float bottom_rect[4];
float top_tex_rect[4];
float bottom_tex_rect[4];
- guint32 top_tex_id;
- guint32 bottom_tex_id;
+ guint32 top_tex_id[2];
+ guint32 bottom_tex_id[2];
guint32 blend_mode;
};
{
.location = 6,
.binding = 0,
- .format = VK_FORMAT_R32_UINT,
+ .format = VK_FORMAT_R32G32_UINT,
.offset = G_STRUCT_OFFSET (GskVulkanBlendModeInstance, bottom_tex_id),
},
{
.location = 7,
.binding = 0,
- .format = VK_FORMAT_R32_UINT,
+ .format = VK_FORMAT_R32G32_UINT,
.offset = G_STRUCT_OFFSET (GskVulkanBlendModeInstance, blend_mode),
}
};
void
gsk_vulkan_blend_mode_pipeline_collect_vertex_data (GskVulkanBlendModePipeline *pipeline,
guchar *data,
- guint32 top_tex_id,
- guint32 bottom_tex_id,
+ guint32 top_tex_id[2],
+ guint32 bottom_tex_id[2],
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 = top_tex_id;
- instance->bottom_tex_id = bottom_tex_id;
+ 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->blend_mode = blend_mode;
}
void gsk_vulkan_blend_mode_pipeline_collect_vertex_data (GskVulkanBlendModePipeline *pipeline,
guchar *data,
- guint32 top_tex_id,
- guint32 bottom_tex_id,
+ guint32 top_tex_id[2],
+ guint32 bottom_tex_id[2],
const graphene_point_t *offset,
const graphene_rect_t *bounds,
const graphene_rect_t *top_bounds,
float rect[4];
float tex_rect[4];
float blur_radius;
- guint32 tex_id;
+ guint32 tex_id[2];
};
G_DEFINE_TYPE (GskVulkanBlurPipeline, gsk_vulkan_blur_pipeline, GSK_TYPE_VULKAN_PIPELINE)
{
.location = 3,
.binding = 0,
- .format = VK_FORMAT_R32_UINT,
+ .format = VK_FORMAT_R32G32_UINT,
.offset = G_STRUCT_OFFSET (GskVulkanBlurInstance, tex_id),
}
};
void
gsk_vulkan_blur_pipeline_collect_vertex_data (GskVulkanBlurPipeline *pipeline,
guchar *data,
- guint32 tex_id,
+ guint32 tex_id[2],
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->blur_radius = blur_radius;
- instance->tex_id = tex_id;
+ instance->tex_id[0] = tex_id[0];
+ instance->tex_id[1] = tex_id[1];
}
gsize
void gsk_vulkan_blur_pipeline_collect_vertex_data (GskVulkanBlurPipeline *pipeline,
guchar *data,
- guint32 tex_id,
+ guint32 tex_id[2],
const graphene_point_t *offset,
const graphene_rect_t *rect,
const graphene_rect_t *tex_rect,
{
float rect[4];
float tex_rect[4];
- guint32 tex_id;
+ guint32 tex_id[2];
};
G_DEFINE_TYPE (GskVulkanColorTextPipeline, gsk_vulkan_color_text_pipeline, GSK_TYPE_VULKAN_PIPELINE)
{
.location = 2,
.binding = 0,
- .format = VK_FORMAT_R32_UINT,
+ .format = VK_FORMAT_R32G32_UINT,
.offset = G_STRUCT_OFFSET (GskVulkanColorTextInstance, tex_id),
}
};
guchar *data,
GskVulkanRenderer *renderer,
const graphene_rect_t *rect,
- guint tex_id,
+ guint tex_id[2],
PangoFont *font,
guint total_glyphs,
const PangoGlyphInfo *glyphs,
instance->tex_rect[2] = glyph->tw;
instance->tex_rect[3] = glyph->th;
- instance->tex_id = tex_id;
+ instance->tex_id[0] = tex_id[0];
+ instance->tex_id[1] = tex_id[1];
count++;
}
guchar *data,
GskVulkanRenderer *renderer,
const graphene_rect_t *rect,
- guint tex_id,
+ guint tex_id[2],
PangoFont *font,
guint total_glyphs,
const PangoGlyphInfo *glyphs,
float end_rect[4];
float start_tex_rect[4];
float end_tex_rect[4];
- guint32 start_tex_id;
- guint32 end_tex_id;
+ guint32 start_tex_id[2];
+ guint32 end_tex_id[2];
float progress;
};
{
.location = 5,
.binding = 0,
- .format = VK_FORMAT_R32_UINT,
+ .format = VK_FORMAT_R32G32_UINT,
.offset = G_STRUCT_OFFSET (GskVulkanCrossFadeInstance, start_tex_id),
},
{
.location = 6,
.binding = 0,
- .format = VK_FORMAT_R32_UINT,
+ .format = VK_FORMAT_R32G32_UINT,
.offset = G_STRUCT_OFFSET (GskVulkanCrossFadeInstance, end_tex_id),
},
{
void
gsk_vulkan_cross_fade_pipeline_collect_vertex_data (GskVulkanCrossFadePipeline *pipeline,
guchar *data,
- guint32 start_tex_id,
- guint32 end_tex_id,
+ guint32 start_tex_id[2],
+ guint32 end_tex_id[2],
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 = start_tex_id;
- instance->end_tex_id = end_tex_id;
+ 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->progress = progress;
}
void gsk_vulkan_cross_fade_pipeline_collect_vertex_data (GskVulkanCrossFadePipeline *pipeline,
guchar *data,
- guint32 start_tex_id,
- guint32 end_tex_id,
+ guint32 start_tex_id[2],
+ guint32 end_tex_id[2],
const graphene_point_t *offset,
const graphene_rect_t *bounds,
const graphene_rect_t *start_bounds,
float tex_rect[4];
float color_matrix[16];
float color_offset[4];
- guint32 tex_id;
+ guint32 tex_id[2];
};
G_DEFINE_TYPE (GskVulkanEffectPipeline, gsk_vulkan_effect_pipeline, GSK_TYPE_VULKAN_PIPELINE)
{
.location = 7,
.binding = 0,
- .format = VK_FORMAT_R32_UINT,
+ .format = VK_FORMAT_R32G32_UINT,
.offset = G_STRUCT_OFFSET (GskVulkanEffectInstance, tex_id),
}
};
void
gsk_vulkan_effect_pipeline_collect_vertex_data (GskVulkanEffectPipeline *pipeline,
guchar *data,
- guint32 tex_id,
+ guint32 tex_id[2],
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 = tex_id;
+ instance->tex_id[0] = tex_id[0];
+ instance->tex_id[1] = tex_id[1];
}
gsize
void gsk_vulkan_effect_pipeline_collect_vertex_data (GskVulkanEffectPipeline *pipeline,
guchar *data,
- guint32 tex_id,
+ guint32 tex_id[2],
const graphene_point_t *offset,
const graphene_rect_t *rect,
const graphene_rect_t *tex_rect,
VkPipelineLayout pipeline_layout;
GskVulkanUploader *uploader;
- GskDescriptorImageInfos descriptor_image_infos;
+ GskDescriptorImageInfos descriptor_images;
+ GskDescriptorImageInfos descriptor_samplers;
VkDescriptorPool descriptor_pool;
VkDescriptorSet descriptor_set;
GskVulkanPipeline *pipelines[GSK_VULKAN_N_PIPELINES];
GskVulkanImage *target;
- VkSampler sampler;
- VkSampler repeating_sampler;
+ VkSampler samplers[2];
GList *render_passes;
GSList *cleanup_images;
self->vulkan = context;
self->renderer = renderer;
self->framebuffers = g_hash_table_new (g_direct_hash, g_direct_equal);
- gsk_descriptor_image_infos_init (&self->descriptor_image_infos);
+ gsk_descriptor_image_infos_init (&self->descriptor_images);
+ gsk_descriptor_image_infos_init (&self->descriptor_samplers);
device = gdk_vulkan_context_get_device (self->vulkan);
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
.flags = VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT,
.maxSets = 1,
- .poolSizeCount = 1,
- .pPoolSizes = (VkDescriptorPoolSize[1]) {
+ .poolSizeCount = 2,
+ .pPoolSizes = (VkDescriptorPoolSize[2]) {
{
- .type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
+ .type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
+ .descriptorCount = DESCRIPTOR_POOL_MAXITEMS
+ },
+ {
+ .type = VK_DESCRIPTOR_TYPE_SAMPLER,
.descriptorCount = DESCRIPTOR_POOL_MAXITEMS
}
}
GSK_VK_CHECK (vkCreateDescriptorSetLayout, device,
&(VkDescriptorSetLayoutCreateInfo) {
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
- .bindingCount = 1,
+ .bindingCount = 2,
.flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT,
- .pBindings = (VkDescriptorSetLayoutBinding[1]) {
+ .pBindings = (VkDescriptorSetLayoutBinding[2]) {
{
.binding = 0,
- .descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
+ .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
+ .descriptorCount = DESCRIPTOR_POOL_MAXITEMS,
+ .stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT
+ },
+ {
+ .binding = 1,
+ .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER,
.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) {
+ .bindingCount = 2,
+ .pBindingFlags = (VkDescriptorBindingFlags[2]) {
+ VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT
+ | VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT
+ | VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT,
VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT
| VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT
| VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT,
.maxAnisotropy = 1.0,
},
NULL,
- &self->sampler);
+ &self->samplers[GSK_VULKAN_SAMPLER_DEFAULT]);
GSK_VK_CHECK (vkCreateSampler, device,
&(VkSamplerCreateInfo) {
.maxAnisotropy = 1.0,
},
NULL,
- &self->repeating_sampler);
+ &self->samplers[GSK_VULKAN_SAMPLER_REPEAT]);
+
self->uploader = gsk_vulkan_uploader_new (self->vulkan, self->command_pool);
}
gsize
-gsk_vulkan_render_reserve_descriptor_set (GskVulkanRender *self,
- GskVulkanImage *source,
- gboolean repeat)
+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)
{
- VkDescriptorImageInfo info = {
- .sampler = repeat ? self->repeating_sampler : self->sampler,
- .imageView = gsk_vulkan_image_get_image_view (source),
- .imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL
- };
gsize result;
- result = gsk_descriptor_image_infos_get_size (&self->descriptor_image_infos);
- gsk_descriptor_image_infos_append (&self->descriptor_image_infos, &info);
+ result = gsk_descriptor_image_infos_get_size (&self->descriptor_images);
+ gsk_descriptor_image_infos_append (&self->descriptor_images,
+ &(VkDescriptorImageInfo) {
+ .sampler = VK_NULL_HANDLE,
+ .imageView = gsk_vulkan_image_get_image_view (image),
+ .imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL
+ });
g_assert (result < DESCRIPTOR_POOL_MAXITEMS);
gsk_vulkan_render_pass_reserve_descriptor_sets (pass, self);
}
- if (gsk_descriptor_image_infos_get_size (&self->descriptor_image_infos) == 0)
+ if (gsk_descriptor_image_infos_get_size (&self->descriptor_samplers) == 0 &&
+ gsk_descriptor_image_infos_get_size (&self->descriptor_images) == 0)
return;
GSK_VK_CHECK (vkAllocateDescriptorSets, device,
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO,
.descriptorSetCount = 1,
.pDescriptorCounts = (uint32_t[1]) {
- gsk_descriptor_image_infos_get_size (&self->descriptor_image_infos)
+ gsk_descriptor_image_infos_get_size (&self->descriptor_images)
+ + gsk_descriptor_image_infos_get_size (&self->descriptor_samplers)
}
}
},
&self->descriptor_set);
vkUpdateDescriptorSets (device,
- 1,
- (VkWriteDescriptorSet[1]) {
+ 2,
+ (VkWriteDescriptorSet[2]) {
{
.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
.dstSet = self->descriptor_set,
.dstBinding = 0,
.dstArrayElement = 0,
- .descriptorCount = gsk_descriptor_image_infos_get_size (&self->descriptor_image_infos),
- .descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
- .pImageInfo = gsk_descriptor_image_infos_get_data (&self->descriptor_image_infos)
+ .descriptorCount = gsk_descriptor_image_infos_get_size (&self->descriptor_images),
+ .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
+ .pImageInfo = gsk_descriptor_image_infos_get_data (&self->descriptor_images)
+ },
+ {
+ .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
+ .dstSet = self->descriptor_set,
+ .dstBinding = 1,
+ .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)
}
},
0, NULL);
GSK_VK_CHECK (vkResetDescriptorPool, device,
self->descriptor_pool,
0);
- gsk_descriptor_image_infos_set_size (&self->descriptor_image_infos, 0);
+ gsk_descriptor_image_infos_set_size (&self->descriptor_images, 0);
+ gsk_descriptor_image_infos_set_size (&self->descriptor_samplers, 0);
g_list_free_full (self->render_passes, (GDestroyNotify) gsk_vulkan_render_pass_free);
self->render_passes = NULL;
vkDestroyDescriptorPool (device,
self->descriptor_pool,
NULL);
- gsk_descriptor_image_infos_clear (&self->descriptor_image_infos);
+ gsk_descriptor_image_infos_clear (&self->descriptor_images);
+ gsk_descriptor_image_infos_clear (&self->descriptor_samplers);
vkDestroyDescriptorSetLayout (device,
self->descriptor_set_layout,
self->fence,
NULL);
- vkDestroySampler (device,
- self->sampler,
- NULL);
-
- vkDestroySampler (device,
- self->repeating_sampler,
- NULL);
+ for (i = 0; i < G_N_ELEMENTS (self->samplers); i++)
+ {
+ vkDestroySampler (device,
+ self->samplers[i],
+ NULL);
+ }
gsk_vulkan_command_pool_free (self->command_pool);
GskVulkanImage *source; /* source image to render */
GskVulkanImage *source2; /* second source image to render (if relevant) */
gsize vertex_offset; /* offset into vertex buffer */
- gsize descriptor_set_index; /* index into descriptor sets array for the right descriptor set to bind */
- gsize descriptor_set_index2; /* descriptor index for the second source (if relevant) */
+ guint32 image_descriptor[2]; /* index into descriptor for the (image, sampler) */
+ guint32 image_descriptor2[2]; /* index into descriptor for the 2nd image (if relevant) */
graphene_rect_t source_rect; /* area that source maps to */
graphene_rect_t source2_rect; /* area that source2 maps to */
};
GskRoundedRect clip; /* clip rect (or random memory if not relevant) */
GskVulkanImage *source; /* source image to render */
gsize vertex_offset; /* offset into vertex buffer */
- gsize descriptor_set_index; /* index into descriptor sets array for the right descriptor set to bind */
+ guint32 image_descriptor[2]; /* 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_TEXTURE:
gsk_vulkan_texture_pipeline_collect_vertex_data (GSK_VULKAN_TEXTURE_PIPELINE (op->render.pipeline),
data + op->render.vertex_offset,
- op->render.descriptor_set_index,
+ op->render.image_descriptor,
&op->render.offset,
&op->render.node->bounds,
&op->render.source_rect);
case GSK_VULKAN_OP_REPEAT:
gsk_vulkan_texture_pipeline_collect_vertex_data (GSK_VULKAN_TEXTURE_PIPELINE (op->render.pipeline),
data + op->render.vertex_offset,
- op->render.descriptor_set_index,
+ op->render.image_descriptor,
&op->render.offset,
&op->render.node->bounds,
&op->render.source_rect);
data + op->text.vertex_offset,
GSK_VULKAN_RENDERER (gsk_vulkan_render_get_renderer (render)),
&op->text.node->bounds,
- op->text.descriptor_set_index,
+ op->text.image_descriptor,
(PangoFont *)gsk_text_node_get_font (op->text.node),
gsk_text_node_get_num_glyphs (op->text.node),
gsk_text_node_get_glyphs (op->text.node, NULL),
data + op->text.vertex_offset,
GSK_VULKAN_RENDERER (gsk_vulkan_render_get_renderer (render)),
&op->text.node->bounds,
- op->text.descriptor_set_index,
+ op->text.image_descriptor,
(PangoFont *)gsk_text_node_get_font (op->text.node),
gsk_text_node_get_num_glyphs (op->text.node),
gsk_text_node_get_glyphs (op->text.node, NULL),
gsk_vulkan_effect_pipeline_collect_vertex_data (GSK_VULKAN_EFFECT_PIPELINE (op->render.pipeline),
data + op->render.vertex_offset,
- op->render.descriptor_set_index,
+ op->render.image_descriptor,
&op->render.offset,
&op->render.node->bounds,
&op->render.source_rect,
case GSK_VULKAN_OP_BLUR:
gsk_vulkan_blur_pipeline_collect_vertex_data (GSK_VULKAN_BLUR_PIPELINE (op->render.pipeline),
data + op->render.vertex_offset,
- op->render.descriptor_set_index,
+ op->render.image_descriptor,
&op->render.offset,
&op->render.node->bounds,
&op->render.source_rect,
case GSK_VULKAN_OP_COLOR_MATRIX:
gsk_vulkan_effect_pipeline_collect_vertex_data (GSK_VULKAN_EFFECT_PIPELINE (op->render.pipeline),
data + op->render.vertex_offset,
- op->render.descriptor_set_index,
+ op->render.image_descriptor,
&op->render.offset,
&op->render.node->bounds,
&op->render.source_rect,
case GSK_VULKAN_OP_CROSS_FADE:
gsk_vulkan_cross_fade_pipeline_collect_vertex_data (GSK_VULKAN_CROSS_FADE_PIPELINE (op->render.pipeline),
data + op->render.vertex_offset,
- op->render.descriptor_set_index,
- op->render.descriptor_set_index2,
+ op->render.image_descriptor,
+ op->render.image_descriptor2,
&op->render.offset,
&op->render.node->bounds,
&gsk_cross_fade_node_get_start_child (op->render.node)->bounds,
case GSK_VULKAN_OP_BLEND_MODE:
gsk_vulkan_blend_mode_pipeline_collect_vertex_data (GSK_VULKAN_BLEND_MODE_PIPELINE (op->render.pipeline),
data + op->render.vertex_offset,
- op->render.descriptor_set_index,
- op->render.descriptor_set_index2,
+ op->render.image_descriptor,
+ op->render.image_descriptor2,
&op->render.offset,
&op->render.node->bounds,
&gsk_blend_node_get_top_child (op->render.node)->bounds,
case GSK_VULKAN_OP_BLUR:
case GSK_VULKAN_OP_COLOR_MATRIX:
if (op->render.source)
- op->render.descriptor_set_index = gsk_vulkan_render_reserve_descriptor_set (render, op->render.source, FALSE);
+ {
+ 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);
+ }
break;
case GSK_VULKAN_OP_REPEAT:
if (op->render.source)
- op->render.descriptor_set_index = gsk_vulkan_render_reserve_descriptor_set (render, op->render.source, TRUE);
+ {
+ 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_REPEAT);
+ }
break;
case GSK_VULKAN_OP_TEXT:
case GSK_VULKAN_OP_COLOR_TEXT:
- op->text.descriptor_set_index = gsk_vulkan_render_reserve_descriptor_set (render, op->text.source, FALSE);
+ 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);
break;
case GSK_VULKAN_OP_CROSS_FADE:
case GSK_VULKAN_OP_BLEND_MODE:
if (op->render.source && op->render.source2)
{
- op->render.descriptor_set_index = gsk_vulkan_render_reserve_descriptor_set (render, op->render.source, FALSE);
- op->render.descriptor_set_index2 = gsk_vulkan_render_reserve_descriptor_set (render, op->render.source2, FALSE);
+ 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];
}
break;
GSK_VULKAN_N_PIPELINES
} GskVulkanPipelineType;
+typedef enum {
+ GSK_VULKAN_SAMPLER_DEFAULT,
+ GSK_VULKAN_SAMPLER_REPEAT
+} GskVulkanRenderSampler;
+
GskVulkanRender * gsk_vulkan_render_new (GskRenderer *renderer,
GdkVulkanContext *context);
void gsk_vulkan_render_free (GskVulkanRender *self);
GskVulkanPipeline * gsk_vulkan_render_get_pipeline (GskVulkanRender *self,
GskVulkanPipelineType pipeline_type);
-gsize gsk_vulkan_render_reserve_descriptor_set (GskVulkanRender *self,
- GskVulkanImage *source,
- gboolean repeat);
+gsize gsk_vulkan_render_get_sampler_descriptor (GskVulkanRender *self,
+ GskVulkanRenderSampler render_sampler);
+gsize gsk_vulkan_render_get_image_descriptor (GskVulkanRender *self,
+ GskVulkanImage *source);
VkDescriptorSet gsk_vulkan_render_get_descriptor_set (GskVulkanRender *self);
void gsk_vulkan_render_draw (GskVulkanRender *self);
float rect[4];
float tex_rect[4];
float color[4];
- guint32 tex_id;
+ guint32 tex_id[2];
};
G_DEFINE_TYPE (GskVulkanTextPipeline, gsk_vulkan_text_pipeline, GSK_TYPE_VULKAN_PIPELINE)
{
.location = 3,
.binding = 0,
- .format = VK_FORMAT_R32_UINT,
+ .format = VK_FORMAT_R32G32_UINT,
.offset = G_STRUCT_OFFSET (GskVulkanTextInstance, tex_id),
}
};
guchar *data,
GskVulkanRenderer *renderer,
const graphene_rect_t *rect,
- guint tex_id,
+ guint tex_id[2],
PangoFont *font,
guint total_glyphs,
const PangoGlyphInfo *glyphs,
instance->color[2] = color->blue;
instance->color[3] = color->alpha;
- instance->tex_id = tex_id;
+ instance->tex_id[0] = tex_id[0];
+ instance->tex_id[1] = tex_id[1];
count++;
}
guchar *data,
GskVulkanRenderer *renderer,
const graphene_rect_t *rect,
- guint32 tex_id,
+ guint32 tex_id[2],
PangoFont *font,
guint total_glyphs,
const PangoGlyphInfo *glyphs,
{
float rect[4];
float tex_rect[4];
- guint32 tex_id;
+ guint32 tex_id[2];
};
G_DEFINE_TYPE (GskVulkanTexturePipeline, gsk_vulkan_texture_pipeline, GSK_TYPE_VULKAN_PIPELINE)
{
.location = 2,
.binding = 0,
- .format = VK_FORMAT_R32_UINT,
+ .format = VK_FORMAT_R32G32_UINT,
.offset = G_STRUCT_OFFSET (GskVulkanTextureInstance, tex_id),
}
};
void
gsk_vulkan_texture_pipeline_collect_vertex_data (GskVulkanTexturePipeline *pipeline,
guchar *data,
- guint32 tex_id,
+ guint32 tex_id[2],
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 = tex_id;
+ instance->tex_id[0] = tex_id[0];
+ instance->tex_id[1] = tex_id[1];
}
gsize
void gsk_vulkan_texture_pipeline_collect_vertex_data (GskVulkanTexturePipeline *pipeline,
guchar *data,
- guint32 tex_id,
+ guint32 tex_id[2],
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 uint inTopTexId;
-layout(location = 6) flat in uint inBottomTexId;
+layout(location = 5) flat in uvec2 inTopTexId;
+layout(location = 6) flat in uvec2 inBottomTexId;
layout(location = 7) flat in uint inBlendMode;
layout(location = 0) out vec4 color;
void main()
{
float source_alpha = rect_coverage (inTopRect, inPos);
- vec4 source = texture (textures[inTopTexId], inTopTexCoord) * source_alpha;
- //source=vec4(1); //inTopTexCoord * 100 + 100) / 255, 0, 1);
+ vec4 source = texture (get_sampler (inTopTexId), inTopTexCoord) * source_alpha;
float backdrop_alpha = rect_coverage (inBottomRect, inPos);
- vec4 backdrop = texture (textures[inBottomTexId], inBottomTexCoord) * backdrop_alpha;
- //backdrop=vec4(1, 0, 0, 1) * backdrop_alpha;
+ vec4 backdrop = texture (get_sampler (inBottomTexId), inBottomTexCoord) * backdrop_alpha;
vec4 result;
if (inBlendMode == 0)
layout(location = 2) in vec4 inBottomRect;
layout(location = 3) in vec4 inTopTexRect;
layout(location = 4) in vec4 inBottomTexRect;
-layout(location = 5) in uint inTopTexId;
-layout(location = 6) in uint inBottomTexId;
+layout(location = 5) in uvec2 inTopTexId;
+layout(location = 6) in uvec2 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 uint outTopTexId;
-layout(location = 6) flat out uint outBottomTexId;
+layout(location = 5) flat out uvec2 outTopTexId;
+layout(location = 6) flat out uvec2 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 uint inTexId;
+layout(location = 4) in flat uvec2 inTexId;
layout(location = 0) out vec4 color;
float fx = Gaussian (inRadius, float(x) - float(half_samples_x));
float offset_x = float(x - half_samples_x) * pixel_size_x;
total += fx * fy;
- ret += texture(textures[inTexId], uv + vec2(offset_x, offset_y)) * fx * fy;
+ ret += texture(get_sampler (inTexId), uv + vec2(offset_x, offset_y)) * fx * fy;
}
}
return ret / total;
layout(location = 0) in vec4 inRect;
layout(location = 1) in vec4 inTexRect;
layout(location = 2) in float inRadius;
-layout(location = 3) in uint inTexId;
+layout(location = 3) in uvec2 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 uint outTexId;
+layout(location = 4) out flat uvec2 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 uint inTexId;
+layout(location = 7) in flat uvec2 inTexId;
layout(location = 0) out vec4 color;
void main()
{
- color = clip (inPos, color_matrix (texture (textures[inTexId], inTexCoord), inColorMatrix, inColorOffset));
+ color = clip (inPos, color_matrix (texture (get_sampler (inTexId), inTexCoord), inColorMatrix, inColorOffset));
}
layout(location = 1) in vec4 inTexRect;
layout(location = 2) in mat4 inColorMatrix;
layout(location = 6) in vec4 inColorOffset;
-layout(location = 7) in uint inTexId;
+layout(location = 7) in uvec2 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 uint outTexId;
+layout(location = 7) out flat uvec2 outTexId;
vec2 offsets[6] = { vec2(0.0, 0.0),
vec2(1.0, 0.0),
-layout(set = 0, binding = 0) uniform sampler2D textures[50000];
+layout(set = 0, binding = 0) uniform texture2D textures[50000];
+layout(set = 0, binding = 1) uniform sampler samplers[50000];
+
+#define get_sampler(id) sampler2D(textures[id.x], samplers[id.y])
+
layout(location = 2) in Rect inEndRect;
layout(location = 3) in vec2 inStartTexCoord;
layout(location = 4) in vec2 inEndTexCoord;
-layout(location = 5) flat in uint inStartTexId;
-layout(location = 6) flat in uint inEndTexId;
+layout(location = 5) flat in uvec2 inStartTexId;
+layout(location = 6) flat in uvec2 inEndTexId;
layout(location = 7) in float inProgress;
layout(location = 0) out vec4 color;
void main()
{
float start_alpha = rect_coverage (inStartRect, inPos);
- vec4 start = texture (textures[inStartTexId], inStartTexCoord) * start_alpha;
+ vec4 start = texture (get_sampler (inStartTexId), inStartTexCoord) * start_alpha;
float end_alpha = rect_coverage (inEndRect, inPos);
- vec4 end = texture (textures[inEndTexId], inEndTexCoord) * end_alpha;
+ vec4 end = texture (get_sampler (inEndTexId), inEndTexCoord) * end_alpha;
color = clip_scaled (inPos, mix (start, end, inProgress));
}
layout(location = 2) in vec4 inEndRect;
layout(location = 3) in vec4 inStartTexRect;
layout(location = 4) in vec4 inEndTexRect;
-layout(location = 5) in uint inStartTexId;
-layout(location = 6) in uint inEndTexId;
+layout(location = 5) in uvec2 inStartTexId;
+layout(location = 6) in uvec2 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 uint outStartTexId;
-layout(location = 6) flat out uint outEndTexId;
+layout(location = 5) flat out uvec2 outStartTexId;
+layout(location = 6) flat out uvec2 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 uint inTexId;
+layout(location = 3) flat in uvec2 inTexId;
layout(location = 0) out vec4 color;
void main()
{
- color = clip (inPos, vec4(inColor.rgb * inColor.a, inColor.a) * texture(textures[inTexId], inTexCoord).a);
+ color = clip (inPos, vec4(inColor.rgb * inColor.a, inColor.a) * texture(get_sampler (inTexId), inTexCoord).a);
}
layout(location = 0) in vec4 inRect;
layout(location = 1) in vec4 inTexRect;
layout(location = 2) in vec4 inColor;
-layout(location = 3) in uint inTexId;
+layout(location = 3) in uvec2 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 uint outTexId;
+layout(location = 3) out flat uvec2 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 uint inTexId;
+layout(location = 3) flat in uvec2 inTexId;
layout(location = 0) out vec4 color;
void main()
{
float alpha = rect_coverage (inRect, inPos);
- color = clip_scaled (inPos, texture (textures[inTexId], inTexCoord) * alpha);
+ color = clip_scaled (inPos, texture (get_sampler (inTexId), inTexCoord) * alpha);
}
layout(location = 0) in vec4 inRect;
layout(location = 1) in vec4 inTexRect;
-layout(location = 2) in uint inTexId;
+layout(location = 2) in uvec2 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 uint outTexId;
+layout(location = 3) out flat uvec2 outTexId;
void main() {
Rect r = rect_from_gsk (inRect);