Improve typing in render.
This commit is contained in:
parent
d6ec77207f
commit
59d13684be
@ -86,16 +86,21 @@ enum : rk_uint {
|
||||
typedef rk_ushort rk_vertex_index;
|
||||
typedef rk_ushort rk_mesh_index;
|
||||
|
||||
// param input types must be size compatible with an array of rk_param_input
|
||||
typedef rk_uint rk_param_input;
|
||||
|
||||
#define RK_CHECK_PARAM_INPUT_TYPE(_t) static_assert(!(sizeof(_t) % sizeof(rk_param_input)))
|
||||
|
||||
struct rk_mesh {
|
||||
rk_uint base_index;
|
||||
rk_uint ntriangles;
|
||||
};
|
||||
|
||||
// param input types must be size compatible with an array of rk_param_input
|
||||
typedef rk_uint rk_param_input;
|
||||
|
||||
template<typename _input_type>
|
||||
void rk_param_get_input_size(unsigned & _size, unsigned & _len) {
|
||||
static_assert((sizeof(_input_type) % sizeof(rk_param_input)) == 0);
|
||||
_size = sizeof(_input_type);
|
||||
_len = sizeof(_input_type) / sizeof(rk_param_input);
|
||||
}
|
||||
|
||||
RK_EXPORT void rk_render_initialize(
|
||||
rk_bool debug);
|
||||
|
||||
|
@ -13,6 +13,7 @@
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include "../render.hpp"
|
||||
#include "render_opengles.hpp"
|
||||
#include "../display/display_glx.hpp"
|
||||
#include "../cmp_memcpy.hpp"
|
||||
@ -688,8 +689,8 @@ rk_batch_t rk_create_batch(
|
||||
param->offset = offset;
|
||||
switch (*f & RK_PARAM_FORMAT_MASK) {
|
||||
case RK_PARAM_FORMAT_VEC3_FLOAT:
|
||||
param->src_size = sizeof(rk_vec3);
|
||||
param->dst_size = sizeof(rk_vec3_float);
|
||||
rk_param_get_input_size<rk_vec3>(param->src_size, param->src_len);
|
||||
rk_param_get_output_size<rk_vec3_float>(param->dst_size, param->dst_len);
|
||||
param->packer = rk_pack_vec3_float;
|
||||
glBindVertexBuffer(binding, batch->params_buffer, param->offset, param->dst_size);
|
||||
glEnableVertexAttribArray(attrib);
|
||||
@ -697,8 +698,8 @@ rk_batch_t rk_create_batch(
|
||||
glVertexAttribBinding(attrib++, binding);
|
||||
break;
|
||||
case RK_PARAM_FORMAT_VEC3_SHORT:
|
||||
param->src_size = sizeof(rk_vec3);
|
||||
param->dst_size = sizeof(rk_vec3_short);
|
||||
rk_param_get_input_size<rk_vec3>(param->src_size, param->src_len);
|
||||
rk_param_get_output_size<rk_vec3_short>(param->dst_size, param->dst_len);
|
||||
param->packer = norm ? rk_pack_vec3_short_norm : rk_pack_vec3_short;
|
||||
glBindVertexBuffer(binding, batch->params_buffer, param->offset, param->dst_size);
|
||||
glEnableVertexAttribArray(attrib);
|
||||
@ -706,8 +707,8 @@ rk_batch_t rk_create_batch(
|
||||
glVertexAttribBinding(attrib++, binding);
|
||||
break;
|
||||
case RK_PARAM_FORMAT_VEC3_INT10:
|
||||
param->src_size = sizeof(rk_vec3);
|
||||
param->dst_size = sizeof(rk_vec3_int10);
|
||||
rk_param_get_input_size<rk_vec3>(param->src_size, param->src_len);
|
||||
rk_param_get_output_size<rk_vec3_int10>(param->dst_size, param->dst_len);
|
||||
param->packer = norm ? rk_pack_vec3_int10_norm : rk_pack_vec3_int10;
|
||||
glBindVertexBuffer(binding, batch->params_buffer, param->offset, param->dst_size);
|
||||
glEnableVertexAttribArray(attrib);
|
||||
@ -715,8 +716,8 @@ rk_batch_t rk_create_batch(
|
||||
glVertexAttribBinding(attrib++, binding);
|
||||
break;
|
||||
case RK_PARAM_FORMAT_MAT3_FLOAT:
|
||||
param->src_size = sizeof(rk_mat3);
|
||||
param->dst_size = sizeof(rk_mat3_float);
|
||||
rk_param_get_input_size<rk_mat3>(param->src_size, param->src_len);
|
||||
rk_param_get_output_size<rk_mat3_float>(param->dst_size, param->dst_len);
|
||||
param->packer = rk_pack_mat3_float;
|
||||
glBindVertexBuffer(binding, batch->params_buffer, param->offset, param->dst_size);
|
||||
glEnableVertexAttribArray(attrib);
|
||||
@ -730,8 +731,8 @@ rk_batch_t rk_create_batch(
|
||||
glVertexAttribBinding(attrib++, binding);
|
||||
break;
|
||||
case RK_PARAM_FORMAT_MAT3_INT10:
|
||||
param->src_size = sizeof(rk_mat3);
|
||||
param->dst_size = sizeof(rk_mat3_int10);
|
||||
rk_param_get_input_size<rk_mat3>(param->src_size, param->src_len);
|
||||
rk_param_get_output_size<rk_mat3_int10>(param->dst_size, param->dst_len);
|
||||
param->packer = norm ? rk_pack_mat3_int10_norm : rk_pack_mat3_int10;
|
||||
glBindVertexBuffer(binding, batch->params_buffer, param->offset, param->dst_size);
|
||||
glEnableVertexAttribArray(attrib);
|
||||
@ -746,8 +747,6 @@ rk_batch_t rk_create_batch(
|
||||
break;
|
||||
}
|
||||
glVertexBindingDivisor(binding, 1);
|
||||
param->src_len = param->src_size / sizeof(rk_param_input);
|
||||
param->dst_len = param->dst_size / sizeof(rk_param_output);
|
||||
param->source = new rk_param_input[max_size * param->src_len];
|
||||
memset(param->source, 0xFF, max_size * param->src_size);
|
||||
offset += max_size * param->dst_size;
|
||||
|
@ -16,7 +16,8 @@
|
||||
#ifndef _RK_ENGINE_RENDER_OPENGLES_H
|
||||
#define _RK_ENGINE_RENDER_OPENGLES_H
|
||||
|
||||
#include "../render.hpp"
|
||||
#include "../types.hpp"
|
||||
#include "../math.hpp"
|
||||
#include <GLES3/gl32.h>
|
||||
#include <GLES3/gl3ext.h>
|
||||
#include <GLES3/gl3platform.h>
|
||||
@ -61,7 +62,12 @@ struct rk_command {
|
||||
// param output types must be size compatible with an array of rk_param_output
|
||||
typedef rk_uint rk_param_output;
|
||||
|
||||
#define RK_CHECK_PARAM_OUTPUT_TYPE(_t) static_assert(!(sizeof(_t) % sizeof(rk_param_output)))
|
||||
template<typename _output_type>
|
||||
void rk_param_get_output_size(unsigned & _size, unsigned & _len) {
|
||||
static_assert((sizeof(_output_type) % sizeof(rk_param_output)) == 0);
|
||||
_size = sizeof(_output_type);
|
||||
_len = sizeof(_output_type) / sizeof(rk_param_output);
|
||||
}
|
||||
|
||||
struct rk_vec3_float {
|
||||
float x;
|
||||
@ -95,16 +101,6 @@ struct rk_mat3_int10 {
|
||||
rk_vec3_int10 z;
|
||||
};
|
||||
|
||||
RK_CHECK_PARAM_INPUT_TYPE(rk_vec3_float);
|
||||
RK_CHECK_PARAM_INPUT_TYPE(rk_mat3_float);
|
||||
|
||||
RK_CHECK_PARAM_OUTPUT_TYPE(rk_vec3_float);
|
||||
RK_CHECK_PARAM_OUTPUT_TYPE(rk_vec3_short);
|
||||
RK_CHECK_PARAM_OUTPUT_TYPE(rk_vec3_int10);
|
||||
RK_CHECK_PARAM_OUTPUT_TYPE(rk_vec3_uint10);
|
||||
RK_CHECK_PARAM_OUTPUT_TYPE(rk_mat3_float);
|
||||
RK_CHECK_PARAM_OUTPUT_TYPE(rk_mat3_int10);
|
||||
|
||||
typedef void (*rk_packer)(
|
||||
unsigned const, // count
|
||||
rk_instance_index const * const, // indices
|
||||
@ -116,8 +112,8 @@ struct rk_parameter {
|
||||
unsigned binding;
|
||||
unsigned offset;
|
||||
unsigned src_size;
|
||||
unsigned dst_size;
|
||||
unsigned src_len;
|
||||
unsigned dst_size;
|
||||
unsigned dst_len;
|
||||
rk_param_input * source;
|
||||
rk_packer packer;
|
||||
|
Loading…
Reference in New Issue
Block a user