From f21938cae66258aeff321ab1b754143bc4c07e9a Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sat, 21 Oct 2023 08:26:24 +0200 Subject: [PATCH] gpu: Handle flags for images For now, the flags are just there because, and nobody uses them yet. The only flag is EXTERNAL, which for now I'm using for YUV buffers, though it's a bit undefined what that means. --- gsk/gpu/gskglimage.c | 4 ++-- gsk/gpu/gskgpuframe.c | 4 ++-- gsk/gpu/gskgpuimage.c | 28 ++++++++++++++++++++++++---- gsk/gpu/gskgpuimageprivate.h | 4 ++++ gsk/gpu/gskgputypesprivate.h | 4 ++++ gsk/gpu/gskvulkanimage.c | 4 ++-- 6 files changed, 38 insertions(+), 10 deletions(-) diff --git a/gsk/gpu/gskglimage.c b/gsk/gpu/gskglimage.c index 23a8a64f1d..295bb4523a 100644 --- a/gsk/gpu/gskglimage.c +++ b/gsk/gpu/gskglimage.c @@ -88,7 +88,7 @@ gsk_gl_image_new_backbuffer (GskGLDevice *device, &self->gl_type, swizzle); - gsk_gpu_image_setup (GSK_GPU_IMAGE (self), format, width, height); + gsk_gpu_image_setup (GSK_GPU_IMAGE (self), 0, format, width, height); /* texture_id == 0 means backbuffer */ @@ -119,7 +119,7 @@ gsk_gl_image_new (GskGLDevice *device, &self->gl_type, swizzle); - gsk_gpu_image_setup (GSK_GPU_IMAGE (self), format, width, height); + gsk_gpu_image_setup (GSK_GPU_IMAGE (self), 0, format, width, height); glGenTextures (1, &self->texture_id); self->owns_texture = TRUE; diff --git a/gsk/gpu/gskgpuframe.c b/gsk/gpu/gskgpuframe.c index ac1ce3904e..2626d3e462 100644 --- a/gsk/gpu/gskgpuframe.c +++ b/gsk/gpu/gskgpuframe.c @@ -76,12 +76,12 @@ gsk_gpu_frame_cleanup (GskGpuFrame *self) } static GskGpuImage * -gsk_gpu_frame_default_upload_texture (GskGpuFrame *frame, +gsk_gpu_frame_default_upload_texture (GskGpuFrame *self, GdkTexture *texture) { GskGpuImage *image; - image = gsk_gpu_upload_texture_op_try (frame, texture); + image = gsk_gpu_upload_texture_op_try (self, texture); if (image) g_object_ref (image); diff --git a/gsk/gpu/gskgpuimage.c b/gsk/gpu/gskgpuimage.c index dd8f8625c5..c3dfb8c3a2 100644 --- a/gsk/gpu/gskgpuimage.c +++ b/gsk/gpu/gskgpuimage.c @@ -6,6 +6,7 @@ typedef struct _GskGpuImagePrivate GskGpuImagePrivate; struct _GskGpuImagePrivate { + GskGpuImageFlags flags; GdkMemoryFormat format; gsize width; gsize height; @@ -41,13 +42,15 @@ gsk_gpu_image_init (GskGpuImage *self) } void -gsk_gpu_image_setup (GskGpuImage *self, - GdkMemoryFormat format, - gsize width, - gsize height) +gsk_gpu_image_setup (GskGpuImage *self, + GskGpuImageFlags flags, + GdkMemoryFormat format, + gsize width, + gsize height) { GskGpuImagePrivate *priv = gsk_gpu_image_get_instance_private (self); + priv->flags = flags; priv->format = format; priv->width = width; priv->height = height; @@ -77,6 +80,23 @@ gsk_gpu_image_get_height (GskGpuImage *self) return priv->height; } +GskGpuImageFlags +gsk_gpu_image_get_flags (GskGpuImage *self) +{ + GskGpuImagePrivate *priv = gsk_gpu_image_get_instance_private (self); + + return priv->flags; +} + +void +gsk_gpu_image_set_flags (GskGpuImage *self, + GskGpuImageFlags flags) +{ + GskGpuImagePrivate *priv = gsk_gpu_image_get_instance_private (self); + + priv->flags |= flags; +} + void gsk_gpu_image_get_projection_matrix (GskGpuImage *self, graphene_matrix_t *out_projection) diff --git a/gsk/gpu/gskgpuimageprivate.h b/gsk/gpu/gskgpuimageprivate.h index eaca0ef4a3..a4b1405c77 100644 --- a/gsk/gpu/gskgpuimageprivate.h +++ b/gsk/gpu/gskgpuimageprivate.h @@ -31,6 +31,7 @@ struct _GskGpuImageClass GType gsk_gpu_image_get_type (void) G_GNUC_CONST; void gsk_gpu_image_setup (GskGpuImage *self, + GskGpuImageFlags flags, GdkMemoryFormat format, gsize width, gsize height); @@ -38,6 +39,9 @@ void gsk_gpu_image_setup (GskGpuI GdkMemoryFormat gsk_gpu_image_get_format (GskGpuImage *self); gsize gsk_gpu_image_get_width (GskGpuImage *self); gsize gsk_gpu_image_get_height (GskGpuImage *self); +GskGpuImageFlags gsk_gpu_image_get_flags (GskGpuImage *self); +void gsk_gpu_image_set_flags (GskGpuImage *self, + GskGpuImageFlags flags); void gsk_gpu_image_get_projection_matrix (GskGpuImage *self, graphene_matrix_t *out_projection); diff --git a/gsk/gpu/gskgputypesprivate.h b/gsk/gpu/gskgputypesprivate.h index 5c01d117cb..d1135d11fd 100644 --- a/gsk/gpu/gskgputypesprivate.h +++ b/gsk/gpu/gskgputypesprivate.h @@ -16,6 +16,10 @@ typedef struct _GskGpuOpClass GskGpuOpClass; typedef struct _GskGpuShaderOp GskGpuShaderOp; typedef struct _GskGpuShaderOpClass GskGpuShaderOpClass; +typedef enum { + GSK_GPU_IMAGE_EXTERNAL = (1 << 0), +} GskGpuImageFlags; + typedef enum { GSK_GPU_SAMPLER_DEFAULT, GSK_GPU_SAMPLER_TRANSPARENT, diff --git a/gsk/gpu/gskvulkanimage.c b/gsk/gpu/gskvulkanimage.c index 39f313e094..5b3a2fcfd5 100644 --- a/gsk/gpu/gskvulkanimage.c +++ b/gsk/gpu/gskvulkanimage.c @@ -617,7 +617,7 @@ gsk_vulkan_image_new (GskVulkanDevice *device, self->vk_image_layout = layout; self->vk_access = access; - gsk_gpu_image_setup (GSK_GPU_IMAGE (self), format, width, height); + gsk_gpu_image_setup (GSK_GPU_IMAGE (self), 0, format, width, height); GSK_VK_CHECK (vkCreateImage, vk_device, &(VkImageCreateInfo) { @@ -743,7 +743,7 @@ gsk_vulkan_image_new_for_swapchain (GskVulkanDevice *device, self->vk_image_layout = VK_IMAGE_LAYOUT_UNDEFINED; self->vk_access = 0; - gsk_gpu_image_setup (GSK_GPU_IMAGE (self), GDK_MEMORY_DEFAULT, width, height); + gsk_gpu_image_setup (GSK_GPU_IMAGE (self), 0, GDK_MEMORY_DEFAULT, width, height); gsk_vulkan_image_create_view (self, VK_NULL_HANDLE,