diff --git a/gsk/ngl/gsknglcommandqueue.c b/gsk/ngl/gsknglcommandqueue.c index 0fb56cfc50..e160076c57 100644 --- a/gsk/ngl/gsknglcommandqueue.c +++ b/gsk/ngl/gsknglcommandqueue.c @@ -272,24 +272,23 @@ snapshot_uniforms (GskNglUniformState *state, GskNglUniformProgram *program, GskNglCommandUniforms *array) { - GskNglCommandUniform *uniform = gsk_ngl_command_uniforms_append_n (array, program->n_sparse); + GskNglCommandUniform *uniform = gsk_ngl_command_uniforms_append_n (array, program->n_mappings); guint count = 0; - for (guint i = 0; i < program->n_sparse; i++) + for (guint i = 0; i < program->n_mappings; i++) { - guint location = program->sparse[i]; - const GskNglUniformInfo *info = &program->uniforms[location].info; + const GskNglUniformMapping *mapping = &program->mappings[i]; - if (!info->initial) + if (!mapping->info.initial && mapping->location > -1) { - uniform[count].location = location; - uniform[count].info = *info; + uniform[count].location = mapping->location; + uniform[count].info = mapping->info; count++; } } - if (count != program->n_sparse) - array->len -= program->n_sparse - count; + if (count != program->n_mappings) + array->len -= program->n_mappings - count; return count; } diff --git a/gsk/ngl/gsknglcommandqueueprivate.h b/gsk/ngl/gsknglcommandqueueprivate.h index e51d1abb46..bcd7c8312d 100644 --- a/gsk/ngl/gsknglcommandqueueprivate.h +++ b/gsk/ngl/gsknglcommandqueueprivate.h @@ -153,7 +153,7 @@ G_STATIC_ASSERT (sizeof (GskNglCommandClear) == 20); typedef struct _GskNglCommandUniform { GskNglUniformInfo info; - guint location; + guint location; } GskNglCommandUniform; G_STATIC_ASSERT (sizeof (GskNglCommandUniform) == 8); diff --git a/gsk/ngl/gskngldriver.c b/gsk/ngl/gskngldriver.c index a4254c8da4..ec30ccf86f 100644 --- a/gsk/ngl/gskngldriver.c +++ b/gsk/ngl/gskngldriver.c @@ -226,14 +226,14 @@ gsk_ngl_driver_dispose (GObject *object) #define GSK_NGL_NO_UNIFORMS #define GSK_NGL_ADD_UNIFORM(pos, KEY, name) #define GSK_NGL_DEFINE_PROGRAM(name, resource, uniforms) \ - GSK_NGL_DELETE_PROGRAM(name); \ - GSK_NGL_DELETE_PROGRAM(name ## _no_clip); \ + GSK_NGL_DELETE_PROGRAM(name); \ + GSK_NGL_DELETE_PROGRAM(name ## _no_clip); \ GSK_NGL_DELETE_PROGRAM(name ## _rect_clip); -#define GSK_NGL_DELETE_PROGRAM(name) \ - G_STMT_START { \ - if (self->name) \ +#define GSK_NGL_DELETE_PROGRAM(name) \ + G_STMT_START { \ + if (self->name) \ gsk_ngl_program_delete (self->name); \ - g_clear_object (&self->name); \ + g_clear_object (&self->name); \ } G_STMT_END; # include "gsknglprograms.defs" #undef GSK_NGL_NO_UNIFORMS @@ -356,10 +356,10 @@ gsk_ngl_driver_load_programs (GskNglDriver *self, #define GSK_NGL_ADD_UNIFORM(pos, KEY, name) \ gsk_ngl_program_add_uniform (program, #name, UNIFORM_##KEY); #define GSK_NGL_DEFINE_PROGRAM(name, resource, uniforms) \ - gsk_ngl_compiler_set_source_from_resource (compiler, GSK_NGL_COMPILER_ALL, resource); \ - GSK_NGL_COMPILE_PROGRAM(name ## _no_clip, uniforms, "#define NO_CLIP 1\n"); \ - GSK_NGL_COMPILE_PROGRAM(name ## _rect_clip, uniforms, "#define RECT_CLIP 1\n"); \ - GSK_NGL_COMPILE_PROGRAM(name, uniforms, ""); + gsk_ngl_compiler_set_source_from_resource (compiler, GSK_NGL_COMPILER_ALL, resource); \ + GSK_NGL_COMPILE_PROGRAM(name ## _no_clip, uniforms, "#define NO_CLIP 1\n"); \ + GSK_NGL_COMPILE_PROGRAM(name ## _rect_clip, uniforms, "#define RECT_CLIP 1\n"); \ + GSK_NGL_COMPILE_PROGRAM(name, uniforms, ""); #define GSK_NGL_COMPILE_PROGRAM(name, uniforms, clip) \ G_STMT_START { \ GskNglProgram *program; \ @@ -1046,26 +1046,26 @@ gsk_ngl_driver_lookup_shader (GskNglDriver *self, int n_uniforms; uniforms = gsk_gl_shader_get_uniforms (shader, &n_uniforms); - if (n_uniforms > G_N_ELEMENTS (program->args_locations)) + if (n_uniforms > GSK_NGL_PROGRAM_MAX_CUSTOM_ARGS) { g_set_error (error, GDK_GL_ERROR, GDK_GL_ERROR_UNSUPPORTED_FORMAT, "Tried to use %d uniforms, while only %d is supported", n_uniforms, - (int)G_N_ELEMENTS (program->args_locations)); + GSK_NGL_PROGRAM_MAX_CUSTOM_ARGS); return NULL; } n_required_textures = gsk_gl_shader_get_n_textures (shader); - if (n_required_textures > G_N_ELEMENTS (program->texture_locations)) + if (n_required_textures > GSK_NGL_PROGRAM_MAX_CUSTOM_TEXTURES) { g_set_error (error, GDK_GL_ERROR, GDK_GL_ERROR_UNSUPPORTED_FORMAT, "Tried to use %d textures, while only %d is supported", n_required_textures, - (int)(G_N_ELEMENTS (program->texture_locations))); + GSK_NGL_PROGRAM_MAX_CUSTOM_TEXTURES); return NULL; } @@ -1108,18 +1108,10 @@ gsk_ngl_driver_lookup_shader (GskNglDriver *self, gsk_ngl_program_add_uniform (program, "u_texture2", UNIFORM_CUSTOM_TEXTURE2); gsk_ngl_program_add_uniform (program, "u_texture3", UNIFORM_CUSTOM_TEXTURE3); gsk_ngl_program_add_uniform (program, "u_texture4", UNIFORM_CUSTOM_TEXTURE4); - for (guint i = 0; i < n_uniforms; i++) - gsk_ngl_program_add_uniform (program, uniforms[i].name, UNIFORM_CUSTOM_LAST+i); - program->size_location = gsk_ngl_program_get_uniform_location (program, UNIFORM_CUSTOM_SIZE); - program->texture_locations[0] = gsk_ngl_program_get_uniform_location (program, UNIFORM_CUSTOM_TEXTURE1); - program->texture_locations[1] = gsk_ngl_program_get_uniform_location (program, UNIFORM_CUSTOM_TEXTURE2); - program->texture_locations[2] = gsk_ngl_program_get_uniform_location (program, UNIFORM_CUSTOM_TEXTURE3); - program->texture_locations[3] = gsk_ngl_program_get_uniform_location (program, UNIFORM_CUSTOM_TEXTURE4); + /* Custom arguments (max is 8) */ for (guint i = 0; i < n_uniforms; i++) - program->args_locations[i] = gsk_ngl_program_get_uniform_location (program, UNIFORM_CUSTOM_LAST+i); - for (guint i = n_uniforms; i < G_N_ELEMENTS (program->args_locations); i++) - program->args_locations[i] = -1; + gsk_ngl_program_add_uniform (program, uniforms[i].name, UNIFORM_CUSTOM_ARG0+i); gsk_ngl_program_uniforms_added (program, TRUE); diff --git a/gsk/ngl/gskngldriverprivate.h b/gsk/ngl/gskngldriverprivate.h index c50e112e86..ad9b4a0ff2 100644 --- a/gsk/ngl/gskngldriverprivate.h +++ b/gsk/ngl/gskngldriverprivate.h @@ -45,6 +45,14 @@ enum { UNIFORM_CUSTOM_TEXTURE2, UNIFORM_CUSTOM_TEXTURE3, UNIFORM_CUSTOM_TEXTURE4, + UNIFORM_CUSTOM_ARG0, + UNIFORM_CUSTOM_ARG1, + UNIFORM_CUSTOM_ARG2, + UNIFORM_CUSTOM_ARG3, + UNIFORM_CUSTOM_ARG4, + UNIFORM_CUSTOM_ARG5, + UNIFORM_CUSTOM_ARG6, + UNIFORM_CUSTOM_ARG7, UNIFORM_CUSTOM_LAST }; diff --git a/gsk/ngl/gsknglprogram.c b/gsk/ngl/gsknglprogram.c index 1343eb35a4..d6db23fad8 100644 --- a/gsk/ngl/gsknglprogram.c +++ b/gsk/ngl/gsknglprogram.c @@ -40,7 +40,7 @@ gsk_ngl_program_new (GskNglDriver *driver, self->id = program_id; self->name = g_strdup (name); self->driver = g_object_ref (driver); - self->n_uniforms = 0; + self->n_mappings = 0; return self; } @@ -74,8 +74,8 @@ gsk_ngl_program_init (GskNglProgram *self) { self->id = -1; - for (guint i = 0; i < G_N_ELEMENTS (self->uniform_locations); i++) - self->uniform_locations[i] = -1; + for (guint i = 0; i < G_N_ELEMENTS (self->mappings); i++) + self->mappings[i].location = -1; } /** @@ -114,22 +114,22 @@ gsk_ngl_program_add_uniform (GskNglProgram *self, g_return_val_if_fail (GSK_IS_NGL_PROGRAM (self), FALSE); g_return_val_if_fail (name != NULL, FALSE); - g_return_val_if_fail (key < 1024, FALSE); + g_return_val_if_fail (key < G_N_ELEMENTS (self->mappings), FALSE); - if (-1 == (location = glGetUniformLocation (self->id, name))) - return FALSE; + location = glGetUniformLocation (self->id, name); - self->uniform_locations[key] = location; - - if (location >= self->n_uniforms) - self->n_uniforms = location + 1; + /* Register the information even if unused */ + self->mappings[key].name = g_intern_string (name); + self->mappings[key].location = location; + if (key >= self->n_mappings) + self->n_mappings = key + 1; #if 0 - g_print ("program [%d] %s uniform %s at location %d.\n", - self->id, self->name, name, location); + g_print ("program [%d] %s uniform %s [%u of %u] at location %d.\n", + self->id, self->name, name, key, self->n_mappings, location); #endif - return TRUE; + return location > -1; } /** @@ -171,6 +171,6 @@ gsk_ngl_program_uniforms_added (GskNglProgram *self, g_return_if_fail (self->uniforms == NULL); self->uniforms = self->driver->command_queue->uniforms; - self->program_info = gsk_ngl_uniform_state_get_program (self->uniforms, self->id, self->n_uniforms); + self->program_info = gsk_ngl_uniform_state_get_program (self->uniforms, self->id, self->mappings, self->n_mappings); self->program_info->has_attachments = has_attachments; } diff --git a/gsk/ngl/gsknglprogramprivate.h b/gsk/ngl/gsknglprogramprivate.h index 47bb0e314f..ccf0b8a798 100644 --- a/gsk/ngl/gsknglprogramprivate.h +++ b/gsk/ngl/gsknglprogramprivate.h @@ -23,12 +23,15 @@ #include "gskngltypesprivate.h" +#include "gsknglattachmentstateprivate.h" #include "gsknglcommandqueueprivate.h" #include "gskngldriverprivate.h" G_BEGIN_DECLS #define GSK_TYPE_GL_PROGRAM (gsk_ngl_program_get_type()) +#define GSK_NGL_PROGRAM_MAX_CUSTOM_TEXTURES 4 +#define GSK_NGL_PROGRAM_MAX_CUSTOM_ARGS 8 G_DECLARE_FINAL_TYPE (GskNglProgram, gsk_ngl_program, GSK, NGL_PROGRAM, GObject) @@ -40,23 +43,13 @@ struct _GskNglProgram char *name; GskNglDriver *driver; - /* In reality, this is the largest uniform position - * as returned after linking so that we can use direct - * indexes based on location. - */ - guint n_uniforms; - /* Cached pointer to avoid lots of pointer chasing/lookups */ GskNglUniformState *uniforms; GskNglUniformProgram *program_info; - /* For custom programs */ - int texture_locations[4]; - int args_locations[8]; - int size_location; - /* Static array for key->location transforms */ - int uniform_locations[32]; + GskNglUniformMapping mappings[32]; + guint n_mappings; }; GskNglProgram *gsk_ngl_program_new (GskNglDriver *driver, @@ -69,8 +62,6 @@ void gsk_ngl_program_uniforms_added (GskNglProgram *self, gboolean has_attachments); void gsk_ngl_program_delete (GskNglProgram *self); -#define gsk_ngl_program_get_uniform_location(s,k) ((s)->uniform_locations[(k)]) - static inline void gsk_ngl_program_set_uniform1fv (GskNglProgram *self, guint key, @@ -79,8 +70,10 @@ gsk_ngl_program_set_uniform1fv (GskNglProgram *self, const float *values) { gsk_ngl_uniform_state_set1fv (self->uniforms, self->program_info, - gsk_ngl_program_get_uniform_location (self, key), - stamp, count, values); + key, + stamp, + count, + values); } static inline void @@ -91,8 +84,10 @@ gsk_ngl_program_set_uniform2fv (GskNglProgram *self, const float *values) { gsk_ngl_uniform_state_set2fv (self->uniforms, self->program_info, - gsk_ngl_program_get_uniform_location (self, key), - stamp, count, values); + key, + stamp, + count, + values); } static inline void @@ -103,8 +98,10 @@ gsk_ngl_program_set_uniform4fv (GskNglProgram *self, const float *values) { gsk_ngl_uniform_state_set4fv (self->uniforms, self->program_info, - gsk_ngl_program_get_uniform_location (self, key), - stamp, count, values); + key, + stamp, + count, + values); } static inline void @@ -114,8 +111,9 @@ gsk_ngl_program_set_uniform_rounded_rect (GskNglProgram *self, const GskRoundedRect *rounded_rect) { gsk_ngl_uniform_state_set_rounded_rect (self->uniforms, self->program_info, - gsk_ngl_program_get_uniform_location (self, key), - stamp, rounded_rect); + key, + stamp, + rounded_rect); } static inline void @@ -126,8 +124,9 @@ gsk_ngl_program_set_uniform1i (GskNglProgram *self, { gsk_ngl_uniform_state_set1i (self->uniforms, self->program_info, - gsk_ngl_program_get_uniform_location (self, key), - stamp, value0); + key, + stamp, + value0); } static inline void @@ -139,8 +138,9 @@ gsk_ngl_program_set_uniform2i (GskNglProgram *self, { gsk_ngl_uniform_state_set2i (self->uniforms, self->program_info, - gsk_ngl_program_get_uniform_location (self, key), - stamp, value0, value1); + key, + stamp, + value0, value1); } static inline void @@ -153,8 +153,9 @@ gsk_ngl_program_set_uniform3i (GskNglProgram *self, { gsk_ngl_uniform_state_set3i (self->uniforms, self->program_info, - gsk_ngl_program_get_uniform_location (self, key), - stamp, value0, value1, value2); + key, + stamp, + value0, value1, value2); } static inline void @@ -168,8 +169,9 @@ gsk_ngl_program_set_uniform4i (GskNglProgram *self, { gsk_ngl_uniform_state_set4i (self->uniforms, self->program_info, - gsk_ngl_program_get_uniform_location (self, key), - stamp, value0, value1, value2, value3); + key, + stamp, + value0, value1, value2, value3); } static inline void @@ -180,8 +182,9 @@ gsk_ngl_program_set_uniform1f (GskNglProgram *self, { gsk_ngl_uniform_state_set1f (self->uniforms, self->program_info, - gsk_ngl_program_get_uniform_location (self, key), - stamp, value0); + key, + stamp, + value0); } static inline void @@ -193,8 +196,9 @@ gsk_ngl_program_set_uniform2f (GskNglProgram *self, { gsk_ngl_uniform_state_set2f (self->uniforms, self->program_info, - gsk_ngl_program_get_uniform_location (self, key), - stamp, value0, value1); + key, + stamp, + value0, value1); } static inline void @@ -207,8 +211,9 @@ gsk_ngl_program_set_uniform3f (GskNglProgram *self, { gsk_ngl_uniform_state_set3f (self->uniforms, self->program_info, - gsk_ngl_program_get_uniform_location (self, key), - stamp, value0, value1, value2); + key, + stamp, + value0, value1, value2); } static inline void @@ -222,8 +227,9 @@ gsk_ngl_program_set_uniform4f (GskNglProgram *self, { gsk_ngl_uniform_state_set4f (self->uniforms, self->program_info, - gsk_ngl_program_get_uniform_location (self, key), - stamp, value0, value1, value2, value3); + key, + stamp, + value0, value1, value2, value3); } static inline void @@ -234,8 +240,9 @@ gsk_ngl_program_set_uniform_color (GskNglProgram *self, { gsk_ngl_uniform_state_set_color (self->uniforms, self->program_info, - gsk_ngl_program_get_uniform_location (self, key), - stamp, color); + key, + stamp, + color); } static inline void @@ -252,8 +259,9 @@ gsk_ngl_program_set_uniform_texture (GskNglProgram *self, texture_id); gsk_ngl_uniform_state_set_texture (self->uniforms, self->program_info, - gsk_ngl_program_get_uniform_location (self, key), - stamp, texture_slot); + key, + stamp, + texture_slot); } static inline void @@ -264,8 +272,9 @@ gsk_ngl_program_set_uniform_matrix (GskNglProgram *self, { gsk_ngl_uniform_state_set_matrix (self->uniforms, self->program_info, - gsk_ngl_program_get_uniform_location (self, key), - stamp, matrix); + key, + stamp, + matrix); } G_END_DECLS diff --git a/gsk/ngl/gsknglrenderjob.c b/gsk/ngl/gsknglrenderjob.c index f6cf738353..8e4246d8b7 100644 --- a/gsk/ngl/gsknglrenderjob.c +++ b/gsk/ngl/gsknglrenderjob.c @@ -1003,41 +1003,36 @@ gsk_ngl_render_job_begin_draw (GskNglRenderJob *job, job->viewport.size.width, job->viewport.size.height); - if (program->uniform_locations[UNIFORM_SHARED_VIEWPORT] > -1) - gsk_ngl_uniform_state_set4fv (program->uniforms, - program->program_info, - program->uniform_locations[UNIFORM_SHARED_VIEWPORT], - job->driver->stamps[UNIFORM_SHARED_VIEWPORT], - 1, - (const float *)&job->viewport); + gsk_ngl_uniform_state_set4fv (program->uniforms, + program->program_info, + UNIFORM_SHARED_VIEWPORT, + job->driver->stamps[UNIFORM_SHARED_VIEWPORT], + 1, + (const float *)&job->viewport); - if (program->uniform_locations[UNIFORM_SHARED_MODELVIEW] > -1) - gsk_ngl_uniform_state_set_matrix (program->uniforms, - program->program_info, - program->uniform_locations[UNIFORM_SHARED_MODELVIEW], - job->driver->stamps[UNIFORM_SHARED_MODELVIEW], - &job->current_modelview->matrix); + gsk_ngl_uniform_state_set_matrix (program->uniforms, + program->program_info, + UNIFORM_SHARED_MODELVIEW, + job->driver->stamps[UNIFORM_SHARED_MODELVIEW], + &job->current_modelview->matrix); - if (program->uniform_locations[UNIFORM_SHARED_PROJECTION] > -1) - gsk_ngl_uniform_state_set_matrix (program->uniforms, - program->program_info, - program->uniform_locations[UNIFORM_SHARED_PROJECTION], - job->driver->stamps[UNIFORM_SHARED_PROJECTION], - &job->projection); + gsk_ngl_uniform_state_set_matrix (program->uniforms, + program->program_info, + UNIFORM_SHARED_PROJECTION, + job->driver->stamps[UNIFORM_SHARED_PROJECTION], + &job->projection); - if (program->uniform_locations[UNIFORM_SHARED_CLIP_RECT] > -1) - gsk_ngl_uniform_state_set_rounded_rect (program->uniforms, - program->program_info, - program->uniform_locations[UNIFORM_SHARED_CLIP_RECT], - job->driver->stamps[UNIFORM_SHARED_CLIP_RECT], - &job->current_clip->rect); + gsk_ngl_uniform_state_set_rounded_rect (program->uniforms, + program->program_info, + UNIFORM_SHARED_CLIP_RECT, + job->driver->stamps[UNIFORM_SHARED_CLIP_RECT], + &job->current_clip->rect); - if (program->uniform_locations[UNIFORM_SHARED_ALPHA] > -1) - gsk_ngl_uniform_state_set1f (program->uniforms, - program->program_info, - program->uniform_locations[UNIFORM_SHARED_ALPHA], - job->driver->stamps[UNIFORM_SHARED_ALPHA], - job->alpha); + gsk_ngl_uniform_state_set1f (program->uniforms, + program->program_info, + UNIFORM_SHARED_ALPHA, + job->driver->stamps[UNIFORM_SHARED_ALPHA], + job->alpha); } #define CHOOSE_PROGRAM(job,name) \ @@ -3086,10 +3081,6 @@ gsk_ngl_render_job_visit_gl_shader_node (GskNglRenderJob *job, const GskGLUniform *u = &uniforms[i]; const guint8 *data = base + u->offset; - /* Ignore unused uniforms */ - if (program->args_locations[i] == -1) - continue; - switch (u->type) { default: @@ -3098,38 +3089,38 @@ gsk_ngl_render_job_visit_gl_shader_node (GskNglRenderJob *job, case GSK_GL_UNIFORM_TYPE_FLOAT: gsk_ngl_uniform_state_set1fv (job->command_queue->uniforms, program->program_info, - program->args_locations[i], + UNIFORM_CUSTOM_ARG0 + i, 0, 1, (const float *)data); break; case GSK_GL_UNIFORM_TYPE_INT: gsk_ngl_uniform_state_set1i (job->command_queue->uniforms, program->program_info, - program->args_locations[i], + UNIFORM_CUSTOM_ARG0 + i, 0, *(const gint32 *)data); break; case GSK_GL_UNIFORM_TYPE_UINT: case GSK_GL_UNIFORM_TYPE_BOOL: gsk_ngl_uniform_state_set1ui (job->command_queue->uniforms, program->program_info, - program->args_locations[i], + UNIFORM_CUSTOM_ARG0 + i, 0, *(const guint32 *)data); break; case GSK_GL_UNIFORM_TYPE_VEC2: gsk_ngl_uniform_state_set2fv (job->command_queue->uniforms, program->program_info, - program->args_locations[i], + UNIFORM_CUSTOM_ARG0 + i, 0, 1, (const float *)data); break; case GSK_GL_UNIFORM_TYPE_VEC3: gsk_ngl_uniform_state_set3fv (job->command_queue->uniforms, program->program_info, - program->args_locations[i], + UNIFORM_CUSTOM_ARG0 + i, 0, 1, (const float *)data); break; case GSK_GL_UNIFORM_TYPE_VEC4: gsk_ngl_uniform_state_set4fv (job->command_queue->uniforms, program->program_info, - program->args_locations[i], + UNIFORM_CUSTOM_ARG0 + i, 0, 1, (const float *)data); break; } diff --git a/gsk/ngl/gskngluniformstate.c b/gsk/ngl/gskngluniformstate.c index c6fc9b5b67..44270e8fa5 100644 --- a/gsk/ngl/gskngluniformstate.c +++ b/gsk/ngl/gskngluniformstate.c @@ -92,14 +92,14 @@ gsk_ngl_uniform_state_unref (GskNglUniformState *state) } gpointer -gsk_ngl_uniform_state_init_value (GskNglUniformState *state, - GskNglUniformProgram *program, - GskNglUniformFormat format, - guint array_count, - guint location, - GskNglUniformInfoElement **infoptr) +gsk_ngl_uniform_state_init_value (GskNglUniformState *state, + GskNglUniformProgram *program, + GskNglUniformFormat format, + guint array_count, + guint key, + GskNglUniformMapping **infoptr) { - GskNglUniformInfoElement *info; + GskNglUniformMapping *mapping; guint offset; g_assert (state != NULL); @@ -107,23 +107,22 @@ gsk_ngl_uniform_state_init_value (GskNglUniformState *state, g_assert ((int)format >= 0 && format < GSK_NGL_UNIFORM_FORMAT_LAST); g_assert (format > 0); g_assert (program != NULL); - g_assert (program->sparse != NULL); - g_assert (program->n_sparse <= program->n_uniforms); - g_assert (location < GL_MAX_UNIFORM_LOCATIONS || location == (guint)-1); - g_assert (location < program->n_uniforms); + g_assert (key < program->n_mappings); - /* Handle unused uniforms gracefully */ - if G_UNLIKELY (location == (guint)-1) - return NULL; + mapping = &program->mappings[key]; - info = &program->uniforms[location]; - - if G_LIKELY (format == info->info.format) + if (mapping->location == -1) { - if G_LIKELY (array_count <= info->info.array_count) + *infoptr = NULL; + return NULL; + } + + if G_LIKELY (format == mapping->info.format) + { + if G_LIKELY (array_count <= mapping->info.array_count) { - *infoptr = info; - return GSK_NGL_UNIFORM_VALUE (state->values_buf, info->info.offset); + *infoptr = mapping; + return GSK_NGL_UNIFORM_VALUE (state->values_buf, mapping->info.offset); } /* We found the uniform, but there is not enough space for the @@ -136,7 +135,7 @@ gsk_ngl_uniform_state_init_value (GskNglUniformState *state, */ goto setup_info; } - else if (info->info.format == 0) + else if (mapping->info.format == 0) { goto setup_info; } @@ -145,8 +144,8 @@ gsk_ngl_uniform_state_init_value (GskNglUniformState *state, g_critical ("Attempt to access uniform with different type of value " "than it was initialized with. Program %u Location %u. " "Was %d now %d (array length %d now %d).", - program->program_id, location, info->info.format, format, - info->info.array_count, array_count); + program->program_id, key, mapping->info.format, format, + mapping->info.array_count, array_count); *infoptr = NULL; return NULL; } @@ -160,22 +159,15 @@ setup_info: /* we have 21 bits for offset */ g_assert (offset < (1 << GSK_NGL_UNIFORM_OFFSET_BITS)); - /* We could once again be setting up this info if the array size grew. - * So make sure that we have space in our space array for the value. - */ - g_assert (info->info.format != 0 || program->n_sparse < program->n_uniforms); - if (info->info.format == 0) - program->sparse[program->n_sparse++] = location; + mapping->info.format = format; + mapping->info.offset = offset; + mapping->info.array_count = array_count; + mapping->info.initial = TRUE; + mapping->stamp = 0; - info->info.format = format; - info->info.offset = offset; - info->info.array_count = array_count; - info->info.initial = TRUE; - info->stamp = 0; + *infoptr = mapping; - *infoptr = info; - - return GSK_NGL_UNIFORM_VALUE (state->values_buf, info->info.offset); + return GSK_NGL_UNIFORM_VALUE (state->values_buf, mapping->info.offset); } void @@ -196,24 +188,25 @@ gsk_ngl_uniform_state_end_frame (GskNglUniformState *state) g_hash_table_iter_init (&iter, state->programs); while (g_hash_table_iter_next (&iter, NULL, (gpointer *)&program)) { - for (guint j = 0; j < program->n_sparse; j++) + for (guint j = 0; j < program->n_mappings; j++) { - guint location = program->sparse[j]; - GskNglUniformInfoElement *info = &program->uniforms[location]; + GskNglUniformMapping *mapping = &program->mappings[j]; guint size; - g_assert (info->info.format > 0); + /* Skip unused uniform mappings */ + if (mapping->info.format == 0 || mapping->location == -1) + continue; /* Calculate how much size is needed for the uniform, including arrays */ - size = uniform_sizes[info->info.format] * MAX (1, info->info.array_count); + size = uniform_sizes[mapping->info.format] * MAX (1, mapping->info.array_count); /* Adjust alignment for value */ allocator += gsk_ngl_uniform_state_align (allocator, size); /* Offset is in slots of 4 bytes */ - info->info.offset = allocator / 4; - info->info.initial = TRUE; - info->stamp = 0; + mapping->info.offset = allocator / 4; + mapping->info.initial = TRUE; + mapping->stamp = 0; /* Now advance for this items data */ allocator += size; @@ -237,35 +230,27 @@ gsk_ngl_uniform_format_size (GskNglUniformFormat format) } GskNglUniformProgram * -gsk_ngl_uniform_state_get_program (GskNglUniformState *state, - guint program, - guint n_uniforms) +gsk_ngl_uniform_state_get_program (GskNglUniformState *state, + guint program, + const GskNglUniformMapping *mappings, + guint n_mappings) { GskNglUniformProgram *ret; g_return_val_if_fail (state != NULL, NULL); g_return_val_if_fail (program > 0, NULL); g_return_val_if_fail (program < G_MAXUINT, NULL); + g_return_val_if_fail (n_mappings <= G_N_ELEMENTS (ret->mappings), NULL); ret = g_hash_table_lookup (state->programs, GUINT_TO_POINTER (program)); if (ret == NULL) { - gsize uniform_size = n_uniforms * sizeof (GskNglUniformInfoElement); - gsize sparse_size = n_uniforms * sizeof (guint); - gsize size = sizeof (GskNglUniformProgram) + uniform_size + sparse_size; - - /* Must be multiple of 4 for space pointer to align */ - G_STATIC_ASSERT (sizeof (GskNglUniformInfoElement) == 8); - - ret = g_malloc0 (size); + ret = g_new0 (GskNglUniformProgram, 1); ret->program_id = program; - ret->n_uniforms = n_uniforms; - ret->n_sparse = 0; - ret->sparse = (guint *)&ret->uniforms[n_uniforms]; + ret->n_mappings = n_mappings; - for (guint i = 0; i < n_uniforms; i++) - ret->uniforms[i].info.initial = TRUE; + memcpy (ret->mappings, mappings, n_mappings * sizeof *mappings); g_hash_table_insert (state->programs, GUINT_TO_POINTER (program), ret); } diff --git a/gsk/ngl/gskngluniformstateprivate.h b/gsk/ngl/gskngluniformstateprivate.h index fe2852f68f..be36c6e88a 100644 --- a/gsk/ngl/gskngluniformstateprivate.h +++ b/gsk/ngl/gskngluniformstateprivate.h @@ -51,30 +51,21 @@ typedef struct _GskNglUniformInfo G_STATIC_ASSERT (sizeof (GskNglUniformInfo) == 4); -typedef struct _GskNglUniformInfoElement +typedef struct _GskNglUniformMapping { + const char *name; GskNglUniformInfo info; guint stamp; -} GskNglUniformInfoElement; - -G_STATIC_ASSERT (sizeof (GskNglUniformInfoElement) == 8); + int location; +} GskNglUniformMapping; typedef struct _GskNglUniformProgram { guint program_id; guint n_uniforms : 12; guint has_attachments : 1; - - /* To avoid walking our 1:1 array of location->uniform slots, we have - * a sparse index that allows us to skip the empty zones. - */ - guint *sparse; - guint n_sparse; - - /* Uniforms are provided inline at the end of structure to avoid - * an extra dereference. - */ - GskNglUniformInfoElement uniforms[0]; + guint n_mappings; + GskNglUniformMapping mappings[32]; } GskNglUniformProgram; typedef struct _GskNglUniformState @@ -86,20 +77,6 @@ typedef struct _GskNglUniformState GskNglUniformInfo apply_hash[512]; } GskNglUniformState; -/** - * GskNglUniformStateCallback: - * @info: a pointer to the information about the uniform - * @location: the location of the uniform within the GPU program. - * @user_data: closure data for the callback - * - * This callback can be used to snapshot state of a program which - * is useful when batching commands so that the state may be compared - * with future evocations of the program. - */ -typedef void (*GskNglUniformStateCallback) (const GskNglUniformInfo *info, - guint location, - gpointer user_data); - typedef enum _GskNglUniformKind { GSK_NGL_UNIFORM_FORMAT_1F = 1, @@ -131,49 +108,42 @@ typedef enum _GskNglUniformKind G_STATIC_ASSERT (GSK_NGL_UNIFORM_FORMAT_LAST < (1 << GSK_NGL_UNIFORM_FORMAT_BITS)); GskNglUniformState *gsk_ngl_uniform_state_new (void); -GskNglUniformState *gsk_ngl_uniform_state_ref (GskNglUniformState *state); -void gsk_ngl_uniform_state_unref (GskNglUniformState *state); -GskNglUniformProgram *gsk_ngl_uniform_state_get_program (GskNglUniformState *state, - guint program, - guint n_uniforms); -void gsk_ngl_uniform_state_end_frame (GskNglUniformState *state); -gsize gsk_ngl_uniform_format_size (GskNglUniformFormat format); -gpointer gsk_ngl_uniform_state_init_value (GskNglUniformState *state, - GskNglUniformProgram *program, - GskNglUniformFormat format, - guint array_count, - guint location, - GskNglUniformInfoElement **infoptr); +GskNglUniformState *gsk_ngl_uniform_state_ref (GskNglUniformState *state); +void gsk_ngl_uniform_state_unref (GskNglUniformState *state); +GskNglUniformProgram *gsk_ngl_uniform_state_get_program (GskNglUniformState *state, + guint program, + const GskNglUniformMapping *mappings, + guint n_mappings); +void gsk_ngl_uniform_state_end_frame (GskNglUniformState *state); +gsize gsk_ngl_uniform_format_size (GskNglUniformFormat format); +gpointer gsk_ngl_uniform_state_init_value (GskNglUniformState *state, + GskNglUniformProgram *program, + GskNglUniformFormat format, + guint array_count, + guint key, + GskNglUniformMapping **out_mapping); #define GSK_NGL_UNIFORM_VALUE(base, offset) ((gpointer)((base) + ((offset) * 4))) #define gsk_ngl_uniform_state_get_uniform_data(state,offset) GSK_NGL_UNIFORM_VALUE((state)->values_buf, offset) -#define gsk_ngl_uniform_state_snapshot(state, program_info, callback, user_data) \ - G_STMT_START { \ - for (guint z = 0; z < program_info->n_sparse; z++) \ - { \ - guint location = program_info->sparse[z]; \ - GskNglUniformInfoElement *info = &program_info->uniforms[location]; \ - \ - g_assert (location < GL_MAX_UNIFORM_LOCATIONS); \ - g_assert (location < program_info->n_uniforms); \ - \ - if (info->info.format > 0) \ - callback (&info->info, location, user_data); \ - } \ - } G_STMT_END static inline gpointer -gsk_ngl_uniform_state_get_value (GskNglUniformState *state, - GskNglUniformProgram *program, - GskNglUniformFormat format, - guint array_count, - guint location, - guint stamp, - GskNglUniformInfoElement **infoptr) +gsk_ngl_uniform_state_get_value (GskNglUniformState *state, + GskNglUniformProgram *program, + GskNglUniformFormat format, + guint array_count, + guint key, + guint stamp, + GskNglUniformMapping **out_mapping) { - GskNglUniformInfoElement *info; + GskNglUniformMapping *mapping; - if (location == (guint)-1) + g_assert (key < G_N_ELEMENTS (program->mappings)); + g_assert (key < program->n_mappings); + + mapping = &program->mappings[key]; + + /* Short-circuit if the program optimized the uniform out */ + if (mapping->location == -1) return NULL; /* If the stamp is the same, then we can ignore the request @@ -185,17 +155,16 @@ gsk_ngl_uniform_state_get_value (GskNglUniformState *state, * modelview, clip, etc to avoid so many comparisons which cost * considerable CPU. */ - info = &program->uniforms[location]; - if (stamp != 0 && stamp == info->stamp) + if (stamp != 0 && stamp == mapping->stamp) return NULL; - if G_LIKELY (format == info->info.format && array_count <= info->info.array_count) + if G_LIKELY (format == mapping->info.format && array_count <= mapping->info.array_count) { - *infoptr = info; - return GSK_NGL_UNIFORM_VALUE (state->values_buf, info->info.offset); + *out_mapping = mapping; + return GSK_NGL_UNIFORM_VALUE (state->values_buf, mapping->info.offset); } - return gsk_ngl_uniform_state_init_value (state, program, format, array_count, location, infoptr); + return gsk_ngl_uniform_state_init_value (state, program, format, array_count, key, out_mapping); } static inline guint @@ -251,8 +220,7 @@ gsk_ngl_uniform_state_realloc (GskNglUniformState *state, } G_STMT_END static inline void -gsk_ngl_uniform_info_changed (GskNglUniformInfoElement *info, - guint location, +gsk_ngl_uniform_info_changed (GskNglUniformMapping *info, guint stamp) { info->stamp = stamp; @@ -262,23 +230,23 @@ gsk_ngl_uniform_info_changed (GskNglUniformInfoElement *info, static inline void gsk_ngl_uniform_state_set1f (GskNglUniformState *state, GskNglUniformProgram *program, - guint location, + guint key, guint stamp, float value0) { Uniform1f *u; - GskNglUniformInfoElement *info; + GskNglUniformMapping *info; g_assert (state != NULL); g_assert (program != 0); - if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_1F, 1, location, stamp, &info))) + if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_1F, 1, key, stamp, &info))) { if (info->info.initial || u->v0 != value0) { GSK_NGL_UNIFORM_STATE_REPLACE (info, u, Uniform1f , 1); u->v0 = value0; - gsk_ngl_uniform_info_changed (info, location, stamp); + gsk_ngl_uniform_info_changed (info, stamp); } } } @@ -286,25 +254,25 @@ gsk_ngl_uniform_state_set1f (GskNglUniformState *state, static inline void gsk_ngl_uniform_state_set2f (GskNglUniformState *state, GskNglUniformProgram *program, - guint location, + guint key, guint stamp, float value0, float value1) { Uniform2f *u; - GskNglUniformInfoElement *info; + GskNglUniformMapping *info; g_assert (state != NULL); g_assert (program != NULL); - if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_2F, 1, location, stamp, &info))) + if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_2F, 1, key, stamp, &info))) { if (info->info.initial || u->v0 != value0 || u->v1 != value1) { GSK_NGL_UNIFORM_STATE_REPLACE (info, u, Uniform2f, 1); u->v0 = value0; u->v1 = value1; - gsk_ngl_uniform_info_changed (info, location, stamp); + gsk_ngl_uniform_info_changed (info, stamp); } } } @@ -312,19 +280,19 @@ gsk_ngl_uniform_state_set2f (GskNglUniformState *state, static inline void gsk_ngl_uniform_state_set3f (GskNglUniformState *state, GskNglUniformProgram *program, - guint location, + guint key, guint stamp, float value0, float value1, float value2) { Uniform3f *u; - GskNglUniformInfoElement *info; + GskNglUniformMapping *info; g_assert (state != NULL); g_assert (program != NULL); - if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_3F, 1, location, stamp, &info))) + if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_3F, 1, key, stamp, &info))) { if (info->info.initial || u->v0 != value0 || u->v1 != value1 || u->v2 != value2) { @@ -332,7 +300,7 @@ gsk_ngl_uniform_state_set3f (GskNglUniformState *state, u->v0 = value0; u->v1 = value1; u->v2 = value2; - gsk_ngl_uniform_info_changed (info, location, stamp); + gsk_ngl_uniform_info_changed (info, stamp); } } } @@ -340,7 +308,7 @@ gsk_ngl_uniform_state_set3f (GskNglUniformState *state, static inline void gsk_ngl_uniform_state_set4f (GskNglUniformState *state, GskNglUniformProgram *program, - guint location, + guint key, guint stamp, float value0, float value1, @@ -348,12 +316,12 @@ gsk_ngl_uniform_state_set4f (GskNglUniformState *state, float value3) { Uniform4f *u; - GskNglUniformInfoElement *info; + GskNglUniformMapping *info; g_assert (state != NULL); g_assert (program != NULL); - if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_4F, 1, location, stamp, &info))) + if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_4F, 1, key, stamp, &info))) { if (info->info.initial || u->v0 != value0 || u->v1 != value1 || u->v2 != value2 || u->v3 != value3) { @@ -362,7 +330,7 @@ gsk_ngl_uniform_state_set4f (GskNglUniformState *state, u->v1 = value1; u->v2 = value2; u->v3 = value3; - gsk_ngl_uniform_info_changed (info, location, stamp); + gsk_ngl_uniform_info_changed (info, stamp); } } } @@ -370,23 +338,23 @@ gsk_ngl_uniform_state_set4f (GskNglUniformState *state, static inline void gsk_ngl_uniform_state_set1ui (GskNglUniformState *state, GskNglUniformProgram *program, - guint location, + guint key, guint stamp, guint value0) { Uniform1ui *u; - GskNglUniformInfoElement *info; + GskNglUniformMapping *info; g_assert (state != NULL); g_assert (program != NULL); - if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_1UI, 1, location, stamp, &info))) + if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_1UI, 1, key, stamp, &info))) { if (info->info.initial || u->v0 != value0) { GSK_NGL_UNIFORM_STATE_REPLACE (info, u, Uniform1ui, 1); u->v0 = value0; - gsk_ngl_uniform_info_changed (info, location, stamp); + gsk_ngl_uniform_info_changed (info, stamp); } } } @@ -394,23 +362,23 @@ gsk_ngl_uniform_state_set1ui (GskNglUniformState *state, static inline void gsk_ngl_uniform_state_set1i (GskNglUniformState *state, GskNglUniformProgram *program, - guint location, + guint key, guint stamp, int value0) { Uniform1i *u; - GskNglUniformInfoElement *info; + GskNglUniformMapping *info; g_assert (state != NULL); g_assert (program != NULL); - if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_1I, 1, location, stamp, &info))) + if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_1I, 1, key, stamp, &info))) { if (info->info.initial || u->v0 != value0) { GSK_NGL_UNIFORM_STATE_REPLACE (info, u, Uniform1i, 1); u->v0 = value0; - gsk_ngl_uniform_info_changed (info, location, stamp); + gsk_ngl_uniform_info_changed (info, stamp); } } } @@ -418,25 +386,25 @@ gsk_ngl_uniform_state_set1i (GskNglUniformState *state, static inline void gsk_ngl_uniform_state_set2i (GskNglUniformState *state, GskNglUniformProgram *program, - guint location, + guint key, guint stamp, int value0, int value1) { Uniform2i *u; - GskNglUniformInfoElement *info; + GskNglUniformMapping *info; g_assert (state != NULL); g_assert (program != NULL); - if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_2I, 1, location, stamp, &info))) + if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_2I, 1, key, stamp, &info))) { if (info->info.initial || u->v0 != value0 || u->v1 != value1) { GSK_NGL_UNIFORM_STATE_REPLACE (info, u, Uniform2i, 1); u->v0 = value0; u->v1 = value1; - gsk_ngl_uniform_info_changed (info, location, stamp); + gsk_ngl_uniform_info_changed (info, stamp); } } } @@ -444,19 +412,19 @@ gsk_ngl_uniform_state_set2i (GskNglUniformState *state, static inline void gsk_ngl_uniform_state_set3i (GskNglUniformState *state, GskNglUniformProgram *program, - guint location, + guint key, guint stamp, int value0, int value1, int value2) { Uniform3i *u; - GskNglUniformInfoElement *info; + GskNglUniformMapping *info; g_assert (state != NULL); g_assert (program != NULL); - if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_3I, 1, location, stamp, &info))) + if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_3I, 1, key, stamp, &info))) { if (info->info.initial || u->v0 != value0 || u->v1 != value1 || u->v2 != value2) { @@ -464,7 +432,7 @@ gsk_ngl_uniform_state_set3i (GskNglUniformState *state, u->v0 = value0; u->v1 = value1; u->v2 = value2; - gsk_ngl_uniform_info_changed (info, location, stamp); + gsk_ngl_uniform_info_changed (info, stamp); } } } @@ -472,7 +440,7 @@ gsk_ngl_uniform_state_set3i (GskNglUniformState *state, static inline void gsk_ngl_uniform_state_set4i (GskNglUniformState *state, GskNglUniformProgram *program, - guint location, + guint key, guint stamp, int value0, int value1, @@ -480,12 +448,12 @@ gsk_ngl_uniform_state_set4i (GskNglUniformState *state, int value3) { Uniform4i *u; - GskNglUniformInfoElement *info; + GskNglUniformMapping *info; g_assert (state != NULL); g_assert (program != NULL); - if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_4I, 1, location, stamp, &info))) + if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_4I, 1, key, stamp, &info))) { if (info->info.initial || u->v0 != value0 || u->v1 != value1 || u->v2 != value2 || u->v3 != value3) { @@ -494,7 +462,7 @@ gsk_ngl_uniform_state_set4i (GskNglUniformState *state, u->v1 = value1; u->v2 = value2; u->v3 = value3; - gsk_ngl_uniform_info_changed (info, location, stamp); + gsk_ngl_uniform_info_changed (info, stamp); } } } @@ -502,24 +470,24 @@ gsk_ngl_uniform_state_set4i (GskNglUniformState *state, static inline void gsk_ngl_uniform_state_set_rounded_rect (GskNglUniformState *state, GskNglUniformProgram *program, - guint location, + guint key, guint stamp, const GskRoundedRect *rounded_rect) { GskRoundedRect *u; - GskNglUniformInfoElement *info; + GskNglUniformMapping *info; g_assert (state != NULL); g_assert (program != NULL); g_assert (rounded_rect != NULL); - if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_ROUNDED_RECT, 1, location, stamp, &info))) + if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_ROUNDED_RECT, 1, key, stamp, &info))) { if (info->info.initial || memcmp (u, rounded_rect, sizeof *u) != 0) { GSK_NGL_UNIFORM_STATE_REPLACE (info, u, GskRoundedRect, 1); memcpy (u, rounded_rect, sizeof *rounded_rect); - gsk_ngl_uniform_info_changed (info, location, stamp); + gsk_ngl_uniform_info_changed (info, stamp); } } } @@ -527,24 +495,24 @@ gsk_ngl_uniform_state_set_rounded_rect (GskNglUniformState *state, static inline void gsk_ngl_uniform_state_set_matrix (GskNglUniformState *state, GskNglUniformProgram *program, - guint location, + guint key, guint stamp, const graphene_matrix_t *matrix) { graphene_matrix_t *u; - GskNglUniformInfoElement *info; + GskNglUniformMapping *info; g_assert (state != NULL); g_assert (program != NULL); g_assert (matrix != NULL); - if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_MATRIX, 1, location, stamp, &info))) + if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_MATRIX, 1, key, stamp, &info))) { if (info->info.initial || memcmp (u, matrix, sizeof *u) != 0) { GSK_NGL_UNIFORM_STATE_REPLACE (info, u, graphene_matrix_t, 1); memcpy (u, matrix, sizeof *matrix); - gsk_ngl_uniform_info_changed (info, location, stamp); + gsk_ngl_uniform_info_changed (info, stamp); } } } @@ -566,11 +534,11 @@ gsk_ngl_uniform_state_set_matrix (GskNglUniformState *state, static inline void gsk_ngl_uniform_state_set_texture (GskNglUniformState *state, GskNglUniformProgram *program, - guint location, + guint key, guint stamp, guint texture_slot) { - GskNglUniformInfoElement *info; + GskNglUniformMapping *info; guint *u; g_assert (texture_slot >= GL_TEXTURE0); @@ -578,13 +546,13 @@ gsk_ngl_uniform_state_set_texture (GskNglUniformState *state, texture_slot -= GL_TEXTURE0; - if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_TEXTURE, 1, location, stamp, &info))) + if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_TEXTURE, 1, key, stamp, &info))) { if (info->info.initial || *u != texture_slot) { GSK_NGL_UNIFORM_STATE_REPLACE (info, u, guint, 1); *u = texture_slot; - gsk_ngl_uniform_info_changed (info, location, stamp); + gsk_ngl_uniform_info_changed (info, stamp); } } } @@ -603,18 +571,18 @@ gsk_ngl_uniform_state_set_texture (GskNglUniformState *state, static inline void gsk_ngl_uniform_state_set_color (GskNglUniformState *state, GskNglUniformProgram *program, - guint location, + guint key, guint stamp, const GdkRGBA *color) { static const GdkRGBA transparent = {0}; - GskNglUniformInfoElement *info; + GskNglUniformMapping *info; GdkRGBA *u; g_assert (state != NULL); g_assert (program != NULL); - if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_COLOR, 1, location, stamp, &info))) + if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_COLOR, 1, key, stamp, &info))) { if (color == NULL) color = &transparent; @@ -623,7 +591,7 @@ gsk_ngl_uniform_state_set_color (GskNglUniformState *state, { GSK_NGL_UNIFORM_STATE_REPLACE (info, u, GdkRGBA, 1); memcpy (u, color, sizeof *color); - gsk_ngl_uniform_info_changed (info, location, stamp); + gsk_ngl_uniform_info_changed (info, stamp); } } } @@ -631,25 +599,25 @@ gsk_ngl_uniform_state_set_color (GskNglUniformState *state, static inline void gsk_ngl_uniform_state_set1fv (GskNglUniformState *state, GskNglUniformProgram *program, - guint location, + guint key, guint stamp, guint count, const float *value) { Uniform1f *u; - GskNglUniformInfoElement *info; + GskNglUniformMapping *info; g_assert (state != NULL); g_assert (program != NULL); g_assert (count > 0); - if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_1FV, count, location, stamp, &info))) + if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_1FV, count, key, stamp, &info))) { if (info->info.initial || count != info->info.array_count || memcmp (u, value, sizeof *u * count) != 0) { GSK_NGL_UNIFORM_STATE_REPLACE (info, u, Uniform1f, count); memcpy (u, value, sizeof (Uniform1f) * count); - gsk_ngl_uniform_info_changed (info, location, stamp); + gsk_ngl_uniform_info_changed (info, stamp); } } } @@ -657,25 +625,25 @@ gsk_ngl_uniform_state_set1fv (GskNglUniformState *state, static inline void gsk_ngl_uniform_state_set2fv (GskNglUniformState *state, GskNglUniformProgram *program, - guint location, + guint key, guint stamp, guint count, const float *value) { Uniform2f *u; - GskNglUniformInfoElement *info; + GskNglUniformMapping *info; g_assert (state != NULL); g_assert (program != NULL); g_assert (count > 0); - if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_2FV, count, location, stamp, &info))) + if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_2FV, count, key, stamp, &info))) { if (info->info.initial || count != info->info.array_count || memcmp (u, value, sizeof *u * count) != 0) { GSK_NGL_UNIFORM_STATE_REPLACE (info, u, Uniform2f, count); memcpy (u, value, sizeof (Uniform2f) * count); - gsk_ngl_uniform_info_changed (info, location, stamp); + gsk_ngl_uniform_info_changed (info, stamp); } } } @@ -683,25 +651,25 @@ gsk_ngl_uniform_state_set2fv (GskNglUniformState *state, static inline void gsk_ngl_uniform_state_set3fv (GskNglUniformState *state, GskNglUniformProgram *program, - guint location, + guint key, guint stamp, guint count, const float *value) { Uniform3f *u; - GskNglUniformInfoElement *info; + GskNglUniformMapping *info; g_assert (state != NULL); g_assert (program != NULL); g_assert (count > 0); - if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_3FV, count, location, stamp, &info))) + if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_3FV, count, key, stamp, &info))) { if (info->info.initial || count != info->info.array_count || memcmp (u, value, sizeof *u * count) != 0) { GSK_NGL_UNIFORM_STATE_REPLACE (info, u, Uniform3f, count); memcpy (u, value, sizeof (Uniform3f) * count); - gsk_ngl_uniform_info_changed (info, location, stamp); + gsk_ngl_uniform_info_changed (info, stamp); } } } @@ -709,25 +677,25 @@ gsk_ngl_uniform_state_set3fv (GskNglUniformState *state, static inline void gsk_ngl_uniform_state_set4fv (GskNglUniformState *state, GskNglUniformProgram *program, - guint location, + guint key, guint stamp, guint count, const float *value) { Uniform4f *u; - GskNglUniformInfoElement *info; + GskNglUniformMapping *info; g_assert (state != NULL); g_assert (program != NULL); g_assert (count > 0); - if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_4FV, count, location, stamp, &info))) + if ((u = gsk_ngl_uniform_state_get_value (state, program, GSK_NGL_UNIFORM_FORMAT_4FV, count, key, stamp, &info))) { if (info->info.initial || count != info->info.array_count || memcmp (u, value, sizeof *u * count) != 0) { GSK_NGL_UNIFORM_STATE_REPLACE (info, u, Uniform4f, count); memcpy (u, value, sizeof (Uniform4f) * count); - gsk_ngl_uniform_info_changed (info, location, stamp); + gsk_ngl_uniform_info_changed (info, stamp); } } }