From 7416aa762f12a17a46d7dd903c777571a6720129 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Thu, 30 Jun 2016 15:07:16 +0100 Subject: [PATCH] gsk: Group render state attributes --- gsk/gskglrenderer.c | 89 ++++++++++++++++++++++++--------------------- 1 file changed, 47 insertions(+), 42 deletions(-) diff --git a/gsk/gskglrenderer.c b/gsk/gskglrenderer.c index a2f9a2f48c..776b985606 100644 --- a/gsk/gskglrenderer.c +++ b/gsk/gskglrenderer.c @@ -12,6 +12,19 @@ #include +typedef struct { + guint vao_id; + guint buffer_id; + guint texture_id; + guint program_id; + + guint mvp_location; + guint map_location; + guint uv_location; + guint position_location; + guint alpha_location; +} RenderData; + typedef struct { /* Back pointer to the node, only meant for comparison */ GskRenderNode *node; @@ -29,15 +42,7 @@ typedef struct { const char *name; - guint vao_id; - guint texture_id; - guint program_id; - guint mvp_location; - guint map_location; - guint uv_location; - guint position_location; - guint alpha_location; - guint buffer_id; + RenderData render_data; } RenderItem; struct _GskGLRenderer @@ -489,15 +494,15 @@ render_item_clear (gpointer data_) GSK_NOTE (OPENGL, g_print ("Destroying render item [%p] buffer %u\n", item, - item->buffer_id)); - glDeleteBuffers (1, &item->buffer_id); - item->buffer_id = 0; + item->render_data.buffer_id)); + glDeleteBuffers (1, &item->render_data.buffer_id); + item->render_data.buffer_id = 0; GSK_NOTE (OPENGL, g_print ("Destroying render item [%p] texture %u\n", item, - item->texture_id)); - glDeleteTextures (1, &item->texture_id); - item->texture_id = 0; + item->render_data.texture_id)); + glDeleteTextures (1, &item->render_data.texture_id); + item->render_data.texture_id = 0; graphene_matrix_init_identity (&item->mvp); @@ -515,10 +520,10 @@ render_item (RenderItem *item) }; float mvp[16]; - glBindVertexArray (item->vao_id); + glBindVertexArray (item->render_data.vao_id); /* Generate the vertex buffer for the texture quad */ - if (item->buffer_id == 0) + if (item->render_data.buffer_id == 0) { struct vertex_info vertex_data[] = { { { item->min.x, item->min.y }, { 0, 0 }, }, @@ -532,44 +537,44 @@ render_item (RenderItem *item) GSK_NOTE (OPENGL, g_print ("Creating quad for render item [%p]\n", item)); - glGenBuffers (1, &item->buffer_id); - glBindBuffer (GL_ARRAY_BUFFER, item->buffer_id); + glGenBuffers (1, &(item->render_data.buffer_id)); + glBindBuffer (GL_ARRAY_BUFFER, item->render_data.buffer_id); /* The data won't change */ glBufferData (GL_ARRAY_BUFFER, sizeof (vertex_data), vertex_data, GL_STATIC_DRAW); /* Set up the buffers with the computed position and texels */ - glEnableVertexAttribArray (item->position_location); - glVertexAttribPointer (item->position_location, 2, GL_FLOAT, GL_FALSE, + glEnableVertexAttribArray (item->render_data.position_location); + glVertexAttribPointer (item->render_data.position_location, 2, GL_FLOAT, GL_FALSE, sizeof (struct vertex_info), (void *) G_STRUCT_OFFSET (struct vertex_info, position)); - glEnableVertexAttribArray (item->uv_location); - glVertexAttribPointer (item->uv_location, 2, GL_FLOAT, GL_FALSE, + glEnableVertexAttribArray (item->render_data.uv_location); + glVertexAttribPointer (item->render_data.uv_location, 2, GL_FLOAT, GL_FALSE, sizeof (struct vertex_info), (void *) G_STRUCT_OFFSET (struct vertex_info, uv)); } else { /* We already set up the vertex buffer, so we just need to reuse it */ - glBindBuffer (GL_ARRAY_BUFFER, item->buffer_id); - glEnableVertexAttribArray (item->position_location); - glEnableVertexAttribArray (item->uv_location); + glBindBuffer (GL_ARRAY_BUFFER, item->render_data.buffer_id); + glEnableVertexAttribArray (item->render_data.position_location); + glEnableVertexAttribArray (item->render_data.uv_location); } - glUseProgram (item->program_id); + glUseProgram (item->render_data.program_id); /* Use texture unit 0 for the sampler */ glActiveTexture (GL_TEXTURE0); - glBindTexture (GL_TEXTURE_2D, item->texture_id); - glUniform1i (item->map_location, 0); + glBindTexture (GL_TEXTURE_2D, item->render_data.texture_id); + glUniform1i (item->render_data.map_location, 0); /* Pass the opacity component */ - glUniform1f (item->alpha_location, item->opaque ? 1 : item->opacity); + glUniform1f (item->render_data.alpha_location, item->opaque ? 1 : item->opacity); /* Pass the mvp to the vertex shader */ GSK_NOTE (OPENGL, graphene_matrix_print (&item->mvp)); graphene_matrix_to_float (&item->mvp, mvp); - glUniformMatrix4fv (item->mvp_location, 1, GL_FALSE, mvp); + glUniformMatrix4fv (item->render_data.mvp_location, 1, GL_FALSE, mvp); /* Draw the quad */ GSK_NOTE (OPENGL, g_print ("Drawing item <%s>[%p] with opacity: %g\n", @@ -581,8 +586,8 @@ render_item (RenderItem *item) /* Reset the state */ glBindTexture (GL_TEXTURE_2D, 0); - glDisableVertexAttribArray (item->position_location); - glDisableVertexAttribArray (item->uv_location); + glDisableVertexAttribArray (item->render_data.position_location); + glDisableVertexAttribArray (item->render_data.uv_location); glUseProgram (0); } @@ -735,14 +740,14 @@ gsk_gl_renderer_add_render_item (GskGLRenderer *self, item.opacity = gsk_render_node_get_opacity (node); /* GL objects */ - item.vao_id = self->vao_id; - item.buffer_id = 0; - item.program_id = self->program_id; - item.map_location = self->map_location; - item.mvp_location = self->mvp_location; - item.uv_location = self->uv_location; - item.position_location = self->position_location; - item.alpha_location = self->alpha_location; + item.render_data.vao_id = self->vao_id; + item.render_data.buffer_id = 0; + item.render_data.program_id = self->program_id; + item.render_data.map_location = self->map_location; + item.render_data.mvp_location = self->mvp_location; + item.render_data.uv_location = self->uv_location; + item.render_data.position_location = self->position_location; + item.render_data.alpha_location = self->alpha_location; gsk_renderer_get_projection (GSK_RENDERER (self), &projection); item.z = project_item (&projection, &mv); @@ -765,7 +770,7 @@ gsk_gl_renderer_add_render_item (GskGLRenderer *self, if (surface == NULL) goto recurse_children; - surface_to_texture (surface, &bounds, gl_min_filter, gl_mag_filter, &item.texture_id); + surface_to_texture (surface, &bounds, gl_min_filter, gl_mag_filter, &(item.render_data.texture_id)); GSK_NOTE (OPENGL, g_print ("Adding node <%s>[%p] to render items\n", node->name != NULL ? node->name : "unnamed",