From 5b64ca7e0a6ad20ae21c222353e01fe720b8bec3 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Thu, 15 Jun 2023 23:17:40 +0200 Subject: [PATCH] vulkan: Pick high depth texture for high depth nodes If a node has a higher depth, pick the RGBA format that has that depth as the texture format we're renderig to with render_texture(). Support for adapting the swapchain is not part of this. --- gsk/vulkan/gskvulkanimage.c | 20 ++++++++++++++++++++ gsk/vulkan/gskvulkanimageprivate.h | 4 ++++ gsk/vulkan/gskvulkanrenderer.c | 2 +- gsk/vulkan/gskvulkanrenderpass.c | 2 +- 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/gsk/vulkan/gskvulkanimage.c b/gsk/vulkan/gskvulkanimage.c index 0ff410beda..ed6aa2ae51 100644 --- a/gsk/vulkan/gskvulkanimage.c +++ b/gsk/vulkan/gskvulkanimage.c @@ -8,6 +8,8 @@ #include "gdk/gdkmemoryformatprivate.h" +#include "gskrendernodeprivate.h" + #include struct _GskVulkanUploader @@ -485,6 +487,24 @@ 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 471163d101..db7036b902 100644 --- a/gsk/vulkan/gskvulkanimageprivate.h +++ b/gsk/vulkan/gskvulkanimageprivate.h @@ -1,10 +1,12 @@ #pragma once #include +#include #include "gskvulkanbufferprivate.h" #include "gskvulkancommandpoolprivate.h" + G_BEGIN_DECLS typedef struct _GskVulkanUploader GskVulkanUploader; @@ -20,6 +22,8 @@ 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 c51fd81ac3..35a4269da6 100644 --- a/gsk/vulkan/gskvulkanrenderer.c +++ b/gsk/vulkan/gskvulkanrenderer.c @@ -285,7 +285,7 @@ gsk_vulkan_renderer_render_texture (GskRenderer *renderer, ceil (viewport->size.width), ceil (viewport->size.height)); image = gsk_vulkan_image_new_for_offscreen (self->vulkan, - GDK_MEMORY_DEFAULT, + gsk_render_node_get_preferred_vulkan_format (root), rounded_viewport.size.width, rounded_viewport.size.height); diff --git a/gsk/vulkan/gskvulkanrenderpass.c b/gsk/vulkan/gskvulkanrenderpass.c index 59f429aa89..3dce46d622 100644 --- a/gsk/vulkan/gskvulkanrenderpass.c +++ b/gsk/vulkan/gskvulkanrenderpass.c @@ -1249,7 +1249,7 @@ gsk_vulkan_render_pass_render_offscreen (GdkVulkanContext *vulkan, ceil (scale_y * viewport->size.height)); result = gsk_vulkan_image_new_for_offscreen (vulkan, - GDK_MEMORY_DEFAULT, + gsk_render_node_get_preferred_vulkan_format (node), view.size.width, view.size.height); #ifdef G_ENABLE_DEBUG