summaryrefslogtreecommitdiff
path: root/gsk/gl
diff options
context:
space:
mode:
authorTimm Bäder <mail@baedert.org>2017-12-16 10:02:03 +0100
committerTimm Bäder <mail@baedert.org>2017-12-21 19:12:32 +0100
commit48be2aed230e4e71998b6166679aadb0d1ccfce7 (patch)
tree79d619f64ab286b0be172d9a0ab24bd59eccf242 /gsk/gl
parent28499032da585c914a9089249f8374e48b9ae159 (diff)
downloadgtk+-48be2aed230e4e71998b6166679aadb0d1ccfce7.tar.gz
gl renderer: Use one function per op type to apply data
Diffstat (limited to 'gsk/gl')
-rw-r--r--gsk/gl/gskglrenderer.c389
1 files changed, 251 insertions, 138 deletions
diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c
index 95cc513b77..9d1318af17 100644
--- a/gsk/gl/gskglrenderer.c
+++ b/gsk/gl/gskglrenderer.c
@@ -1038,6 +1038,240 @@ render_cross_fade_node (GskGLRenderer *self,
ops_draw (builder, vertex_data);
}
+static inline void
+apply_viewport_op (const Program *program,
+ const RenderOp *op)
+{
+ OP_PRINT (" -> New Viewport: %f, %f, %f, %f", op->viewport.origin.x, op->viewport.origin.y, op->viewport.size.width, op->viewport.size.height);
+ glUniform4f (program->viewport_location,
+ op->viewport.origin.x, op->viewport.origin.y,
+ op->viewport.size.width, op->viewport.size.height);
+ glViewport (0, 0, op->viewport.size.width, op->viewport.size.height);
+}
+
+static inline void
+apply_modelview_op (const Program *program,
+ const RenderOp *op)
+{
+ float mat[16];
+
+ OP_PRINT (" -> Modelview");
+ graphene_matrix_to_float (&op->modelview, mat);
+ glUniformMatrix4fv (program->modelview_location, 1, GL_FALSE, mat);
+}
+
+static inline void
+apply_projection_op (const Program *program,
+ const RenderOp *op)
+{
+ float mat[16];
+
+ OP_PRINT (" -> Projection");
+ graphene_matrix_to_float (&op->projection, mat);
+ glUniformMatrix4fv (program->projection_location, 1, GL_FALSE, mat);
+}
+
+static inline void
+apply_program_op (const Program *program,
+ const RenderOp *op)
+{
+ OP_PRINT (" -> Program: %d", op->program->index);
+ glUseProgram (op->program->id);
+}
+
+static inline void
+apply_render_target_op (GskGLRenderer *self,
+ const Program *program,
+ const RenderOp *op)
+{
+ OP_PRINT (" -> Render Target: %d", op->render_target_id);
+
+ glBindFramebuffer (GL_FRAMEBUFFER, op->render_target_id);
+
+ if (op->render_target_id != 0)
+ glDisable (GL_SCISSOR_TEST);
+ else
+ gsk_gl_renderer_setup_render_mode (self); /* Reset glScissor etc. */
+}
+
+static inline void
+apply_color_op (const Program *program,
+ const RenderOp *op)
+{
+ OP_PRINT (" -> Color: (%f, %f, %f, %f)", op->color.red, op->color.green, op->color.blue, op->color.alpha);
+ /* TODO: We use color.color_location here and this is right for all three of the programs above,
+ * but that's just a coincidence. */
+ glUniform4f (program->color.color_location,
+ op->color.red, op->color.green, op->color.blue, op->color.alpha);
+}
+
+static inline void
+apply_opacity_op (const Program *program,
+ const RenderOp *op)
+{
+ OP_PRINT (" -> Opacity %f", op->opacity);
+ glUniform1f (program->alpha_location, op->opacity);
+}
+
+static inline void
+apply_source_texture_op (const Program *program,
+ const RenderOp *op)
+{
+ g_assert(op->texture_id != 0);
+ OP_PRINT (" -> New texture: %d", op->texture_id);
+ /* Use texture unit 0 for the source */
+ glUniform1i (program->source_location, 0);
+ glActiveTexture (GL_TEXTURE0);
+ glBindTexture (GL_TEXTURE_2D, op->texture_id);
+}
+
+static inline void
+apply_color_matrix_op (const Program *program,
+ const RenderOp *op)
+{
+ float mat[16];
+ float vec[4];
+ OP_PRINT (" -> Color Matrix");
+ graphene_matrix_to_float (&op->color_matrix.matrix, mat);
+ glUniformMatrix4fv (program->color_matrix.color_matrix_location, 1, GL_FALSE, mat);
+
+ graphene_vec4_to_float (&op->color_matrix.offset, vec);
+ glUniform4fv (program->color_matrix.color_offset_location, 1, vec);
+}
+
+static inline void
+apply_clip_op (const Program *program,
+ const RenderOp *op)
+{
+ OP_PRINT (" -> Clip (%f, %f, %f, %f) (%f, %f, %f, %f), (%f, %f, %f, %f)",
+ op->clip.bounds.origin.x, op->clip.bounds.origin.y,
+ op->clip.bounds.size.width, op->clip.bounds.size.height,
+ op->clip.corner[0].width,
+ op->clip.corner[1].width,
+ op->clip.corner[2].width,
+ op->clip.corner[3].width,
+ op->clip.corner[0].height,
+ op->clip.corner[1].height,
+ op->clip.corner[2].height,
+ op->clip.corner[3].height);
+ glUniform4f (program->clip_location,
+ op->clip.bounds.origin.x, op->clip.bounds.origin.y,
+ op->clip.bounds.size.width, op->clip.bounds.size.height);
+
+ glUniform4f (program->clip_corner_widths_location,
+ op->clip.corner[0].width,
+ op->clip.corner[1].width,
+ op->clip.corner[2].width,
+ op->clip.corner[3].width);
+ glUniform4f (program->clip_corner_heights_location,
+ op->clip.corner[0].height,
+ op->clip.corner[1].height,
+ op->clip.corner[2].height,
+ op->clip.corner[3].height);
+}
+
+static inline void
+apply_inset_shadow_op (const Program *program,
+ const RenderOp *op)
+{
+ OP_PRINT (" -> inset shadow. Color: (%f, %f, %f, %f), Offset: (%f, %f), Spread: %f, Outline: (%f, %f, %f, %f) Corner widths: (%f, %f, %f, %f), Corner Heights: (%f, %f, %f, %f)",
+ op->inset_shadow.color[0],
+ op->inset_shadow.color[1],
+ op->inset_shadow.color[2],
+ op->inset_shadow.color[3],
+ op->inset_shadow.offset[0],
+ op->inset_shadow.offset[1],
+ op->inset_shadow.spread,
+ op->inset_shadow.outline[0],
+ op->inset_shadow.outline[1],
+ op->inset_shadow.outline[2],
+ op->inset_shadow.outline[3],
+ op->inset_shadow.corner_widths[0],
+ op->inset_shadow.corner_widths[1],
+ op->inset_shadow.corner_widths[2],
+ op->inset_shadow.corner_widths[3],
+ op->inset_shadow.corner_heights[0],
+ op->inset_shadow.corner_heights[1],
+ op->inset_shadow.corner_heights[2],
+ op->inset_shadow.corner_heights[3]);
+ glUniform4fv (program->inset_shadow.color_location, 1, op->inset_shadow.color);
+ glUniform2fv (program->inset_shadow.offset_location, 1, op->inset_shadow.offset);
+ glUniform1f (program->inset_shadow.spread_location, op->inset_shadow.spread);
+ glUniform4fv (program->inset_shadow.outline_location, 1, op->inset_shadow.outline);
+ glUniform4fv (program->inset_shadow.corner_widths_location, 1, op->inset_shadow.corner_widths);
+ glUniform4fv (program->inset_shadow.corner_heights_location, 1, op->inset_shadow.corner_heights);
+}
+static inline void
+apply_outset_shadow_op (const Program *program,
+ const RenderOp *op)
+{
+ OP_PRINT (" -> outset shadow");
+ glUniform4fv (program->outset_shadow.color_location, 1, op->outset_shadow.color);
+ glUniform2fv (program->outset_shadow.offset_location, 1, op->outset_shadow.offset);
+ glUniform1f (program->outset_shadow.spread_location, op->outset_shadow.spread);
+ glUniform4fv (program->outset_shadow.outline_location, 1, op->outset_shadow.outline);
+ glUniform4fv (program->outset_shadow.corner_widths_location, 1, op->outset_shadow.corner_widths);
+ glUniform4fv (program->outset_shadow.corner_heights_location, 1, op->outset_shadow.corner_heights);
+}
+
+static inline void
+apply_linear_gradient_op (const Program *program,
+ const RenderOp *op)
+{
+ OP_PRINT (" -> Linear gradient");
+ glUniform1i (program->linear_gradient.num_color_stops_location,
+ op->linear_gradient.n_color_stops);
+ glUniform4fv (program->linear_gradient.color_stops_location,
+ op->linear_gradient.n_color_stops,
+ op->linear_gradient.color_stops);
+ glUniform1fv (program->linear_gradient.color_offsets_location,
+ op->linear_gradient.n_color_stops,
+ op->linear_gradient.color_offsets);
+ glUniform2f (program->linear_gradient.start_point_location,
+ op->linear_gradient.start_point.x, op->linear_gradient.start_point.y);
+ glUniform2f (program->linear_gradient.end_point_location,
+ op->linear_gradient.end_point.x, op->linear_gradient.end_point.y);
+}
+
+static inline void
+apply_border_op (const Program *program,
+ const RenderOp *op)
+{
+ OP_PRINT (" -> Border (%f, %f, %f, %f)",
+ op->border.widths[0], op->border.widths[1], op->border.widths[2], op->border.widths[3]);
+ glUniform4fv (program->border.widths_location, 1, op->border.widths);
+}
+
+static inline void
+apply_border_color_op (const Program *program,
+ const RenderOp *op)
+{
+ OP_PRINT (" -> Border color (%f, %f, %f, %f)",
+ op->border.color[0], op->border.color[1], op->border.color[2], op->border.color[3]);
+ glUniform4fv (program->border.color_location, 1, op->border.color);
+}
+
+static inline void
+apply_blur_op (const Program *program,
+ const RenderOp *op)
+{
+ OP_PRINT (" -> Blur");
+ glUniform1f (program->blur.blur_radius_location, op->blur.radius);
+ glUniform2f (program->blur.blur_size_location, op->blur.size.width, op->blur.size.height);
+}
+
+static inline void
+apply_cross_fade_op (const Program *program,
+ const RenderOp *op)
+{
+ /* End texture id */
+ glUniform1i (program->cross_fade.source2_location, 1);
+ glActiveTexture (GL_TEXTURE0 + 1);
+ glBindTexture (GL_TEXTURE_2D, op->cross_fade.source2);
+ /* progress */
+ glUniform1f (program->cross_fade.progress_location, op->cross_fade.progress);
+}
+
static void
gsk_gl_renderer_dispose (GObject *gobject)
{
@@ -1646,8 +1880,6 @@ static void
gsk_gl_renderer_render_ops (GskGLRenderer *self,
gsize vertex_data_size)
{
- float mat[16];
- float vec[4];
guint i;
guint n_ops = self->render_ops->len;
const Program *program = NULL;
@@ -1710,35 +1942,20 @@ gsk_gl_renderer_render_ops (GskGLRenderer *self,
switch (op->op)
{
case OP_CHANGE_PROJECTION:
- graphene_matrix_to_float (&op->projection, mat);
- glUniformMatrix4fv (program->projection_location, 1, GL_FALSE, mat);
- OP_PRINT (" -> Projection");
- /*graphene_matrix_print (&op->projection);*/
+ apply_projection_op (program, op);
break;
case OP_CHANGE_MODELVIEW:
- graphene_matrix_to_float (&op->modelview, mat);
- glUniformMatrix4fv (program->modelview_location, 1, GL_FALSE, mat);
- OP_PRINT (" -> Modelview");
- /*graphene_matrix_print (&op->modelview);*/
+ apply_modelview_op (program, op);
break;
case OP_CHANGE_PROGRAM:
+ apply_program_op (program, op);
program = op->program;
- glUseProgram (op->program->id);
- OP_PRINT (" -> Program: %d", op->program->index);
break;
case OP_CHANGE_RENDER_TARGET:
- OP_PRINT (" -> Render Target: %d", op->render_target_id);
-
- glBindFramebuffer (GL_FRAMEBUFFER, op->render_target_id);
-
- if (op->render_target_id != 0)
- glDisable (GL_SCISSOR_TEST);
- else
- gsk_gl_renderer_setup_render_mode (self); /* Reset glScissor etc. */
-
+ apply_render_target_op (self, program, op);
break;
case OP_CLEAR:
@@ -1747,162 +1964,58 @@ gsk_gl_renderer_render_ops (GskGLRenderer *self,
break;
case OP_CHANGE_VIEWPORT:
- OP_PRINT (" -> New Viewport: %f, %f, %f, %f", op->viewport.origin.x, op->viewport.origin.y, op->viewport.size.width, op->viewport.size.height);
- glUniform4f (program->viewport_location,
- op->viewport.origin.x, op->viewport.origin.y,
- op->viewport.size.width, op->viewport.size.height);
- glViewport (0, 0, op->viewport.size.width, op->viewport.size.height);
+ apply_viewport_op (program, op);
break;
case OP_CHANGE_OPACITY:
- OP_PRINT (" -> Opacity %f", op->opacity);
- glUniform1f (program->alpha_location, op->opacity);
+ apply_opacity_op (program, op);
break;
case OP_CHANGE_COLOR_MATRIX:
- OP_PRINT (" -> Color Matrix");
- g_assert (program == &self->color_matrix_program);
- graphene_matrix_to_float (&op->color_matrix.matrix, mat);
- glUniformMatrix4fv (program->color_matrix.color_matrix_location, 1, GL_FALSE, mat);
-
- graphene_vec4_to_float (&op->color_matrix.offset, vec);
- glUniform4fv (program->color_matrix.color_offset_location, 1, vec);
+ apply_color_matrix_op (program, op);
break;
case OP_CHANGE_COLOR:
- OP_PRINT (" -> Color: (%f, %f, %f, %f)", op->color.red, op->color.green, op->color.blue, op->color.alpha);
g_assert (program == &self->color_program || program == &self->coloring_program ||
program == &self->shadow_program);
- /* TODO: We use color.color_location here and this is right for all three of the programs above,
- * but that's just a coincidence. */
- glUniform4f (program->color.color_location,
- op->color.red, op->color.green, op->color.blue, op->color.alpha);
+ apply_color_op (program, op);
break;
case OP_CHANGE_BORDER_COLOR:
- OP_PRINT (" -> Border color (%f, %f, %f, %f)",
- op->border.color[0], op->border.color[1], op->border.color[2], op->border.color[3]);
- g_assert (program == &self->border_program);
- glUniform4fv (program->border.color_location, 1, op->border.color);
+ apply_border_color_op (program, op);
break;
case OP_CHANGE_CLIP:
- OP_PRINT (" -> Clip (%f, %f, %f, %f) (%f, %f, %f, %f), (%f, %f, %f, %f)",
- op->clip.bounds.origin.x, op->clip.bounds.origin.y,
- op->clip.bounds.size.width, op->clip.bounds.size.height,
- op->clip.corner[0].width,
- op->clip.corner[1].width,
- op->clip.corner[2].width,
- op->clip.corner[3].width,
- op->clip.corner[0].height,
- op->clip.corner[1].height,
- op->clip.corner[2].height,
- op->clip.corner[3].height);
- glUniform4f (program->clip_location,
- op->clip.bounds.origin.x, op->clip.bounds.origin.y,
- op->clip.bounds.size.width, op->clip.bounds.size.height);
-
- glUniform4f (program->clip_corner_widths_location,
- op->clip.corner[0].width,
- op->clip.corner[1].width,
- op->clip.corner[2].width,
- op->clip.corner[3].width);
- glUniform4f (program->clip_corner_heights_location,
- op->clip.corner[0].height,
- op->clip.corner[1].height,
- op->clip.corner[2].height,
- op->clip.corner[3].height);
+ apply_clip_op (program, op);
break;
case OP_CHANGE_SOURCE_TEXTURE:
- g_assert(op->texture_id != 0);
- OP_PRINT (" -> New texture: %d", op->texture_id);
- /* Use texture unit 0 for the source */
- glUniform1i (program->source_location, 0);
- glActiveTexture (GL_TEXTURE0);
- glBindTexture (GL_TEXTURE_2D, op->texture_id);
-
+ apply_source_texture_op (program, op);
break;
case OP_CHANGE_CROSS_FADE:
g_assert (program == &self->cross_fade_program);
- /* End texture id */
- glUniform1i (program->cross_fade.source2_location, 1);
- glActiveTexture (GL_TEXTURE0 + 1);
- glBindTexture (GL_TEXTURE_2D, op->cross_fade.source2);
- /* progress */
- glUniform1f (program->cross_fade.progress_location, op->cross_fade.progress);
+ apply_cross_fade_op (program, op);
break;
case OP_CHANGE_LINEAR_GRADIENT:
- OP_PRINT (" -> Linear gradient");
- glUniform1i (program->linear_gradient.num_color_stops_location,
- op->linear_gradient.n_color_stops);
- glUniform4fv (program->linear_gradient.color_stops_location,
- op->linear_gradient.n_color_stops,
- op->linear_gradient.color_stops);
- glUniform1fv (program->linear_gradient.color_offsets_location,
- op->linear_gradient.n_color_stops,
- op->linear_gradient.color_offsets);
- glUniform2f (program->linear_gradient.start_point_location,
- op->linear_gradient.start_point.x, op->linear_gradient.start_point.y);
- glUniform2f (program->linear_gradient.end_point_location,
- op->linear_gradient.end_point.x, op->linear_gradient.end_point.y);
+ apply_linear_gradient_op (program, op);
break;
case OP_CHANGE_BLUR:
- OP_PRINT (" -> Blur");
- g_assert (program == &self->blur_program);
- glUniform1f (program->blur.blur_radius_location, op->blur.radius);
- glUniform2f (program->blur.blur_size_location, op->blur.size.width, op->blur.size.height);
+ apply_blur_op (program, op);
break;
case OP_CHANGE_INSET_SHADOW:
- OP_PRINT (" -> inset shadow. Color: (%f, %f, %f, %f), Offset: (%f, %f), Spread: %f, Outline: (%f, %f, %f, %f) Corner widths: (%f, %f, %f, %f), Corner Heights: (%f, %f, %f, %f)",
- op->inset_shadow.color[0],
- op->inset_shadow.color[1],
- op->inset_shadow.color[2],
- op->inset_shadow.color[3],
- op->inset_shadow.offset[0],
- op->inset_shadow.offset[1],
- op->inset_shadow.spread,
- op->inset_shadow.outline[0],
- op->inset_shadow.outline[1],
- op->inset_shadow.outline[2],
- op->inset_shadow.outline[3],
- op->inset_shadow.corner_widths[0],
- op->inset_shadow.corner_widths[1],
- op->inset_shadow.corner_widths[2],
- op->inset_shadow.corner_widths[3],
- op->inset_shadow.corner_heights[0],
- op->inset_shadow.corner_heights[1],
- op->inset_shadow.corner_heights[2],
- op->inset_shadow.corner_heights[3]);
- g_assert (program == &self->inset_shadow_program);
- glUniform4fv (program->inset_shadow.color_location, 1, op->inset_shadow.color);
- glUniform2fv (program->inset_shadow.offset_location, 1, op->inset_shadow.offset);
- glUniform1f (program->inset_shadow.spread_location, op->inset_shadow.spread);
- glUniform4fv (program->inset_shadow.outline_location, 1, op->inset_shadow.outline);
- glUniform4fv (program->inset_shadow.corner_widths_location, 1, op->inset_shadow.corner_widths);
- glUniform4fv (program->inset_shadow.corner_heights_location, 1, op->inset_shadow.corner_heights);
+ apply_inset_shadow_op (program, op);
break;
case OP_CHANGE_OUTSET_SHADOW:
- OP_PRINT (" -> outset shadow");
- g_assert (program == &self->outset_shadow_program);
- glUniform4fv (program->outset_shadow.color_location, 1, op->outset_shadow.color);
- glUniform2fv (program->outset_shadow.offset_location, 1, op->outset_shadow.offset);
- glUniform1f (program->outset_shadow.spread_location, op->outset_shadow.spread);
- glUniform4fv (program->outset_shadow.outline_location, 1, op->outset_shadow.outline);
- glUniform4fv (program->outset_shadow.corner_widths_location, 1, op->outset_shadow.corner_widths);
- glUniform4fv (program->outset_shadow.corner_heights_location, 1, op->outset_shadow.corner_heights);
+ apply_outset_shadow_op (program, op);
break;
case OP_CHANGE_BORDER:
- OP_PRINT (" -> Border (%f, %f, %f, %f)",
- op->border.widths[0], op->border.widths[1], op->border.widths[2], op->border.widths[3]);
- g_assert (program == &self->border_program);
- glUniform4fv (program->border.widths_location, 1, op->border.widths);
+ apply_border_op (program, op);
break;
case OP_DRAW: