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:
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user