fixes
[demo] / src / vulkan / vkutil-pipeline.cc
index bc542ff..44cf5d6 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;
@@ -49,9 +46,13 @@ VkuPipelineGenerator::VkuPipelineGenerator()
 
 VkuPipelineGenerator::~VkuPipelineGenerator()
 {
+       for(size_t i=0; i<res_layouts.size(); i++) {
+               vkDestroyDescriptorSetLayout(vk_device, res_layouts[i], 0);
+       }
+       vkDestroyPipelineLayout(vk_device, layout, 0);
 }
 
-VkPipeline VkuPipelineGenerator::generate(VkuDynState dyn_flags) const
+VkPipeline VkuPipelineGenerator::generate(VkuDynState dyn_flags)
 {
        VkPipelineDynamicStateCreateInfo dyni;
        memset(&dyni, 0, sizeof dyni);
@@ -71,6 +72,30 @@ 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 = res_layouts.size();
+       linf.pSetLayouts = res_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
+
+       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;
@@ -98,7 +123,7 @@ VkPipeline VkuPipelineGenerator::generate(VkuDynState dyn_flags) const
 
        VkPipeline gpipeline;
        if(vkCreateGraphicsPipelines(vk_device, pcache, 1, &gpinf, 0, &gpipeline) !=
-                       VK_SUCCESS) {
+               VK_SUCCESS) {
                fprintf(stderr, "Failed to create graphics pipeline.\n");
                return 0;
        }
@@ -107,12 +132,30 @@ VkPipeline VkuPipelineGenerator::generate(VkuDynState dyn_flags) const
 }
 
 void VkuPipelineGenerator::set_shader_modules(VkShaderModule vs,
-               VkShaderModule fs)
+        VkShaderModule fs)
 {
        sdri[0].module = 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_resources_layout(VkDescriptorSetLayout layout)
 {
+       res_layouts.push_back(layout);
 }