vulkan: Pick high depth texture for high depth nodes
authorBenjamin Otte <otte@redhat.com>
Thu, 15 Jun 2023 21:17:40 +0000 (23:17 +0200)
committerBenjamin Otte <otte@redhat.com>
Mon, 19 Jun 2023 13:08:00 +0000 (15:08 +0200)
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
gsk/vulkan/gskvulkanimageprivate.h
gsk/vulkan/gskvulkanrenderer.c
gsk/vulkan/gskvulkanrenderpass.c

index 0ff410bedaa00bd3a77d78ae0ea121a63fe80146..ed6aa2ae51ffe18cccaac3ebdbb2792cfd697414 100644 (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)
index 471163d1015c84a1f51a8d645fd008ab9319154d..db7036b902b0ecb280dc5b1752ab562a6aac2dc4 100644 (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,
index c51fd81ac3264b4083d724dbc23daaba9e909eae..35a4269da6eb1502b297da05b8d93da55ed95ea8 100644 (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);
 
index 59f429aa89f76c16ff09c3ba08a450e8cfbf6397..3dce46d622ddc5633e22ac244c457f070a7c6bc5 100644 (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