diff --git a/.gitlab-ci/test-msvc.bat b/.gitlab-ci/test-msvc.bat index 89255b25b901c34a83488c6ea78ab00440780b1e..ff6b0853665bac21574009ec2061d447f2c5a0cb 100644 --- a/.gitlab-ci/test-msvc.bat +++ b/.gitlab-ci/test-msvc.bat @@ -6,7 +6,7 @@ call "C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Auxiliar :: FIXME: make warnings fatal pip3 install --upgrade --user meson~=0.64 || goto :error -meson setup -Dbackend_max_links=1 -Ddebug=false -Dmedia-gstreamer=disabled _build || goto :error +meson setup -Dbackend_max_links=1 -Ddebug=false -Dmedia-gstreamer=disabled -Dvulkan=disabled _build || goto :error ninja -C _build || goto :error goto :EOF diff --git a/.gitlab-ci/test-msys2.sh b/.gitlab-ci/test-msys2.sh index 04894a75b8f56d7318a56894909aeefca3d69880..00f2c877f220388f40ea440832ac3d1b1d06d324 100644 --- a/.gitlab-ci/test-msys2.sh +++ b/.gitlab-ci/test-msys2.sh @@ -33,7 +33,8 @@ pacman --noconfirm -S --needed \ mingw-w64-$MSYS2_ARCH-gst-plugins-bad-libs \ mingw-w64-$MSYS2_ARCH-shared-mime-info \ mingw-w64-$MSYS2_ARCH-python-gobject \ - mingw-w64-$MSYS2_ARCH-shaderc + mingw-w64-$MSYS2_ARCH-shaderc \ + mingw-w64-$MSYS2_ARCH-vulkan mkdir -p _ccache export CCACHE_BASEDIR="$(pwd)" @@ -47,7 +48,6 @@ meson \ -Dx11-backend=false \ -Dwayland-backend=false \ -Dwin32-backend=true \ - -Dvulkan=disabled \ -Dintrospection=enabled \ -Dgtk:werror=true \ _build diff --git a/demos/node-editor/node-editor-window.c b/demos/node-editor/node-editor-window.c index a29ac33ccbf7874b728ab5c947b954396c5a40bf..934379c03e34bfe0092eb32c3f6fa1a9d9a293aa 100644 --- a/demos/node-editor/node-editor-window.c +++ b/demos/node-editor/node-editor-window.c @@ -24,13 +24,9 @@ #include "gtkrendererpaintableprivate.h" #include "gsk/gskrendernodeparserprivate.h" -#include "gsk/gl/gskglrenderer.h" #ifdef GDK_WINDOWING_BROADWAY #include "gsk/broadway/gskbroadwayrenderer.h" #endif -#ifdef GDK_RENDERING_VULKAN -#include "gsk/vulkan/gskvulkanrenderer.h" -#endif #include #ifdef CAIRO_HAS_SVG_SURFACE @@ -794,7 +790,7 @@ create_cairo_texture (NodeEditorWindow *self) return NULL; renderer = gsk_cairo_renderer_new (); - gsk_renderer_realize (renderer, NULL, NULL); + gsk_renderer_realize_for_display (renderer, gtk_widget_get_display (GTK_WIDGET (self)), NULL); texture = gsk_renderer_render_texture (renderer, node, NULL); gsk_render_node_unref (node); @@ -866,11 +862,11 @@ export_image_response_cb (GObject *source, GskRenderer *renderer; renderer = gsk_gl_renderer_new (); - if (!gsk_renderer_realize (renderer, NULL, NULL)) + if (!gsk_renderer_realize_for_display (renderer, gdk_display_get_default (), NULL)) { g_object_unref (renderer); renderer = gsk_cairo_renderer_new (); - if (!gsk_renderer_realize (renderer, NULL, NULL)) + if (!gsk_renderer_realize_for_display (renderer, gdk_display_get_default (), NULL)) { g_assert_not_reached (); } @@ -1121,8 +1117,11 @@ node_editor_window_add_renderer (NodeEditorWindow *self, const char *description) { GdkPaintable *paintable; + GdkDisplay *display; + + display = gtk_widget_get_display (GTK_WIDGET (self)); - if (!gsk_renderer_realize (renderer, NULL, NULL)) + if (!gsk_renderer_realize_for_display (renderer, display, NULL)) { GdkSurface *surface = gtk_native_get_surface (GTK_NATIVE (self)); g_assert (surface != NULL); diff --git a/gdk/gdkdisplay.c b/gdk/gdkdisplay.c index 00182bfba29476cb1daafe68f993b437bd18f230..9f51bce222917675ae7944276ff8797c0ba60079 100644 --- a/gdk/gdkdisplay.c +++ b/gdk/gdkdisplay.c @@ -1267,12 +1267,14 @@ gdk_display_get_keymap (GdkDisplay *display) /* * gdk_display_create_vulkan_context: * @self: a `GdkDisplay` + * @surface: (nullable): the `GdkSurface` to use or %NULL for a surfaceless + * context * @error: return location for an error * * Creates a new `GdkVulkanContext` for use with @display. * - * The context can not be used to draw to surfaces, it can only be - * used for custom rendering or compute. + * If @surface is NULL, the context can not be used to draw to surfaces, + * it can only be used for custom rendering or compute. * * If the creation of the `GdkVulkanContext` failed, @error will be set. * @@ -1281,9 +1283,11 @@ gdk_display_get_keymap (GdkDisplay *display) */ GdkVulkanContext * gdk_display_create_vulkan_context (GdkDisplay *self, + GdkSurface *surface, GError **error) { g_return_val_if_fail (GDK_IS_DISPLAY (self), NULL); + g_return_val_if_fail (surface == NULL || GDK_IS_SURFACE (surface), NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); if (gdk_display_get_debug_flags (self) & GDK_DEBUG_VULKAN_DISABLE) @@ -1300,11 +1304,22 @@ gdk_display_create_vulkan_context (GdkDisplay *self, return FALSE; } - return g_initable_new (GDK_DISPLAY_GET_CLASS (self)->vk_context_type, - NULL, - error, - "display", self, - NULL); + if (surface) + { + return g_initable_new (GDK_DISPLAY_GET_CLASS (self)->vk_context_type, + NULL, + error, + "surface", surface, + NULL); + } + else + { + return g_initable_new (GDK_DISPLAY_GET_CLASS (self)->vk_context_type, + NULL, + error, + "display", self, + NULL); + } } gboolean diff --git a/gdk/gdkdisplayprivate.h b/gdk/gdkdisplayprivate.h index a655ed33b3db6bf6927d3bff5be575f7536745e3..0c2f9355f7bdb5d6d06f5d6be6593a25563d9e2e 100644 --- a/gdk/gdkdisplayprivate.h +++ b/gdk/gdkdisplayprivate.h @@ -236,6 +236,7 @@ void gdk_display_init_dmabuf (GdkDisplay *self); gboolean gdk_display_has_vulkan_feature (GdkDisplay *self, GdkVulkanFeatures feature); GdkVulkanContext * gdk_display_create_vulkan_context (GdkDisplay *self, + GdkSurface *surface, GError **error); GdkGLContext * gdk_display_get_gl_context (GdkDisplay *display); diff --git a/gdk/gdkdmabufegl.c b/gdk/gdkdmabufegl.c index 54a6a6b897e133f79145c578ab0d6d9529c97cb9..1282d314dd292c42f9a6ff4fcfccb08a476cc118 100644 --- a/gdk/gdkdmabufegl.c +++ b/gdk/gdkdmabufegl.c @@ -140,10 +140,10 @@ gdk_dmabuf_egl_downloader_collect_formats (GdkDisplay *display, typedef struct _GskRenderer GskRenderer; -extern GskRenderer * gsk_gl_renderer_new (void); -extern gboolean gsk_renderer_realize (GskRenderer *renderer, - GdkSurface *surface, - GError **error); +extern GskRenderer * gsk_gl_renderer_new (void); +extern gboolean gsk_renderer_realize_for_display (GskRenderer *renderer, + GdkDisplay *display, + GError **error); GdkDmabufDownloader * gdk_dmabuf_get_egl_downloader (GdkDisplay *display, @@ -176,7 +176,7 @@ gdk_dmabuf_get_egl_downloader (GdkDisplay *display, renderer = gsk_gl_renderer_new (); - if (!gsk_renderer_realize (renderer, NULL, &error)) + if (!gsk_renderer_realize_for_display (renderer, display, &error)) { g_warning ("Failed to realize GL renderer: %s", error->message); g_error_free (error); diff --git a/gdk/gdksurface.c b/gdk/gdksurface.c index 94675e9064f7bfa739ee5b1f404b92f29eed471b..d35516b4b4084156a8636fffba5c7b3fd1c72446 100644 --- a/gdk/gdksurface.c +++ b/gdk/gdksurface.c @@ -1246,43 +1246,20 @@ gdk_surface_create_cairo_context (GdkSurface *surface) * @surface: a `GdkSurface` * @error: return location for an error * - * Creates a new `GdkVulkanContext` for rendering on @surface. + * Sets an error and returns %NULL. * - * If the creation of the `GdkVulkanContext` failed, @error will be set. + * Returns: (transfer full): %NULL * - * Returns: (transfer full): the newly created `GdkVulkanContext`, or - * %NULL on error + * Deprecated: 4.14: GTK does not expose any Vulkan internals. This + * function is a leftover that was accidentally exposed. */ GdkVulkanContext * gdk_surface_create_vulkan_context (GdkSurface *surface, GError **error) { - GdkDisplay *display; - - g_return_val_if_fail (GDK_IS_SURFACE (surface), NULL); - g_return_val_if_fail (error == NULL || *error == NULL, NULL); - - if (gdk_display_get_debug_flags (surface->display) & GDK_DEBUG_VULKAN_DISABLE) - { - g_set_error_literal (error, GDK_VULKAN_ERROR, GDK_VULKAN_ERROR_NOT_AVAILABLE, - _("Vulkan support disabled via GDK_DEBUG")); - return NULL; - } - - display = surface->display; - - if (GDK_DISPLAY_GET_CLASS (display)->vk_extension_name == NULL) - { - g_set_error (error, GDK_VULKAN_ERROR, GDK_VULKAN_ERROR_UNSUPPORTED, - "The %s backend has no Vulkan support.", G_OBJECT_TYPE_NAME (display)); - return FALSE; - } - - return g_initable_new (GDK_DISPLAY_GET_CLASS (display)->vk_context_type, - NULL, - error, - "surface", surface, - NULL); + g_set_error (error, GDK_VULKAN_ERROR, GDK_VULKAN_ERROR_UNSUPPORTED, + "GTK does not expose Vulkan internals."); + return FALSE; } static gboolean diff --git a/gdk/gdksurface.h b/gdk/gdksurface.h index 50c1efe779e30eb31e2ea87a446c015739d64b90..5c8025c38f93182325e8cf8305b997fbc69cc5d9 100644 --- a/gdk/gdksurface.h +++ b/gdk/gdksurface.h @@ -134,7 +134,7 @@ GdkCairoContext *gdk_surface_create_cairo_context(GdkSurface *surface); GDK_AVAILABLE_IN_ALL GdkGLContext * gdk_surface_create_gl_context (GdkSurface *surface, GError **error); -GDK_AVAILABLE_IN_ALL +GDK_DEPRECATED_IN_4_14 GdkVulkanContext * gdk_surface_create_vulkan_context(GdkSurface *surface, GError **error); diff --git a/gdk/gdkvulkancontext.c b/gdk/gdkvulkancontext.c index 01e47005cab4051cce912c9f02fdec417235f38d..cb50d42507ce7364f559e1f793bb8970b30cc846 100644 --- a/gdk/gdkvulkancontext.c +++ b/gdk/gdkvulkancontext.c @@ -1826,6 +1826,8 @@ gdk_display_unref_vulkan (GdkDisplay *display) display->vk_instance = VK_NULL_HANDLE; } +#ifdef HAVE_DMABUF + /* Hack. We don't include gsk/gsk.h here to avoid a build order problem * with the generated header gskenumtypes.h, so we need to hack around * a bit to access the gsk api we need. @@ -1833,10 +1835,10 @@ gdk_display_unref_vulkan (GdkDisplay *display) typedef struct _GskRenderer GskRenderer; -extern GskRenderer * gsk_vulkan_renderer_new (void); -extern gboolean gsk_renderer_realize (GskRenderer *renderer, - GdkSurface *surface, - GError **error); +extern GskRenderer * gsk_vulkan_renderer_new (void); +extern gboolean gsk_renderer_realize_for_display (GskRenderer *renderer, + GdkDisplay *display, + GError **error); GdkDmabufDownloader * gdk_vulkan_get_dmabuf_downloader (GdkDisplay *display, @@ -1903,7 +1905,7 @@ gdk_vulkan_get_dmabuf_downloader (GdkDisplay *display, renderer = gsk_vulkan_renderer_new (); - if (!gsk_renderer_realize (renderer, NULL, &error)) + if (!gsk_renderer_realize_for_display (renderer, display, &error)) { g_warning ("Failed to realize GL renderer: %s", error->message); g_error_free (error); @@ -1915,6 +1917,8 @@ gdk_vulkan_get_dmabuf_downloader (GdkDisplay *display, return GDK_DMABUF_DOWNLOADER (renderer); } +#endif + VkShaderModule gdk_display_get_vk_shader_module (GdkDisplay *self, const char *resource_name) diff --git a/gdk/gdkvulkancontext.h b/gdk/gdkvulkancontext.h index 55a347861b9bfb3bcedda3ba56594865bd24938d..bbcb9d8abfafc323ed49d418790858103b12ca4e 100644 --- a/gdk/gdkvulkancontext.h +++ b/gdk/gdkvulkancontext.h @@ -26,10 +26,6 @@ #include -#ifdef GDK_RENDERING_VULKAN -#include -#endif - G_BEGIN_DECLS #define GDK_TYPE_VULKAN_CONTEXT (gdk_vulkan_context_get_type ()) @@ -44,37 +40,6 @@ GQuark gdk_vulkan_error_quark (void); GDK_AVAILABLE_IN_ALL GType gdk_vulkan_context_get_type (void) G_GNUC_CONST; -#ifndef __GI_SCANNER__ -#ifdef GDK_RENDERING_VULKAN - -GDK_AVAILABLE_IN_ALL -const char * gdk_vulkan_strerror (VkResult result); - -GDK_AVAILABLE_IN_ALL -VkInstance gdk_vulkan_context_get_instance (GdkVulkanContext *context); -GDK_AVAILABLE_IN_ALL -VkPhysicalDevice gdk_vulkan_context_get_physical_device (GdkVulkanContext *context); -GDK_AVAILABLE_IN_ALL -VkDevice gdk_vulkan_context_get_device (GdkVulkanContext *context); -GDK_AVAILABLE_IN_ALL -VkQueue gdk_vulkan_context_get_queue (GdkVulkanContext *context); -GDK_AVAILABLE_IN_ALL -uint32_t gdk_vulkan_context_get_queue_family_index (GdkVulkanContext *context); -GDK_AVAILABLE_IN_ALL -VkFormat gdk_vulkan_context_get_image_format (GdkVulkanContext *context); -GDK_AVAILABLE_IN_ALL -uint32_t gdk_vulkan_context_get_n_images (GdkVulkanContext *context); -GDK_AVAILABLE_IN_ALL -VkImage gdk_vulkan_context_get_image (GdkVulkanContext *context, - guint id); -GDK_AVAILABLE_IN_ALL -uint32_t gdk_vulkan_context_get_draw_index (GdkVulkanContext *context); -GDK_AVAILABLE_IN_ALL -VkSemaphore gdk_vulkan_context_get_draw_semaphore (GdkVulkanContext *context); - -#endif /* GDK_RENDERING_VULKAN */ -#endif /* __GI_SCANNER__ */ - G_DEFINE_AUTOPTR_CLEANUP_FUNC(GdkVulkanContext, g_object_unref) G_END_DECLS diff --git a/gdk/gdkvulkancontextprivate.h b/gdk/gdkvulkancontextprivate.h index 904c44d661e5460f7e9aff3b567983a5df25f8da..181ddf7f01184176c1fdc2001f46b80e9d66861d 100644 --- a/gdk/gdkvulkancontextprivate.h +++ b/gdk/gdkvulkancontextprivate.h @@ -57,6 +57,8 @@ struct _GdkVulkanContextClass #ifdef GDK_RENDERING_VULKAN +const char * gdk_vulkan_strerror (VkResult result); + static inline VkResult gdk_vulkan_handle_result (VkResult res, const char *called_function) @@ -76,14 +78,28 @@ gboolean gdk_display_init_vulkan (GdkDisp void gdk_display_ref_vulkan (GdkDisplay *display); void gdk_display_unref_vulkan (GdkDisplay *display); +#ifdef HAVE_DMABUF GdkDmabufDownloader * gdk_vulkan_get_dmabuf_downloader (GdkDisplay *display, GdkDmabufFormatsBuilder *builder); +#endif VkShaderModule gdk_display_get_vk_shader_module (GdkDisplay *display, const char *resource_name); void gdk_display_vulkan_pipeline_cache_updated (GdkDisplay *display); +VkInstance gdk_vulkan_context_get_instance (GdkVulkanContext *context); +VkPhysicalDevice gdk_vulkan_context_get_physical_device (GdkVulkanContext *context); +VkDevice gdk_vulkan_context_get_device (GdkVulkanContext *context); +VkQueue gdk_vulkan_context_get_queue (GdkVulkanContext *context); +uint32_t gdk_vulkan_context_get_queue_family_index (GdkVulkanContext *context); +VkFormat gdk_vulkan_context_get_image_format (GdkVulkanContext *context); +uint32_t gdk_vulkan_context_get_n_images (GdkVulkanContext *context); +VkImage gdk_vulkan_context_get_image (GdkVulkanContext *context, + guint id); +uint32_t gdk_vulkan_context_get_draw_index (GdkVulkanContext *context); +VkSemaphore gdk_vulkan_context_get_draw_semaphore (GdkVulkanContext *context); + GdkMemoryFormat gdk_vulkan_context_get_offscreen_format (GdkVulkanContext *context, GdkMemoryDepth depth); diff --git a/gsk/broadway/gskbroadwayrenderer.c b/gsk/broadway/gskbroadwayrenderer.c index c89f471b02ed1c9b139ce1339a32f541cd3521a4..cd960b8ddaae5af81adcfef53f847a5f8c2e4c1e 100644 --- a/gsk/broadway/gskbroadwayrenderer.c +++ b/gsk/broadway/gskbroadwayrenderer.c @@ -35,6 +35,7 @@ G_DEFINE_TYPE (GskBroadwayRenderer, gsk_broadway_renderer, GSK_TYPE_RENDERER) static gboolean gsk_broadway_renderer_realize (GskRenderer *renderer, + GdkDisplay *display, GdkSurface *surface, GError **error) { diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c index 0942e2767d4913c7bce8544b1802e0f32280b4c9..51d7eb78304569e12fd3cd5cd439db79edcbcba1 100644 --- a/gsk/gl/gskglrenderer.c +++ b/gsk/gl/gskglrenderer.c @@ -162,6 +162,7 @@ gsk_gl_renderer_new (void) static gboolean gsk_gl_renderer_realize (GskRenderer *renderer, + GdkDisplay *display, GdkSurface *surface, GError **error) { @@ -169,7 +170,6 @@ gsk_gl_renderer_realize (GskRenderer *renderer, GskGLRenderer *self = (GskGLRenderer *)renderer; GdkGLContext *context = NULL; GskGLDriver *driver = NULL; - GdkDisplay *display; gboolean ret = FALSE; gboolean debug_shaders = FALSE; GdkGLAPI api; @@ -182,15 +182,9 @@ gsk_gl_renderer_realize (GskRenderer *renderer, g_assert (self->command_queue == NULL); if (surface == NULL) - { - display = gdk_display_get_default (); /* FIXME: allow different displays somehow ? */ - context = gdk_display_create_gl_context (display, error); - } + context = gdk_display_create_gl_context (display, error); else - { - display = gdk_surface_get_display (surface); - context = gdk_surface_create_gl_context (surface, error); - } + context = gdk_surface_create_gl_context (surface, error); if (!context || !gdk_gl_context_realize (context, error)) goto failure; diff --git a/gsk/gl/gskglrenderer.h b/gsk/gl/gskglrenderer.h index acad1c91cdf4def59655603f54173a763a043ff2..6d0095fe73ea9b031f453a0871da49fea513386b 100644 --- a/gsk/gl/gskglrenderer.h +++ b/gsk/gl/gskglrenderer.h @@ -20,7 +20,13 @@ #pragma once +#if !defined (__GSK_H_INSIDE__) && !defined (GTK_COMPILATION) #include +#define GSK_INCLUDE_WARNING(x) GDK_DEPRECATED_IN_4_14_FOR("#include instead of to avoid this warning") +#else +#include +#define GSK_INCLUDE_WARNING(x) x +#endif G_BEGIN_DECLS @@ -35,14 +41,14 @@ G_BEGIN_DECLS typedef struct _GskGLRenderer GskGLRenderer; typedef struct _GskGLRendererClass GskGLRendererClass; -GDK_AVAILABLE_IN_4_2 +GSK_INCLUDE_WARNING(GDK_AVAILABLE_IN_4_2) GType gsk_gl_renderer_get_type (void) G_GNUC_CONST; -GDK_AVAILABLE_IN_4_2 +GSK_INCLUDE_WARNING(GDK_AVAILABLE_IN_4_2) GskRenderer *gsk_gl_renderer_new (void); -GDK_AVAILABLE_IN_ALL +GSK_INCLUDE_WARNING(GDK_AVAILABLE_IN_ALL) GType gsk_ngl_renderer_get_type (void) G_GNUC_CONST; -GDK_AVAILABLE_IN_ALL +GSK_INCLUDE_WARNING(GDK_AVAILABLE_IN_ALL) GskRenderer *gsk_ngl_renderer_new (void); G_END_DECLS diff --git a/gsk/gl/gskglrendererprivate.h b/gsk/gl/gskglrendererprivate.h index 59a7222e71fe2f82e4973dedfaded0cdc1725ec3..3902a7cd995982c5d6dec84a23715645e7ed6eb9 100644 --- a/gsk/gl/gskglrendererprivate.h +++ b/gsk/gl/gskglrendererprivate.h @@ -22,6 +22,8 @@ #include "gskglrenderer.h" +#include "gskglshader.h" + G_BEGIN_DECLS gboolean gsk_gl_renderer_try_compile_gl_shader (GskGLRenderer *renderer, diff --git a/gsk/gpu/gskgpudownloadop.c b/gsk/gpu/gskgpudownloadop.c index c1c5517de9d95cb65e8541af554165c7f694fd98..a9c3ec614849ed1e32ef1bf032fa4594e2eb990e 100644 --- a/gsk/gpu/gskgpudownloadop.c +++ b/gsk/gpu/gskgpudownloadop.c @@ -69,6 +69,8 @@ gsk_gpu_download_op_print (GskGpuOp *op, } #ifdef GDK_RENDERING_VULKAN + +#ifdef HAVE_DMABUF /* The code needs to run here because vkGetSemaphoreFdKHR() may * only be called after the semaphore has been submitted via * vkQueueSubmit(). @@ -102,6 +104,7 @@ gsk_gpu_download_op_vk_sync_semaphore (GskGpuDownloadOp *self) vkDestroySemaphore (display->vk_device, self->vk_semaphore, NULL); } +#endif static void gsk_gpu_download_op_vk_create (GskGpuDownloadOp *self) diff --git a/gsk/gpu/gskgpurenderer.c b/gsk/gpu/gskgpurenderer.c index fb87d5359d5fff53e318b9ee4da7fce413a6fc4c..00d50099e7e7431f61e096410bfa00483f5e6d2a 100644 --- a/gsk/gpu/gskgpurenderer.c +++ b/gsk/gpu/gskgpurenderer.c @@ -188,18 +188,13 @@ gsk_gpu_renderer_get_frame (GskGpuRenderer *self) static gboolean gsk_gpu_renderer_realize (GskRenderer *renderer, + GdkDisplay *display, GdkSurface *surface, GError **error) { GskGpuRenderer *self = GSK_GPU_RENDERER (renderer); GskGpuRendererPrivate *priv = gsk_gpu_renderer_get_instance_private (self); GskGpuOptimizations context_optimizations; - GdkDisplay *display; - - if (surface) - display = gdk_surface_get_display (surface); - else - display = gdk_display_get_default (); priv->device = GSK_GPU_RENDERER_GET_CLASS (self)->get_device (display, error); if (priv->device == NULL) diff --git a/gsk/gpu/gskvulkandeviceprivate.h b/gsk/gpu/gskvulkandeviceprivate.h index 6e79a04a6eb0954592c18a403ace52045e9e8f21..564cb54051a82ecff4bf4ef297ebecdb018fcf6a 100644 --- a/gsk/gpu/gskvulkandeviceprivate.h +++ b/gsk/gpu/gskvulkandeviceprivate.h @@ -6,8 +6,8 @@ #include "gskgpuclipprivate.h" #include "gskvulkanmemoryprivate.h" -#include #include "gdk/gdkdisplayprivate.h" +#include "gdk/gdkvulkancontextprivate.h" G_BEGIN_DECLS diff --git a/gsk/gpu/gskvulkanmemoryprivate.h b/gsk/gpu/gskvulkanmemoryprivate.h index 6dcb30c05aa5a73db678fa9f2ac2d7d2111ec320..5fa7f615de41cfb7841372764ed70e804d13c116 100644 --- a/gsk/gpu/gskvulkanmemoryprivate.h +++ b/gsk/gpu/gskvulkanmemoryprivate.h @@ -2,6 +2,8 @@ #include +#include + G_BEGIN_DECLS #define GSK_VULKAN_MEMORY_MAPPABLE (VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | \ diff --git a/gsk/gpu/gskvulkanrenderer.c b/gsk/gpu/gskvulkanrenderer.c index 7ba5fdbd1144f0553258237a403f2db7c6c49c59..997a6d944802c7e9df4059769d7faefcdaba1eed 100644 --- a/gsk/gpu/gskvulkanrenderer.c +++ b/gsk/gpu/gskvulkanrenderer.c @@ -1,20 +1,26 @@ #include "config.h" -#include "gsk/vulkan/gskvulkanrenderer.h" +#include "gskvulkanrenderer.h" #include "gskgpurendererprivate.h" + +#ifdef GDK_RENDERING_VULKAN + #include "gskvulkandeviceprivate.h" #include "gskvulkanframeprivate.h" #include "gskvulkanimageprivate.h" #include "gdk/gdkdisplayprivate.h" +#endif struct _GskVulkanRenderer { GskGpuRenderer parent_instance; +#ifdef GDK_RENDERING_VULKAN guint n_targets; GskGpuImage **targets; +#endif }; struct _GskVulkanRendererClass @@ -24,6 +30,7 @@ struct _GskVulkanRendererClass G_DEFINE_TYPE (GskVulkanRenderer, gsk_vulkan_renderer, GSK_TYPE_GPU_RENDERER) +#ifdef GDK_RENDERING_VULKAN static void gsk_vulkan_renderer_free_targets (GskVulkanRenderer *self) { @@ -82,11 +89,7 @@ gsk_vulkan_renderer_create_context (GskGpuRenderer *renderer, GskVulkanRenderer *self = GSK_VULKAN_RENDERER (renderer); GdkVulkanContext *context; - if (surface) - context = gdk_surface_create_vulkan_context (surface, error); - else - context = gdk_display_create_vulkan_context (display, error); - + context = gdk_display_create_vulkan_context (display, surface, error); if (context == NULL) return NULL; @@ -171,10 +174,12 @@ gsk_vulkan_renderer_unrealize (GskRenderer *renderer) GSK_RENDERER_CLASS (gsk_vulkan_renderer_parent_class)->unrealize (renderer); } +#endif static void gsk_vulkan_renderer_class_init (GskVulkanRendererClass *klass) { +#ifdef GDK_RENDERING_VULKAN GskGpuRendererClass *gpu_renderer_class = GSK_GPU_RENDERER_CLASS (klass); GskRendererClass *renderer_class = GSK_RENDERER_CLASS (klass); @@ -188,6 +193,7 @@ gsk_vulkan_renderer_class_init (GskVulkanRendererClass *klass) gpu_renderer_class->get_dmabuf_formats = gsk_vulkan_renderer_get_dmabuf_formats; renderer_class->unrealize = gsk_vulkan_renderer_unrealize; +#endif } static void @@ -203,8 +209,8 @@ gsk_vulkan_renderer_init (GskVulkanRenderer *self) * The Vulkan renderer is a renderer that uses the Vulkan library for * rendering. * - * This function is only available when GTK was compiled with Vulkan - * support. + * This renderer will fail to realize when GTK was not compiled with + * Vulkan support. * * Returns: a new Vulkan renderer **/ diff --git a/gsk/vulkan/gskvulkanrenderer.h b/gsk/gpu/gskvulkanrenderer.h similarity index 92% rename from gsk/vulkan/gskvulkanrenderer.h rename to gsk/gpu/gskvulkanrenderer.h index 0b4e74a58df0ddea9c5dad3037022f40eea963f9..0346e5ca863c4e57fdda3d5a7505fa3c02a6686b 100644 --- a/gsk/vulkan/gskvulkanrenderer.h +++ b/gsk/gpu/gskvulkanrenderer.h @@ -20,10 +20,6 @@ #include #include -#ifdef GDK_RENDERING_VULKAN - -#include - G_BEGIN_DECLS #define GSK_TYPE_VULKAN_RENDERER (gsk_vulkan_renderer_get_type ()) @@ -38,6 +34,8 @@ G_BEGIN_DECLS * GskVulkanRenderer: * * A GSK renderer that is using Vulkan. + * + * This renderer will fail to realize if Vulkan is not supported. */ typedef struct _GskVulkanRenderer GskVulkanRenderer; typedef struct _GskVulkanRendererClass GskVulkanRendererClass; @@ -48,4 +46,6 @@ GType gsk_vulkan_renderer_get_type (void) G_GNUC_CO GDK_AVAILABLE_IN_ALL GskRenderer * gsk_vulkan_renderer_new (void); -#endif +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GskVulkanRenderer, g_object_unref) + +G_END_DECLS diff --git a/gsk/gsk.h b/gsk/gsk.h index 9f2ee451dd2dfe36cabb21e35997aa401d83fb63..d118ef3c0a63ead39ae045062437192fc6840fb2 100644 --- a/gsk/gsk.h +++ b/gsk/gsk.h @@ -32,6 +32,8 @@ #include #include +#include +#include #include #include diff --git a/gsk/gskcairorenderer.c b/gsk/gskcairorenderer.c index 71725f4b2fbda0e8ae71cb5a9e49b2fc194d35fe..7ba3434ecd94c57a5975081b768cafe9e2973254 100644 --- a/gsk/gskcairorenderer.c +++ b/gsk/gskcairorenderer.c @@ -50,6 +50,7 @@ G_DEFINE_TYPE (GskCairoRenderer, gsk_cairo_renderer, GSK_TYPE_RENDERER) static gboolean gsk_cairo_renderer_realize (GskRenderer *renderer, + GdkDisplay *display, GdkSurface *surface, GError **error) { diff --git a/gsk/gskrenderer.c b/gsk/gskrenderer.c index ec93c06ac6a898733c773e5ae79182d3faeb7d4b..156c448faffb288736cb0e24a4f0c54210d58ad2 100644 --- a/gsk/gskrenderer.c +++ b/gsk/gskrenderer.c @@ -38,20 +38,19 @@ #include "gskcairorenderer.h" #include "gskdebugprivate.h" -#include "gl/gskglrenderer.h" #include "gskprofilerprivate.h" #include "gskrendernodeprivate.h" #include "gskoffloadprivate.h" #include "gskenumtypes.h" +#include "gl/gskglrenderer.h" +#include "gpu/gskvulkanrenderer.h" + #include #include #include -#ifdef GDK_RENDERING_VULKAN -#include "vulkan/gskvulkanrenderer.h" -#endif #ifdef GDK_WINDOWING_X11 #include #endif @@ -103,6 +102,7 @@ static GParamSpec *gsk_renderer_properties[N_PROPS]; static gboolean gsk_renderer_real_realize (GskRenderer *self, + GdkDisplay *display, GdkSurface *surface, GError **error) { @@ -256,6 +256,32 @@ gsk_renderer_is_realized (GskRenderer *renderer) return priv->is_realized; } +static gboolean +gsk_renderer_do_realize (GskRenderer *renderer, + GdkDisplay *display, + GdkSurface *surface, + GError **error) +{ + GskRendererPrivate *priv = gsk_renderer_get_instance_private (renderer); + + if (surface) + priv->surface = g_object_ref (surface); + + if (!GSK_RENDERER_GET_CLASS (renderer)->realize (renderer, display, surface, error)) + { + g_clear_object (&priv->surface); + return FALSE; + } + + priv->is_realized = TRUE; + + g_object_notify (G_OBJECT (renderer), "realized"); + if (surface) + g_object_notify (G_OBJECT (renderer), "surface"); + + return TRUE; +} + /** * gsk_renderer_realize: * @renderer: a `GskRenderer` @@ -267,6 +293,8 @@ gsk_renderer_is_realized (GskRenderer *renderer) * * Since GTK 4.6, the surface may be `NULL`, which allows using * renderers without having to create a surface. + * Since GTK 4.14, it is recommended to use [method@Gsk.Renderer.realize_for_display] + * instead. * * Note that it is mandatory to call [method@Gsk.Renderer.unrealize] before * destroying the renderer. @@ -278,29 +306,54 @@ gsk_renderer_realize (GskRenderer *renderer, GdkSurface *surface, GError **error) { - GskRendererPrivate *priv = gsk_renderer_get_instance_private (renderer); - g_return_val_if_fail (GSK_IS_RENDERER (renderer), FALSE); g_return_val_if_fail (!gsk_renderer_is_realized (renderer), FALSE); g_return_val_if_fail (surface == NULL || GDK_IS_SURFACE (surface), FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); - if (surface) - priv->surface = g_object_ref (surface); - - if (!GSK_RENDERER_GET_CLASS (renderer)->realize (renderer, surface, error)) + if (surface == NULL) { - g_clear_object (&priv->surface); - return FALSE; + return gsk_renderer_do_realize (renderer, + gdk_display_get_default (), + NULL, + error); } + else + { + return gsk_renderer_do_realize (renderer, + gdk_surface_get_display (surface), + surface, + error); + } +} - priv->is_realized = TRUE; - - g_object_notify (G_OBJECT (renderer), "realized"); - if (surface) - g_object_notify (G_OBJECT (renderer), "surface"); +/** + * gsk_renderer_realize_for_display: + * @renderer: a `GskRenderer` + * @display: the `GdkDisplay` renderer will be used on + * @error: return location for an error + * + * Creates the resources needed by the @renderer to render the scene + * graph. + * + * Note that it is mandatory to call [method@Gsk.Renderer.unrealize] before + * destroying the renderer. + * + * Returns: Whether the renderer was successfully realized + * + * Since: 4.14 + */ +gboolean +gsk_renderer_realize_for_display (GskRenderer *renderer, + GdkDisplay *display, + GError **error) +{ + g_return_val_if_fail (GSK_IS_RENDERER (renderer), FALSE); + g_return_val_if_fail (!gsk_renderer_is_realized (renderer), FALSE); + g_return_val_if_fail (display == NULL || GDK_IS_DISPLAY (display), FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); - return TRUE; + return gsk_renderer_do_realize (renderer, display, NULL, error); } /** diff --git a/gsk/gskrenderer.h b/gsk/gskrenderer.h index af73141e2b03d7f4716ed20eb3e3c315e8151d57..97a828b5b7fe787796cea5cab0e70f9af6a690b7 100644 --- a/gsk/gskrenderer.h +++ b/gsk/gskrenderer.h @@ -47,6 +47,10 @@ GDK_AVAILABLE_IN_ALL gboolean gsk_renderer_realize (GskRenderer *renderer, GdkSurface *surface, GError **error); +GDK_AVAILABLE_IN_4_14 +gboolean gsk_renderer_realize_for_display (GskRenderer *renderer, + GdkDisplay *display, + GError **error); GDK_AVAILABLE_IN_ALL void gsk_renderer_unrealize (GskRenderer *renderer); GDK_AVAILABLE_IN_ALL diff --git a/gsk/gskrendererprivate.h b/gsk/gskrendererprivate.h index 2d020be493d9453bada00149747b864be95e7cdc..cf080498185ecf43e8c892e110d580675cd163f6 100644 --- a/gsk/gskrendererprivate.h +++ b/gsk/gskrendererprivate.h @@ -41,6 +41,7 @@ struct _GskRendererClass gboolean supports_offload; gboolean (* realize) (GskRenderer *renderer, + GdkDisplay *display, GdkSurface *surface, GError **error); void (* unrealize) (GskRenderer *renderer); diff --git a/gsk/meson.build b/gsk/meson.build index 273fdc63bc8f4dbf48a625eaa47067f7be510cbe..b30a7ec9f8ac5933155752681a35978903dbeb16 100644 --- a/gsk/meson.build +++ b/gsk/meson.build @@ -109,6 +109,7 @@ gsk_private_sources = files([ 'gpu/gskgpuuberop.c', 'gpu/gskgpuuploadop.c', 'gpu/gsknglrenderer.c', + 'gpu/gskvulkanrenderer.c', ]) gsk_f16c_sources = files([ @@ -138,6 +139,12 @@ gsk_public_gl_headers = files([ install_headers(gsk_public_gl_headers, subdir: 'gtk-4.0/gsk/gl') gsk_public_headers += gsk_public_gl_headers +gsk_public_gpu_headers = files([ + 'gpu/gskvulkanrenderer.h' +]) +install_headers(gsk_public_gpu_headers, subdir: 'gtk-4.0/gsk/gpu') +gsk_public_headers += gsk_public_gpu_headers + if get_variable('broadway_enabled') gsk_public_broadway_headers = files([ 'broadway/gskbroadwayrenderer.h' @@ -146,14 +153,6 @@ if get_variable('broadway_enabled') gsk_public_headers += gsk_public_broadway_headers endif -if have_vulkan - gsk_public_vulkan_headers = files([ - 'vulkan/gskvulkanrenderer.h' - ]) - install_headers(gsk_public_vulkan_headers, subdir: 'gtk-4.0/gsk/vulkan') - gsk_public_headers += gsk_public_vulkan_headers -endif - gsk_private_vulkan_shaders = [] gsk_private_vulkan_compiled_shaders = [] gsk_private_vulkan_compiled_shaders_deps = [] @@ -168,7 +167,6 @@ if have_vulkan 'gpu/gskvulkanimage.c', 'gpu/gskvulkanmemory.c', 'gpu/gskvulkanrealdescriptors.c', - 'gpu/gskvulkanrenderer.c', 'gpu/gskvulkansubdescriptors.c', ]) endif # have_vulkan diff --git a/gtk/gtktestutils.c b/gtk/gtktestutils.c index face9c372366b8912b90c2b0adf6ce5c5e7adfec..ae5043682e7c22d2282ae398a9e81fe5e8577544 100644 --- a/gtk/gtktestutils.c +++ b/gtk/gtktestutils.c @@ -40,16 +40,10 @@ #include #define GTK_COMPILATION -#include - #ifdef GDK_WINDOWING_BROADWAY #include #endif -#ifdef GDK_RENDERING_VULKAN -#include -#endif - #ifdef GDK_WINDOWING_X11 #include #endif diff --git a/gtk/inspector/general.c b/gtk/inspector/general.c index 7b01a99438157609a3b001159ed2a02abbedb8e4..fc0f8b62d38f318591d4baa7552af916c9421714 100644 --- a/gtk/inspector/general.c +++ b/gtk/inspector/general.c @@ -447,7 +447,7 @@ init_gl (GtkInspectorGeneral *gen) #ifdef GDK_RENDERING_VULKAN static gboolean -has_debug_extension (GdkVulkanContext *context) +has_debug_extension (void) { uint32_t i; uint32_t n_extensions; @@ -465,7 +465,7 @@ has_debug_extension (GdkVulkanContext *context) } static gboolean -has_validation_layer (GdkVulkanContext *context) +has_validation_layer (void) { uint32_t i; uint32_t n_layers; @@ -487,9 +487,6 @@ static void init_vulkan (GtkInspectorGeneral *gen) { #ifdef GDK_RENDERING_VULKAN - GdkSurface *surface; - GdkVulkanContext *context; - if (gdk_display_get_debug_flags (gen->display) & GDK_DEBUG_VULKAN_DISABLE) { gtk_label_set_text (GTK_LABEL (gen->vk_device), C_("Vulkan device", "Disabled")); @@ -498,11 +495,7 @@ init_vulkan (GtkInspectorGeneral *gen) return; } - surface = gdk_surface_new_toplevel (gen->display); - context = gdk_surface_create_vulkan_context (surface, NULL); - gdk_surface_destroy (surface); - - if (context) + if (gen->display->vk_device) { VkPhysicalDevice vk_device; VkPhysicalDeviceProperties props; @@ -510,7 +503,7 @@ init_vulkan (GtkInspectorGeneral *gen) char *api_version; char *driver_version; - vk_device = gdk_vulkan_context_get_physical_device (context); + vk_device = gen->display->vk_physical_device; vkGetPhysicalDeviceProperties (vk_device, &props); device_name = g_strdup_printf ("%s (%d)", props.deviceName, props.deviceType); @@ -541,11 +534,9 @@ init_vulkan (GtkInspectorGeneral *gen) add_check_row (gen, GTK_LIST_BOX (gen->vulkan_extensions_box), "VK_KHR_wayland_surface", TRUE, 0); #endif add_check_row (gen, GTK_LIST_BOX (gen->vulkan_extensions_box), VK_EXT_DEBUG_REPORT_EXTENSION_NAME, - has_debug_extension (context), 0); + has_debug_extension (), 0); add_check_row (gen, GTK_LIST_BOX (gen->vulkan_extensions_box), "VK_LAYER_KHRONOS_validation", - has_validation_layer (context), 0); - - g_object_unref (context); + has_validation_layer (), 0); } else #endif diff --git a/meson.build b/meson.build index 1ea481dd5c2a6db20f7eeba789265c4ca9a4e61d..a9663e501ca2e0322e934f3ddcae045cd22c1e4d 100644 --- a/meson.build +++ b/meson.build @@ -101,6 +101,7 @@ wayland_enabled = get_option('wayland-backend') broadway_enabled = get_option('broadway-backend') macos_enabled = get_option('macos-backend') win32_enabled = get_option('win32-backend') +vulkan_enabled = get_option('vulkan') os_unix = false os_linux = false @@ -122,6 +123,7 @@ os_unix = not os_win32 if os_darwin wayland_enabled = false + vulkan_enabled = false else macos_enabled = false endif @@ -616,8 +618,8 @@ endif # be reported upstream and fixed. vulkan_dep = dependency('vulkan', version: vulkan_req, - required: get_option('vulkan')) -glslc = find_program('glslc', required: get_option('vulkan')) + required: vulkan_enabled) +glslc = find_program('glslc', required: vulkan_enabled) if vulkan_dep.found() have_vulkan = true vulkan_pkg_found = vulkan_dep.type_name() == 'pkgconfig' diff --git a/meson_options.txt b/meson_options.txt index 4b794e781418fbeca1d0505799bd9a82c6ad63eb..3b2cb8ad37b7dc2fab84435f1aad45c2a883c951 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -55,8 +55,8 @@ option('print-cups', option('vulkan', type: 'feature', - value: 'disabled', - description : 'Enable support for the experimental Vulkan renderer') + value: 'enabled', + description : 'Enable Vulkan support including the Vulkan renderer') option('cloudproviders', type: 'feature', diff --git a/tests/testdmabuf.c b/tests/testdmabuf.c index 6ca82bd47f7e6c3f5af8a4604149ed17240a29a0..c6a2e263d856d6560585e808f7438420a24ee049 100644 --- a/tests/testdmabuf.c +++ b/tests/testdmabuf.c @@ -6,6 +6,9 @@ #include #include +#ifdef GDK_RENDERING_VULKAN +#include +#endif /* For this to work, you may need to give /dev/dma_heap/system * lax permissions. */ diff --git a/testsuite/gdk/memorytexture.c b/testsuite/gdk/memorytexture.c index 5d53e7ae59113b9ada37714431847458e05ac529..57cd48ab56263c1e4fe567bb5c78575949d58bc5 100644 --- a/testsuite/gdk/memorytexture.c +++ b/testsuite/gdk/memorytexture.c @@ -1,10 +1,5 @@ #include -#include "gsk/gl/gskglrenderer.h" -#ifdef GDK_RENDERING_VULKAN -#include "gsk/vulkan/gskvulkanrenderer.h" -#endif - #include #define N 10 @@ -1456,6 +1451,7 @@ add_conversion_test (const char *name, int main (int argc, char *argv[]) { + GdkDisplay *display; int result; gtk_test_init (&argc, &argv, NULL); @@ -1465,31 +1461,31 @@ main (int argc, char *argv[]) add_conversion_test ("/memorytexture/conversion_1x1", test_conversion_1x1); add_conversion_test ("/memorytexture/conversion_random", test_conversion_random); - gl_context = gdk_display_create_gl_context (gdk_display_get_default (), NULL); + display = gdk_display_get_default (); + + gl_context = gdk_display_create_gl_context (display, NULL); if (gl_context == NULL || !gdk_gl_context_realize (gl_context, NULL)) { g_clear_object (&gl_context); } gl_renderer = gsk_gl_renderer_new (); - if (!gsk_renderer_realize (gl_renderer, NULL, NULL)) + if (!gsk_renderer_realize_for_display (gl_renderer, display, NULL)) { g_clear_object (&gl_renderer); } ngl_renderer = gsk_ngl_renderer_new (); - if (!gsk_renderer_realize (ngl_renderer, NULL, NULL)) + if (!gsk_renderer_realize_for_display (ngl_renderer, display, NULL)) { g_clear_object (&ngl_renderer); } -#ifdef GDK_RENDERING_VULKAN vulkan_renderer = gsk_vulkan_renderer_new (); - if (!gsk_renderer_realize (vulkan_renderer, NULL, NULL)) + if (!gsk_renderer_realize_for_display (vulkan_renderer, display, NULL)) { g_clear_object (&vulkan_renderer); } -#endif result = g_test_run (); diff --git a/testsuite/gdk/texture-threads.c b/testsuite/gdk/texture-threads.c index 529e2351e6f52a216a79bfb0f35b34d4562f677a..b5a499305160b0c57b27135caa559cfc688aba5d 100644 --- a/testsuite/gdk/texture-threads.c +++ b/testsuite/gdk/texture-threads.c @@ -1,7 +1,5 @@ #include -#include "gsk/gl/gskglrenderer.h" - /* This function will be called from a thread and/or the main loop. * Textures are threadsafe after all. */ static void @@ -67,7 +65,7 @@ texture_threads (void) /* 1. Get a GL renderer */ gl_renderer = gsk_gl_renderer_new (); - if (!gsk_renderer_realize (gl_renderer, NULL, &error)) + if (!gsk_renderer_realize_for_display (gl_renderer, gdk_display_get_default (), &error)) { g_test_skip (error->message); diff --git a/testsuite/gsk/misc.c b/testsuite/gsk/misc.c index b2d72d77b7ce06c5855bfb41102f01dd945b759f..e392c758a440bf578ea256720b650bf54f4db0f2 100644 --- a/testsuite/gsk/misc.c +++ b/testsuite/gsk/misc.c @@ -1,10 +1,6 @@ #include #include "gsk/gskrendernodeprivate.h" -#ifdef GDK_RENDERING_GL -#include -#endif - #include static void diff --git a/testsuite/gsk/scaling.c b/testsuite/gsk/scaling.c index 70039f5d710a4a1b7e045fdc9c60832dcb9832c6..e247ee9c94ffd6c3016f7962d236ce457639579a 100644 --- a/testsuite/gsk/scaling.c +++ b/testsuite/gsk/scaling.c @@ -1,12 +1,5 @@ #include -#include "gsk/gl/gskglrenderer.h" -#ifdef GDK_RENDERING_VULKAN -#include "gsk/vulkan/gskvulkanrenderer.h" -#endif - -#include - #define N 10 struct { @@ -25,12 +18,10 @@ struct { "cairo", gsk_cairo_renderer_new, }, -#ifdef GDK_RENDERING_VULKAN { "vulkan", gsk_vulkan_renderer_new, }, -#endif { "ngl", gsk_ngl_renderer_new, @@ -1051,7 +1042,7 @@ create_renderers (void) for (i = 0; i < G_N_ELEMENTS (renderers); i++) { renderers[i].renderer = renderers[i].create_func (); - if (!gsk_renderer_realize (renderers[i].renderer, NULL, &error)) + if (!gsk_renderer_realize_for_display (renderers[i].renderer, gdk_display_get_default (), &error)) { g_test_message ("Could not realize %s renderer: %s", renderers[i].name, error->message); g_clear_error (&error);