From: Eleni Maria Stea Date: Mon, 2 Apr 2018 19:58:19 +0000 (+0300) Subject: pipeline generator additions X-Git-Url: https://eleni.mutantstargoat.com/git/?p=demo;a=commitdiff_plain;h=75b8713addd14a845e2fa8ad9a9d3d4a6a323bec pipeline generator additions --- diff --git a/src/vulkan/vkutil-pipeline.cc b/src/vulkan/vkutil-pipeline.cc index bc542ff..1d2620d 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 = 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); } diff --git a/src/vulkan/vkutil-pipeline.h b/src/vulkan/vkutil-pipeline.h index 4dac9af..9f8a266 100644 --- a/src/vulkan/vkutil-pipeline.h +++ b/src/vulkan/vkutil-pipeline.h @@ -3,6 +3,16 @@ #include +#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 bind_descriptions; + std::vector attr_descriptions; + + /* uniforms */ + std::vector dset_layouts; + std::vector 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_ diff --git a/src/vulkan/vkutil.cc b/src/vulkan/vkutil.cc index 1a33fa7..4622819 100644 --- a/src/vulkan/vkutil.cc +++ b/src/vulkan/vkutil.cc @@ -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; } }