pipeline generator additions
[demo] / src / vulkan / vkutil-pipeline.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);
 }