GSK_VULKAN_OP_FALLBACK,
GSK_VULKAN_OP_FALLBACK_CLIP,
GSK_VULKAN_OP_FALLBACK_ROUNDED_CLIP,
- GSK_VULKAN_OP_TEXTURE_SCALE,
GSK_VULKAN_OP_COLOR,
GSK_VULKAN_OP_LINEAR_GRADIENT,
GSK_VULKAN_OP_OPACITY,
GskRenderNode *node)
{
GskVulkanPipelineType pipeline_type;
- GskVulkanOpRender op = {
- .type = GSK_VULKAN_OP_TEXTURE_SCALE,
- .node = node,
- .offset = state->offset,
- };
+ GskVulkanImage *image;
+ GskVulkanRenderer *renderer;
+ GskVulkanRenderSampler sampler;
+ GdkTexture *texture;
if (gsk_vulkan_clip_contains_rect (&state->clip, &state->offset, &node->bounds))
pipeline_type = GSK_VULKAN_PIPELINE_TEXTURE;
else
pipeline_type = GSK_VULKAN_PIPELINE_TEXTURE_CLIP_ROUNDED;
- op.pipeline = gsk_vulkan_render_pass_get_pipeline (self, render, pipeline_type);
- gsk_vulkan_render_pass_add_op (self, (GskVulkanOp *) &op);
+ renderer = GSK_VULKAN_RENDERER (gsk_vulkan_render_get_renderer (render));
+ texture = gsk_texture_scale_node_get_texture (node);
+ switch (gsk_texture_scale_node_get_filter (node))
+ {
+ default:
+ g_assert_not_reached ();
+ case GSK_SCALING_FILTER_LINEAR:
+ case GSK_SCALING_FILTER_TRILINEAR:
+ sampler = GSK_VULKAN_SAMPLER_DEFAULT;
+ break;
+ case GSK_SCALING_FILTER_NEAREST:
+ sampler = GSK_VULKAN_SAMPLER_NEAREST;
+ break;
+ }
+ image = gsk_vulkan_renderer_get_texture_image (renderer, texture);
+ if (image == NULL)
+ {
+ image = gsk_vulkan_upload_op_init_texture (gsk_vulkan_render_pass_alloc_op (self, gsk_vulkan_upload_op_size ()),
+ self->vulkan,
+ texture);
+ gsk_vulkan_renderer_add_texture_image (renderer, texture, image);
+ }
+
+ gsk_vulkan_texture_op_init (gsk_vulkan_render_pass_alloc_op (self, gsk_vulkan_texture_op_size ()),
+ gsk_vulkan_render_pass_get_pipeline (self, render, pipeline_type),
+ image,
+ sampler,
+ &node->bounds,
+ &state->offset,
+ &GRAPHENE_RECT_INIT(0, 0, 1, 1));
return TRUE;
}
}
break;
- case GSK_VULKAN_OP_TEXTURE_SCALE:
- {
- op->render.source = gsk_vulkan_renderer_ref_texture_image (GSK_VULKAN_RENDERER (gsk_vulkan_render_get_renderer (render)),
- gsk_texture_scale_node_get_texture (op->render.node),
- uploader);
- op->render.source_rect = GRAPHENE_RECT_INIT(0, 0, 1, 1);
- gsk_vulkan_render_add_cleanup_image (render, op->render.source);
- }
- break;
-
case GSK_VULKAN_OP_OPACITY:
{
GskRenderNode *child = gsk_opacity_node_get_child (op->render.node);
case GSK_VULKAN_OP_FALLBACK:
case GSK_VULKAN_OP_FALLBACK_CLIP:
case GSK_VULKAN_OP_FALLBACK_ROUNDED_CLIP:
- case GSK_VULKAN_OP_TEXTURE_SCALE:
case GSK_VULKAN_OP_REPEAT:
case GSK_VULKAN_OP_COLOR:
case GSK_VULKAN_OP_LINEAR_GRADIENT:
case GSK_VULKAN_OP_FALLBACK:
case GSK_VULKAN_OP_FALLBACK_CLIP:
case GSK_VULKAN_OP_FALLBACK_ROUNDED_CLIP:
- case GSK_VULKAN_OP_TEXTURE_SCALE:
gsk_vulkan_texture_pipeline_collect_vertex_data (GSK_VULKAN_TEXTURE_PIPELINE (op->render.pipeline),
data + op->render.vertex_offset,
op->render.image_descriptor,
}
break;
- case GSK_VULKAN_OP_TEXTURE_SCALE:
- if (op->render.source)
- {
- op->render.image_descriptor[0] = gsk_vulkan_render_get_image_descriptor (render, op->render.source);
- switch (gsk_texture_scale_node_get_filter (op->render.node))
- {
- default:
- g_assert_not_reached ();
- case GSK_SCALING_FILTER_LINEAR:
- case GSK_SCALING_FILTER_TRILINEAR:
- op->render.image_descriptor[1] = gsk_vulkan_render_get_sampler_descriptor (render, GSK_VULKAN_SAMPLER_DEFAULT);
- break;
- case GSK_SCALING_FILTER_NEAREST:
- op->render.image_descriptor[1] = gsk_vulkan_render_get_sampler_descriptor (render, GSK_VULKAN_SAMPLER_NEAREST);
- break;
- }
- }
- break;
-
case GSK_VULKAN_OP_REPEAT:
if (op->render.source)
{
case GSK_VULKAN_OP_FALLBACK:
case GSK_VULKAN_OP_FALLBACK_CLIP:
case GSK_VULKAN_OP_FALLBACK_ROUNDED_CLIP:
- case GSK_VULKAN_OP_TEXTURE_SCALE:
case GSK_VULKAN_OP_REPEAT:
case GSK_VULKAN_OP_COLOR:
case GSK_VULKAN_OP_LINEAR_GRADIENT:
case GSK_VULKAN_OP_FALLBACK:
case GSK_VULKAN_OP_FALLBACK_CLIP:
case GSK_VULKAN_OP_FALLBACK_ROUNDED_CLIP:
- case GSK_VULKAN_OP_TEXTURE_SCALE:
case GSK_VULKAN_OP_REPEAT:
if (!op->render.source)
break;