vulkan: Take offscreen fromat from context
authorBenjamin Otte <otte@redhat.com>
Tue, 20 Jun 2023 14:35:55 +0000 (16:35 +0200)
committerBenjamin Otte <otte@redhat.com>
Tue, 20 Jun 2023 18:15:12 +0000 (20:15 +0200)
We want to create offscreens in compatible formats, and in particular we
want to ideally use the same format as rendering would use.

gdk/gdkvulkancontext.c
gdk/gdkvulkancontextprivate.h
gsk/vulkan/gskvulkanimage.c
gsk/vulkan/gskvulkanimageprivate.h
gsk/vulkan/gskvulkanrenderer.c
gsk/vulkan/gskvulkanrenderpass.c

index b6ec40891fb58366e37a2b247da0cbec4c2fc8ef..a319c9c5dc1f65c40e8d4f9aa593a6ba913245b4 100644 (file)
@@ -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)
 {
index 7a5948567579306e56013d0ab13a17408172afc0..cb06efd73c7f3da57d7fc23eab79a420a36e6205 100644 (file)
@@ -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 */
 
index 030a3ac9794f0fa1dd7600d4462f1ca42b73ffe1..709584e02ca36b6fc2bdbb0e46cb2e5ca8beec79 100644 (file)
@@ -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)
index 25ab54ded44e5c5af62cd7bafeb08be30489fdd4..401711fd9e6e3b7567b0f2635202e4856729db38 100644 (file)
@@ -1,7 +1,6 @@
 #pragma once
 
 #include <gdk/gdk.h>
-#include <gsk/gskrendernode.h>
 
 #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,
index 694786e13fb71f16c8630d758ff7d986739eb8b3..7a42e1acb96932f3b162119f543391dd5f6b93c1 100644 (file)
@@ -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 <graphene.h>
 
@@ -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);
 
index eb66a564828ef9b3d772b688de59e56984156b95..3e793e4600abf6fde9175e73dbdf0d4bbcae17d7 100644 (file)
@@ -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