vulkan: Move some code
authorBenjamin Otte <otte@redhat.com>
Tue, 13 Jun 2023 06:02:06 +0000 (08:02 +0200)
committerBenjamin Otte <otte@redhat.com>
Wed, 14 Jun 2023 01:34:07 +0000 (03:34 +0200)
Add gsk_vulkan_image_new_from_texture() and use it.

Also rewrite the actual code from using Cairo surfaces to using
GdkTextureDownloader.

gsk/vulkan/gskvulkanimage.c
gsk/vulkan/gskvulkanimageprivate.h
gsk/vulkan/gskvulkanrenderer.c

index 63d00b87869042a7cafbeca7b940a1b16e383008..f10ad5a1d12cdeda3a61adb5c88b77cc1919a665 100644 (file)
@@ -529,6 +529,27 @@ gsk_vulkan_image_new_from_data_directly (GskVulkanUploader *uploader,
   return self;
 }
 
+GskVulkanImage *
+gsk_vulkan_image_new_from_texture (GskVulkanUploader *uploader,
+                                   GdkTexture        *texture)
+{
+  GdkTextureDownloader *downloader;
+  GskVulkanImage *result;
+  GBytes *bytes;
+  gsize stride;
+
+  downloader = gdk_texture_downloader_new (texture);
+  bytes = gdk_texture_downloader_download_bytes (downloader, &stride);
+  result = gsk_vulkan_image_new_from_data (uploader,
+                                           g_bytes_get_data (bytes, NULL),
+                                           gdk_texture_get_width (texture),
+                                           gdk_texture_get_height (texture),
+                                           stride);
+  g_bytes_unref (bytes);
+  gdk_texture_downloader_free (downloader);
+  return result;
+}
+
 GskVulkanImage *
 gsk_vulkan_image_new_from_data (GskVulkanUploader *uploader,
                                 const guchar      *data,
index d793e46e60afb780f36093da9369690a9addad42..07f988bc66b86781bafd736cea8cb626b89fa2c2 100644 (file)
@@ -24,6 +24,8 @@ GskVulkanImage *        gsk_vulkan_image_new_for_swapchain              (GdkVulk
                                                                          VkFormat                format,
                                                                          gsize                   width,
                                                                          gsize                   height);
+GskVulkanImage *        gsk_vulkan_image_new_from_texture               (GskVulkanUploader      *uploader,
+                                                                         GdkTexture             *texture);
 GskVulkanImage *        gsk_vulkan_image_new_from_data                  (GskVulkanUploader      *uploader,
                                                                          const guchar           *data,
                                                                          gsize                   width,
index 8c1b88c3156a37a0bfd2d3d71518f92464443cc5..aa94c1dab1aa53ba0040c681cd03ab56c5e2c082 100644 (file)
@@ -422,20 +422,13 @@ gsk_vulkan_renderer_ref_texture_image (GskVulkanRenderer *self,
                                        GskVulkanUploader *uploader)
 {
   GskVulkanTextureData *data;
-  cairo_surface_t *surface;
   GskVulkanImage *image;
 
   data = gdk_texture_get_render_data (texture, self);
   if (data)
     return g_object_ref (data->image);
 
-  surface = gdk_texture_download_surface (texture);
-  image = gsk_vulkan_image_new_from_data (uploader,
-                                          cairo_image_surface_get_data (surface),
-                                          cairo_image_surface_get_width (surface),
-                                          cairo_image_surface_get_height (surface),
-                                          cairo_image_surface_get_stride (surface));
-  cairo_surface_destroy (surface);
+  image = gsk_vulkan_image_new_from_texture (uploader, texture);
 
   data = g_new0 (GskVulkanTextureData, 1);
   data->image = image;