cairo_region_t *clip;
graphene_vec2_t scale;
-
- VkRenderPass render_pass;
};
struct _GskVulkanParseState
const graphene_vec2_t *scale,
const graphene_rect_t *viewport,
cairo_region_t *clip,
- GskRenderNode *node,
- gboolean is_root)
+ GskRenderNode *node)
{
GskVulkanRenderPass *self;
self->viewport = *viewport;
graphene_vec2_init_from_vec2 (&self->scale, scale);
- if (is_root)
- {
- /* this is a swapchain target */
- self->render_pass = gsk_vulkan_render_get_render_pass (render,
- gsk_vulkan_image_get_vk_format (target),
- VK_IMAGE_LAYOUT_UNDEFINED,
- VK_IMAGE_LAYOUT_PRESENT_SRC_KHR);
- }
- else
- {
- /* this is an offscreen */
- self->render_pass = gsk_vulkan_render_get_render_pass (render,
- gsk_vulkan_image_get_vk_format (target),
- VK_IMAGE_LAYOUT_UNDEFINED,
- VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
- }
-
#ifdef G_ENABLE_DEBUG
if (fallback_pixels_quark == 0)
{
gsk_vulkan_render_pass_add_node (self, render, &state, node);
}
-
-VkRenderPass
-gsk_vulkan_render_pass_begin_draw (GskVulkanRenderPass *self,
- GskVulkanRender *render,
- VkPipelineLayout pipeline_layout,
- VkCommandBuffer command_buffer)
-{
- cairo_rectangle_int_t rect;
-
- vkCmdSetViewport (command_buffer,
- 0,
- 1,
- &(VkViewport) {
- .x = 0,
- .y = 0,
- .width = self->viewport.size.width,
- .height = self->viewport.size.height,
- .minDepth = 0,
- .maxDepth = 1
- });
-
- cairo_region_get_extents (self->clip, &rect);
-
- vkCmdBeginRenderPass (command_buffer,
- &(VkRenderPassBeginInfo) {
- .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
- .renderPass = self->render_pass,
- .framebuffer = gsk_vulkan_image_get_framebuffer (self->target,
- self->render_pass),
- .renderArea = {
- { rect.x, rect.y },
- { rect.width, rect.height }
- },
- .clearValueCount = 1,
- .pClearValues = (VkClearValue [1]) {
- { .color = { .float32 = { 0.f, 0.f, 0.f, 0.f } } }
- }
- },
- VK_SUBPASS_CONTENTS_INLINE);
-
- return self->render_pass;
-}
-
-void
-gsk_vulkan_render_pass_end_draw (GskVulkanRenderPass *self,
- GskVulkanRender *render,
- VkPipelineLayout pipeline_layout,
- VkCommandBuffer command_buffer)
-{
- vkCmdEndRenderPass (command_buffer);
-}
-
GskVulkanImage *image;
GskVulkanRenderPass *render_pass;
+ cairo_rectangle_int_t area;
+ graphene_size_t viewport_size;
+
+ VkImageLayout initial_layout;
+ VkImageLayout final_layout;
};
static void
const char *current_pipeline_clip_type = NULL;
VkRenderPass vk_render_pass;
- vk_render_pass = gsk_vulkan_render_pass_begin_draw (self->render_pass, render, pipeline_layout, command_buffer);
+ vk_render_pass = gsk_vulkan_render_get_render_pass (render,
+ gsk_vulkan_image_get_vk_format (self->image),
+ self->initial_layout,
+ self->final_layout);
+
+
+ vkCmdSetViewport (command_buffer,
+ 0,
+ 1,
+ &(VkViewport) {
+ .x = 0,
+ .y = 0,
+ .width = self->viewport_size.width,
+ .height = self->viewport_size.height,
+ .minDepth = 0,
+ .maxDepth = 1
+ });
+
+ vkCmdBeginRenderPass (command_buffer,
+ &(VkRenderPassBeginInfo) {
+ .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
+ .renderPass = vk_render_pass,
+ .framebuffer = gsk_vulkan_image_get_framebuffer (self->image,
+ vk_render_pass),
+ .renderArea = {
+ { self->area.x, self->area.y },
+ { self->area.width, self->area.height }
+ },
+ .clearValueCount = 1,
+ .pClearValues = (VkClearValue [1]) {
+ { .color = { .float32 = { 0.f, 0.f, 0.f, 0.f } } }
+ }
+ },
+ VK_SUBPASS_CONTENTS_INLINE);
op = op->next;
while (op->op_class->stage != GSK_VULKAN_STAGE_END_PASS)
self = (GskVulkanRenderPassOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_RENDER_PASS_OP_CLASS);
self->image = image;
+ self->initial_layout = VK_IMAGE_LAYOUT_UNDEFINED;
+ self->final_layout = is_root ? VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
+ :VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
+ cairo_region_get_extents (clip, &self->area);
+ self->viewport_size = viewport->size;
self->render_pass = gsk_vulkan_render_pass_new (context,
render,
scale,
viewport,
clip,
- node,
- is_root);
+ node);
/* This invalidates the self pointer */
gsk_vulkan_render_pass_add (self->render_pass, render, node);
const graphene_vec2_t *scale,
const graphene_rect_t *viewport,
cairo_region_t *clip,
- GskRenderNode *node,
- gboolean is_root);
+ GskRenderNode *node);
void gsk_vulkan_render_pass_free (GskVulkanRenderPass *self);
GskVulkanRender *render,
GskRenderNode *node);
-VkRenderPass gsk_vulkan_render_pass_begin_draw (GskVulkanRenderPass *self,
- GskVulkanRender *render,
- VkPipelineLayout pipeline_layout,
- VkCommandBuffer command_buffer);
-void gsk_vulkan_render_pass_end_draw (GskVulkanRenderPass *self,
- GskVulkanRender *render,
- VkPipelineLayout pipeline_layout,
- VkCommandBuffer command_buffer);
-
G_END_DECLS