vulkan: Split texture caching code
authorBenjamin Otte <otte@redhat.com>
Sat, 24 Jun 2023 22:54:10 +0000 (00:54 +0200)
committerBenjamin Otte <otte@redhat.com>
Sun, 16 Jul 2023 10:12:36 +0000 (12:12 +0200)
Instead of having one function that gets the image for the texture and
uploads it if it doesn't exist yet, make it 2 functions:

One to get the texture if it exists.
One to assign an uploaded image to the texture.

This way, we can potentially do the upload ourselves.

gsk/vulkan/gskvulkanrenderer.c
gsk/vulkan/gskvulkanrendererprivate.h

index 7a42e1acb96932f3b162119f543391dd5f6b93c1..1de96bbfad5809538a65defbeb65613628eda4be 100644 (file)
@@ -424,18 +424,24 @@ gsk_vulkan_renderer_clear_texture (gpointer p)
 }
 
 GskVulkanImage *
-gsk_vulkan_renderer_ref_texture_image (GskVulkanRenderer *self,
-                                       GdkTexture        *texture,
-                                       GskVulkanUploader *uploader)
+gsk_vulkan_renderer_get_texture_image (GskVulkanRenderer *self,
+                                       GdkTexture        *texture)
 {
   GskVulkanTextureData *data;
-  GskVulkanImage *image;
 
   data = gdk_texture_get_render_data (texture, self);
   if (data)
-    return g_object_ref (data->image);
+    return data->image;
 
-  image = gsk_vulkan_image_new_from_texture (uploader, texture);
+  return NULL;
+}
+
+void
+gsk_vulkan_renderer_add_texture_image (GskVulkanRenderer *self,
+                                       GdkTexture        *texture,
+                                       GskVulkanImage    *image)
+{
+  GskVulkanTextureData *data;
 
   data = g_new0 (GskVulkanTextureData, 1);
   data->image = image;
@@ -451,7 +457,23 @@ gsk_vulkan_renderer_ref_texture_image (GskVulkanRenderer *self,
     {
       g_free (data);
     }
+}
+
+GskVulkanImage *
+gsk_vulkan_renderer_ref_texture_image (GskVulkanRenderer *self,
+                                       GdkTexture        *texture,
+                                       GskVulkanUploader *uploader)
+{
+  GskVulkanImage *image;
+
+  image = gsk_vulkan_renderer_get_texture_image (self, texture);
+  if (image)
+    return g_object_ref (image);
+
+  image = gsk_vulkan_image_new_from_texture (uploader, texture);
 
+  gsk_vulkan_renderer_add_texture_image (self, texture, image);
+                                         
   return image;
 }
 
index fd7d2c19f02d852f299b2beeb90a82c3809eaf90..fdebb49235399f122801b450769f8a962e3e0174 100644 (file)
@@ -5,6 +5,11 @@
 
 G_BEGIN_DECLS
 
+GskVulkanImage *        gsk_vulkan_renderer_get_texture_image           (GskVulkanRenderer      *self,
+                                                                         GdkTexture             *texture);
+void                    gsk_vulkan_renderer_add_texture_image           (GskVulkanRenderer      *self,
+                                                                         GdkTexture             *texture,
+                                                                         GskVulkanImage         *image);
 GskVulkanImage *        gsk_vulkan_renderer_ref_texture_image           (GskVulkanRenderer      *self,
                                                                          GdkTexture             *texture,
                                                                          GskVulkanUploader      *uploader);