// Copyright (C) 2022 RozK // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #ifndef _RK_ENGINE_RENDER_OPENGLES_H #define _RK_ENGINE_RENDER_OPENGLES_H #include "../render.hpp" #include "render_context.hpp" #include #include #include enum : GLuint { RK_VERTICES_BINDING = 0, RK_PARAMS_BINDING = 1 }; struct rk_shader { GLuint vertex; GLuint fragment; GLuint program; }; struct rk_texture { unsigned nlevels; GLuint texture; }; struct rk_triangles { unsigned size; GLuint array; GLuint vertices; }; struct rk_vertices { unsigned vertex_size; unsigned layout; GLuint array; GLuint vertices; GLuint indices; }; struct rk_vec3s { rk_short x; rk_short y; rk_short z; rk_short pad; }; union rk_pack_src { rk_ubyte const * __restrict ptr; rk_vec3 const * __restrict vec3_ptr; inline rk_pack_src() {} inline rk_pack_src(rk_ubyte const * const __restrict src) : ptr(src) {} }; union rk_pack_dst { rk_ubyte * __restrict ptr; rk_vec3 * __restrict vec3_ptr; rk_vec3s * __restrict vec3s_ptr; rk_int * __restrict int_ptr; inline rk_pack_dst() {} inline rk_pack_dst(rk_ubyte * const __restrict dst) : ptr(dst) {} }; typedef void (*rk_packer_fn)(rk_pack_dst, rk_pack_src); struct rk_packer { rk_packer_fn pack; unsigned dst_incr; unsigned src_incr; }; struct rk_command { GLuint nvertices; GLuint ninstances; GLuint base_index; GLint base_vertex; GLuint base_instance; }; struct rk_batch { unsigned size; unsigned nparams; unsigned params_size; unsigned packed_size; rk_ushort * indices; rk_command * commands; rk_packer * packers; rk_ubyte * params; GLuint params_buffer; GLuint commands_buffer; }; #endif // _RK_ENGINE_RENDER_OPENGLES_H