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;
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;
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);
}
#include <vulkan/vulkan.h>
+#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,
class VkuPipelineGenerator {
private:
VkPipelineShaderStageCreateInfo sdri[2];
- VkPipelineVertexInputStateCreateInfo verti;
VkPipelineInputAssemblyStateCreateInfo asmi;
VkPipelineViewportStateCreateInfo viewpi;
VkPipelineRasterizationStateCreateInfo rasti;
VkPipelineDepthStencilStateCreateInfo depthi;
VkPipelineColorBlendStateCreateInfo cblendi;
- VkPipelineLayout layout;
+ /* attributes */
+ std::vector<VkVertexInputBindingDescription> bind_descriptions;
+ std::vector<VkVertexInputAttributeDescription> attr_descriptions;
+
+ /* uniforms */
+ std::vector<VkDescriptorSetLayout> dset_layouts;
+ std::vector<VkPushConstantRange> push_const_ranges;
public:
VkuPipelineGenerator();
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_