2016-12-08 12:26:36 +00:00
|
|
|
#include "config.h"
|
|
|
|
|
|
|
|
#include "gskvulkanrenderpassprivate.h"
|
|
|
|
|
|
|
|
#include "gskvulkanimageprivate.h"
|
|
|
|
#include "gskrendernodeprivate.h"
|
|
|
|
#include "gskrenderer.h"
|
2016-12-14 06:21:21 +00:00
|
|
|
#include "gskvulkanpushconstantsprivate.h"
|
2016-12-09 06:23:04 +00:00
|
|
|
#include "gskvulkanrendererprivate.h"
|
2016-12-08 12:26:36 +00:00
|
|
|
|
2016-12-14 06:34:18 +00:00
|
|
|
typedef union _GskVulkanOp GskVulkanOp;
|
|
|
|
typedef struct _GskVulkanOpRender GskVulkanOpRender;
|
|
|
|
typedef struct _GskVulkanOpPushConstants GskVulkanOpPushConstants;
|
2016-12-08 12:26:36 +00:00
|
|
|
|
|
|
|
typedef enum {
|
2016-12-14 06:34:18 +00:00
|
|
|
/* GskVulkanOpRender */
|
2016-12-09 04:59:19 +00:00
|
|
|
GSK_VULKAN_OP_FALLBACK,
|
|
|
|
GSK_VULKAN_OP_SURFACE,
|
2016-12-12 23:11:06 +00:00
|
|
|
GSK_VULKAN_OP_TEXTURE,
|
2016-12-14 06:34:18 +00:00
|
|
|
/* GskVulkanOpPushConstants */
|
2016-12-14 06:21:21 +00:00
|
|
|
GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS,
|
|
|
|
GSK_VULKAN_OP_PUSH_FRAGMENT_CONSTANTS
|
2016-12-08 12:26:36 +00:00
|
|
|
} GskVulkanOpType;
|
|
|
|
|
2016-12-14 06:34:18 +00:00
|
|
|
struct _GskVulkanOpRender
|
2016-12-08 12:26:36 +00:00
|
|
|
{
|
|
|
|
GskVulkanOpType type;
|
|
|
|
GskRenderNode *node; /* node that's the source of this op */
|
|
|
|
GskVulkanImage *source; /* source image to render */
|
|
|
|
gsize vertex_offset; /* offset into vertex buffer */
|
|
|
|
gsize vertex_count; /* number of vertices */
|
2016-12-09 01:55:47 +00:00
|
|
|
gsize descriptor_set_index; /* index into descriptor sets array for the right descriptor set to bind */
|
2016-12-08 12:26:36 +00:00
|
|
|
};
|
|
|
|
|
2016-12-14 06:34:18 +00:00
|
|
|
struct _GskVulkanOpPushConstants
|
|
|
|
{
|
|
|
|
GskVulkanOpType type;
|
|
|
|
GskRenderNode *node; /* node that's the source of this op */
|
|
|
|
GskVulkanPushConstants constants; /* new constants to push */
|
|
|
|
};
|
|
|
|
|
|
|
|
union _GskVulkanOp
|
|
|
|
{
|
|
|
|
GskVulkanOpType type;
|
|
|
|
GskVulkanOpRender render;
|
|
|
|
GskVulkanOpPushConstants constants;
|
|
|
|
};
|
|
|
|
|
2016-12-08 12:26:36 +00:00
|
|
|
struct _GskVulkanRenderPass
|
|
|
|
{
|
|
|
|
GdkVulkanContext *vulkan;
|
|
|
|
|
|
|
|
GArray *render_ops;
|
|
|
|
};
|
|
|
|
|
|
|
|
GskVulkanRenderPass *
|
|
|
|
gsk_vulkan_render_pass_new (GdkVulkanContext *context)
|
|
|
|
{
|
|
|
|
GskVulkanRenderPass *self;
|
|
|
|
|
|
|
|
self = g_slice_new0 (GskVulkanRenderPass);
|
|
|
|
self->vulkan = g_object_ref (context);
|
2016-12-14 06:34:18 +00:00
|
|
|
self->render_ops = g_array_new (FALSE, FALSE, sizeof (GskVulkanOp));
|
2016-12-08 12:26:36 +00:00
|
|
|
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
gsk_vulkan_render_pass_free (GskVulkanRenderPass *self)
|
|
|
|
{
|
|
|
|
g_array_unref (self->render_ops);
|
|
|
|
g_object_unref (self->vulkan);
|
|
|
|
|
|
|
|
g_slice_free (GskVulkanRenderPass, self);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2016-12-14 06:21:21 +00:00
|
|
|
gsk_vulkan_render_pass_add_node (GskVulkanRenderPass *self,
|
|
|
|
GskVulkanRender *render,
|
|
|
|
const GskVulkanPushConstants *constants,
|
|
|
|
GskRenderNode *node)
|
2016-12-08 12:26:36 +00:00
|
|
|
{
|
2016-12-14 06:34:18 +00:00
|
|
|
GskVulkanOp op = {
|
2016-12-08 12:26:36 +00:00
|
|
|
.type = GSK_VULKAN_OP_FALLBACK,
|
2016-12-14 06:34:18 +00:00
|
|
|
.render.node = node
|
2016-12-08 12:26:36 +00:00
|
|
|
};
|
|
|
|
|
2016-12-11 01:33:58 +00:00
|
|
|
switch (gsk_render_node_get_node_type (node))
|
2016-12-09 04:59:19 +00:00
|
|
|
{
|
2016-12-11 01:33:58 +00:00
|
|
|
case GSK_NOT_A_RENDER_NODE:
|
|
|
|
g_assert_not_reached ();
|
|
|
|
break;
|
|
|
|
|
2016-12-13 03:20:04 +00:00
|
|
|
default:
|
|
|
|
op.type = GSK_VULKAN_OP_FALLBACK;
|
|
|
|
g_array_append_val (self->render_ops, op);
|
|
|
|
break;
|
|
|
|
|
2016-12-11 01:33:58 +00:00
|
|
|
case GSK_CAIRO_NODE:
|
2016-12-09 04:59:19 +00:00
|
|
|
op.type = GSK_VULKAN_OP_SURFACE;
|
|
|
|
g_array_append_val (self->render_ops, op);
|
2016-12-11 01:33:58 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case GSK_TEXTURE_NODE:
|
2016-12-09 04:59:19 +00:00
|
|
|
op.type = GSK_VULKAN_OP_TEXTURE;
|
|
|
|
g_array_append_val (self->render_ops, op);
|
2016-12-11 01:33:58 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case GSK_CONTAINER_NODE:
|
2016-12-12 18:30:41 +00:00
|
|
|
{
|
|
|
|
guint i;
|
|
|
|
|
|
|
|
for (i = 0; i < gsk_container_node_get_n_children (node); i++)
|
|
|
|
{
|
2016-12-14 06:21:21 +00:00
|
|
|
gsk_vulkan_render_pass_add_node (self, render, constants, gsk_container_node_get_child (node, i));
|
2016-12-12 18:30:41 +00:00
|
|
|
}
|
|
|
|
}
|
2016-12-11 01:33:58 +00:00
|
|
|
break;
|
2016-12-12 23:11:06 +00:00
|
|
|
case GSK_TRANSFORM_NODE:
|
|
|
|
{
|
|
|
|
graphene_matrix_t transform;
|
|
|
|
|
|
|
|
gsk_transform_node_get_transform (node, &transform);
|
2016-12-14 06:21:21 +00:00
|
|
|
op.type = GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS;
|
2016-12-14 06:34:18 +00:00
|
|
|
gsk_vulkan_push_constants_init_copy (&op.constants.constants, constants);
|
|
|
|
gsk_vulkan_push_constants_multiply_mvp (&op.constants.constants, &transform);
|
2016-12-12 23:11:06 +00:00
|
|
|
g_array_append_val (self->render_ops, op);
|
2016-12-14 06:34:18 +00:00
|
|
|
gsk_vulkan_render_pass_add_node (self, render, &op.constants.constants, gsk_transform_node_get_child (node));
|
|
|
|
gsk_vulkan_push_constants_init_copy (&op.constants.constants, constants);
|
2016-12-12 23:11:06 +00:00
|
|
|
g_array_append_val (self->render_ops, op);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2016-12-09 04:59:19 +00:00
|
|
|
}
|
2016-12-08 12:26:36 +00:00
|
|
|
}
|
|
|
|
|
2016-12-12 23:11:06 +00:00
|
|
|
void
|
|
|
|
gsk_vulkan_render_pass_add (GskVulkanRenderPass *self,
|
|
|
|
GskVulkanRender *render,
|
|
|
|
const graphene_matrix_t *mvp,
|
|
|
|
GskRenderNode *node)
|
|
|
|
{
|
2016-12-14 06:34:18 +00:00
|
|
|
GskVulkanOp op = { 0, };
|
2016-12-12 23:11:06 +00:00
|
|
|
|
2016-12-14 06:21:21 +00:00
|
|
|
op.type = GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS;
|
2016-12-14 06:34:18 +00:00
|
|
|
gsk_vulkan_push_constants_init (&op.constants.constants, mvp);
|
2016-12-12 23:11:06 +00:00
|
|
|
g_array_append_val (self->render_ops, op);
|
|
|
|
|
2016-12-14 06:21:21 +00:00
|
|
|
op.type = GSK_VULKAN_OP_PUSH_FRAGMENT_CONSTANTS;
|
|
|
|
g_array_append_val (self->render_ops, op);
|
|
|
|
|
2016-12-14 06:34:18 +00:00
|
|
|
gsk_vulkan_render_pass_add_node (self, render, &op.constants.constants, node);
|
2016-12-12 23:11:06 +00:00
|
|
|
}
|
|
|
|
|
2016-12-08 12:26:36 +00:00
|
|
|
static void
|
2016-12-08 16:55:32 +00:00
|
|
|
gsk_vulkan_render_pass_upload_fallback (GskVulkanRenderPass *self,
|
2016-12-14 06:34:18 +00:00
|
|
|
GskVulkanOpRender *op,
|
2016-12-08 16:55:32 +00:00
|
|
|
GskVulkanRender *render,
|
|
|
|
VkCommandBuffer command_buffer)
|
2016-12-08 12:26:36 +00:00
|
|
|
{
|
|
|
|
graphene_rect_t bounds;
|
|
|
|
cairo_surface_t *surface;
|
|
|
|
cairo_t *cr;
|
|
|
|
|
|
|
|
gsk_render_node_get_bounds (op->node, &bounds);
|
|
|
|
|
|
|
|
surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
|
|
|
|
ceil (bounds.size.width),
|
|
|
|
ceil (bounds.size.height));
|
|
|
|
cr = cairo_create (surface);
|
2016-12-13 03:20:04 +00:00
|
|
|
cairo_translate (cr, -bounds.origin.x, -bounds.origin.y);
|
2016-12-08 12:26:36 +00:00
|
|
|
|
2016-12-13 02:15:07 +00:00
|
|
|
gsk_render_node_draw (op->node, cr);
|
2016-12-08 12:26:36 +00:00
|
|
|
|
|
|
|
cairo_destroy (cr);
|
|
|
|
|
2016-12-08 16:55:32 +00:00
|
|
|
op->source = gsk_vulkan_image_new_from_data (self->vulkan,
|
|
|
|
command_buffer,
|
2016-12-08 12:26:36 +00:00
|
|
|
cairo_image_surface_get_data (surface),
|
|
|
|
cairo_image_surface_get_width (surface),
|
|
|
|
cairo_image_surface_get_height (surface),
|
|
|
|
cairo_image_surface_get_stride (surface));
|
|
|
|
|
|
|
|
cairo_surface_destroy (surface);
|
|
|
|
|
|
|
|
gsk_vulkan_render_add_cleanup_image (render, op->source);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
gsk_vulkan_render_pass_upload (GskVulkanRenderPass *self,
|
2016-12-08 16:55:32 +00:00
|
|
|
GskVulkanRender *render,
|
|
|
|
VkCommandBuffer command_buffer)
|
2016-12-08 12:26:36 +00:00
|
|
|
{
|
2016-12-14 06:34:18 +00:00
|
|
|
GskVulkanOp *op;
|
2016-12-08 12:26:36 +00:00
|
|
|
guint i;
|
|
|
|
|
|
|
|
for (i = 0; i < self->render_ops->len; i++)
|
|
|
|
{
|
2016-12-14 06:34:18 +00:00
|
|
|
op = &g_array_index (self->render_ops, GskVulkanOp, i);
|
2016-12-08 12:26:36 +00:00
|
|
|
|
|
|
|
switch (op->type)
|
|
|
|
{
|
|
|
|
case GSK_VULKAN_OP_FALLBACK:
|
2016-12-14 06:34:18 +00:00
|
|
|
gsk_vulkan_render_pass_upload_fallback (self, &op->render, render, command_buffer);
|
2016-12-08 12:26:36 +00:00
|
|
|
break;
|
|
|
|
|
2016-12-09 04:59:19 +00:00
|
|
|
case GSK_VULKAN_OP_SURFACE:
|
|
|
|
{
|
2016-12-14 06:34:18 +00:00
|
|
|
cairo_surface_t *surface = gsk_cairo_node_get_surface (op->render.node);
|
|
|
|
op->render.source = gsk_vulkan_image_new_from_data (self->vulkan,
|
|
|
|
command_buffer,
|
|
|
|
cairo_image_surface_get_data (surface),
|
|
|
|
cairo_image_surface_get_width (surface),
|
|
|
|
cairo_image_surface_get_height (surface),
|
|
|
|
cairo_image_surface_get_stride (surface));
|
|
|
|
gsk_vulkan_render_add_cleanup_image (render, op->render.source);
|
2016-12-09 04:59:19 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case GSK_VULKAN_OP_TEXTURE:
|
|
|
|
{
|
2016-12-14 06:34:18 +00:00
|
|
|
op->render.source = gsk_vulkan_renderer_ref_texture_image (GSK_VULKAN_RENDERER (gsk_vulkan_render_get_renderer (render)),
|
|
|
|
gsk_texture_node_get_texture (op->render.node),
|
|
|
|
command_buffer);
|
|
|
|
gsk_vulkan_render_add_cleanup_image (render, op->render.source);
|
2016-12-09 04:59:19 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2016-12-08 12:26:36 +00:00
|
|
|
default:
|
|
|
|
g_assert_not_reached ();
|
2016-12-14 06:21:21 +00:00
|
|
|
case GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS:
|
|
|
|
case GSK_VULKAN_OP_PUSH_FRAGMENT_CONSTANTS:
|
2016-12-08 12:26:36 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
gsize
|
|
|
|
gsk_vulkan_render_pass_count_vertices (GskVulkanRenderPass *self)
|
|
|
|
{
|
|
|
|
return self->render_ops->len * 6;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gsize
|
2016-12-14 06:34:18 +00:00
|
|
|
gsk_vulkan_render_op_collect_vertices (GskVulkanOpRender *op,
|
2016-12-08 12:26:36 +00:00
|
|
|
GskVulkanVertex *vertices)
|
|
|
|
{
|
|
|
|
graphene_rect_t bounds;
|
|
|
|
|
|
|
|
gsk_render_node_get_bounds (op->node, &bounds);
|
|
|
|
|
|
|
|
vertices[0] = (GskVulkanVertex) { bounds.origin.x, bounds.origin.y, 0.0, 0.0 };
|
|
|
|
vertices[1] = (GskVulkanVertex) { bounds.origin.x + bounds.size.width, bounds.origin.y, 1.0, 0.0 };
|
|
|
|
vertices[2] = (GskVulkanVertex) { bounds.origin.x, bounds.origin.y + bounds.size.height, 0.0, 1.0 };
|
|
|
|
vertices[3] = (GskVulkanVertex) { bounds.origin.x, bounds.origin.y + bounds.size.height, 0.0, 1.0 };
|
|
|
|
vertices[4] = (GskVulkanVertex) { bounds.origin.x + bounds.size.width, bounds.origin.y, 1.0, 0.0 };
|
|
|
|
vertices[5] = (GskVulkanVertex) { bounds.origin.x + bounds.size.width, bounds.origin.y + bounds.size.height, 1.0, 1.0 };
|
|
|
|
|
|
|
|
return 6;
|
|
|
|
}
|
|
|
|
|
|
|
|
gsize
|
|
|
|
gsk_vulkan_render_pass_collect_vertices (GskVulkanRenderPass *self,
|
|
|
|
GskVulkanVertex *vertices,
|
|
|
|
gsize offset,
|
|
|
|
gsize total)
|
|
|
|
{
|
2016-12-14 06:34:18 +00:00
|
|
|
GskVulkanOp *op;
|
2016-12-08 12:26:36 +00:00
|
|
|
gsize n;
|
|
|
|
guint i;
|
|
|
|
|
|
|
|
n = 0;
|
|
|
|
for (i = 0; i < self->render_ops->len; i++)
|
|
|
|
{
|
2016-12-14 06:34:18 +00:00
|
|
|
op = &g_array_index (self->render_ops, GskVulkanOp, i);
|
2016-12-08 12:26:36 +00:00
|
|
|
|
|
|
|
switch (op->type)
|
|
|
|
{
|
|
|
|
case GSK_VULKAN_OP_FALLBACK:
|
2016-12-09 04:59:19 +00:00
|
|
|
case GSK_VULKAN_OP_SURFACE:
|
|
|
|
case GSK_VULKAN_OP_TEXTURE:
|
2016-12-14 06:34:18 +00:00
|
|
|
op->render.vertex_offset = offset + n;
|
|
|
|
op->render.vertex_count = gsk_vulkan_render_op_collect_vertices (&op->render, vertices + n + offset);
|
2016-12-08 12:26:36 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
g_assert_not_reached ();
|
2016-12-14 06:21:21 +00:00
|
|
|
case GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS:
|
|
|
|
case GSK_VULKAN_OP_PUSH_FRAGMENT_CONSTANTS:
|
2016-12-14 06:34:18 +00:00
|
|
|
continue;
|
2016-12-08 12:26:36 +00:00
|
|
|
}
|
|
|
|
|
2016-12-14 06:34:18 +00:00
|
|
|
n += op->render.vertex_count;
|
2016-12-08 12:26:36 +00:00
|
|
|
g_assert (n + offset <= total);
|
|
|
|
}
|
|
|
|
|
|
|
|
return n;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2016-12-09 01:55:47 +00:00
|
|
|
gsk_vulkan_render_pass_reserve_descriptor_sets (GskVulkanRenderPass *self,
|
|
|
|
GskVulkanRender *render)
|
2016-12-08 12:26:36 +00:00
|
|
|
{
|
2016-12-14 06:34:18 +00:00
|
|
|
GskVulkanOp *op;
|
2016-12-08 12:26:36 +00:00
|
|
|
guint i;
|
|
|
|
|
|
|
|
for (i = 0; i < self->render_ops->len; i++)
|
|
|
|
{
|
2016-12-14 06:34:18 +00:00
|
|
|
op = &g_array_index (self->render_ops, GskVulkanOp, i);
|
2016-12-08 12:26:36 +00:00
|
|
|
|
2016-12-09 01:55:47 +00:00
|
|
|
switch (op->type)
|
|
|
|
{
|
|
|
|
case GSK_VULKAN_OP_FALLBACK:
|
2016-12-09 04:59:19 +00:00
|
|
|
case GSK_VULKAN_OP_SURFACE:
|
|
|
|
case GSK_VULKAN_OP_TEXTURE:
|
2016-12-14 06:34:18 +00:00
|
|
|
op->render.descriptor_set_index = gsk_vulkan_render_reserve_descriptor_set (render, op->render.source);
|
2016-12-09 01:55:47 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
g_assert_not_reached ();
|
2016-12-14 06:21:21 +00:00
|
|
|
case GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS:
|
|
|
|
case GSK_VULKAN_OP_PUSH_FRAGMENT_CONSTANTS:
|
2016-12-09 01:55:47 +00:00
|
|
|
break;
|
|
|
|
}
|
2016-12-08 12:26:36 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2016-12-09 04:53:04 +00:00
|
|
|
gsk_vulkan_render_pass_draw (GskVulkanRenderPass *self,
|
|
|
|
GskVulkanRender *render,
|
2016-12-14 07:00:58 +00:00
|
|
|
GskVulkanPipelineLayout *layout,
|
2016-12-09 04:53:04 +00:00
|
|
|
VkCommandBuffer command_buffer)
|
2016-12-08 12:26:36 +00:00
|
|
|
{
|
2016-12-14 06:34:18 +00:00
|
|
|
GskVulkanOp *op;
|
2016-12-08 12:26:36 +00:00
|
|
|
guint i;
|
|
|
|
|
|
|
|
for (i = 0; i < self->render_ops->len; i++)
|
|
|
|
{
|
2016-12-14 06:34:18 +00:00
|
|
|
op = &g_array_index (self->render_ops, GskVulkanOp, i);
|
2016-12-08 12:26:36 +00:00
|
|
|
|
2016-12-12 23:11:06 +00:00
|
|
|
switch (op->type)
|
|
|
|
{
|
|
|
|
case GSK_VULKAN_OP_FALLBACK:
|
|
|
|
case GSK_VULKAN_OP_SURFACE:
|
|
|
|
case GSK_VULKAN_OP_TEXTURE:
|
|
|
|
vkCmdBindDescriptorSets (command_buffer,
|
|
|
|
VK_PIPELINE_BIND_POINT_GRAPHICS,
|
2016-12-14 07:00:58 +00:00
|
|
|
gsk_vulkan_pipeline_layout_get_pipeline_layout (layout),
|
2016-12-12 23:11:06 +00:00
|
|
|
0,
|
|
|
|
1,
|
|
|
|
(VkDescriptorSet[1]) {
|
2016-12-14 06:34:18 +00:00
|
|
|
gsk_vulkan_render_get_descriptor_set (render, op->render.descriptor_set_index)
|
2016-12-12 23:11:06 +00:00
|
|
|
},
|
|
|
|
0,
|
|
|
|
NULL);
|
|
|
|
|
|
|
|
vkCmdDraw (command_buffer,
|
2016-12-14 06:34:18 +00:00
|
|
|
op->render.vertex_count, 1,
|
|
|
|
op->render.vertex_offset, 0);
|
2016-12-12 23:11:06 +00:00
|
|
|
break;
|
|
|
|
|
2016-12-14 06:21:21 +00:00
|
|
|
case GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS:
|
2016-12-14 06:34:18 +00:00
|
|
|
gsk_vulkan_push_constants_push_vertex (&op->constants.constants,
|
2016-12-14 06:21:21 +00:00
|
|
|
command_buffer,
|
2016-12-14 07:00:58 +00:00
|
|
|
gsk_vulkan_pipeline_layout_get_pipeline_layout (layout));
|
2016-12-14 06:21:21 +00:00
|
|
|
break;
|
2016-12-12 23:11:06 +00:00
|
|
|
|
2016-12-14 06:21:21 +00:00
|
|
|
case GSK_VULKAN_OP_PUSH_FRAGMENT_CONSTANTS:
|
2016-12-14 06:34:18 +00:00
|
|
|
gsk_vulkan_push_constants_push_fragment (&op->constants.constants,
|
2016-12-14 06:21:21 +00:00
|
|
|
command_buffer,
|
2016-12-14 07:00:58 +00:00
|
|
|
gsk_vulkan_pipeline_layout_get_pipeline_layout (layout));
|
2016-12-12 23:11:06 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
g_assert_not_reached ();
|
|
|
|
break;
|
|
|
|
}
|
2016-12-08 12:26:36 +00:00
|
|
|
}
|
|
|
|
}
|