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.
This commit is contained in:
Benjamin Otte
2023-10-15 02:11:13 +02:00
parent cfb2a31382
commit f4879a0f2e
3 changed files with 29 additions and 4 deletions

View File

@@ -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)
{

View File

@@ -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);

View File

@@ -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);