5 #include "vkutil-pipeline.h"
7 VkuPipelineGenerator::VkuPipelineGenerator()
9 memset(sdri, 0, sizeof sdri);
10 sdri[0].sType = sdri[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
11 sdri[0].pName = sdri[1].pName = "main";
12 sdri[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
13 sdri[1].stage = VK_SHADER_STAGE_FRAGMENT_BIT;
15 memset(&verti, 0, sizeof verti);
16 verti.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
18 memset(&asmi, 0, sizeof asmi);
19 asmi.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
20 asmi.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
22 VkViewport viewport = {0, 0, 0, 0};
23 VkRect2D scissor = {0, 0};
24 memset(&viewpi, 0, sizeof viewpi);
25 viewpi.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
26 viewpi.viewportCount = 1;
27 viewpi.pViewports = &viewport;
28 viewpi.scissorCount = 1;
29 viewpi.pScissors = &scissor;
31 memset(&rasti, 0, sizeof rasti);
32 rasti.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
33 rasti.polygonMode = VK_POLYGON_MODE_FILL;
34 rasti.cullMode = VK_CULL_MODE_BACK_BIT;
35 rasti.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
37 memset(&multi, 0, sizeof multi);
38 multi.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
40 memset(&depthi, 0, sizeof depthi);
41 depthi.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
42 depthi.depthTestEnable = VK_TRUE;
43 depthi.depthWriteEnable = VK_TRUE;
44 depthi.depthCompareOp = VK_COMPARE_OP_LESS;
46 memset(&cblendi, 0, sizeof cblendi);
47 cblendi.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
50 VkuPipelineGenerator::~VkuPipelineGenerator()
54 VkPipeline VkuPipelineGenerator::generate(VkuDynState dyn_flags) const
56 VkPipelineDynamicStateCreateInfo dyni;
57 memset(&dyni, 0, sizeof dyni);
58 dyni.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
60 std::vector<VkDynamicState> dyn_states;
61 if(dyn_flags & VKU_DS_VIEWPORT) {
62 dyn_states.push_back(VK_DYNAMIC_STATE_VIEWPORT);
64 if(dyn_flags & VKU_DS_SCISSOR) {
65 dyn_states.push_back(VK_DYNAMIC_STATE_SCISSOR);
67 if(dyn_flags & VKU_DS_BLEND) {
68 dyn_states.push_back(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
71 dyni.dynamicStateCount = dyn_states.size();
72 dyni.pDynamicStates = dyn_states.data();
74 VkGraphicsPipelineCreateInfo gpinf;
75 memset(&gpinf, 0, sizeof gpinf);
76 gpinf.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
79 gpinf.pVertexInputState = &verti;
80 gpinf.pInputAssemblyState = &asmi;
81 gpinf.pViewportState = &viewpi;
82 gpinf.pMultisampleState = &multi;
83 gpinf.pDepthStencilState = &depthi;
84 gpinf.pColorBlendState = &cblendi;
85 gpinf.pDynamicState = &dyni;
86 gpinf.layout = layout;
87 gpinf.renderPass = vk_renderpass;
89 VkPipelineCacheCreateInfo pcinf;
90 memset(&pcinf, 0, sizeof pcinf);
91 pcinf.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
93 VkPipelineCache pcache;
94 if(vkCreatePipelineCache(vk_device, &pcinf, 0, &pcache) != VK_SUCCESS) {
95 fprintf(stderr, "Failed to create cache for pipeline.\n");
100 if(vkCreateGraphicsPipelines(vk_device, pcache, 1, &gpinf, 0, &gpipeline) !=
102 fprintf(stderr, "Failed to create graphics pipeline.\n");
109 void VkuPipelineGenerator::set_shader_modules(VkShaderModule vs,
116 void VkuPipelineGenerator::set_vertex_attributes()