Cleanup: rework resources creation.

This commit is contained in:
Roz K 2022-12-18 03:39:34 +01:00
parent 5c9e10eea8
commit 028ba40148
Signed by: roz
GPG Key ID: 51FBF4E483E1C822
4 changed files with 168 additions and 159 deletions

View File

@ -239,14 +239,68 @@ def load_shader(vert_lines, frag_lines):
vert_nlines, ctypes.addressof(vert_lines), vert_nlines, ctypes.addressof(vert_lines),
frag_nlines, ctypes.addressof(frag_lines)) frag_nlines, ctypes.addressof(frag_lines))
select_shader = _lib.rk_select_shader
select_shader.argtypes = (
ctypes.c_void_p,) # shader
resolve_input = _lib.rk_resolve_input resolve_input = _lib.rk_resolve_input
resolve_input.restype = ctypes.c_void_p resolve_input.restype = ctypes.c_void_p
resolve_input.argtypes = ( resolve_input.argtypes = (
ctypes.c_char_p,) # name ctypes.c_void_p, # shader
ctypes.c_char_p) # name
resolve_param = _lib.rk_resolve_param
resolve_param.restype = ctypes.c_void_p
resolve_param.argtypes = (
ctypes.c_void_p, # shader
ctypes.c_char_p) # name
_create_texture = _lib.rk_create_texture
_create_texture.restype = ctypes.c_void_p
_create_texture.argtypes = (
ctypes.c_uint, # slot
ctypes.c_uint, # format
ctypes.c_uint, # width
ctypes.c_uint, # height
ctypes.c_uint, # nlevels
ctypes.c_uint, # flags
ctypes.c_void_p) # pixels
def create_texture(slot, format, width, height, nlevels, flags, pixels):
assert pixels.typecode == TEXTURE_FORMAT_TYPECODE[format]
assert len(pixels) == width * height * max(1, nlevels) * TEXTURE_FORMAT_NELEMS[format]
return _create_texture(slot, format, width, height, nlevels, flags, _voidp(pixels))
_create_triangles = _lib.rk_create_triangles
_create_triangles.restype = ctypes.c_void_p
_create_triangles.argtypes = (
ctypes.c_uint, # nvertices
ctypes.c_void_p) # vertices
def create_triangles(vertices):
assert len(vertices) % 9 == 0
return _create_triangles(len(vertices) // 3, _floatp(vertices))
_create_vertices = _lib.rk_create_vertices
_create_vertices.restype = ctypes.c_void_p
_create_vertices.argtypes = (
ctypes.c_char_p, # format
ctypes.c_uint, # nvertices
ctypes.c_void_p, # vertices
ctypes.c_uint, # nindices
ctypes.c_void_p) # indices
def create_vertices(format, nvertices, vertices, indices):
return _create_vertices(format, nvertices, _ubytep(vertices), len(indices), _ushortp(indices))
create_batch = _lib.rk_create_batch
create_batch.restype = ctypes.c_void_p
create_batch.argtypes = (
ctypes.c_void_p, # vertices
ctypes.c_uint, # max_size
ctypes.c_char_p) # params_format
begin_frame = _lib.rk_begin_frame
select_shader = _lib.rk_select_shader
select_shader.argtypes = (
ctypes.c_void_p,) # shader
set_input_float = _lib.rk_set_input_float set_input_float = _lib.rk_set_input_float
set_input_float.argtypes = ( set_input_float.argtypes = (
@ -280,11 +334,6 @@ def set_input_mat4(input, value):
assert len(value) == 16 assert len(value) == 16
_set_input_mat4(input, _mat4(value)) _set_input_mat4(input, _mat4(value))
resolve_param = _lib.rk_resolve_param
resolve_param.restype = ctypes.c_void_p
resolve_param.argtypes = (
ctypes.c_char_p,) # name
_set_param_vec3 = _lib.rk_set_param_vec3 _set_param_vec3 = _lib.rk_set_param_vec3
_set_param_vec3.argtypes = ( _set_param_vec3.argtypes = (
ctypes.c_uint, # layout ctypes.c_uint, # layout
@ -294,56 +343,10 @@ def set_param_vec3(param, value):
assert len(value) == 3 assert len(value) == 3
_set_param_vec3(param, _vec3(value)) _set_param_vec3(param, _vec3(value))
_create_texture = _lib.rk_create_texture
_create_texture.restype = ctypes.c_void_p
_create_texture.argtypes = (
ctypes.c_uint, # slot
ctypes.c_char_p, # input
ctypes.c_uint, # format
ctypes.c_uint, # width
ctypes.c_uint, # height
ctypes.c_uint, # nlevels
ctypes.c_uint, # flags
ctypes.c_void_p) # pixels
def create_texture(slot, input, format, width, height, nlevels, flags, pixels):
assert pixels.typecode == TEXTURE_FORMAT_TYPECODE[format]
assert len(pixels) == width * height * max(1, nlevels) * TEXTURE_FORMAT_NELEMS[format]
return _create_texture(slot, input, format, width, height, nlevels, flags, _voidp(pixels))
_create_triangles = _lib.rk_create_triangles
_create_triangles.restype = ctypes.c_void_p
_create_triangles.argtypes = (
ctypes.c_uint, # nvertices
ctypes.c_void_p) # vertices
def create_triangles(vertices):
assert len(vertices) % 9 == 0
return _create_triangles(len(vertices) // 3, _floatp(vertices))
_create_vertices = _lib.rk_create_vertices
_create_vertices.restype = ctypes.c_void_p
_create_vertices.argtypes = (
ctypes.c_char_p, # format
ctypes.c_uint, # nvertices
ctypes.c_void_p, # vertices
ctypes.c_uint, # nindices
ctypes.c_void_p) # indices
def create_vertices(format, nvertices, vertices, indices):
return _create_vertices(format, nvertices, _ubytep(vertices), len(indices), _ushortp(indices))
create_batch = _lib.rk_create_batch
create_batch.restype = ctypes.c_void_p
create_batch.argtypes = (
ctypes.c_uint, # max_size
ctypes.c_char_p) # params_format
begin_frame = _lib.rk_begin_frame
select_texture = _lib.rk_select_texture select_texture = _lib.rk_select_texture
select_texture.argtypes = ( select_texture.argtypes = (
ctypes.c_void_p,) # texture ctypes.c_void_p, # texture
ctypes.c_void_p) # sampler
draw_triangles = _lib.rk_draw_triangles draw_triangles = _lib.rk_draw_triangles
draw_triangles.argtypes = ( draw_triangles.argtypes = (

View File

@ -122,88 +122,37 @@ rk_shader_t rk_load_shader(
return shader; return shader;
} }
void rk_select_shader(
rk_shader_t _shader) {
rk_shader * const shader = reinterpret_cast<rk_shader *>(_shader);
if (shader) {
rk_current_shader = shader;
glUseProgram(shader->program);
}
}
rk_input_t rk_resolve_input( rk_input_t rk_resolve_input(
rk_shader_t _shader,
char const * name) { char const * name) {
if (!rk_current_shader || !name) { rk_shader const * const shader = reinterpret_cast<rk_shader const *>(_shader);
if (!shader || !name) {
return nullptr; return nullptr;
} }
GLint const uniform = glGetUniformLocation(rk_current_shader->program, name); GLint const uniform = glGetUniformLocation(shader->program, name);
return reinterpret_cast<rk_input_t>(uniform + 1); return reinterpret_cast<rk_input_t>(uniform + 1);
} }
void rk_set_input_float(
rk_input_t _input,
float value) {
GLint const input = reinterpret_cast<intptr_t>(_input) - 1;
if (rk_current_shader && input > -1) {
glUniform1f(input, value);
}
}
void rk_set_input_vec3(
rk_input_t _input,
rk_vec3 const & value) {
GLint const input = reinterpret_cast<intptr_t>(_input) - 1;
if (rk_current_shader && input > -1) {
glUniform3fv(input, 1, glm::value_ptr(value));
}
}
void rk_set_input_mat3(
rk_input_t _input,
rk_mat3 const & value) {
GLint const input = reinterpret_cast<intptr_t>(_input) - 1;
if (rk_current_shader && input > -1) {
glUniformMatrix3fv(input, 1, GL_FALSE, glm::value_ptr(value));
}
}
void rk_set_input_mat4(
rk_input_t _input,
rk_mat4 const & value) {
GLint const input = reinterpret_cast<intptr_t>(_input) - 1;
if (rk_current_shader && input > -1) {
glUniformMatrix4fv(input, 1, GL_FALSE, glm::value_ptr(value));
}
}
rk_param_t rk_resolve_param( rk_param_t rk_resolve_param(
rk_shader_t _shader,
char const * name) { char const * name) {
if (!rk_current_shader || !name) { rk_shader const * const shader = reinterpret_cast<rk_shader const *>(_shader);
if (!shader || !name) {
return nullptr; return nullptr;
} }
GLint const location = glGetAttribLocation(rk_current_shader->program, name); GLint const location = glGetAttribLocation(shader->program, name);
return reinterpret_cast<rk_param_t>(location + 1); return reinterpret_cast<rk_param_t>(location + 1);
} }
void rk_set_param_vec3(
rk_param_t _param,
rk_vec3 const & value) {
GLint const param = reinterpret_cast<intptr_t>(_param) - 1;
if (rk_current_shader && param > -1) {
glVertexAttrib3fv(param, glm::value_ptr(value));
}
}
rk_texture_t rk_create_texture( rk_texture_t rk_create_texture(
rk_uint slot, rk_uint slot,
char const * input,
rk_texture_format format, rk_texture_format format,
rk_uint width, rk_uint width,
rk_uint height, rk_uint height,
rk_uint nlevels, rk_uint nlevels,
rk_texture_flags flags, rk_texture_flags flags,
void const * pixels) { void const * pixels) {
if (!input || width == 0 || height == 0 || !pixels || !rk_current_shader) { if (!width || !height || !pixels) {
return nullptr; return nullptr;
} }
GLint internal_format; GLint internal_format;
@ -279,10 +228,6 @@ rk_texture_t rk_create_texture(
} }
texture->slot = slot; texture->slot = slot;
texture->nlevels = nlevels; texture->nlevels = nlevels;
texture->sampler = glGetUniformLocation(rk_current_shader->program, input);
if (texture->sampler == -1) {
printf("[RK_ENGINE] glGetUniformLocation(%s) failed\n", input);
}
glBindTexture(target, 0); glBindTexture(target, 0);
return texture; return texture;
} }
@ -290,7 +235,7 @@ rk_texture_t rk_create_texture(
rk_triangles_t rk_create_triangles( rk_triangles_t rk_create_triangles(
rk_uint nvertices, rk_uint nvertices,
rk_vec3 const * vertices) { rk_vec3 const * vertices) {
if (nvertices == 0 || !vertices || !rk_current_shader) { if (!nvertices || !vertices) {
return nullptr; return nullptr;
} }
rk_triangles * const triangles = new rk_triangles; rk_triangles * const triangles = new rk_triangles;
@ -313,7 +258,7 @@ rk_vertices_t rk_create_vertices(
void const * _vertices, void const * _vertices,
rk_uint nindices, rk_uint nindices,
rk_ushort const * indices) { rk_ushort const * indices) {
if (!format || !nvertices || !_vertices || !nindices || !indices || !rk_current_shader) { if (!format || !nvertices || !_vertices || !nindices || !indices) {
return nullptr; return nullptr;
} }
rk_uint vertex_size = 0; rk_uint vertex_size = 0;
@ -407,10 +352,13 @@ static void rk_pack_vec3_int10(
#undef _convert #undef _convert
} }
//TODO: multiple batches per vertices
rk_batch_t rk_create_batch( rk_batch_t rk_create_batch(
rk_vertices_t _vertices,
rk_uint max_size, rk_uint max_size,
rk_param_format const * params_format) { rk_param_format const * params_format) {
if (!max_size || !params_format || max_size > RK_BATCH_MAX_SIZE || !rk_current_shader || !rk_current_vertices) { rk_vertices const * const vertices = reinterpret_cast<rk_vertices const *>(_vertices);
if (!vertices || !max_size || !params_format || max_size > RK_BATCH_MAX_SIZE) {
rk_printf("rk_create_batch(): invalid parameters."); rk_printf("rk_create_batch(): invalid parameters.");
return nullptr; return nullptr;
} }
@ -448,9 +396,10 @@ rk_batch_t rk_create_batch(
batch->packers = new rk_packer[nparams]; batch->packers = new rk_packer[nparams];
batch->params = new rk_ubyte[max_size * packed_size]; batch->params = new rk_ubyte[max_size * packed_size];
glGenBuffers(1, &batch->params_buffer); glGenBuffers(1, &batch->params_buffer);
rk_uint layout = rk_current_vertices->layout; rk_uint layout = vertices->layout;
rk_packer * packer = batch->packers; rk_packer * packer = batch->packers;
rk_uint offset = 0; rk_uint offset = 0;
glBindVertexArray(vertices->array);
for (rk_param_format const * f = params_format; *f; ++f, ++layout, ++packer) { for (rk_param_format const * f = params_format; *f; ++f, ++layout, ++packer) {
GLboolean const normalize = (*f & RK_PARAM_FORMAT_NORMALIZE) != 0; GLboolean const normalize = (*f & RK_PARAM_FORMAT_NORMALIZE) != 0;
glEnableVertexAttribArray(layout); glEnableVertexAttribArray(layout);
@ -483,6 +432,7 @@ rk_batch_t rk_create_batch(
} }
glVertexBindingDivisor(RK_PARAMS_BINDING, 1); glVertexBindingDivisor(RK_PARAMS_BINDING, 1);
glBindVertexBuffer(RK_PARAMS_BINDING, batch->params_buffer, 0, batch->packed_size); glBindVertexBuffer(RK_PARAMS_BINDING, batch->params_buffer, 0, batch->packed_size);
glBindVertexArray(0);
} }
if (rk_MultiDrawElementsIndirect) { if (rk_MultiDrawElementsIndirect) {
glGenBuffers(1, &batch->commands_buffer); glGenBuffers(1, &batch->commands_buffer);
@ -494,19 +444,73 @@ void rk_begin_frame() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
} }
void rk_select_shader(
rk_shader_t _shader) {
rk_shader * const shader = reinterpret_cast<rk_shader *>(_shader);
if (shader) {
rk_current_shader = shader;
glUseProgram(shader->program);
}
}
void rk_set_input_float(
rk_input_t _input,
float value) {
GLint const input = reinterpret_cast<intptr_t>(_input) - 1;
if (rk_current_shader && input > -1) {
glUniform1f(input, value);
}
}
void rk_set_input_vec3(
rk_input_t _input,
rk_vec3 const & value) {
GLint const input = reinterpret_cast<intptr_t>(_input) - 1;
if (rk_current_shader && input > -1) {
glUniform3fv(input, 1, glm::value_ptr(value));
}
}
void rk_set_input_mat3(
rk_input_t _input,
rk_mat3 const & value) {
GLint const input = reinterpret_cast<intptr_t>(_input) - 1;
if (rk_current_shader && input > -1) {
glUniformMatrix3fv(input, 1, GL_FALSE, glm::value_ptr(value));
}
}
void rk_set_input_mat4(
rk_input_t _input,
rk_mat4 const & value) {
GLint const input = reinterpret_cast<intptr_t>(_input) - 1;
if (rk_current_shader && input > -1) {
glUniformMatrix4fv(input, 1, GL_FALSE, glm::value_ptr(value));
}
}
void rk_set_param_vec3(
rk_param_t _param,
rk_vec3 const & value) {
GLint const param = reinterpret_cast<intptr_t>(_param) - 1;
if (rk_current_shader && param > -1) {
glVertexAttrib3fv(param, glm::value_ptr(value));
}
}
void rk_select_texture( void rk_select_texture(
rk_texture_t _texture) { rk_texture_t _texture,
rk_input_t _sampler) {
rk_texture const * const texture = reinterpret_cast<rk_texture const *>(_texture); rk_texture const * const texture = reinterpret_cast<rk_texture const *>(_texture);
if (texture) { GLint const sampler = reinterpret_cast<intptr_t>(_sampler) - 1;
if (texture && sampler > -1 && rk_current_shader) {
glActiveTexture(GL_TEXTURE0 + texture->slot); glActiveTexture(GL_TEXTURE0 + texture->slot);
if (texture->nlevels) { if (texture->nlevels) {
glBindTexture(GL_TEXTURE_2D_ARRAY, texture->texture); glBindTexture(GL_TEXTURE_2D_ARRAY, texture->texture);
} else { } else {
glBindTexture(GL_TEXTURE_2D, texture->texture); glBindTexture(GL_TEXTURE_2D, texture->texture);
} }
if (texture->sampler > -1) { glUniform1i(sampler, texture->slot);
glUniform1i(texture->sampler, texture->slot);
}
} }
} }
@ -523,7 +527,7 @@ RK_EXPORT void rk_draw_triangles(
void rk_select_vertices( void rk_select_vertices(
rk_vertices_t _vertices) { rk_vertices_t _vertices) {
rk_vertices * const vertices = reinterpret_cast<rk_vertices *>(_vertices); rk_vertices * const vertices = reinterpret_cast<rk_vertices *>(_vertices);
if (vertices && rk_current_shader) { if (vertices) {
glBindVertexArray(vertices->array); glBindVertexArray(vertices->array);
rk_current_vertices = vertices; rk_current_vertices = vertices;
} }

View File

@ -36,7 +36,6 @@ struct rk_shader {
struct rk_texture { struct rk_texture {
rk_uint slot; rk_uint slot;
rk_uint nlevels; rk_uint nlevels;
GLint sampler;
GLuint texture; GLuint texture;
}; };

View File

@ -22,10 +22,10 @@
typedef rk_handle_t rk_window_t; typedef rk_handle_t rk_window_t;
typedef rk_handle_t rk_shader_t; typedef rk_handle_t rk_shader_t;
typedef rk_handle_t rk_input_t; typedef rk_handle_t rk_input_t;
typedef rk_handle_t rk_param_t;
typedef rk_handle_t rk_texture_t; typedef rk_handle_t rk_texture_t;
typedef rk_handle_t rk_triangles_t; typedef rk_handle_t rk_triangles_t;
typedef rk_handle_t rk_vertices_t; typedef rk_handle_t rk_vertices_t;
typedef rk_handle_t rk_param_t;
typedef rk_handle_t rk_batch_t; typedef rk_handle_t rk_batch_t;
#define RK_FLAG(bit) (1 << (bit)) #define RK_FLAG(bit) (1 << (bit))
@ -92,38 +92,16 @@ RK_EXPORT rk_shader_t rk_load_shader(
rk_uint const frag_nlines, rk_uint const frag_nlines,
char const ** const frag_lines); char const ** const frag_lines);
RK_EXPORT void rk_select_shader(
rk_shader_t _shader);
RK_EXPORT rk_input_t rk_resolve_input( RK_EXPORT rk_input_t rk_resolve_input(
rk_shader_t shader,
char const * name); char const * name);
RK_EXPORT void rk_set_input_float(
rk_input_t input,
float value);
RK_EXPORT void rk_set_input_vec3(
rk_input_t input,
rk_vec3 const & value);
RK_EXPORT void rk_set_input_mat3(
rk_input_t input,
rk_mat3 const & value);
RK_EXPORT void rk_set_input_mat4(
rk_input_t input,
rk_mat4 const & value);
RK_EXPORT rk_param_t rk_resolve_param( RK_EXPORT rk_param_t rk_resolve_param(
rk_shader_t shader,
char const * name); char const * name);
RK_EXPORT void rk_set_param_vec3(
rk_param_t param,
rk_vec3 const & value);
RK_EXPORT rk_texture_t rk_create_texture( RK_EXPORT rk_texture_t rk_create_texture(
rk_uint slot, rk_uint slot,
char const * input,
rk_texture_format format, rk_texture_format format,
rk_uint width, rk_uint width,
rk_uint height, rk_uint height,
@ -143,13 +121,38 @@ RK_EXPORT rk_vertices_t rk_create_vertices(
rk_ushort const * indices); rk_ushort const * indices);
RK_EXPORT rk_batch_t rk_create_batch( RK_EXPORT rk_batch_t rk_create_batch(
rk_vertices_t vertices,
rk_uint max_size, rk_uint max_size,
rk_param_format const * params_format); rk_param_format const * params_format);
RK_EXPORT void rk_begin_frame(); RK_EXPORT void rk_begin_frame();
RK_EXPORT void rk_select_shader(
rk_shader_t _shader);
RK_EXPORT void rk_set_input_float(
rk_input_t input,
float value);
RK_EXPORT void rk_set_input_vec3(
rk_input_t input,
rk_vec3 const & value);
RK_EXPORT void rk_set_input_mat3(
rk_input_t input,
rk_mat3 const & value);
RK_EXPORT void rk_set_input_mat4(
rk_input_t input,
rk_mat4 const & value);
RK_EXPORT void rk_set_param_vec3(
rk_param_t param,
rk_vec3 const & value);
RK_EXPORT void rk_select_texture( RK_EXPORT void rk_select_texture(
rk_texture_t texture); rk_texture_t texture,
rk_input_t sampler);
RK_EXPORT void rk_draw_triangles( RK_EXPORT void rk_draw_triangles(
rk_triangles_t triangles); rk_triangles_t triangles);