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.
This commit is contained in:
Benjamin Otte 2023-06-15 23:17:40 +02:00
parent d61737ac7a
commit 5b64ca7e0a
4 changed files with 26 additions and 2 deletions

View File

@ -8,6 +8,8 @@
#include "gdk/gdkmemoryformatprivate.h"
#include "gskrendernodeprivate.h"
#include <string.h>
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)

View File

@ -1,10 +1,12 @@
#pragma once
#include <gdk/gdk.h>
#include <gsk/gskrendernode.h>
#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,

View File

@ -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);

View File

@ -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