Changed the OpenGL part and the GLSL shaders to use UBO and
[demo] / src / vulkan / shader-vk.cc
1 #include "vkutil.h"
2 #include "shader-vk.h"
3
4 /* static variables */
5 ShaderVK::ShaderVK()
6 {
7 }
8
9 ShaderVK::~ShaderVK()
10 {
11         destroy();
12 }
13
14 bool ShaderVK::load(const char *fname, SType type)
15 {
16         char *vk_fname = new char[strlen(fname) + strlen(".spirv") + 1];
17         strcpy(vk_fname, fname);
18
19         char *suffix = strrchr(vk_fname, '.');
20
21         if(suffix) {
22                 *suffix = 0;
23         }
24
25         strcat(vk_fname, ".spirv");
26
27         bool res = Shader::load(vk_fname, type);
28         delete [] vk_fname;
29
30         return res;
31 }
32
33 bool ShaderVK::create(char *buf, unsigned int bsz, const char *fname)
34 {
35         name = std::string(fname);
36
37         VkShaderModuleCreateInfo sminf;
38         memset(&sminf, 0, sizeof sminf);
39         sminf.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
40
41         sminf.codeSize = bsz;
42         sminf.pCode = (uint32_t *)buf;
43
44         if(vkCreateShaderModule(vk_device, &sminf, 0, &sm) != VK_SUCCESS) {
45                 delete [] buf;
46
47                 fprintf(stderr, "Failed to create vertex shader module.\n");
48                 return false;
49         }
50
51         delete [] buf;
52         return true;
53 }
54
55 void ShaderVK::destroy()
56 {
57         vkDestroyShaderModule(vk_device, sm, 0);
58 }
59
60 ShaderProgramVK::ShaderProgramVK()
61 {
62 }
63
64 ShaderProgramVK::~ShaderProgramVK()
65 {
66 }
67
68 bool ShaderProgramVK::create()
69 {
70         /* pipeline cache */
71         VkPipelineCacheCreateInfo pcinf;
72         memset(&pcinf, 0, sizeof pcinf);
73         pcinf.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
74
75         VkPipelineCache pcache;
76         if(!vkCreatePipelineCache(vk_device, &pcinf, 0, &pcache) != VK_SUCCESS) {
77                 fprintf(stderr, "Failed to create pipeline cache.\n");
78                 return false;
79         }
80
81         /* pipeline */
82         VkGraphicsPipelineCreateInfo gpinf;
83         memset(&gpinf, 0, sizeof gpinf);
84         gpinf.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
85         gpinf.stageCount = 2;
86
87         VkPipelineShaderStageCreateInfo ssinf[2];
88         for(int i=0; i<2; i++) {
89                 memset(&ssinf[i], 0, sizeof ssinf[i]);
90                 ssinf[i].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
91
92                 switch(shaders[i]->get_type()) {
93                 case SDR_VERTEX:
94                         ssinf[i].stage = VK_SHADER_STAGE_VERTEX_BIT;
95                         break;
96                 case SDR_FRAGMENT:
97                         ssinf[i].stage = VK_SHADER_STAGE_FRAGMENT_BIT;
98                         break;
99                 default:
100                         fprintf(stderr, "Failed to create graphics pipeline: Invalid shader type.\n");
101                         return false;
102                 }
103                 ssinf[i].module = ((ShaderVK *)shaders[i])->sm;
104         }
105
106         gpinf.pStages = ssinf;
107
108         return true;
109 }
110
111 bool ShaderProgramVK::link()
112 {
113         return true;
114 }
115
116 bool ShaderProgramVK::use() const
117 {
118         return true;
119 }
120
121 void ShaderProgramVK::destroy()
122 {
123 }
124
125 void ShaderProgramVK::attach_shader(Shader *shader)
126 {
127 }