[gtk+/wip/otte/vulkan: 58/62] vulkan: Push the correct matrix when drawing
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/otte/vulkan: 58/62] vulkan: Push the correct matrix when drawing
- Date: Fri, 9 Dec 2016 17:39:49 +0000 (UTC)
commit cf470f31ca5562413502201381f2dfee48ddec71
Author: Benjamin Otte <otte redhat com>
Date: Fri Dec 9 05:53:04 2016 +0100
vulkan: Push the correct matrix when drawing
Instead of pushing the root matrix, push the world matrix for the
current node. That way, the bounds we emit as vertices are actually
properly transformed.
gsk/gskvulkanrender.c | 9 +--------
gsk/gskvulkanrenderpass.c | 22 ++++++++++++++++++----
gsk/gskvulkanrenderpassprivate.h | 1 +
3 files changed, 20 insertions(+), 12 deletions(-)
---
diff --git a/gsk/gskvulkanrender.c b/gsk/gskvulkanrender.c
index 626f638..12b390d 100644
--- a/gsk/gskvulkanrender.c
+++ b/gsk/gskvulkanrender.c
@@ -437,16 +437,9 @@ gsk_vulkan_render_draw (GskVulkanRender *self,
},
(VkDeviceSize[1]) { 0 });
- vkCmdPushConstants (self->command_buffer,
- gsk_vulkan_pipeline_get_pipeline_layout (self->pipeline),
- VK_SHADER_STAGE_VERTEX_BIT,
- 0,
- sizeof (graphene_matrix_t),
- &self->mvp);
-
for (l = self->render_passes; l; l = l->next)
{
- gsk_vulkan_render_pass_draw (l->data, self, self->pipeline, self->command_buffer);
+ gsk_vulkan_render_pass_draw (l->data, self, &self->mvp, self->pipeline, self->command_buffer);
}
vkCmdEndRenderPass (self->command_buffer);
diff --git a/gsk/gskvulkanrenderpass.c b/gsk/gskvulkanrenderpass.c
index 60deacc..d9582ca 100644
--- a/gsk/gskvulkanrenderpass.c
+++ b/gsk/gskvulkanrenderpass.c
@@ -211,12 +211,15 @@ gsk_vulkan_render_pass_reserve_descriptor_sets (GskVulkanRenderPass *self,
}
void
-gsk_vulkan_render_pass_draw (GskVulkanRenderPass *self,
- GskVulkanRender *render,
- GskVulkanPipeline *pipeline,
- VkCommandBuffer command_buffer)
+gsk_vulkan_render_pass_draw (GskVulkanRenderPass *self,
+ GskVulkanRender *render,
+ const graphene_matrix_t *root_mvp,
+ GskVulkanPipeline *pipeline,
+ VkCommandBuffer command_buffer)
{
GskVulkanRenderOp *op;
+ graphene_matrix_t world, mvp;
+ float float_matrix[16];
guint i;
for (i = 0; i < self->render_ops->len; i++)
@@ -234,6 +237,17 @@ gsk_vulkan_render_pass_draw (GskVulkanRenderPass *self,
0,
NULL);
+ gsk_render_node_get_world_matrix (op->node, &world);
+ graphene_matrix_multiply (&world, root_mvp, &mvp);
+ graphene_matrix_to_float (&mvp, float_matrix);
+
+ vkCmdPushConstants (command_buffer,
+ gsk_vulkan_pipeline_get_pipeline_layout (pipeline),
+ VK_SHADER_STAGE_VERTEX_BIT,
+ 0,
+ sizeof (float_matrix),
+ &float_matrix);
+
vkCmdDraw (command_buffer,
op->vertex_count, 1,
op->vertex_offset, 0);
diff --git a/gsk/gskvulkanrenderpassprivate.h b/gsk/gskvulkanrenderpassprivate.h
index a5eae77..1cc826d 100644
--- a/gsk/gskvulkanrenderpassprivate.h
+++ b/gsk/gskvulkanrenderpassprivate.h
@@ -31,6 +31,7 @@ void gsk_vulkan_render_pass_reserve_descriptor_sets (GskVulk
GskVulkanRender *render);
void gsk_vulkan_render_pass_draw (GskVulkanRenderPass *self,
GskVulkanRender *render,
+ const graphene_matrix_t*root_mvp,
GskVulkanPipeline *pipeline,
VkCommandBuffer
command_buffer);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]