X-Git-Url: http://git.mutantstargoat.com?a=blobdiff_plain;f=src%2Fvulkan%2Fvkutil-pipeline.cc;h=4be1d2266ee7498c8fe357b4f00810ac1809bca2;hb=f6ceb163227d00d7f97df1fc2dfbdd419c56277e;hp=bc542ff6662b84922a931a17bca84cb980df9000;hpb=dbce2a319517c09fcf1a9be60ae46a0ff20c423e;p=demo diff --git a/src/vulkan/vkutil-pipeline.cc b/src/vulkan/vkutil-pipeline.cc index bc542ff..4be1d22 100644 --- a/src/vulkan/vkutil-pipeline.cc +++ b/src/vulkan/vkutil-pipeline.cc @@ -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 = 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 + + 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; @@ -98,7 +120,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 +129,25 @@ 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; }