[gtk+/wip/otte/vulkan: 24/28] vulkan: Push the correct matrix when drawing



commit 23072f6b8a78968f6a4e33543fccc8c800d34a4e
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]