pipeline generator additions
authorEleni Maria Stea <estea@igalia.com>
Mon, 2 Apr 2018 19:58:19 +0000 (22:58 +0300)
committerEleni Maria Stea <estea@igalia.com>
Mon, 2 Apr 2018 20:24:08 +0000 (23:24 +0300)
src/vulkan/vkutil-pipeline.cc
src/vulkan/vkutil-pipeline.h
src/vulkan/vkutil.cc

index bc542ff..1d2620d 100644 (file)
@@ -12,9 +12,6 @@ VkuPipelineGenerator::VkuPipelineGenerator()
        sdri[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
        sdri[1].stage = VK_SHADER_STAGE_FRAGMENT_BIT;
 
-       memset(&verti, 0, sizeof verti);
-       verti.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
-
        memset(&asmi, 0, sizeof asmi);
        asmi.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
        asmi.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
@@ -71,6 +68,31 @@ VkPipeline VkuPipelineGenerator::generate(VkuDynState dyn_flags) const
        dyni.dynamicStateCount = dyn_states.size();
        dyni.pDynamicStates = dyn_states.data();
 
+       VkPipelineVertexInputStateCreateInfo verti;
+       memset(&verti, 0, sizeof verti);
+       verti.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
+       verti.vertexBindingDescriptionCount = bind_descriptions.size();
+       verti.pVertexBindingDescriptions = bind_descriptions.data();
+       verti.vertexAttributeDescriptionCount = attr_descriptions.size();
+       verti.pVertexAttributeDescriptions = attr_descriptions.data();
+
+       VkPipelineLayoutCreateInfo linf;
+       memset(&linf, 0, sizeof linf);
+       linf.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
+       linf.setLayoutCount = dset_layouts.size();
+       linf.pSetLayouts = dset_layouts.data();
+       //TODO find max num dsets vkGetPhysicalDeviceProperties
+       //maxBoundDescriptorSets of VkPhysicalDeviceLimits
+       linf.pushConstantRangeCount = push_const_ranges.size();
+       linf.pPushConstantRanges = push_const_ranges.data();
+       //maxPushConstantsSize from VkPhysicalDeviceLimits
+
+       VkPipelineLayout layout;
+       if(vkCreatePipelineLayout(vk_device, &linf, 0, &layout) != VK_SUCCESS) {
+               fprintf(stderr, "Failed to create pipeline layout.\n");
+               return 0;
+       }
+
        VkGraphicsPipelineCreateInfo gpinf;
        memset(&gpinf, 0, sizeof gpinf);
        gpinf.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
@@ -113,6 +135,24 @@ void VkuPipelineGenerator::set_shader_modules(VkShaderModule vs,
        sdri[1].module = fs;
 }
 
-void VkuPipelineGenerator::set_vertex_attributes()
+void VkuPipelineGenerator::set_attribute(uint32_t binding, uint32_t stride,
+               uint32_t location, VkFormat format)
+{
+       VkVertexInputBindingDescription bdsc;
+       bdsc.binding = binding;
+       bdsc.stride = stride;
+       bdsc.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
+
+       bind_descriptions.push_back(bdsc);
+
+       VkVertexInputAttributeDescription adsc;
+       memset(&adsc, 0, sizeof adsc);
+       adsc.location = location;
+       adsc.binding = binding;
+       adsc.format = format;
+}
+
+void VkuPipelineGenerator::set_descriptor_set_layout(const vku_descriptor &desc)
 {
+       dset_layouts.push_back(desc.layout);
 }
index 4dac9af..9f8a266 100644 (file)
@@ -3,6 +3,16 @@
 
 #include <vulkan/vulkan.h>
 
+#define VERTEX_ATTRIB_BIT (1 << VKU_BIND_VERTEX)
+#define NORMAL_ATTRIB_BIT (1 << VKU_BIND_NORMAL)
+#define TEX_COORD_ATTRIB_BIT (1 << VKU_BIND_TEX_COORD)
+
+enum VkuVertexBindings {
+       VKU_BIND_VERTEX,
+       VKU_BIND_NORMAL,
+       VKU_BIND_TEX_COORD
+};
+
 enum VkuDynState {
        VKU_DS_VIEWPORT = 1 << 0,
        VKU_DS_SCISSOR  = 1 << 1,
@@ -12,7 +22,6 @@ enum VkuDynState {
 class VkuPipelineGenerator {
 private:
        VkPipelineShaderStageCreateInfo sdri[2];
-       VkPipelineVertexInputStateCreateInfo verti;
        VkPipelineInputAssemblyStateCreateInfo asmi;
        VkPipelineViewportStateCreateInfo viewpi;
        VkPipelineRasterizationStateCreateInfo rasti;
@@ -20,7 +29,13 @@ private:
        VkPipelineDepthStencilStateCreateInfo depthi;
        VkPipelineColorBlendStateCreateInfo cblendi;
 
-       VkPipelineLayout layout;
+       /* attributes */
+       std::vector<VkVertexInputBindingDescription> bind_descriptions;
+       std::vector<VkVertexInputAttributeDescription> attr_descriptions;
+
+       /* uniforms */
+       std::vector<VkDescriptorSetLayout> dset_layouts;
+       std::vector<VkPushConstantRange> push_const_ranges;
 
 public:
        VkuPipelineGenerator();
@@ -29,11 +44,11 @@ public:
        VkPipeline generate(VkuDynState dyn_flags) const;
 
        void set_shader_modules(VkShaderModule vs, VkShaderModule fs);
+       void set_attribute(uint32_t binding, uint32_t stride, uint32_t location,
+                       VkFormat format);
+       void set_descriptor_set_layout(const vku_descriptor &desc);
 
-       // TODO
-       void set_vertex_attributes();
-       void set_blend_state();
-       void set_layout();
+       void set_push_constant(); //TODO
 };
 
 #endif // VKUTIL_PIPELINE_H_
index 1a33fa7..4622819 100644 (file)
@@ -428,11 +428,7 @@ struct vku_buffer *vku_create_buffer(int sz, unsigned int usage)
 void vku_destroy_buffer(struct vku_buffer *buf)
 {
        if(buf) {
-               //TODO change when the allocator changes
-               vku_free(buf->mem_pool);
-
                vkDestroyBuffer(vk_device, buf->buf, 0);
-               delete buf;
        }
 }