#include "shader-vk.h"
/* static variables */
-static vku_buffer ubo;
-
ShaderVK::ShaderVK()
{
}
destroy();
}
-bool ShaderVK::create(char *buf, unsigned int bsz, const char *fname)
+bool ShaderVK::load(const char *fname, SType type)
{
- return true;
+ char *vk_fname = new char[strlen(fname) + strlen(".spirv") + 1];
+ strcpy(vk_fname, fname);
+
+ char *suffix = strrchr(vk_fname, '.');
+
+ if(suffix) {
+ *suffix = 0;
+ }
+
+ strcat(vk_fname, ".spirv");
+
+ bool res = Shader::load(vk_fname, type);
+ delete [] vk_fname;
+
+ return res;
}
-bool ShaderVK::load(const char *fname, SType type)
+bool ShaderVK::create(char *buf, unsigned int bsz, const char *fname)
{
+ name = std::string(fname);
+
+ VkShaderModuleCreateInfo sminf;
+ memset(&sminf, 0, sizeof sminf);
+ sminf.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
+
+ sminf.codeSize = bsz;
+ sminf.pCode = (uint32_t*)buf;
+
+ if(vkCreateShaderModule(vk_device, &sminf, 0, &sm) != VK_SUCCESS) {
+ delete [] buf;
+
+ fprintf(stderr, "Failed to create vertex shader module.\n");
+ return false;
+ }
+
+ delete [] buf;
return true;
}
void ShaderVK::destroy()
{
+ vkDestroyShaderModule(vk_device, sm, 0);
}
ShaderProgramVK::ShaderProgramVK()
bool ShaderProgramVK::create()
{
+ /* pipeline cache */
+ VkPipelineCacheCreateInfo pcinf;
+ memset(&pcinf, 0, sizeof pcinf);
+ pcinf.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
+
+ VkPipelineCache pcache;
+ if(!vkCreatePipelineCache(vk_device, &pcinf, 0, &pcache) != VK_SUCCESS) {
+ fprintf(stderr, "Failed to create pipeline cache.\n");
+ return false;
+ }
+
+ /* pipeline */
+ VkGraphicsPipelineCreateInfo gpinf;
+ memset(&gpinf, 0, sizeof gpinf);
+ gpinf.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
+ gpinf.stageCount = 2;
+
+ VkPipelineShaderStageCreateInfo ssinf[2];
+ for(int i=0; i<2; i++) {
+ memset(&ssinf[i], 0, sizeof ssinf[i]);
+ ssinf[i].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
+
+ switch(shaders[i]->get_type()) {
+ case SDR_VERTEX:
+ ssinf[i].stage = VK_SHADER_STAGE_VERTEX_BIT;
+ break;
+ case SDR_FRAGMENT:
+ ssinf[i].stage = VK_SHADER_STAGE_FRAGMENT_BIT;
+ break;
+ default:
+ fprintf(stderr, "Failed to create graphics pipeline: Invalid shader type.\n");
+ return false;
+ }
+ ssinf[i].module = ((ShaderVK*)shaders[i])->sm;
+ }
+
+ gpinf.pStages = ssinf;
+
return true;
}
void ShaderProgramVK::set_uniform_matrix(int location, const Mat4 &mat)
{
-}
\ No newline at end of file
+}