From: Benjamin Otte Date: Mon, 23 Oct 2023 19:21:03 +0000 (+0200) Subject: gl: Make sure render_texture() sets the right format for high depth X-Git-Tag: archive/raspbian/4.12.4+ds-3+rpi1^2~21^2^2~23 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=101296ac0ea156784dad4d270b9449a2af4d7758;p=gtk4.git gl: Make sure render_texture() sets the right format for high depth Setting the format got lost when converting this coe to the texture builder, because that codepaths avods the texture sniffing and always uses RGBA8. --- diff --git a/gsk/gl/gskgldriver.c b/gsk/gl/gskgldriver.c index 225cae6920..d115aca8e5 100644 --- a/gsk/gl/gskgldriver.c +++ b/gsk/gl/gskgldriver.c @@ -1601,8 +1601,9 @@ create_texture_from_texture_destroy (gpointer data) } GdkTexture * -gsk_gl_driver_create_gdk_texture (GskGLDriver *self, - guint texture_id) +gsk_gl_driver_create_gdk_texture (GskGLDriver *self, + guint texture_id, + GdkMemoryFormat format) { GskGLTextureState *state; GdkGLTextureBuilder *builder; @@ -1630,6 +1631,7 @@ gsk_gl_driver_create_gdk_texture (GskGLDriver *self, builder = gdk_gl_texture_builder_new (); gdk_gl_texture_builder_set_context (builder, self->command_queue->context); gdk_gl_texture_builder_set_id (builder, texture_id); + gdk_gl_texture_builder_set_format (builder, format); gdk_gl_texture_builder_set_width (builder, texture->width); gdk_gl_texture_builder_set_height (builder, texture->height); gdk_gl_texture_builder_set_sync (builder, state->sync); diff --git a/gsk/gl/gskgldriverprivate.h b/gsk/gl/gskgldriverprivate.h index 021792bd8c..c40d3c401f 100644 --- a/gsk/gl/gskgldriverprivate.h +++ b/gsk/gl/gskgldriverprivate.h @@ -149,7 +149,8 @@ void gsk_gl_driver_begin_frame (GskGLDriver *s void gsk_gl_driver_end_frame (GskGLDriver *self); void gsk_gl_driver_after_frame (GskGLDriver *self); GdkTexture * gsk_gl_driver_create_gdk_texture (GskGLDriver *self, - guint texture_id); + guint texture_id, + GdkMemoryFormat format); void gsk_gl_driver_cache_texture (GskGLDriver *self, const GskTextureKey *key, guint texture_id); diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c index d61a42258c..cf551eaedc 100644 --- a/gsk/gl/gskglrenderer.c +++ b/gsk/gl/gskglrenderer.c @@ -332,6 +332,7 @@ gsk_gl_renderer_render_texture (GskRenderer *renderer, GskGLRenderJob *job; GdkTexture *texture; guint texture_id; + GdkMemoryFormat gdk_format; int width, height, max_size; int format; @@ -375,9 +376,15 @@ gsk_gl_renderer_render_texture (GskRenderer *renderer, if (gsk_render_node_get_preferred_depth (root) != GDK_MEMORY_U8 && gdk_gl_context_check_version (self->context, "3.0", "3.0")) - format = GL_RGBA32F; + { + gdk_format = GDK_MEMORY_R32G32B32A32_FLOAT_PREMULTIPLIED; + format = GL_RGBA32F; + } else - format = GL_RGBA8; + { + format = GL_RGBA8; + gdk_format = GDK_MEMORY_R8G8B8A8_PREMULTIPLIED; + } gdk_gl_context_make_current (self->context); @@ -394,7 +401,7 @@ gsk_gl_renderer_render_texture (GskRenderer *renderer, #endif gsk_gl_render_job_render_flipped (job, root); texture_id = gsk_gl_driver_release_render_target (self->driver, render_target, FALSE); - texture = gsk_gl_driver_create_gdk_texture (self->driver, texture_id); + texture = gsk_gl_driver_create_gdk_texture (self->driver, texture_id, gdk_format); gsk_gl_driver_end_frame (self->driver); gsk_gl_render_job_free (job);