diff --git a/gdk/gdkdmabuf.c b/gdk/gdkdmabuf.c index 29c1c22aea..291afd774c 100644 --- a/gdk/gdkdmabuf.c +++ b/gdk/gdkdmabuf.c @@ -376,6 +376,10 @@ gdk_dmabuf_direct_downloader_add_formats (const GdkDmabufDownloader *downloader, for (i = 0; i < G_N_ELEMENTS (supported_formats); i++) { + GDK_DEBUG (DMABUF, "%s dmabuf format %.4s:%#" G_GINT64_MODIFIER "x", + downloader->name, + (char *) &supported_formats[i].fourcc, (guint64) DRM_FORMAT_MOD_LINEAR); + gdk_dmabuf_formats_builder_add_format (builder, supported_formats[i].fourcc, DRM_FORMAT_MOD_LINEAR); diff --git a/gdk/gdkdmabufegl.c b/gdk/gdkdmabufegl.c index 397fe28585..7eff319e42 100644 --- a/gdk/gdkdmabufegl.c +++ b/gdk/gdkdmabufegl.c @@ -101,17 +101,20 @@ gdk_dmabuf_egl_downloader_add_formats (const GdkDmabufDownloader *downloader, for (int j = 0; j < num_modifiers; j++) { - GDK_DEBUG (DMABUF, "supported %sEGL dmabuf format %.4s:%#" G_GINT64_MODIFIER "x", - external_only[j] ? "external " : "", - (char *) &fourccs[i], - modifiers[j]); - /* All linear formats we support are already added my the mmap downloader. * We don't add external formats, unless we can use them (via GLES) */ if (modifiers[j] != DRM_FORMAT_MOD_LINEAR && (!external_only[j] || gdk_gl_context_get_use_es (context))) - gdk_dmabuf_formats_builder_add_format (builder, fourccs[i], modifiers[j]); + { + GDK_DEBUG (DMABUF, "%s%s dmabuf format %.4s:%#" G_GINT64_MODIFIER "x", + external_only[j] ? "external " : "", + downloader->name, + (char *) &fourccs[i], + modifiers[j]); + + gdk_dmabuf_formats_builder_add_format (builder, fourccs[i], modifiers[j]); + } if (external_only[j]) gdk_dmabuf_formats_builder_add_format (external, fourccs[i], modifiers[j]); } diff --git a/gdk/gdkglcontext.c b/gdk/gdkglcontext.c index 725cb5860c..f1641cce9a 100644 --- a/gdk/gdkglcontext.c +++ b/gdk/gdkglcontext.c @@ -1577,9 +1577,10 @@ gdk_gl_context_check_extensions (GdkGLContext *context) "* Extensions checked:\n" " - GL_KHR_debug: %s\n" " - GL_EXT_unpack_subimage: %s\n" + " - GL_EXT_texture_format_BGRA8888: %s\n" + " - GL_EXT_EGL_image_storage: %s\n" " - half float: %s\n" - " - sync: %s\n" - " - bgra: %s", + " - sync: %s", gdk_gl_context_get_use_es (context) ? "OpenGL ES" : "OpenGL", gdk_gl_version_get_major (&priv->gl_version), gdk_gl_version_get_minor (&priv->gl_version), priv->is_legacy ? "legacy" : "core", @@ -1587,9 +1588,10 @@ gdk_gl_context_check_extensions (GdkGLContext *context) max_texture_size, priv->has_khr_debug ? "yes" : "no", priv->has_unpack_subimage ? "yes" : "no", + priv->has_bgra ? "yes" : "no", + priv->has_image_storage ? "yes" : "no", priv->has_half_float ? "yes" : "no", - priv->has_sync ? "yes" : "no", - priv->has_bgra ? "yes" : "no"); + priv->has_sync ? "yes" : "no"); } #endif diff --git a/gdk/wayland/gdkglcontext-wayland.c b/gdk/wayland/gdkglcontext-wayland.c index fcf4ace152..3b15652e4a 100644 --- a/gdk/wayland/gdkglcontext-wayland.c +++ b/gdk/wayland/gdkglcontext-wayland.c @@ -75,7 +75,7 @@ gdk_wayland_gl_context_end_frame (GdkDrawContext *draw_context, WL_SURFACE_OFFSET_SINCE_VERSION) wl_surface_offset (impl->display_server.wl_surface, dx, dy); - /* We should do ths when setting up the EGLSurface, but we don't make_current then */ + /* We should do this when setting up the EGLSurface, but we don't make_current then */ eglSwapInterval (gdk_display_get_egl_display (gdk_draw_context_get_display (draw_context)), 0); GDK_DRAW_CONTEXT_CLASS (gdk_wayland_gl_context_parent_class)->end_frame (draw_context, painted); diff --git a/gsk/gl/gskgldriver.c b/gsk/gl/gskgldriver.c index d00becdf5c..1faf2d18ef 100644 --- a/gsk/gl/gskgldriver.c +++ b/gsk/gl/gskgldriver.c @@ -822,6 +822,8 @@ gsk_gl_driver_import_dmabuf_texture (GskGLDriver *self, GDK_DEBUG (DMABUF, "DMA-buf Format %.4s:%#lx", (char *) &dmabuf->fourcc, dmabuf->modifier); + gdk_display_init_dmabuf (display); + if (!gdk_dmabuf_formats_contains (display->egl_external_formats, dmabuf->fourcc, dmabuf->modifier)) { GDK_DEBUG (DMABUF, "Import dmabuf as GL_TEXTURE_2D texture"); diff --git a/tests/testdmabuf.c b/tests/testdmabuf.c index be26591cea..50a1edb286 100644 --- a/tests/testdmabuf.c +++ b/tests/testdmabuf.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include @@ -9,36 +10,60 @@ * lax permissions. */ +static int dma_heap_fd = -1; + +static gboolean +initialize_dma_heap (void) +{ + dma_heap_fd = open ("/dev/dma_heap/system", O_RDONLY | O_CLOEXEC); + return dma_heap_fd != -1; +} + static int allocate_dma_buf (gsize size) { - static int fd = -1; struct dma_heap_allocation_data heap_data; int ret; - if (fd == -1) - { - fd = open ("/dev/dma_heap/system", O_RDONLY | O_CLOEXEC); - if (fd == -1) - g_error ("Failed to open /dev/dma_heap/system"); - } - heap_data.len = size; heap_data.fd = 0; heap_data.fd_flags = O_RDWR | O_CLOEXEC; heap_data.heap_flags = 0; - ret = ioctl (fd, DMA_HEAP_IOCTL_ALLOC, &heap_data); + ret = ioctl (dma_heap_fd, DMA_HEAP_IOCTL_ALLOC, &heap_data); if (ret) g_error ("dma-buf allocation failed"); return heap_data.fd; } +static int +allocate_memfd (gsize size) +{ + int fd; + + fd = memfd_create ("buffer", MFD_CLOEXEC); + if (fd == -1) + g_error ("memfd allocation failed"); + + ftruncate (fd, size); + + return fd; +} + +static int +allocate_buffer (gsize size) +{ + if (dma_heap_fd != -1) + return allocate_dma_buf (size); + else + return allocate_memfd (size); +} + static void -populate_dma_buf (int fd, - const guchar *data, - gsize size) +populate_buffer (int fd, + const guchar *data, + gsize size) { guchar *buf; @@ -253,8 +278,8 @@ texture_builder_set_planes (GdkDmabufTextureBuilder *builder, for (i = 0; i < n_planes; i++) { - int fd = allocate_dma_buf (sizes[i]); - populate_dma_buf (fd, buf + offset, sizes[i]); + int fd = allocate_buffer (sizes[i]); + populate_buffer (fd, buf + offset, sizes[i]); gdk_dmabuf_texture_builder_set_fd (builder, i, fd); gdk_dmabuf_texture_builder_set_stride (builder, i, strides[i]); @@ -266,8 +291,8 @@ texture_builder_set_planes (GdkDmabufTextureBuilder *builder, { unsigned offset = 0; unsigned i; - int fd = allocate_dma_buf (size); - populate_dma_buf (fd, buf, size); + int fd = allocate_buffer (size); + populate_buffer (fd, buf, size); for (i = 0; i < n_planes; i++) { @@ -292,6 +317,11 @@ make_dmabuf_texture (const char *filename, GdkDmabufTextureBuilder *builder; GError *error = NULL; + if (initialize_dma_heap ()) + g_print ("Using dma_heap\n"); + else + g_print ("Using memfd\n"); + texture = gdk_texture_new_from_filename (filename, NULL); width = gdk_texture_get_width (texture); @@ -318,8 +348,8 @@ make_dmabuf_texture (const char *filename, { gdk_dmabuf_texture_builder_set_n_planes (builder, 1); - fd = allocate_dma_buf (rgb_size); - populate_dma_buf (fd, rgb_data, rgb_size); + fd = allocate_buffer (rgb_size); + populate_buffer (fd, rgb_data, rgb_size); gdk_dmabuf_texture_builder_set_fd (builder, 0, fd); gdk_dmabuf_texture_builder_set_stride (builder, 0, rgb_stride);