&self->viewport,
self->clip,
node,
- VK_NULL_HANDLE);
+ TRUE);
gsk_vulkan_render_verbose_print (self, "start of frame");
}
VkFence fence)
{
VkCommandBuffer command_buffer;
- gsize wait_semaphore_count;
- gsize signal_semaphore_count;
- VkSemaphore *wait_semaphores;
- VkSemaphore *signal_semaphores;
-
- wait_semaphore_count = gsk_vulkan_render_pass_get_wait_semaphores (pass, &wait_semaphores);
- signal_semaphore_count = gsk_vulkan_render_pass_get_signal_semaphores (pass, &signal_semaphores);
command_buffer = gsk_vulkan_command_pool_get_buffer (self->command_pool);
gsk_vulkan_command_pool_submit_buffer (self->command_pool,
command_buffer,
- wait_semaphore_count,
- wait_semaphores,
- signal_semaphore_count,
- signal_semaphores,
+ 0,
+ NULL,
+ 0,
+ NULL,
fence);
}
VkRenderPass render_pass;
VkFramebuffer framebuffer;
- VkSemaphore signal_semaphore;
- GArray *wait_semaphores;
GskVulkanBuffer *vertex_data;
};
const graphene_rect_t *viewport,
cairo_region_t *clip,
GskRenderNode *node,
- VkSemaphore signal_semaphore)
+ gboolean is_root)
{
GskVulkanRenderPass *self;
VkImageLayout final_layout;
self->viewport = *viewport;
graphene_vec2_init_from_vec2 (&self->scale, scale);
- if (signal_semaphore != VK_NULL_HANDLE) // this is a dependent pass
+ if (!is_root) // this is a dependent pass
final_layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
else
final_layout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
NULL,
&self->framebuffer);
- self->signal_semaphore = signal_semaphore;
- self->wait_semaphores = g_array_new (FALSE, FALSE, sizeof (VkSemaphore));
self->vertex_data = NULL;
#ifdef G_ENABLE_DEBUG
if (self->vertex_data)
gsk_vulkan_buffer_free (self->vertex_data);
- if (self->signal_semaphore != VK_NULL_HANDLE)
- vkDestroySemaphore (device, self->signal_semaphore, NULL);
- g_array_unref (self->wait_semaphores);
g_free (self);
}
GskRenderNode *node,
graphene_rect_t *tex_bounds)
{
- VkSemaphore semaphore;
GskVulkanImage *result;
switch ((guint) gsk_render_node_get_node_type (node))
*/
*tex_bounds = clipped;
- vkCreateSemaphore (gdk_vulkan_context_get_device (self->vulkan),
- &(VkSemaphoreCreateInfo) {
- VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
- NULL,
- 0
- },
- NULL,
- &semaphore);
- g_array_append_val (self->wait_semaphores, semaphore);
-
result = gsk_vulkan_offscreen_op (self,
self->vulkan,
render,
&state->scale,
&clipped,
- semaphore,
node);
return result;
GskRenderNode *node)
{
const graphene_rect_t *child_bounds;
- VkSemaphore semaphore;
GskVulkanImage *image;
child_bounds = gsk_repeat_node_get_child_bounds (node);
if (graphene_rect_get_area (child_bounds) == 0)
return TRUE;
- /* We need to create a texture in the right size so that we can repeat it
- * properly, so even for texture nodes this step is necessary.
- * We also can't use the clip because of that. */
- vkCreateSemaphore (gdk_vulkan_context_get_device (self->vulkan),
- &(VkSemaphoreCreateInfo) {
- VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
- NULL,
- 0
- },
- NULL,
- &semaphore);
-
- g_array_append_val (self->wait_semaphores, semaphore);
-
image = gsk_vulkan_offscreen_op (self,
self->vulkan,
render,
&state->scale,
child_bounds,
- semaphore,
gsk_repeat_node_get_child (node));
gsk_vulkan_texture_op (self,
return self->vertex_data;
}
-gsize
-gsk_vulkan_render_pass_get_wait_semaphores (GskVulkanRenderPass *self,
- VkSemaphore **semaphores)
-{
- *semaphores = (VkSemaphore *)self->wait_semaphores->data;
- return self->wait_semaphores->len;
-}
-
-gsize
-gsk_vulkan_render_pass_get_signal_semaphores (GskVulkanRenderPass *self,
- VkSemaphore **semaphores)
-{
- *semaphores = (VkSemaphore *)&self->signal_semaphore;
- return self->signal_semaphore != VK_NULL_HANDLE ? 1 : 0;
-}
-
void
gsk_vulkan_render_pass_reserve_descriptor_sets (GskVulkanRenderPass *self,
GskVulkanRender *render)