From: Benjamin Otte Date: Tue, 20 Jun 2023 14:35:55 +0000 (+0200) Subject: vulkan: Take offscreen fromat from context X-Git-Tag: archive/raspbian/4.12.3+ds-1+rpi1~1^2^2^2~22^2~1^2~117^2~1 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=299c6a3d6fe1cf47a27000100c25b0f2466e40ce;p=gtk4.git vulkan: Take offscreen fromat from context We want to create offscreens in compatible formats, and in particular we want to ideally use the same format as rendering would use. --- diff --git a/gdk/gdkvulkancontext.c b/gdk/gdkvulkancontext.c index b6ec40891f..a319c9c5dc 100644 --- a/gdk/gdkvulkancontext.c +++ b/gdk/gdkvulkancontext.c @@ -52,6 +52,7 @@ struct _GdkVulkanContextPrivate { GdkMemoryFormat gdk_format; } formats[4]; GdkMemoryDepth current_format; + GdkMemoryFormat offscreen_formats[4]; VkSwapchainKHR swapchain; VkSemaphore draw_semaphore; @@ -693,6 +694,11 @@ gdk_vulkan_context_real_init (GInitable *initable, if (!priv->vulkan_ref) return FALSE; + priv->offscreen_formats[GDK_MEMORY_U8] = GDK_MEMORY_B8G8R8A8_PREMULTIPLIED; + priv->offscreen_formats[GDK_MEMORY_U16] = GDK_MEMORY_R16G16B16A16_PREMULTIPLIED; + priv->offscreen_formats[GDK_MEMORY_FLOAT16] = GDK_MEMORY_R16G16B16A16_FLOAT_PREMULTIPLIED; + priv->offscreen_formats[GDK_MEMORY_FLOAT32] = GDK_MEMORY_R32G32B32A32_FLOAT_PREMULTIPLIED; + if (surface == NULL) { for (i = 0; i < G_N_ELEMENTS (priv->formats); i++) @@ -748,6 +754,7 @@ gdk_vulkan_context_real_init (GInitable *initable, { priv->formats[GDK_MEMORY_U8].vk_format = formats[i]; priv->formats[GDK_MEMORY_U8].gdk_format = GDK_MEMORY_B8G8R8A8_PREMULTIPLIED; + priv->offscreen_formats[GDK_MEMORY_U8] = GDK_MEMORY_B8G8R8A8_PREMULTIPLIED; }; break; @@ -827,6 +834,15 @@ out_surface: return FALSE; } +GdkMemoryFormat +gdk_vulkan_context_get_offscreen_format (GdkVulkanContext *context, + GdkMemoryDepth depth) +{ + GdkVulkanContextPrivate *priv = gdk_vulkan_context_get_instance_private (context); + + return priv->offscreen_formats[depth]; +} + static void gdk_vulkan_context_initable_init (GInitableIface *iface) { diff --git a/gdk/gdkvulkancontextprivate.h b/gdk/gdkvulkancontextprivate.h index 7a59485675..cb06efd73c 100644 --- a/gdk/gdkvulkancontextprivate.h +++ b/gdk/gdkvulkancontextprivate.h @@ -69,9 +69,12 @@ gdk_vulkan_handle_result (VkResult res, #define GDK_VK_CHECK(func, ...) gdk_vulkan_handle_result (func (__VA_ARGS__), G_STRINGIFY (func)) -gboolean gdk_display_ref_vulkan (GdkDisplay *display, - GError **error); -void gdk_display_unref_vulkan (GdkDisplay *display); +gboolean gdk_display_ref_vulkan (GdkDisplay *display, + GError **error); +void gdk_display_unref_vulkan (GdkDisplay *display); + +GdkMemoryFormat gdk_vulkan_context_get_offscreen_format (GdkVulkanContext *context, + GdkMemoryDepth depth); #else /* !GDK_RENDERING_VULKAN */ diff --git a/gsk/vulkan/gskvulkanimage.c b/gsk/vulkan/gskvulkanimage.c index 030a3ac979..709584e02c 100644 --- a/gsk/vulkan/gskvulkanimage.c +++ b/gsk/vulkan/gskvulkanimage.c @@ -488,24 +488,6 @@ gsk_memory_format_get_fallback (GdkMemoryFormat format) } } -GdkMemoryFormat -gsk_render_node_get_preferred_vulkan_format (GskRenderNode *node) -{ - switch (gsk_render_node_get_preferred_depth (node)) - { - case GDK_MEMORY_U8: - return GDK_MEMORY_R8G8B8A8_PREMULTIPLIED; - case GDK_MEMORY_U16: - return GDK_MEMORY_R16G16B16A16_PREMULTIPLIED; - case GDK_MEMORY_FLOAT16: - return GDK_MEMORY_R16G16B16A16_FLOAT_PREMULTIPLIED; - case GDK_MEMORY_FLOAT32: - return GDK_MEMORY_R32G32B32A32_FLOAT_PREMULTIPLIED; - default: - g_return_val_if_reached (GDK_MEMORY_R8G8B8A8_PREMULTIPLIED); - } -} - static gboolean gsk_vulkan_context_supports_format (GdkVulkanContext *context, VkFormat format) diff --git a/gsk/vulkan/gskvulkanimageprivate.h b/gsk/vulkan/gskvulkanimageprivate.h index 25ab54ded4..401711fd9e 100644 --- a/gsk/vulkan/gskvulkanimageprivate.h +++ b/gsk/vulkan/gskvulkanimageprivate.h @@ -1,7 +1,6 @@ #pragma once #include -#include #include "gskvulkanbufferprivate.h" #include "gskvulkancommandpoolprivate.h" @@ -22,8 +21,6 @@ void gsk_vulkan_uploader_free (GskVulk void gsk_vulkan_uploader_reset (GskVulkanUploader *self); void gsk_vulkan_uploader_upload (GskVulkanUploader *self); -GdkMemoryFormat gsk_render_node_get_preferred_vulkan_format (GskRenderNode *node); - GskVulkanImage * gsk_vulkan_image_new_for_swapchain (GdkVulkanContext *context, VkImage image, VkFormat format, diff --git a/gsk/vulkan/gskvulkanrenderer.c b/gsk/vulkan/gskvulkanrenderer.c index 694786e13f..7a42e1acb9 100644 --- a/gsk/vulkan/gskvulkanrenderer.c +++ b/gsk/vulkan/gskvulkanrenderer.c @@ -14,8 +14,9 @@ #include "gdk/gdkdisplayprivate.h" #include "gdk/gdkdrawcontextprivate.h" -#include "gdk/gdktextureprivate.h" #include "gdk/gdkprofilerprivate.h" +#include "gdk/gdktextureprivate.h" +#include "gdk/gdkvulkancontextprivate.h" #include @@ -286,7 +287,8 @@ gsk_vulkan_renderer_render_texture (GskRenderer *renderer, ceil (viewport->size.width), ceil (viewport->size.height)); image = gsk_vulkan_image_new_for_offscreen (self->vulkan, - gsk_render_node_get_preferred_vulkan_format (root), + gdk_vulkan_context_get_offscreen_format (self->vulkan, + gsk_render_node_get_preferred_depth (root)), rounded_viewport.size.width, rounded_viewport.size.height); diff --git a/gsk/vulkan/gskvulkanrenderpass.c b/gsk/vulkan/gskvulkanrenderpass.c index eb66a56482..3e793e4600 100644 --- a/gsk/vulkan/gskvulkanrenderpass.c +++ b/gsk/vulkan/gskvulkanrenderpass.c @@ -26,6 +26,8 @@ #include "gskvulkanrendererprivate.h" #include "gskprivate.h" +#include "gdk/gdkvulkancontextprivate.h" + #define ORTHO_NEAR_PLANE -10000 #define ORTHO_FAR_PLANE 10000 @@ -1275,7 +1277,8 @@ gsk_vulkan_render_pass_render_offscreen (GdkVulkanContext *vulkan, ceil (scale_y * viewport->size.height)); result = gsk_vulkan_image_new_for_offscreen (vulkan, - gsk_render_node_get_preferred_vulkan_format (node), + gdk_vulkan_context_get_offscreen_format (vulkan, + gsk_render_node_get_preferred_depth (node)), view.size.width, view.size.height); #ifdef G_ENABLE_DEBUG