diff --git a/gdk/gdkdisplay.c b/gdk/gdkdisplay.c index a233af6ed0..c2288feeed 100644 --- a/gdk/gdkdisplay.c +++ b/gdk/gdkdisplay.c @@ -1882,6 +1882,9 @@ gdk_display_init_dmabuf (GdkDisplay *self) if (self->dmabuf_formats != NULL) return; + GDK_DISPLAY_DEBUG (self, DMABUF, + "Beginning initialization of dmabuf support"); + builder = gdk_dmabuf_formats_builder_new (); #ifdef HAVE_DMABUF @@ -1899,6 +1902,10 @@ gdk_display_init_dmabuf (GdkDisplay *self) #endif self->dmabuf_formats = gdk_dmabuf_formats_builder_free_to_formats (builder); + + GDK_DISPLAY_DEBUG (self, DMABUF, + "Initialized support for %zu dmabuf formats", + gdk_dmabuf_formats_get_n_formats (self->dmabuf_formats)); } /** diff --git a/gdk/gdkdmabuf.c b/gdk/gdkdmabuf.c index 9f0c057fb8..968970bd16 100644 --- a/gdk/gdkdmabuf.c +++ b/gdk/gdkdmabuf.c @@ -463,6 +463,8 @@ gdk_dmabuf_direct_downloader_do_download (GdkTexture *texture, g_warning ("Failed to seek dmabuf: %s", g_strerror (errno)); goto out; } + /* be a good citizen and seek back to the start, as the dos recommend */ + lseek (dmabuf->planes[i].fd, 0, SEEK_SET); if (ioctl (dmabuf->planes[i].fd, DMA_BUF_IOCTL_SYNC, &(struct dma_buf_sync) { DMA_BUF_SYNC_START|DMA_BUF_SYNC_READ }) < 0) g_warning ("Failed to sync dmabuf: %s", g_strerror (errno)); diff --git a/gdk/gdkmemoryformat.c b/gdk/gdkmemoryformat.c index 6fe398acb6..ce8ea268a4 100644 --- a/gdk/gdkmemoryformat.c +++ b/gdk/gdkmemoryformat.c @@ -569,7 +569,7 @@ static const GdkMemoryFormatDescription memory_formats[] = { GDK_MEMORY_ALPHA_PREMULTIPLIED, 16, G_ALIGNOF (float), - TRUE, + GDK_MEMORY_FLOAT32, { 0, 0, 3, 0 }, { GL_RGBA32F, GL_RGBA, GL_FLOAT, { GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA } }, r32g32b32a32_float_to_float, diff --git a/gsk/gl/gskgldriver.c b/gsk/gl/gskgldriver.c index 1faf2d18ef..f02fcc2fa3 100644 --- a/gsk/gl/gskgldriver.c +++ b/gsk/gl/gskgldriver.c @@ -1801,8 +1801,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; @@ -1830,6 +1831,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 c421bed98a..21d21a2b48 100644 --- a/gsk/gl/gskgldriverprivate.h +++ b/gsk/gl/gskgldriverprivate.h @@ -154,7 +154,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);