From: Benjamin Otte Date: Wed, 28 Jun 2023 18:50:43 +0000 (+0200) Subject: vulkan: Combine textures and samplers again X-Git-Tag: archive/raspbian/4.12.3+ds-1+rpi1~1^2^2^2~22^2~1^2~60^2~69 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=8207c548cc1fd8f300b930974184a57aaca4bc34;p=gtk4.git vulkan: Combine textures and samplers again This reverts most of commit f420c143e0d8947a433704969bab02aea47d82f5 again because it turns out GPUs like combined images and samplers. But: The one thing we don't revert is allowing the C code to select any combination of sampler and image: gsk_vulkan_render_get_image_descriptor() now takes a 2nd argument specifying the sampler. This allows the same flexibility as before, we just combine things early. This change was inspired by https://developer.nvidia.com/blog/vulkan-dos-donts/ --- diff --git a/gsk/vulkan/gskvulkanblendmodepipeline.c b/gsk/vulkan/gskvulkanblendmodepipeline.c index fb71b3b846..2bd18bc587 100644 --- a/gsk/vulkan/gskvulkanblendmodepipeline.c +++ b/gsk/vulkan/gskvulkanblendmodepipeline.c @@ -54,8 +54,8 @@ gsk_vulkan_blend_mode_pipeline_new (GdkVulkanContext *context, void gsk_vulkan_blend_mode_pipeline_collect_vertex_data (GskVulkanBlendModePipeline *pipeline, guchar *data, - guint32 top_tex_id[2], - guint32 bottom_tex_id[2], + guint32 top_tex_id, + guint32 bottom_tex_id, const graphene_point_t *offset, const graphene_rect_t *bounds, const graphene_rect_t *top_bounds, @@ -91,10 +91,8 @@ gsk_vulkan_blend_mode_pipeline_collect_vertex_data (GskVulkanBlendModePipeline * instance->bottom_tex_rect[2] = bottom_tex_rect->size.width; instance->bottom_tex_rect[3] = bottom_tex_rect->size.height; - instance->top_tex_id[0] = top_tex_id[0]; - instance->top_tex_id[1] = top_tex_id[1]; - instance->bottom_tex_id[0] = bottom_tex_id[0]; - instance->bottom_tex_id[1] = bottom_tex_id[1]; + instance->top_tex_id = top_tex_id; + instance->bottom_tex_id = bottom_tex_id; instance->blend_mode = blend_mode; } diff --git a/gsk/vulkan/gskvulkanblendmodepipelineprivate.h b/gsk/vulkan/gskvulkanblendmodepipelineprivate.h index 088068f1b3..e06f28ae90 100644 --- a/gsk/vulkan/gskvulkanblendmodepipelineprivate.h +++ b/gsk/vulkan/gskvulkanblendmodepipelineprivate.h @@ -20,8 +20,8 @@ GskVulkanPipeline * gsk_vulkan_blend_mode_pipeline_new (GdkVulka void gsk_vulkan_blend_mode_pipeline_collect_vertex_data (GskVulkanBlendModePipeline *pipeline, guchar *data, - guint32 top_tex_id[2], - guint32 bottom_tex_id[2], + guint32 top_tex_id, + guint32 bottom_tex_id, const graphene_point_t *offset, const graphene_rect_t *bounds, const graphene_rect_t *top_bounds, diff --git a/gsk/vulkan/gskvulkanblurpipeline.c b/gsk/vulkan/gskvulkanblurpipeline.c index 5b9352908a..5f46c7edde 100644 --- a/gsk/vulkan/gskvulkanblurpipeline.c +++ b/gsk/vulkan/gskvulkanblurpipeline.c @@ -52,7 +52,7 @@ gsk_vulkan_blur_pipeline_new (GdkVulkanContext *context, void gsk_vulkan_blur_pipeline_collect_vertex_data (GskVulkanBlurPipeline *pipeline, guchar *data, - guint32 tex_id[2], + guint32 tex_id, const graphene_point_t *offset, const graphene_rect_t *rect, const graphene_rect_t *tex_rect, @@ -69,8 +69,7 @@ gsk_vulkan_blur_pipeline_collect_vertex_data (GskVulkanBlurPipeline *pipeline, instance->tex_rect[2] = tex_rect->size.width; instance->tex_rect[3] = tex_rect->size.height; instance->radius = radius; - instance->tex_id[0] = tex_id[0]; - instance->tex_id[1] = tex_id[1]; + instance->tex_id = tex_id; } gsize diff --git a/gsk/vulkan/gskvulkanblurpipelineprivate.h b/gsk/vulkan/gskvulkanblurpipelineprivate.h index f77f99013a..5e7435aba6 100644 --- a/gsk/vulkan/gskvulkanblurpipelineprivate.h +++ b/gsk/vulkan/gskvulkanblurpipelineprivate.h @@ -19,7 +19,7 @@ GskVulkanPipeline * gsk_vulkan_blur_pipeline_new (GdkVulka void gsk_vulkan_blur_pipeline_collect_vertex_data (GskVulkanBlurPipeline *pipeline, guchar *data, - guint32 tex_id[2], + guint32 tex_id, const graphene_point_t *offset, const graphene_rect_t *rect, const graphene_rect_t *tex_rect, diff --git a/gsk/vulkan/gskvulkancolormatrixop.c b/gsk/vulkan/gskvulkancolormatrixop.c index 2fcd151f1d..d202f70fa1 100644 --- a/gsk/vulkan/gskvulkancolormatrixop.c +++ b/gsk/vulkan/gskvulkancolormatrixop.c @@ -17,7 +17,6 @@ struct _GskVulkanColorMatrixOp graphene_rect_t tex_rect; guint32 image_descriptor; - guint32 sampler_descriptor; GskVulkanPipeline *pipeline; gsize vertex_offset; }; @@ -70,10 +69,7 @@ gsk_vulkan_color_matrix_op_collect_vertex_data (GskVulkanOp *op, gsk_vulkan_effect_pipeline_collect_vertex_data (GSK_VULKAN_EFFECT_PIPELINE (self->pipeline), data + self->vertex_offset, - (guint32[2]) { - self->image_descriptor, - self->sampler_descriptor, - }, + self->image_descriptor, graphene_point_zero (), &self->rect, &self->tex_rect, @@ -87,8 +83,9 @@ gsk_vulkan_color_matrix_op_reserve_descriptor_sets (GskVulkanOp *op, { GskVulkanColorMatrixOp *self = (GskVulkanColorMatrixOp *) op; - self->image_descriptor = gsk_vulkan_render_get_image_descriptor (render, self->image); - self->sampler_descriptor = gsk_vulkan_render_get_sampler_descriptor (render, GSK_VULKAN_SAMPLER_DEFAULT); + self->image_descriptor = gsk_vulkan_render_get_image_descriptor (render, + self->image, + GSK_VULKAN_SAMPLER_DEFAULT); } static VkPipeline diff --git a/gsk/vulkan/gskvulkancolortextpipeline.c b/gsk/vulkan/gskvulkancolortextpipeline.c index 6e45cfe01e..26b102f9d5 100644 --- a/gsk/vulkan/gskvulkancolortextpipeline.c +++ b/gsk/vulkan/gskvulkancolortextpipeline.c @@ -54,7 +54,7 @@ gsk_vulkan_color_text_pipeline_collect_vertex_data (GskVulkanColorTextPipeline * guchar *data, GskVulkanRenderer *renderer, const graphene_rect_t *rect, - guint tex_id[2], + guint tex_id, PangoFont *font, guint total_glyphs, const PangoGlyphInfo *glyphs, @@ -99,8 +99,7 @@ gsk_vulkan_color_text_pipeline_collect_vertex_data (GskVulkanColorTextPipeline * instance->tex_rect[2] = glyph->tw; instance->tex_rect[3] = glyph->th; - instance->tex_id[0] = tex_id[0]; - instance->tex_id[1] = tex_id[1]; + instance->tex_id = tex_id; count++; } diff --git a/gsk/vulkan/gskvulkancolortextpipelineprivate.h b/gsk/vulkan/gskvulkancolortextpipelineprivate.h index 083977cc29..0094398785 100644 --- a/gsk/vulkan/gskvulkancolortextpipelineprivate.h +++ b/gsk/vulkan/gskvulkancolortextpipelineprivate.h @@ -22,7 +22,7 @@ void gsk_vulkan_color_text_pipeline_collect_vertex_data (Gs guchar *data, GskVulkanRenderer *renderer, const graphene_rect_t *rect, - guint tex_id[2], + guint tex_id, PangoFont *font, guint total_glyphs, const PangoGlyphInfo *glyphs, diff --git a/gsk/vulkan/gskvulkancrossfadepipeline.c b/gsk/vulkan/gskvulkancrossfadepipeline.c index 1ad42cbcd1..165982557b 100644 --- a/gsk/vulkan/gskvulkancrossfadepipeline.c +++ b/gsk/vulkan/gskvulkancrossfadepipeline.c @@ -52,8 +52,8 @@ gsk_vulkan_cross_fade_pipeline_new (GdkVulkanContext *context, void gsk_vulkan_cross_fade_pipeline_collect_vertex_data (GskVulkanCrossFadePipeline *pipeline, guchar *data, - guint32 start_tex_id[2], - guint32 end_tex_id[2], + guint32 start_tex_id, + guint32 end_tex_id, const graphene_point_t *offset, const graphene_rect_t *bounds, const graphene_rect_t *start_bounds, @@ -89,10 +89,8 @@ gsk_vulkan_cross_fade_pipeline_collect_vertex_data (GskVulkanCrossFadePipeline * instance->end_tex_rect[2] = end_tex_rect->size.width; instance->end_tex_rect[3] = end_tex_rect->size.height; - instance->start_tex_id[0] = start_tex_id[0]; - instance->start_tex_id[1] = start_tex_id[1]; - instance->end_tex_id[0] = end_tex_id[0]; - instance->end_tex_id[1] = end_tex_id[1]; + instance->start_tex_id = start_tex_id; + instance->end_tex_id = end_tex_id; instance->progress = progress; } diff --git a/gsk/vulkan/gskvulkancrossfadepipelineprivate.h b/gsk/vulkan/gskvulkancrossfadepipelineprivate.h index 7c80612279..858e6dcad4 100644 --- a/gsk/vulkan/gskvulkancrossfadepipelineprivate.h +++ b/gsk/vulkan/gskvulkancrossfadepipelineprivate.h @@ -19,8 +19,8 @@ GskVulkanPipeline * gsk_vulkan_cross_fade_pipeline_new (GdkVulka void gsk_vulkan_cross_fade_pipeline_collect_vertex_data (GskVulkanCrossFadePipeline *pipeline, guchar *data, - guint32 start_tex_id[2], - guint32 end_tex_id[2], + guint32 start_tex_id, + guint32 end_tex_id, const graphene_point_t *offset, const graphene_rect_t *bounds, const graphene_rect_t *start_bounds, diff --git a/gsk/vulkan/gskvulkaneffectpipeline.c b/gsk/vulkan/gskvulkaneffectpipeline.c index b611502e01..173f8bb986 100644 --- a/gsk/vulkan/gskvulkaneffectpipeline.c +++ b/gsk/vulkan/gskvulkaneffectpipeline.c @@ -52,7 +52,7 @@ gsk_vulkan_effect_pipeline_new (GdkVulkanContext *context, void gsk_vulkan_effect_pipeline_collect_vertex_data (GskVulkanEffectPipeline *pipeline, guchar *data, - guint32 tex_id[2], + guint32 tex_id, const graphene_point_t *offset, const graphene_rect_t *rect, const graphene_rect_t *tex_rect, @@ -71,8 +71,7 @@ gsk_vulkan_effect_pipeline_collect_vertex_data (GskVulkanEffectPipeline *pipelin instance->tex_rect[3] = tex_rect->size.height; graphene_matrix_to_float (color_matrix, instance->color_matrix); graphene_vec4_to_float (color_offset, instance->color_offset); - instance->tex_id[0] = tex_id[0]; - instance->tex_id[1] = tex_id[1]; + instance->tex_id = tex_id; } gsize diff --git a/gsk/vulkan/gskvulkaneffectpipelineprivate.h b/gsk/vulkan/gskvulkaneffectpipelineprivate.h index 328e04de90..f7239386bd 100644 --- a/gsk/vulkan/gskvulkaneffectpipelineprivate.h +++ b/gsk/vulkan/gskvulkaneffectpipelineprivate.h @@ -19,7 +19,7 @@ GskVulkanPipeline * gsk_vulkan_effect_pipeline_new (GdkVulk void gsk_vulkan_effect_pipeline_collect_vertex_data (GskVulkanEffectPipeline *pipeline, guchar *data, - guint32 tex_id[2], + guint32 tex_id, const graphene_point_t *offset, const graphene_rect_t *rect, const graphene_rect_t *tex_rect, diff --git a/gsk/vulkan/gskvulkanrender.c b/gsk/vulkan/gskvulkanrender.c index c6ef70a4a6..923c271ae3 100644 --- a/gsk/vulkan/gskvulkanrender.c +++ b/gsk/vulkan/gskvulkanrender.c @@ -41,7 +41,7 @@ #define GDK_ARRAY_NO_MEMSET 1 #include "gdk/gdkarrayimpl.c" -#define N_DESCRIPTOR_SETS 3 +#define N_DESCRIPTOR_SETS 2 struct _GskVulkanRender { @@ -59,7 +59,6 @@ struct _GskVulkanRender GskVulkanUploader *uploader; GskDescriptorImageInfos descriptor_images; - GskDescriptorImageInfos descriptor_samplers; GskDescriptorBufferInfos descriptor_buffers; VkDescriptorPool descriptor_pool; VkDescriptorSet descriptor_sets[N_DESCRIPTOR_SETS]; @@ -132,7 +131,6 @@ gsk_vulkan_render_new (GskRenderer *renderer, self->vulkan = context; self->renderer = renderer; gsk_descriptor_image_infos_init (&self->descriptor_images); - gsk_descriptor_image_infos_init (&self->descriptor_samplers); gsk_descriptor_buffer_infos_init (&self->descriptor_buffers); device = gdk_vulkan_context_get_device (self->vulkan); @@ -154,11 +152,7 @@ gsk_vulkan_render_new (GskRenderer *renderer, .poolSizeCount = N_DESCRIPTOR_SETS, .pPoolSizes = (VkDescriptorPoolSize[N_DESCRIPTOR_SETS]) { { - .type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, - .descriptorCount = DESCRIPTOR_POOL_MAXITEMS - }, - { - .type = VK_DESCRIPTOR_TYPE_SAMPLER, + .type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, .descriptorCount = DESCRIPTOR_POOL_MAXITEMS }, { @@ -170,32 +164,6 @@ gsk_vulkan_render_new (GskRenderer *renderer, NULL, &self->descriptor_pool); - GSK_VK_CHECK (vkCreateDescriptorSetLayout, device, - &(VkDescriptorSetLayoutCreateInfo) { - .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, - .bindingCount = 1, - .flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT, - .pBindings = (VkDescriptorSetLayoutBinding[3]) { - { - .binding = 0, - .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, - .descriptorCount = DESCRIPTOR_POOL_MAXITEMS, - .stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT - } - }, - .pNext = &(VkDescriptorSetLayoutBindingFlagsCreateInfo) { - .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO, - .bindingCount = 1, - .pBindingFlags = (VkDescriptorBindingFlags[1]) { - VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT - | VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT - | VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT, - }, - } - }, - NULL, - &self->descriptor_set_layouts[0]); - GSK_VK_CHECK (vkCreateDescriptorSetLayout, device, &(VkDescriptorSetLayoutCreateInfo) { .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, @@ -204,7 +172,7 @@ gsk_vulkan_render_new (GskRenderer *renderer, .pBindings = (VkDescriptorSetLayoutBinding[1]) { { .binding = 0, - .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER, + .descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, .descriptorCount = DESCRIPTOR_POOL_MAXITEMS, .stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT } @@ -220,7 +188,7 @@ gsk_vulkan_render_new (GskRenderer *renderer, } }, NULL, - &self->descriptor_set_layouts[1]); + &self->descriptor_set_layouts[0]); GSK_VK_CHECK (vkCreateDescriptorSetLayout, device, &(VkDescriptorSetLayoutCreateInfo) { @@ -246,7 +214,7 @@ gsk_vulkan_render_new (GskRenderer *renderer, } }, NULL, - &self->descriptor_set_layouts[2]); + &self->descriptor_set_layouts[1]); GSK_VK_CHECK (vkCreatePipelineLayout, device, &(VkPipelineLayoutCreateInfo) { @@ -445,46 +413,23 @@ gsk_vulkan_render_bind_descriptor_sets (GskVulkanRender *self, VK_PIPELINE_BIND_POINT_GRAPHICS, self->pipeline_layout, 0, - 3, + N_DESCRIPTOR_SETS, self->descriptor_sets, 0, NULL); } gsize -gsk_vulkan_render_get_sampler_descriptor (GskVulkanRender *self, - GskVulkanRenderSampler render_sampler) -{ - VkSampler sampler = self->samplers[render_sampler]; - gsize i; - - /* If this ever shows up in profiles, add a hash table */ - for (i = 0; i < gsk_descriptor_image_infos_get_size (&self->descriptor_samplers); i++) - { - if (gsk_descriptor_image_infos_get (&self->descriptor_samplers, i)->sampler == sampler) - return i; - } - - g_assert (i < DESCRIPTOR_POOL_MAXITEMS); - - gsk_descriptor_image_infos_append (&self->descriptor_samplers, - &(VkDescriptorImageInfo) { - .sampler = sampler, - }); - - return i; -} - -gsize -gsk_vulkan_render_get_image_descriptor (GskVulkanRender *self, - GskVulkanImage *image) +gsk_vulkan_render_get_image_descriptor (GskVulkanRender *self, + GskVulkanImage *image, + GskVulkanRenderSampler render_sampler) { gsize result; result = gsk_descriptor_image_infos_get_size (&self->descriptor_images); gsk_descriptor_image_infos_append (&self->descriptor_images, &(VkDescriptorImageInfo) { - .sampler = VK_NULL_HANDLE, + .sampler = self->samplers[render_sampler], .imageView = gsk_vulkan_image_get_image_view (image), .imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL }); @@ -567,7 +512,7 @@ static void gsk_vulkan_render_prepare_descriptor_sets (GskVulkanRender *self) { VkDevice device; - VkWriteDescriptorSet descriptor_sets[3]; + VkWriteDescriptorSet descriptor_sets[N_DESCRIPTOR_SETS]; gsize n_descriptor_sets; GList *l; @@ -597,7 +542,6 @@ gsk_vulkan_render_prepare_descriptor_sets (GskVulkanRender *self) .descriptorSetCount = N_DESCRIPTOR_SETS, .pDescriptorCounts = (uint32_t[N_DESCRIPTOR_SETS]) { MAX (1, gsk_descriptor_image_infos_get_size (&self->descriptor_images)), - MAX (1, gsk_descriptor_image_infos_get_size (&self->descriptor_samplers)), MAX (1, gsk_descriptor_buffer_infos_get_size (&self->descriptor_buffers)) } } @@ -613,27 +557,15 @@ gsk_vulkan_render_prepare_descriptor_sets (GskVulkanRender *self) .dstBinding = 0, .dstArrayElement = 0, .descriptorCount = gsk_descriptor_image_infos_get_size (&self->descriptor_images), - .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, + .descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, .pImageInfo = gsk_descriptor_image_infos_get_data (&self->descriptor_images) }; } - if (gsk_descriptor_image_infos_get_size (&self->descriptor_samplers) > 0) - { - descriptor_sets[n_descriptor_sets++] = (VkWriteDescriptorSet) { - .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, - .dstSet = self->descriptor_sets[1], - .dstBinding = 0, - .dstArrayElement = 0, - .descriptorCount = gsk_descriptor_image_infos_get_size (&self->descriptor_samplers), - .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER, - .pImageInfo = gsk_descriptor_image_infos_get_data (&self->descriptor_samplers) - }; - } if (gsk_descriptor_buffer_infos_get_size (&self->descriptor_buffers) > 0) { descriptor_sets[n_descriptor_sets++] = (VkWriteDescriptorSet) { .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, - .dstSet = self->descriptor_sets[2], + .dstSet = self->descriptor_sets[1], .dstBinding = 0, .dstArrayElement = 0, .descriptorCount = gsk_descriptor_buffer_infos_get_size (&self->descriptor_buffers), @@ -748,7 +680,6 @@ gsk_vulkan_render_cleanup (GskVulkanRender *self) self->descriptor_pool, 0); gsk_descriptor_image_infos_set_size (&self->descriptor_images, 0); - gsk_descriptor_image_infos_set_size (&self->descriptor_samplers, 0); gsk_descriptor_buffer_infos_set_size (&self->descriptor_buffers, 0); g_list_free_full (self->render_passes, (GDestroyNotify) gsk_vulkan_render_pass_free); @@ -784,7 +715,6 @@ gsk_vulkan_render_free (GskVulkanRender *self) self->descriptor_pool, NULL); gsk_descriptor_image_infos_clear (&self->descriptor_images); - gsk_descriptor_image_infos_clear (&self->descriptor_samplers); gsk_descriptor_buffer_infos_clear (&self->descriptor_buffers); for (i = 0; i < N_DESCRIPTOR_SETS; i++) diff --git a/gsk/vulkan/gskvulkanrenderpass.c b/gsk/vulkan/gskvulkanrenderpass.c index 0f6a236ea9..cdd2d3eddc 100644 --- a/gsk/vulkan/gskvulkanrenderpass.c +++ b/gsk/vulkan/gskvulkanrenderpass.c @@ -78,8 +78,8 @@ struct _GskVulkanOpRender GskVulkanImage *source; /* source image to render */ GskVulkanImage *source2; /* second source image to render (if relevant) */ gsize vertex_offset; /* offset into vertex buffer */ - guint32 image_descriptor[2]; /* index into descriptor for the (image, sampler) */ - guint32 image_descriptor2[2]; /* index into descriptor for the 2nd image (if relevant) */ + guint32 image_descriptor; /* index into descriptor for the image */ + guint32 image_descriptor2; /* index into descriptor for the 2nd image (if relevant) */ gsize buffer_offset; /* offset into buffer */ graphene_rect_t source_rect; /* area that source maps to */ graphene_rect_t source2_rect; /* area that source2 maps to */ @@ -94,7 +94,7 @@ struct _GskVulkanOpText GskVulkanPipeline *pipeline; /* pipeline to use */ GskVulkanImage *source; /* source image to render */ gsize vertex_offset; /* offset into vertex buffer */ - guint32 image_descriptor[2]; /* index into descriptor for the (image, sampler) */ + guint32 image_descriptor; /* index into descriptor for the (image, sampler) */ guint texture_index; /* index of the texture in the glyph cache */ guint start_glyph; /* the first glyph in nodes glyphstring that we render */ guint num_glyphs; /* number of *non-empty* glyphs (== instances) we render */ @@ -2079,25 +2079,29 @@ gsk_vulkan_render_op_reserve_descriptor_sets (GskVulkanOp *op_, case GSK_VULKAN_OP_BLUR: if (op->render.source) { - op->render.image_descriptor[0] = gsk_vulkan_render_get_image_descriptor (render, op->render.source); - op->render.image_descriptor[1] = gsk_vulkan_render_get_sampler_descriptor (render, GSK_VULKAN_SAMPLER_DEFAULT); + op->render.image_descriptor = gsk_vulkan_render_get_image_descriptor (render, + op->render.source, + GSK_VULKAN_SAMPLER_DEFAULT); } break; case GSK_VULKAN_OP_TEXT: case GSK_VULKAN_OP_COLOR_TEXT: - op->text.image_descriptor[0] = gsk_vulkan_render_get_image_descriptor (render, op->text.source); - op->text.image_descriptor[1] = gsk_vulkan_render_get_sampler_descriptor (render, GSK_VULKAN_SAMPLER_DEFAULT); + op->text.image_descriptor = gsk_vulkan_render_get_image_descriptor (render, + op->text.source, + GSK_VULKAN_SAMPLER_DEFAULT); break; case GSK_VULKAN_OP_CROSS_FADE: case GSK_VULKAN_OP_BLEND_MODE: if (op->render.source && op->render.source2) { - op->render.image_descriptor[0] = gsk_vulkan_render_get_image_descriptor (render, op->render.source); - op->render.image_descriptor[1] = gsk_vulkan_render_get_sampler_descriptor (render, GSK_VULKAN_SAMPLER_DEFAULT); - op->render.image_descriptor2[0] = gsk_vulkan_render_get_image_descriptor (render, op->render.source2); - op->render.image_descriptor2[1] = op->render.image_descriptor2[1]; + op->render.image_descriptor = gsk_vulkan_render_get_image_descriptor (render, + op->render.source, + GSK_VULKAN_SAMPLER_DEFAULT); + op->render.image_descriptor2 = gsk_vulkan_render_get_image_descriptor (render, + op->render.source2, + GSK_VULKAN_SAMPLER_DEFAULT); } break; diff --git a/gsk/vulkan/gskvulkanrenderprivate.h b/gsk/vulkan/gskvulkanrenderprivate.h index 731e5a4e3c..4a206238e9 100644 --- a/gsk/vulkan/gskvulkanrenderprivate.h +++ b/gsk/vulkan/gskvulkanrenderprivate.h @@ -83,10 +83,9 @@ void gsk_vulkan_render_upload (GskVulk GskVulkanPipeline * gsk_vulkan_render_get_pipeline (GskVulkanRender *self, GskVulkanPipelineType pipeline_type, VkRenderPass render_pass); -gsize gsk_vulkan_render_get_sampler_descriptor (GskVulkanRender *self, - GskVulkanRenderSampler render_sampler); gsize gsk_vulkan_render_get_image_descriptor (GskVulkanRender *self, - GskVulkanImage *source); + GskVulkanImage *source, + GskVulkanRenderSampler render_sampler); gsize gsk_vulkan_render_get_buffer_descriptor (GskVulkanRender *self, GskVulkanBuffer *buffer); guchar * gsk_vulkan_render_get_buffer_memory (GskVulkanRender *self, diff --git a/gsk/vulkan/gskvulkantextpipeline.c b/gsk/vulkan/gskvulkantextpipeline.c index c7eed9386f..80b9200341 100644 --- a/gsk/vulkan/gskvulkantextpipeline.c +++ b/gsk/vulkan/gskvulkantextpipeline.c @@ -54,7 +54,7 @@ gsk_vulkan_text_pipeline_collect_vertex_data (GskVulkanTextPipeline *pipeline, guchar *data, GskVulkanRenderer *renderer, const graphene_rect_t *rect, - guint tex_id[2], + guint tex_id, PangoFont *font, guint total_glyphs, const PangoGlyphInfo *glyphs, @@ -105,8 +105,7 @@ gsk_vulkan_text_pipeline_collect_vertex_data (GskVulkanTextPipeline *pipeline, instance->color[2] = color->blue; instance->color[3] = color->alpha; - instance->tex_id[0] = tex_id[0]; - instance->tex_id[1] = tex_id[1]; + instance->tex_id = tex_id; count++; } diff --git a/gsk/vulkan/gskvulkantextpipelineprivate.h b/gsk/vulkan/gskvulkantextpipelineprivate.h index 0cc560c25f..8f05e43500 100644 --- a/gsk/vulkan/gskvulkantextpipelineprivate.h +++ b/gsk/vulkan/gskvulkantextpipelineprivate.h @@ -22,7 +22,7 @@ void gsk_vulkan_text_pipeline_collect_vertex_data (GskVulka guchar *data, GskVulkanRenderer *renderer, const graphene_rect_t *rect, - guint32 tex_id[2], + guint32 tex_id, PangoFont *font, guint total_glyphs, const PangoGlyphInfo *glyphs, diff --git a/gsk/vulkan/gskvulkantextureop.c b/gsk/vulkan/gskvulkantextureop.c index e798d85619..84d427c130 100644 --- a/gsk/vulkan/gskvulkantextureop.c +++ b/gsk/vulkan/gskvulkantextureop.c @@ -16,7 +16,6 @@ struct _GskVulkanTextureOp graphene_rect_t tex_rect; guint32 image_descriptor; - guint32 sampler_descriptor; GskVulkanPipeline *pipeline; gsize vertex_offset; }; @@ -69,10 +68,7 @@ gsk_vulkan_texture_op_collect_vertex_data (GskVulkanOp *op, gsk_vulkan_texture_pipeline_collect_vertex_data (GSK_VULKAN_TEXTURE_PIPELINE (self->pipeline), data + self->vertex_offset, - (guint32[2]) { - self->image_descriptor, - self->sampler_descriptor, - }, + self->image_descriptor, graphene_point_zero (), &self->rect, &self->tex_rect); @@ -84,8 +80,7 @@ gsk_vulkan_texture_op_reserve_descriptor_sets (GskVulkanOp *op, { GskVulkanTextureOp *self = (GskVulkanTextureOp *) op; - self->image_descriptor = gsk_vulkan_render_get_image_descriptor (render, self->image); - self->sampler_descriptor = gsk_vulkan_render_get_sampler_descriptor (render, self->sampler); + self->image_descriptor = gsk_vulkan_render_get_image_descriptor (render, self->image, self->sampler); } static VkPipeline diff --git a/gsk/vulkan/gskvulkantexturepipeline.c b/gsk/vulkan/gskvulkantexturepipeline.c index 19b5e5339e..620097ae8a 100644 --- a/gsk/vulkan/gskvulkantexturepipeline.c +++ b/gsk/vulkan/gskvulkantexturepipeline.c @@ -52,7 +52,7 @@ gsk_vulkan_texture_pipeline_new (GdkVulkanContext *context, void gsk_vulkan_texture_pipeline_collect_vertex_data (GskVulkanTexturePipeline *pipeline, guchar *data, - guint32 tex_id[2], + guint32 tex_id, const graphene_point_t *offset, const graphene_rect_t *rect, const graphene_rect_t *tex_rect) @@ -67,8 +67,7 @@ gsk_vulkan_texture_pipeline_collect_vertex_data (GskVulkanTexturePipeline *pipel instance->tex_rect[1] = tex_rect->origin.y; instance->tex_rect[2] = tex_rect->size.width; instance->tex_rect[3] = tex_rect->size.height; - instance->tex_id[0] = tex_id[0]; - instance->tex_id[1] = tex_id[1]; + instance->tex_id = tex_id; } gsize diff --git a/gsk/vulkan/gskvulkantexturepipelineprivate.h b/gsk/vulkan/gskvulkantexturepipelineprivate.h index 69e3fde2cd..d837e4d9d2 100644 --- a/gsk/vulkan/gskvulkantexturepipelineprivate.h +++ b/gsk/vulkan/gskvulkantexturepipelineprivate.h @@ -19,7 +19,7 @@ GskVulkanPipeline * gsk_vulkan_texture_pipeline_new (GdkVulk void gsk_vulkan_texture_pipeline_collect_vertex_data (GskVulkanTexturePipeline *pipeline, guchar *data, - guint32 tex_id[2], + guint32 tex_id, const graphene_point_t *offset, const graphene_rect_t *rect, const graphene_rect_t *tex_rect); diff --git a/gsk/vulkan/resources/blend-mode.frag b/gsk/vulkan/resources/blend-mode.frag index d8179c2932..48d868ff02 100644 --- a/gsk/vulkan/resources/blend-mode.frag +++ b/gsk/vulkan/resources/blend-mode.frag @@ -9,8 +9,8 @@ layout(location = 1) in Rect inTopRect; layout(location = 2) in Rect inBottomRect; layout(location = 3) in vec2 inTopTexCoord; layout(location = 4) in vec2 inBottomTexCoord; -layout(location = 5) flat in uvec2 inTopTexId; -layout(location = 6) flat in uvec2 inBottomTexId; +layout(location = 5) flat in uint inTopTexId; +layout(location = 6) flat in uint inBottomTexId; layout(location = 7) flat in uint inBlendMode; layout(location = 0) out vec4 color; diff --git a/gsk/vulkan/resources/blend-mode.vert b/gsk/vulkan/resources/blend-mode.vert index 4a8581afed..1216b0a152 100644 --- a/gsk/vulkan/resources/blend-mode.vert +++ b/gsk/vulkan/resources/blend-mode.vert @@ -8,8 +8,8 @@ layout(location = 1) in vec4 inTopRect; layout(location = 2) in vec4 inBottomRect; layout(location = 3) in vec4 inTopTexRect; layout(location = 4) in vec4 inBottomTexRect; -layout(location = 5) in uvec2 inTopTexId; -layout(location = 6) in uvec2 inBottomTexId; +layout(location = 5) in uint inTopTexId; +layout(location = 6) in uint inBottomTexId; layout(location = 7) in uint inBlendMode; layout(location = 0) out vec2 outPos; @@ -17,8 +17,8 @@ layout(location = 1) flat out Rect outTopRect; layout(location = 2) flat out Rect outBottomRect; layout(location = 3) out vec2 outTopTexCoord; layout(location = 4) out vec2 outBottomTexCoord; -layout(location = 5) flat out uvec2 outTopTexId; -layout(location = 6) flat out uvec2 outBottomTexId; +layout(location = 5) flat out uint outTopTexId; +layout(location = 6) flat out uint outBottomTexId; layout(location = 7) flat out uint outBlendMode; void main() { diff --git a/gsk/vulkan/resources/blur.frag b/gsk/vulkan/resources/blur.frag index b3acac9e26..67f4e33661 100644 --- a/gsk/vulkan/resources/blur.frag +++ b/gsk/vulkan/resources/blur.frag @@ -7,7 +7,7 @@ layout(location = 0) in vec2 inPos; layout(location = 1) in flat vec2 inSize; layout(location = 2) in vec2 inTexCoord; layout(location = 3) in float inRadius; -layout(location = 4) in flat uvec2 inTexId; +layout(location = 4) in flat uint inTexId; layout(location = 0) out vec4 color; diff --git a/gsk/vulkan/resources/blur.vert b/gsk/vulkan/resources/blur.vert index 4b2b8e0f7e..58c71bad77 100644 --- a/gsk/vulkan/resources/blur.vert +++ b/gsk/vulkan/resources/blur.vert @@ -6,13 +6,13 @@ layout(location = 0) in vec4 inRect; layout(location = 1) in vec4 inTexRect; layout(location = 2) in float inRadius; -layout(location = 3) in uvec2 inTexId; +layout(location = 3) in uint inTexId; layout(location = 0) out vec2 outPos; layout(location = 1) out flat vec2 outSize; layout(location = 2) out vec2 outTexCoord; layout(location = 3) out flat float outRadius; -layout(location = 4) out flat uvec2 outTexId; +layout(location = 4) out flat uint outTexId; vec2 offsets[6] = { vec2(0.0, 0.0), vec2(1.0, 0.0), diff --git a/gsk/vulkan/resources/color-matrix.frag b/gsk/vulkan/resources/color-matrix.frag index c52eb27226..9db8af2573 100644 --- a/gsk/vulkan/resources/color-matrix.frag +++ b/gsk/vulkan/resources/color-matrix.frag @@ -7,7 +7,7 @@ layout(location = 0) in vec2 inPos; layout(location = 1) in vec2 inTexCoord; layout(location = 2) in flat mat4 inColorMatrix; layout(location = 6) in flat vec4 inColorOffset; -layout(location = 7) in flat uvec2 inTexId; +layout(location = 7) in flat uint inTexId; layout(location = 0) out vec4 color; diff --git a/gsk/vulkan/resources/color-matrix.vert b/gsk/vulkan/resources/color-matrix.vert index c62a728720..979ae9692e 100644 --- a/gsk/vulkan/resources/color-matrix.vert +++ b/gsk/vulkan/resources/color-matrix.vert @@ -6,13 +6,13 @@ layout(location = 0) in vec4 inRect; layout(location = 1) in vec4 inTexRect; layout(location = 2) in mat4 inColorMatrix; layout(location = 6) in vec4 inColorOffset; -layout(location = 7) in uvec2 inTexId; +layout(location = 7) in uint inTexId; layout(location = 0) out vec2 outPos; layout(location = 1) out vec2 outTexCoord; layout(location = 2) out flat mat4 outColorMatrix; layout(location = 6) out flat vec4 outColorOffset; -layout(location = 7) out flat uvec2 outTexId; +layout(location = 7) out flat uint outTexId; vec2 offsets[6] = { vec2(0.0, 0.0), vec2(1.0, 0.0), diff --git a/gsk/vulkan/resources/common.frag.glsl b/gsk/vulkan/resources/common.frag.glsl index 314477f697..49ae98a120 100644 --- a/gsk/vulkan/resources/common.frag.glsl +++ b/gsk/vulkan/resources/common.frag.glsl @@ -1,10 +1,9 @@ -layout(set = 0, binding = 0) uniform texture2D textures[50000]; -layout(set = 1, binding = 0) uniform sampler samplers[50000]; -layout(set = 2, binding = 0) readonly buffer FloatBuffers { +layout(set = 0, binding = 0) uniform sampler2D textures[50000]; +layout(set = 1, binding = 0) readonly buffer FloatBuffers { float floats[]; } buffers[50000]; -#define get_sampler(id) sampler2D(textures[id.x], samplers[id.y]) +#define get_sampler(id) textures[id] #define get_buffer(id) buffers[id] #define get_float(id) get_buffer(0).floats[id] diff --git a/gsk/vulkan/resources/cross-fade.frag b/gsk/vulkan/resources/cross-fade.frag index 9cb3939a31..ba5e392164 100644 --- a/gsk/vulkan/resources/cross-fade.frag +++ b/gsk/vulkan/resources/cross-fade.frag @@ -9,8 +9,8 @@ layout(location = 1) in Rect inStartRect; layout(location = 2) in Rect inEndRect; layout(location = 3) in vec2 inStartTexCoord; layout(location = 4) in vec2 inEndTexCoord; -layout(location = 5) flat in uvec2 inStartTexId; -layout(location = 6) flat in uvec2 inEndTexId; +layout(location = 5) flat in uint inStartTexId; +layout(location = 6) flat in uint inEndTexId; layout(location = 7) in float inProgress; layout(location = 0) out vec4 color; diff --git a/gsk/vulkan/resources/cross-fade.vert b/gsk/vulkan/resources/cross-fade.vert index ffa9921760..1eb87bab13 100644 --- a/gsk/vulkan/resources/cross-fade.vert +++ b/gsk/vulkan/resources/cross-fade.vert @@ -8,8 +8,8 @@ layout(location = 1) in vec4 inStartRect; layout(location = 2) in vec4 inEndRect; layout(location = 3) in vec4 inStartTexRect; layout(location = 4) in vec4 inEndTexRect; -layout(location = 5) in uvec2 inStartTexId; -layout(location = 6) in uvec2 inEndTexId; +layout(location = 5) in uint inStartTexId; +layout(location = 6) in uint inEndTexId; layout(location = 7) in float inProgress; layout(location = 0) out vec2 outPos; @@ -17,8 +17,8 @@ layout(location = 1) flat out Rect outStartRect; layout(location = 2) flat out Rect outEndRect; layout(location = 3) out vec2 outStartTexCoord; layout(location = 4) out vec2 outEndTexCoord; -layout(location = 5) flat out uvec2 outStartTexId; -layout(location = 6) flat out uvec2 outEndTexId; +layout(location = 5) flat out uint outStartTexId; +layout(location = 6) flat out uint outEndTexId; layout(location = 7) flat out float outProgress; void main() { diff --git a/gsk/vulkan/resources/mask.frag b/gsk/vulkan/resources/mask.frag index 7a72cf6db9..db4df18e04 100644 --- a/gsk/vulkan/resources/mask.frag +++ b/gsk/vulkan/resources/mask.frag @@ -6,7 +6,7 @@ layout(location = 0) in vec2 inPos; layout(location = 1) in vec2 inTexCoord; layout(location = 2) in vec4 inColor; -layout(location = 3) flat in uvec2 inTexId; +layout(location = 3) flat in uint inTexId; layout(location = 0) out vec4 color; diff --git a/gsk/vulkan/resources/mask.vert b/gsk/vulkan/resources/mask.vert index 3c89f159bb..f787593993 100644 --- a/gsk/vulkan/resources/mask.vert +++ b/gsk/vulkan/resources/mask.vert @@ -5,12 +5,12 @@ layout(location = 0) in vec4 inRect; layout(location = 1) in vec4 inTexRect; layout(location = 2) in vec4 inColor; -layout(location = 3) in uvec2 inTexId; +layout(location = 3) in uint inTexId; layout(location = 0) out vec2 outPos; layout(location = 1) out vec2 outTexCoord; layout(location = 2) out flat vec4 outColor; -layout(location = 3) out flat uvec2 outTexId; +layout(location = 3) out flat uint outTexId; vec2 offsets[6] = { vec2(0.0, 0.0), vec2(1.0, 0.0), diff --git a/gsk/vulkan/resources/texture.frag b/gsk/vulkan/resources/texture.frag index dea157332a..f7f8f0ffc6 100644 --- a/gsk/vulkan/resources/texture.frag +++ b/gsk/vulkan/resources/texture.frag @@ -7,7 +7,7 @@ layout(location = 0) in vec2 inPos; layout(location = 1) in Rect inRect; layout(location = 2) in vec2 inTexCoord; -layout(location = 3) flat in uvec2 inTexId; +layout(location = 3) flat in uint inTexId; layout(location = 0) out vec4 color; diff --git a/gsk/vulkan/resources/texture.vert b/gsk/vulkan/resources/texture.vert index 739f32e3b6..a76c4bad3a 100644 --- a/gsk/vulkan/resources/texture.vert +++ b/gsk/vulkan/resources/texture.vert @@ -5,12 +5,12 @@ layout(location = 0) in vec4 inRect; layout(location = 1) in vec4 inTexRect; -layout(location = 2) in uvec2 inTexId; +layout(location = 2) in uint inTexId; layout(location = 0) out vec2 outPos; layout(location = 1) out flat Rect outRect; layout(location = 2) out vec2 outTexCoord; -layout(location = 3) out flat uvec2 outTexId; +layout(location = 3) out flat uint outTexId; void main() { Rect r = rect_from_gsk (inRect);