From f4879a0f2e07e775003c766cc0110f102b984971 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sun, 15 Oct 2023 02:11:13 +0200 Subject: [PATCH] gpu: Factor out uploading textures into a vfunc This way GL and Vulkan can run custom code to import GL textures and dmabufs. This function also decides if and how to cache the textures it creates. --- gsk/gpu/gskgpuframe.c | 22 ++++++++++++++++++++++ gsk/gpu/gskgpuframeprivate.h | 4 ++++ gsk/gpu/gskgpunodeprocessor.c | 7 +++---- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/gsk/gpu/gskgpuframe.c b/gsk/gpu/gskgpuframe.c index 16ceb5ee75..ccc2dea172 100644 --- a/gsk/gpu/gskgpuframe.c +++ b/gsk/gpu/gskgpuframe.c @@ -10,6 +10,7 @@ #include "gskgpuopprivate.h" #include "gskgpurendererprivate.h" #include "gskgpurenderpassopprivate.h" +#include "gskgpuuploadopprivate.h" #include "gskdebugprivate.h" #include "gskrendererprivate.h" @@ -74,6 +75,19 @@ gsk_gpu_frame_cleanup (GskGpuFrame *self) GSK_GPU_FRAME_GET_CLASS (self)->cleanup (self); } +static GskGpuImage * +gsk_gpu_frame_default_upload_texture (GskGpuFrame *frame, + GdkTexture *texture) +{ + GskGpuImage *image; + + image = gsk_gpu_upload_texture_op_try (frame, texture); + if (image) + g_object_ref (image); + + return image; +} + static void gsk_gpu_frame_dispose (GObject *object) { @@ -107,6 +121,7 @@ gsk_gpu_frame_class_init (GskGpuFrameClass *klass) klass->setup = gsk_gpu_frame_default_setup; klass->cleanup = gsk_gpu_frame_default_cleanup; + klass->upload_texture = gsk_gpu_frame_default_upload_texture; object_class->dispose = gsk_gpu_frame_dispose; object_class->finalize = gsk_gpu_frame_finalize; @@ -344,6 +359,13 @@ gsk_gpu_frame_alloc_op (GskGpuFrame *self, return gsk_gpu_ops_index (&priv->ops, pos); } +GskGpuImage * +gsk_gpu_frame_upload_texture (GskGpuFrame *self, + GdkTexture *texture) +{ + return GSK_GPU_FRAME_GET_CLASS (self)->upload_texture (self, texture); +} + GskGpuDescriptors * gsk_gpu_frame_create_descriptors (GskGpuFrame *self) { diff --git a/gsk/gpu/gskgpuframeprivate.h b/gsk/gpu/gskgpuframeprivate.h index 916de5a96e..fc80bcc80b 100644 --- a/gsk/gpu/gskgpuframeprivate.h +++ b/gsk/gpu/gskgpuframeprivate.h @@ -27,6 +27,8 @@ struct _GskGpuFrameClass gboolean (* is_busy) (GskGpuFrame *self); void (* setup) (GskGpuFrame *self); void (* cleanup) (GskGpuFrame *self); + GskGpuImage * (* upload_texture) (GskGpuFrame *self, + GdkTexture *texture); GskGpuDescriptors * (* create_descriptors) (GskGpuFrame *self); GskGpuBuffer * (* create_vertex_buffer) (GskGpuFrame *self, gsize size); @@ -54,6 +56,8 @@ gboolean gsk_gpu_frame_should_optimize (GskGpuF gpointer gsk_gpu_frame_alloc_op (GskGpuFrame *self, gsize size); +GskGpuImage * gsk_gpu_frame_upload_texture (GskGpuFrame *self, + GdkTexture *texture); GskGpuDescriptors * gsk_gpu_frame_create_descriptors (GskGpuFrame *self); gsize gsk_gpu_frame_reserve_vertex_data (GskGpuFrame *self, gsize size); diff --git a/gsk/gpu/gskgpunodeprocessor.c b/gsk/gpu/gskgpunodeprocessor.c index 533631c88f..806fea855c 100644 --- a/gsk/gpu/gskgpunodeprocessor.c +++ b/gsk/gpu/gskgpunodeprocessor.c @@ -517,7 +517,7 @@ gsk_gpu_get_node_as_image (GskGpuFrame *frame, result = gsk_gpu_device_lookup_texture_image (device, texture, timestamp); if (result == NULL) { - result = gsk_gpu_upload_texture_op_try (frame, texture); + result = gsk_gpu_frame_upload_texture (frame, texture); if (result) gsk_gpu_device_cache_texture_image (device, texture, timestamp, result); } @@ -1129,7 +1129,7 @@ gsk_gpu_node_processor_add_texture_node (GskGpuNodeProcessor *self, image = gsk_gpu_device_lookup_texture_image (device, texture, timestamp); if (image == NULL) { - image = gsk_gpu_upload_texture_op_try (self->frame, texture); + image = gsk_gpu_frame_upload_texture (self->frame, texture); if (image == NULL) { GSK_DEBUG (FALLBACK, "Unsupported texture format %u for size %dx%d", @@ -1140,7 +1140,6 @@ gsk_gpu_node_processor_add_texture_node (GskGpuNodeProcessor *self, return; } gsk_gpu_device_cache_texture_image (device, texture, timestamp, image); - image = g_object_ref (image); } descriptor = gsk_gpu_node_processor_add_image (self, image, GSK_GPU_SAMPLER_DEFAULT); @@ -1172,7 +1171,7 @@ gsk_gpu_node_processor_create_texture_pattern (GskGpuPatternWriter *self, image = gsk_gpu_device_lookup_texture_image (device, texture, timestamp); if (image == NULL) { - image = gsk_gpu_upload_texture_op_try (self->frame, texture); + image = gsk_gpu_frame_upload_texture (self->frame, texture); if (image == NULL) return FALSE; gsk_gpu_device_cache_texture_image (device, texture, timestamp, image);