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,
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;
}
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,
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,
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
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,
graphene_rect_t tex_rect;
guint32 image_descriptor;
- guint32 sampler_descriptor;
GskVulkanPipeline *pipeline;
gsize vertex_offset;
};
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,
{
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
guchar *data,
GskVulkanRenderer *renderer,
const graphene_rect_t *rect,
- guint tex_id[2],
+ guint tex_id,
PangoFont *font,
guint total_glyphs,
const PangoGlyphInfo *glyphs,
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++;
}
guchar *data,
GskVulkanRenderer *renderer,
const graphene_rect_t *rect,
- guint tex_id[2],
+ guint tex_id,
PangoFont *font,
guint total_glyphs,
const PangoGlyphInfo *glyphs,
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,
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;
}
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,
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,
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
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,
#define GDK_ARRAY_NO_MEMSET 1
#include "gdk/gdkarrayimpl.c"
-#define N_DESCRIPTOR_SETS 3
+#define N_DESCRIPTOR_SETS 2
struct _GskVulkanRender
{
GskVulkanUploader *uploader;
GskDescriptorImageInfos descriptor_images;
- GskDescriptorImageInfos descriptor_samplers;
GskDescriptorBufferInfos descriptor_buffers;
VkDescriptorPool descriptor_pool;
VkDescriptorSet descriptor_sets[N_DESCRIPTOR_SETS];
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);
.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
},
{
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,
.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
}
}
},
NULL,
- &self->descriptor_set_layouts[1]);
+ &self->descriptor_set_layouts[0]);
GSK_VK_CHECK (vkCreateDescriptorSetLayout, device,
&(VkDescriptorSetLayoutCreateInfo) {
}
},
NULL,
- &self->descriptor_set_layouts[2]);
+ &self->descriptor_set_layouts[1]);
GSK_VK_CHECK (vkCreatePipelineLayout, device,
&(VkPipelineLayoutCreateInfo) {
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
});
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;
.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))
}
}
.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),
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);
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++)
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 */
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 */
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;
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,
guchar *data,
GskVulkanRenderer *renderer,
const graphene_rect_t *rect,
- guint tex_id[2],
+ guint tex_id,
PangoFont *font,
guint total_glyphs,
const PangoGlyphInfo *glyphs,
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++;
}
guchar *data,
GskVulkanRenderer *renderer,
const graphene_rect_t *rect,
- guint32 tex_id[2],
+ guint32 tex_id,
PangoFont *font,
guint total_glyphs,
const PangoGlyphInfo *glyphs,
graphene_rect_t tex_rect;
guint32 image_descriptor;
- guint32 sampler_descriptor;
GskVulkanPipeline *pipeline;
gsize vertex_offset;
};
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);
{
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
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)
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
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);
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;
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;
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() {
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;
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),
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;
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),
-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]
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;
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;
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() {
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;
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),
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;
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);