backup
[demo] / src / vulkan / vkutil-pipeline.cc
1 #include <stdio.h>
2 #include <string.h>
3
4 #include "vkutil.h"
5 #include "vkutil-pipeline.h"
6
7 VkuPipelineGenerator::VkuPipelineGenerator()
8 {
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;
14
15         memset(&verti, 0, sizeof verti);
16         verti.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
17
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;
21
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;
30
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;
36
37         memset(&multi, 0, sizeof multi);
38         multi.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
39
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;
45
46         memset(&cblendi, 0, sizeof cblendi);
47         cblendi.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
48 }
49
50 VkuPipelineGenerator::~VkuPipelineGenerator()
51 {
52 }
53
54 VkPipeline VkuPipelineGenerator::generate(VkuDynState dyn_flags) const
55 {
56         VkPipelineDynamicStateCreateInfo dyni;
57         memset(&dyni, 0, sizeof dyni);
58         dyni.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
59
60         std::vector<VkDynamicState> dyn_states;
61         if(dyn_flags & VKU_DS_VIEWPORT) {
62                 dyn_states.push_back(VK_DYNAMIC_STATE_VIEWPORT);
63         }
64         if(dyn_flags & VKU_DS_SCISSOR) {
65                 dyn_states.push_back(VK_DYNAMIC_STATE_SCISSOR);
66         }
67         if(dyn_flags & VKU_DS_BLEND) {
68                 dyn_states.push_back(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
69         }
70
71         dyni.dynamicStateCount = dyn_states.size();
72         dyni.pDynamicStates = dyn_states.data();
73
74         VkGraphicsPipelineCreateInfo gpinf;
75         memset(&gpinf, 0, sizeof gpinf);
76         gpinf.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
77         gpinf.stageCount = 2;
78         gpinf.pStages = sdri;
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;
88
89         VkPipelineCacheCreateInfo pcinf;
90         memset(&pcinf, 0, sizeof pcinf);
91         pcinf.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
92
93         VkPipelineCache pcache;
94         if(vkCreatePipelineCache(vk_device, &pcinf, 0, &pcache) != VK_SUCCESS) {
95                 fprintf(stderr, "Failed to create cache for pipeline.\n");
96                 return 0;
97         }
98
99         VkPipeline gpipeline;
100         if(vkCreateGraphicsPipelines(vk_device, pcache, 1, &gpinf, 0, &gpipeline) !=
101                         VK_SUCCESS) {
102                 fprintf(stderr, "Failed to create graphics pipeline.\n");
103                 return 0;
104         }
105
106         return gpipeline;
107 }
108
109 void VkuPipelineGenerator::set_shader_modules(VkShaderModule vs,
110                 VkShaderModule fs)
111 {
112         sdri[0].module = vs;
113         sdri[1].module = fs;
114 }
115
116 void VkuPipelineGenerator::set_vertex_attributes()
117 {
118 }