summaryrefslogtreecommitdiff
path: root/gsk/gskvulkanpushconstants.c
blob: 2b119fc25d4b810bc91e8ab0f76d8c91c09bc0dc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include "config.h"

#include "gskvulkanpushconstantsprivate.h"

#include <math.h>

void
gsk_vulkan_push_constants_init (GskVulkanPushConstants  *constants,
                                const graphene_matrix_t *mvp)
{
  gsk_vulkan_push_constants_set_mvp (constants, mvp);
}

void
gsk_vulkan_push_constants_init_copy (GskVulkanPushConstants       *self,
                                     const GskVulkanPushConstants *src)
{
  *self = *src;
}

void
gsk_vulkan_push_constants_set_mvp (GskVulkanPushConstants  *self,
                                   const graphene_matrix_t *mvp)
{
  graphene_matrix_to_float (mvp, self->vertex.mvp);
}

void
gsk_vulkan_push_constants_multiply_mvp (GskVulkanPushConstants  *self,
                                        const graphene_matrix_t *transform)
{
  graphene_matrix_t old_mvp, new_mvp;

  graphene_matrix_init_from_float (&old_mvp, self->vertex.mvp);
  graphene_matrix_multiply (transform, &old_mvp, &new_mvp);
  gsk_vulkan_push_constants_set_mvp (self, &new_mvp);
}

void
gsk_vulkan_push_constants_push_vertex (GskVulkanPushConstants *self,
                                       VkCommandBuffer         command_buffer,
                                       VkPipelineLayout        pipeline_layout)
{
  vkCmdPushConstants (command_buffer,
                      pipeline_layout,
                      VK_SHADER_STAGE_VERTEX_BIT,
                      G_STRUCT_OFFSET (GskVulkanPushConstants, vertex),
                      sizeof (self->vertex),
                      &self->vertex);
}

#if 0
void
gsk_vulkan_push_constants_push_fragment (GskVulkanPushConstants *self,
                                         VkCommandBuffer         command_buffer,
                                         VkPipelineLayout        pipeline_layout)
{
  vkCmdPushConstants (command_buffer,
                      pipeline_layout,
                      VK_SHADER_STAGE_FRAGMENT_BIT,
                      G_STRUCT_OFFSET (GskVulkanPushConstants, fragment),
                      sizeof (self->fragment),
                      &self->fragment);
}
#endif

uint32_t
gst_vulkan_push_constants_get_range_count (void)
{
  return 2;
}

const VkPushConstantRange *
gst_vulkan_push_constants_get_ranges (void)
{
  static const VkPushConstantRange ranges[2] = {
      {
          .stageFlags = VK_SHADER_STAGE_VERTEX_BIT,
          .offset = G_STRUCT_OFFSET (GskVulkanPushConstants, vertex),
          .size = sizeof (((GskVulkanPushConstants *) 0)->vertex)
#if 0
      },
      {
          .stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT,
          .offset = G_STRUCT_OFFSET (GskVulkanPushConstants, fragment),
          .size = sizeof (((GskVulkanPushConstants *) 0)->fragment)
#endif
      }
  };

  return ranges;
}