diff --git a/base/vulkantools.cpp b/base/vulkantools.cpp index dce1d388..c0f1433c 100644 --- a/base/vulkantools.cpp +++ b/base/vulkantools.cpp @@ -307,37 +307,35 @@ namespace vkTools #else VkShaderModule loadShader(const char *fileName, VkDevice device, VkShaderStageFlagBits stage) { - size_t size; + std::ifstream is(fileName, std::ios::binary | std::ios::in | std::ios::ate); - FILE *fp = fopen(fileName, "rb"); - assert(fp); + if (is.is_open()) + { + size_t size = is.tellg(); + is.seekg(0, std::ios::beg); + char* shaderCode = new char[size]; + is.read(shaderCode, size); + is.close(); - fseek(fp, 0L, SEEK_END); - size = ftell(fp); + assert(size > 0); - fseek(fp, 0L, SEEK_SET); + VkShaderModule shaderModule; + VkShaderModuleCreateInfo moduleCreateInfo{}; + moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; + moduleCreateInfo.codeSize = size; + moduleCreateInfo.pCode = (uint32_t*)shaderCode; - //shaderCode = malloc(size); - char *shaderCode = new char[size]; - size_t retval = fread(shaderCode, size, 1, fp); - assert(retval == 1); - assert(size > 0); + VK_CHECK_RESULT(vkCreateShaderModule(device, &moduleCreateInfo, NULL, &shaderModule)); - fclose(fp); + delete[] shaderCode; - VkShaderModule shaderModule; - VkShaderModuleCreateInfo moduleCreateInfo; - moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; - moduleCreateInfo.pNext = NULL; - moduleCreateInfo.codeSize = size; - moduleCreateInfo.pCode = (uint32_t*)shaderCode; - moduleCreateInfo.flags = 0; - - VK_CHECK_RESULT(vkCreateShaderModule(device, &moduleCreateInfo, NULL, &shaderModule)); - - delete[] shaderCode; - - return shaderModule; + return shaderModule; + } + else + { + std::cerr << "Error: Could not open shader file \"" << fileName << "\"" << std::endl; + return nullptr; + } } #endif diff --git a/base/vulkantools.h b/base/vulkantools.h index 1fde5087..1a800e19 100644 --- a/base/vulkantools.h +++ b/base/vulkantools.h @@ -80,21 +80,16 @@ namespace vkTools // Display error message and exit on fatal error void exitFatal(std::string message, std::string caption); - // Load a text file (e.g. GLGL shader) into a std::string - std::string readTextFile(const char *fileName); - // Load a binary file into a buffer (e.g. SPIR-V) - char *readBinaryFile(const char *filename, size_t *psize); - // Load a SPIR-V shader + // @brief Load a SPIR-V shader (binary) #if defined(__ANDROID__) VkShaderModule loadShader(AAssetManager* assetManager, const char *fileName, VkDevice device, VkShaderStageFlagBits stage); #else VkShaderModule loadShader(const char *fileName, VkDevice device, VkShaderStageFlagBits stage); #endif - // Load a GLSL shader - // Note : Only for testing purposes, support for directly feeding GLSL shaders into Vulkan - // may be dropped at some point + // Load a GLSL shader (text) + // Note: GLSL support requires vendor-specific extensions to be enabled and is not a core-feature of Vulkan VkShaderModule loadShaderGLSL(const char *fileName, VkDevice device, VkShaderStageFlagBits stage); // Returns a pre-present image memory barrier