From 5f9fa13c65af6e6fd3e333004b6b305a77ead247 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= Date: Sat, 10 Oct 2020 19:03:02 +0200 Subject: [PATCH] gl renderer: Use op builder to render flipped texture Otherwise, we don't know about the uniform state --- gsk/gl/gskglrenderer.c | 72 +++++++++++++----------------------------- 1 file changed, 22 insertions(+), 50 deletions(-) diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c index 9adb02dd53..ae64a0f76b 100644 --- a/gsk/gl/gskglrenderer.c +++ b/gsk/gl/gskglrenderer.c @@ -4358,14 +4358,14 @@ gsk_gl_renderer_render_texture (GskRenderer *renderer, glDeleteFramebuffers (1, &fbo_id); + /* Render the now drawn framebuffer y-flipped so it's as GdkGLTexture expects it to be */ { guint final_texture_id, final_fbo_id; - GskQuadVertex vertex_data[6]; - GLuint buffer_id, vao_id; - float fs[16]; graphene_matrix_t m; + ops_reset (&self->op_builder); + glGenFramebuffers (1, &final_fbo_id); glBindFramebuffer (GL_FRAMEBUFFER, final_fbo_id); glGenTextures (1, &final_texture_id); @@ -4384,60 +4384,32 @@ gsk_gl_renderer_render_texture (GskRenderer *renderer, glFramebufferTexture (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, final_texture_id, 0); g_assert_cmphex (glCheckFramebufferStatus (GL_FRAMEBUFFER), ==, GL_FRAMEBUFFER_COMPLETE); - glGenVertexArrays (1, &vao_id); - glBindVertexArray (vao_id); - - glGenBuffers (1, &buffer_id); - glBindBuffer (GL_ARRAY_BUFFER, buffer_id); - - fill_vertex_data (vertex_data, 0, 0, width, height); - - glBufferData (GL_ARRAY_BUFFER, sizeof (vertex_data), vertex_data, GL_STATIC_DRAW); - - /* 0 = position location */ - glEnableVertexAttribArray (0); - glVertexAttribPointer (0, 2, GL_FLOAT, GL_FALSE, - sizeof (GskQuadVertex), - (void *) G_STRUCT_OFFSET (GskQuadVertex, position)); - /* 1 = texture coord location */ - glEnableVertexAttribArray (1); - glVertexAttribPointer (1, 2, GL_FLOAT, GL_FALSE, - sizeof (GskQuadVertex), - (void *) G_STRUCT_OFFSET (GskQuadVertex, uv)); - - glUseProgram (self->programs->blit_program.id); - - glClearColor (0, 0, 0, 0); - glClear (GL_COLOR_BUFFER_BIT); - - glActiveTexture (GL_TEXTURE0); - glBindTexture (GL_TEXTURE_2D, texture_id); - glUniform1i (self->programs->blit_program.source_location, 0); - - graphene_matrix_init_identity (&m); - graphene_matrix_to_float (&m, fs); - glUniformMatrix4fv (self->programs->blit_program.modelview_location, 1, GL_FALSE, fs); + ops_set_render_target (&self->op_builder, final_fbo_id); + ops_push_clip (&self->op_builder, &GSK_ROUNDED_RECT_INIT (0, 0, width, height)); + ops_set_program (&self->op_builder, &self->programs->blit_program); + ops_begin (&self->op_builder, OP_CLEAR); + ops_set_texture (&self->op_builder, texture_id); + ops_set_modelview (&self->op_builder, NULL); + ops_set_viewport (&self->op_builder, &GRAPHENE_RECT_INIT (0, 0, width, height)); init_projection_matrix (&m, &GRAPHENE_RECT_INIT (0, 0, width, height)); graphene_matrix_scale (&m, 1, -1, 1); /* Undo the scale init_projection_matrix() does again */ - graphene_matrix_to_float (&m, fs); - glUniformMatrix4fv (self->programs->blit_program.projection_location, 1, GL_FALSE, fs); + ops_set_projection (&self->op_builder, &m); - glUniform4f (self->programs->blit_program.viewport_location, 0, 0, width, height); - glViewport (0, 0, width, height); + ops_draw (&self->op_builder, (GskQuadVertex[GL_N_VERTICES]) { + { { 0, 0 }, { 0, 1 }, }, + { { 0, height }, { 0, 0 }, }, + { { width, 0 }, { 1, 1 }, }, - glUniform4fv (self->programs->blit_program.clip_rect_location, 3, - (float *)&GSK_ROUNDED_RECT_INIT (0, 0, width, height)); - glUniform1f (self->programs->blit_program.alpha_location, 1.0f); + { { width, height }, { 1, 0 }, }, + { { 0, height }, { 0, 0 }, }, + { { width, 0 }, { 1, 1 }, }, + }); - glDrawArrays (GL_TRIANGLES, 0, 6); - - glDeleteFramebuffers (1, &final_fbo_id); - glDeleteVertexArrays (1, &vao_id); - glDeleteBuffers (1, &buffer_id); - - glDeleteTextures (1, &texture_id); + ops_pop_clip (&self->op_builder); + gsk_gl_renderer_render_ops (self); + ops_finish (&self->op_builder); texture_id = final_texture_id; }