diff --git a/gsk/gpu/gskgpuborderop.c b/gsk/gpu/gskgpuborderop.c index e6de690e40..cf74892e3a 100644 --- a/gsk/gpu/gskgpuborderop.c +++ b/gsk/gpu/gskgpuborderop.c @@ -102,6 +102,7 @@ static const GskGpuShaderOpClass GSK_GPU_BORDER_OP_CLASS = { #ifdef GDK_RENDERING_VULKAN &gsk_gpu_border_info, #endif + gsk_gpu_shader_op_no_images, gsk_gpu_border_setup_vao }; diff --git a/gsk/gpu/gskgpunodeprocessor.c b/gsk/gpu/gskgpunodeprocessor.c index ee9f9bc849..8a6bc39e1d 100644 --- a/gsk/gpu/gskgpunodeprocessor.c +++ b/gsk/gpu/gskgpunodeprocessor.c @@ -441,7 +441,7 @@ gsk_gpu_node_processor_add_node_as_pattern (GskGpuNodeProcessor *self, gsk_gpu_clip_get_shader_clip (&self->clip, &self->offset, &node->bounds), &node->bounds, &self->offset, - images, + g_memdup (images, sizeof (GskGpuShaderImage) * n_images), n_images, pattern_id); } diff --git a/gsk/gpu/gskgpurenderpassop.c b/gsk/gpu/gskgpurenderpassop.c index 905be8a0a8..fe847cc63e 100644 --- a/gsk/gpu/gskgpurenderpassop.c +++ b/gsk/gpu/gskgpurenderpassop.c @@ -63,11 +63,12 @@ gsk_gpu_render_pass_type_to_vk_image_layout (GskRenderPassType type) static void gsk_gpu_render_pass_op_do_barriers (GskGpuRenderPassOp *self, - VkCommandBuffer command_buffer) + VkCommandBuffer command_buffer) { GskGpuShaderOp *shader; GskGpuOp *op; - gsize i; + const GskGpuShaderImage *images; + gsize i, n_images; for (op = ((GskGpuOp *) self)->next; op->op_class->stage != GSK_GPU_STAGE_END_PASS; @@ -78,9 +79,10 @@ gsk_gpu_render_pass_op_do_barriers (GskGpuRenderPassOp *self, shader = (GskGpuShaderOp *) op; - for (i = 0; i < shader->n_images; i++) + images = gsk_gpu_shader_op_get_images (shader, &n_images); + for (i = 0; i < n_images; i++) { - gsk_vulkan_image_transition (GSK_VULKAN_IMAGE (shader->images[i].image), + gsk_vulkan_image_transition (GSK_VULKAN_IMAGE (images[i].image), command_buffer, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, diff --git a/gsk/gpu/gskgpushaderop.c b/gsk/gpu/gskgpushaderop.c index 298430ce3b..7422ae36a7 100644 --- a/gsk/gpu/gskgpushaderop.c +++ b/gsk/gpu/gskgpushaderop.c @@ -10,14 +10,11 @@ #include "gskvulkandeviceprivate.h" #endif -void -gsk_gpu_shader_op_finish (GskGpuOp *op) +const GskGpuShaderImage * +gsk_gpu_shader_op_get_images (GskGpuShaderOp *op, + gsize *n_images) { - GskGpuShaderOp *self = (GskGpuShaderOp *) op; - gsize i; - - for (i = 0; i < self->n_images; i++) - g_object_unref (self->images[i].image); + return ((GskGpuShaderOpClass *) ((GskGpuOp *) op)->op_class)->get_images (op, n_images); } #ifdef GDK_RENDERING_VULKAN @@ -80,8 +77,9 @@ gsk_gpu_shader_op_gl_command_n (GskGpuOp *op, { GskGpuShaderOp *self = (GskGpuShaderOp *) op; GskGpuShaderOpClass *shader_op_class = (GskGpuShaderOpClass *) op->op_class; + const GskGpuShaderImage *images; GskGLDevice *device; - gsize i; + gsize i, n_images; device = GSK_GL_DEVICE (gsk_gpu_frame_get_device (frame)); @@ -89,12 +87,13 @@ gsk_gpu_shader_op_gl_command_n (GskGpuOp *op, shader_op_class, self->clip); - for (i = 0; i < self->n_images; i++) + images = gsk_gpu_shader_op_get_images (self, &n_images); + for (i = 0; i < n_images; i++) { - glActiveTexture (GL_TEXTURE0 + self->images[i].descriptor); - gsk_gl_image_bind_texture (GSK_GL_IMAGE (self->images[i].image)); - glBindSampler (self->images[i].descriptor, - gsk_gl_device_get_sampler_id (device, self->images[i].sampler)); + glActiveTexture (GL_TEXTURE0 + images[i].descriptor); + gsk_gl_image_bind_texture (GSK_GL_IMAGE (images[i].image)); + glBindSampler (images[i].descriptor, + gsk_gl_device_get_sampler_id (device, images[i].sampler)); } shader_op_class->setup_vao (self->vertex_offset); @@ -133,21 +132,12 @@ gsk_gpu_shader_op_alloc (GskGpuFrame *frame, return self; } -guint32 -gsk_gpu_shader_op_use_image (GskGpuShaderOp *self, - GskGpuFrame *frame, - GskGpuImage *image, - GskGpuSampler sampler) +const GskGpuShaderImage * +gsk_gpu_shader_op_no_images (GskGpuShaderOp *op, + gsize *n_images) { - gsize id; + *n_images = 0; - g_assert (self->n_images < G_N_ELEMENTS (self->images)); - - id = self->n_images; - self->images[id].image = g_object_ref (image); - self->images[id].sampler = sampler; - self->images[id].descriptor = gsk_gpu_frame_get_image_descriptor (frame, image, sampler); - self->n_images++; - - return self->images[id].descriptor; + return NULL; } + diff --git a/gsk/gpu/gskgpushaderopprivate.h b/gsk/gpu/gskgpushaderopprivate.h index 6d285c27d3..7ba1aafd60 100644 --- a/gsk/gpu/gskgpushaderopprivate.h +++ b/gsk/gpu/gskgpushaderopprivate.h @@ -21,8 +21,6 @@ struct _GskGpuShaderOp GskGpuShaderClip clip; gsize vertex_offset; - GskGpuShaderImage images[2]; - gsize n_images; }; struct _GskGpuShaderOpClass @@ -34,6 +32,8 @@ struct _GskGpuShaderOpClass #ifdef GDK_RENDERING_VULKAN const VkPipelineVertexInputStateCreateInfo *vertex_input_state; #endif + const GskGpuShaderImage * (* get_images) (GskGpuShaderOp *op, + gsize *n_images); void (* setup_vao) (gsize offset); }; @@ -42,13 +42,6 @@ GskGpuShaderOp * gsk_gpu_shader_op_alloc (GskGpuF GskGpuShaderClip clip, gpointer out_vertex_data); -void gsk_gpu_shader_op_finish (GskGpuOp *op); - -guint32 gsk_gpu_shader_op_use_image (GskGpuShaderOp *self, - GskGpuFrame *frame, - GskGpuImage *image, - GskGpuSampler sampler); - #ifdef GDK_RENDERING_VULKAN GskGpuOp * gsk_gpu_shader_op_vk_command_n (GskGpuOp *op, GskGpuFrame *frame, @@ -70,6 +63,12 @@ GskGpuOp * gsk_gpu_shader_op_gl_command (GskGpuO GskGpuFrame *frame, gsize flip_y); +const GskGpuShaderImage * + gsk_gpu_shader_op_get_images (GskGpuShaderOp *op, + gsize *n_images); +const GskGpuShaderImage * + gsk_gpu_shader_op_no_images (GskGpuShaderOp *op, + gsize *n_images); static inline void gsk_gpu_rgba_to_float (const GdkRGBA *rgba, float values[4]) diff --git a/gsk/gpu/gskgputextureop.c b/gsk/gpu/gskgputextureop.c index 956c796399..9025b9e06b 100644 --- a/gsk/gpu/gskgputextureop.c +++ b/gsk/gpu/gskgputextureop.c @@ -13,14 +13,25 @@ typedef struct _GskGpuTextureOp GskGpuTextureOp; struct _GskGpuTextureOp { GskGpuShaderOp op; + + GskGpuShaderImage image; }; +static void +gsk_gpu_texture_op_finish (GskGpuOp *op) +{ + GskGpuTextureOp *self = (GskGpuTextureOp *) op; + + g_object_unref (self->image.image); +} + static void gsk_gpu_texture_op_print (GskGpuOp *op, GskGpuFrame *frame, GString *string, guint indent) { + GskGpuTextureOp *self = (GskGpuTextureOp *) op; GskGpuShaderOp *shader = (GskGpuShaderOp *) op; GskGpuTextureInstance *instance; @@ -28,15 +39,26 @@ gsk_gpu_texture_op_print (GskGpuOp *op, gsk_gpu_print_op (string, indent, "texture"); gsk_gpu_print_rect (string, instance->rect); - gsk_gpu_print_image (string, shader->images[0].image); + gsk_gpu_print_image (string, self->image.image); gsk_gpu_print_newline (string); } +static const GskGpuShaderImage * +gsk_gpu_texture_op_get_images (GskGpuShaderOp *op, + gsize *n_images) +{ + GskGpuTextureOp *self = (GskGpuTextureOp *) op; + + *n_images = 1; + + return &self->image; +} + static const GskGpuShaderOpClass GSK_GPU_TEXTURE_OP_CLASS = { { GSK_GPU_OP_SIZE (GskGpuTextureOp), GSK_GPU_STAGE_SHADER, - gsk_gpu_shader_op_finish, + gsk_gpu_texture_op_finish, gsk_gpu_texture_op_print, #ifdef GDK_RENDERING_VULKAN gsk_gpu_shader_op_vk_command, @@ -48,6 +70,7 @@ static const GskGpuShaderOpClass GSK_GPU_TEXTURE_OP_CLASS = { #ifdef GDK_RENDERING_VULKAN &gsk_gpu_texture_info, #endif + gsk_gpu_texture_op_get_images, gsk_gpu_texture_setup_vao }; @@ -70,5 +93,8 @@ gsk_gpu_texture_op (GskGpuFrame *frame, gsk_gpu_rect_to_float (rect, offset, instance->rect); gsk_gpu_rect_to_float (tex_rect, offset, instance->tex_rect); - instance->tex_id = gsk_gpu_shader_op_use_image ((GskGpuShaderOp *) self, frame, image, sampler); + self->image.image = g_object_ref (image); + self->image.sampler = sampler; + self->image.descriptor = gsk_gpu_frame_get_image_descriptor (frame, image, sampler); + instance->tex_id = self->image.descriptor; } diff --git a/gsk/gpu/gskgpuuberop.c b/gsk/gpu/gskgpuuberop.c index b6aa6e386f..8404c74354 100644 --- a/gsk/gpu/gskgpuuberop.c +++ b/gsk/gpu/gskgpuuberop.c @@ -14,8 +14,23 @@ typedef struct _GskGpuUberOp GskGpuUberOp; struct _GskGpuUberOp { GskGpuShaderOp op; + + GskGpuShaderImage *images; + gsize n_images; }; +static void +gsk_gpu_uber_op_finish (GskGpuOp *op) +{ + GskGpuUberOp *self = (GskGpuUberOp *) op; + gsize i; + + for (i = 0; i < self->n_images; i++) + g_object_unref (self->images[i].image); + + g_free (self->images); +} + static void gsk_gpu_uber_op_print (GskGpuOp *op, GskGpuFrame *frame, @@ -32,11 +47,22 @@ gsk_gpu_uber_op_print (GskGpuOp *op, gsk_gpu_print_newline (string); } +static const GskGpuShaderImage * +gsk_gpu_uber_op_get_images (GskGpuShaderOp *op, + gsize *n_images) +{ + GskGpuUberOp *self = (GskGpuUberOp *) op; + + *n_images = self->n_images; + + return self->images; +} + static const GskGpuShaderOpClass GSK_GPU_UBER_OP_CLASS = { { GSK_GPU_OP_SIZE (GskGpuUberOp), GSK_GPU_STAGE_SHADER, - gsk_gpu_shader_op_finish, + gsk_gpu_uber_op_finish, gsk_gpu_uber_op_print, #ifdef GDK_RENDERING_VULKAN gsk_gpu_shader_op_vk_command, @@ -48,6 +74,7 @@ static const GskGpuShaderOpClass GSK_GPU_UBER_OP_CLASS = { #ifdef GDK_RENDERING_VULKAN &gsk_gpu_uber_info, #endif + gsk_gpu_uber_op_get_images, gsk_gpu_uber_setup_vao }; @@ -56,27 +83,21 @@ gsk_gpu_uber_op (GskGpuFrame *frame, GskGpuShaderClip clip, const graphene_rect_t *rect, const graphene_point_t *offset, - const GskGpuShaderImage *images, + GskGpuShaderImage *images, gsize n_images, guint32 pattern_id) { + GskGpuUberOp *self; GskGpuUberInstance *instance; - GskGpuShaderOp *shader; - gsize i; - shader = gsk_gpu_shader_op_alloc (frame, - &GSK_GPU_UBER_OP_CLASS, - clip, - &instance); + self = (GskGpuUberOp *) gsk_gpu_shader_op_alloc (frame, + &GSK_GPU_UBER_OP_CLASS, + clip, + &instance); + + self->images = images; + self->n_images = n_images; gsk_gpu_rect_to_float (rect, offset, instance->rect); - - shader->n_images = n_images; - for (i = 0; i < n_images; i++) - { - shader->images[i] = images[i]; - g_object_ref (images[i].image); - } - instance->pattern_id = pattern_id; } diff --git a/gsk/gpu/gskgpuuberopprivate.h b/gsk/gpu/gskgpuuberopprivate.h index 45423784f2..26cba2980b 100644 --- a/gsk/gpu/gskgpuuberopprivate.h +++ b/gsk/gpu/gskgpuuberopprivate.h @@ -10,7 +10,7 @@ void gsk_gpu_uber_op (GskGpuF GskGpuShaderClip clip, const graphene_rect_t *rect, const graphene_point_t *offset, - const GskGpuShaderImage *images, + GskGpuShaderImage *images, gsize n_images, guint32 pattern_id);