gl: Make sure render_texture() sets the right format for high depth
authorBenjamin Otte <otte@redhat.com>
Mon, 23 Oct 2023 19:21:03 +0000 (21:21 +0200)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 17 Nov 2023 19:51:56 +0000 (14:51 -0500)
Setting the format got lost when converting this coe to the texture
builder, because that codepaths avods the texture sniffing and always
uses RGBA8.

gsk/gl/gskgldriver.c
gsk/gl/gskgldriverprivate.h
gsk/gl/gskglrenderer.c

index 225cae6920912980e78848cace4b92ffaf4ade7c..d115aca8e56e64779b21e01c14959c5ed89b55ea 100644 (file)
@@ -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);
index 021792bd8ce9194d987ffc56f99c90e69ccf613c..c40d3c401fc62bd47aadde75d663a1847892bfce 100644 (file)
@@ -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);
index d61a42258c5399b375f2302a8a250d69e4f35e35..cf551eaedc112fcc850de23964342b16245b3b7e 100644 (file)
@@ -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);