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;
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);
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;
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;
}
}
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);
}