From fb86fd900ece6bbabaabcc3df4624424cadcdbf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= Date: Wed, 22 May 2019 07:10:57 +0200 Subject: [PATCH] gl renderer: Make creating render targets easier --- gsk/gl/gskgldriver.c | 57 ++++++++++++++++++++++++------------- gsk/gl/gskgldriverprivate.h | 15 +++++----- gsk/gl/gskglimage.c | 3 +- gsk/gl/gskglrenderer.c | 20 ++++--------- 4 files changed, 52 insertions(+), 43 deletions(-) diff --git a/gsk/gl/gskgldriver.c b/gsk/gl/gskgldriver.c index 19ad7b1a78..d73575da06 100644 --- a/gsk/gl/gskgldriver.c +++ b/gsk/gl/gskgldriver.c @@ -585,21 +585,6 @@ gsk_gl_driver_set_texture_for_pointer (GskGLDriver *self, g_hash_table_insert (self->pointer_textures, pointer, GINT_TO_POINTER (texture_id)); } -int -gsk_gl_driver_create_permanent_texture (GskGLDriver *self, - float width, - float height) -{ - Texture *t; - - g_return_val_if_fail (GSK_IS_GL_DRIVER (self), -1); - - t = create_texture (self, width, height); - t->permanent = TRUE; - - return t->texture_id; -} - int gsk_gl_driver_create_texture (GskGLDriver *self, float width, @@ -614,11 +599,11 @@ gsk_gl_driver_create_texture (GskGLDriver *self, return t->texture_id; } -int -gsk_gl_driver_create_render_target (GskGLDriver *self, - int texture_id, - gboolean add_depth_buffer, - gboolean add_stencil_buffer) +static int +create_render_target (GskGLDriver *self, + int texture_id, + gboolean add_depth_buffer, + gboolean add_stencil_buffer) { GLuint fbo_id, depth_stencil_buffer_id; Texture *t; @@ -673,6 +658,38 @@ gsk_gl_driver_create_render_target (GskGLDriver *self, return fbo_id; } +void +gsk_gl_driver_create_render_target (GskGLDriver *self, + int width, + int height, + int *out_texture_id, + int *out_render_target_id) +{ + int texture_id, render_target; + + texture_id = gsk_gl_driver_create_texture (self, width, height); + gsk_gl_driver_bind_source_texture (self, texture_id); + gsk_gl_driver_init_texture_empty (self, texture_id); + + render_target = create_render_target (self, texture_id, FALSE, FALSE); + + *out_texture_id = texture_id; + *out_render_target_id = render_target; +} + +/* Mark the texture permanent, meaning it won'e be reused by the GLDriver. + * E.g. to store it in some other cache. */ +void +gsk_gl_driver_mark_texture_permanent (GskGLDriver *self, + int texture_id) +{ + Texture *t = gsk_gl_driver_get_texture (self, texture_id); + + g_assert_nonnull (t); + + t->permanent = TRUE; +} + void gsk_gl_driver_bind_source_texture (GskGLDriver *self, int texture_id) diff --git a/gsk/gl/gskgldriverprivate.h b/gsk/gl/gskgldriverprivate.h index ee34ccd092..1e57a855f1 100644 --- a/gsk/gl/gskgldriverprivate.h +++ b/gsk/gl/gskgldriverprivate.h @@ -39,17 +39,16 @@ int gsk_gl_driver_get_texture_for_pointer (GskGLDriver *driver void gsk_gl_driver_set_texture_for_pointer (GskGLDriver *driver, gpointer pointer, int texture_id); -int gsk_gl_driver_create_permanent_texture (GskGLDriver *driver, - float width, - float height); int gsk_gl_driver_create_texture (GskGLDriver *driver, float width, float height); -int gsk_gl_driver_create_render_target (GskGLDriver *driver, - int texture_id, - gboolean add_depth_buffer, - gboolean add_stencil_buffer); - +void gsk_gl_driver_create_render_target (GskGLDriver *driver, + int width, + int height, + int *out_texture_id, + int *out_render_target_id); +void gsk_gl_driver_mark_texture_permanent (GskGLDriver *self, + int texture_id); void gsk_gl_driver_bind_source_texture (GskGLDriver *driver, int texture_id); diff --git a/gsk/gl/gskglimage.c b/gsk/gl/gskglimage.c index 6d91b35568..0de2e75bdc 100644 --- a/gsk/gl/gskglimage.c +++ b/gsk/gl/gskglimage.c @@ -8,12 +8,13 @@ gsk_gl_image_create (GskGLImage *self, int width, int height) { - self->texture_id = gsk_gl_driver_create_permanent_texture (gl_driver, width, height); + self->texture_id = gsk_gl_driver_create_texture (gl_driver, width, height); self->width = width; self->height = height; gsk_gl_driver_bind_source_texture (gl_driver, self->texture_id); gsk_gl_driver_init_texture_empty (gl_driver, self->texture_id); + gsk_gl_driver_mark_texture_permanent (gl_driver, self->texture_id); } void diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c index fbc2c0a4e2..43b9b1caa5 100644 --- a/gsk/gl/gskglrenderer.c +++ b/gsk/gl/gskglrenderer.c @@ -1476,16 +1476,13 @@ render_outset_shadow_node (GskGLRenderer *self, int prev_render_target; GskRoundedRect blit_clip; - texture_id = gsk_gl_driver_create_texture (self->gl_driver, texture_width, texture_height); - gsk_gl_driver_bind_source_texture (self->gl_driver, texture_id); - gsk_gl_driver_init_texture_empty (self->gl_driver, texture_id); + gsk_gl_driver_create_render_target (self->gl_driver, texture_width, texture_height, + &texture_id, &render_target); gdk_gl_context_label_object_printf (self->gl_context, GL_TEXTURE, texture_id, "Outset Shadow Temp %d", texture_id); - render_target = gsk_gl_driver_create_render_target (self->gl_driver, texture_id, FALSE, FALSE); gdk_gl_context_label_object_printf (self->gl_context, GL_FRAMEBUFFER, render_target, "Outset Shadow FB Temp %d", render_target); - graphene_matrix_init_ortho (&item_proj, 0, texture_width, 0, texture_height, ORTHO_NEAR_PLANE, ORTHO_FAR_PLANE); @@ -1513,12 +1510,10 @@ render_outset_shadow_node (GskGLRenderer *self, { { texture_width, }, { 1, 1 }, }, }); - blurred_texture_id = gsk_gl_driver_create_permanent_texture (self->gl_driver, texture_width, texture_height); - gsk_gl_driver_bind_source_texture (self->gl_driver, blurred_texture_id); - gsk_gl_driver_init_texture_empty (self->gl_driver, blurred_texture_id); + gsk_gl_driver_create_render_target (self->gl_driver, texture_width, texture_height, + &blurred_texture_id, &blurred_render_target); gdk_gl_context_label_object_printf (self->gl_context, GL_TEXTURE, blurred_texture_id, "Outset Shadow Cache %d", blurred_texture_id); - blurred_render_target = gsk_gl_driver_create_render_target (self->gl_driver, blurred_texture_id, TRUE, TRUE); gdk_gl_context_label_object_printf (self->gl_context, GL_FRAMEBUFFER, render_target, "Outset Shadow Cache FB %d", render_target); @@ -1556,6 +1551,7 @@ render_outset_shadow_node (GskGLRenderer *self, ops_set_projection (builder, &prev_projection); ops_set_render_target (builder, prev_render_target); + gsk_gl_driver_mark_texture_permanent (self->gl_driver, blurred_texture_id); gsk_gl_shadow_cache_commit (&self->shadow_cache, &offset_outline, blur_radius, @@ -2773,13 +2769,9 @@ add_offscreen_ops (GskGLRenderer *self, } } - texture_id = gsk_gl_driver_create_texture (self->gl_driver, width, height); - gsk_gl_driver_bind_source_texture (self->gl_driver, texture_id); - gsk_gl_driver_init_texture_empty (self->gl_driver, texture_id); + gsk_gl_driver_create_render_target (self->gl_driver, width, height, &texture_id, &render_target); gdk_gl_context_label_object_printf (self->gl_context, GL_TEXTURE, texture_id, "Offscreen<%s> %d", child_node->node_class->type_name, texture_id); - - render_target = gsk_gl_driver_create_render_target (self->gl_driver, texture_id, TRUE, TRUE); gdk_gl_context_label_object_printf (self->gl_context, GL_FRAMEBUFFER, render_target, "Offscreen<%s> FB %d", child_node->node_class->type_name, render_target);