#include "ShaderLoader.h" #include std::vector ShaderLoader::loadShaders( VkDevice device, QVulkanDeviceFunctions *deviceFunctions, std::string const *shaderFilenames, std::size_t shaderFilenameCount) { loadedShaders.reserve(loadedShaders.size() + shaderFilenameCount); for (int i = 0; i < shaderFilenameCount; ++i) { std::ifstream shaderFile(shaderFilenames[i], std::ios::ate | std::ios::binary); if (!shaderFile.is_open()) { qFatal("Could not open shader file %s", shaderFilenames[i].c_str()); } // std::ios::ate starts at the end of file => position is the file size const std::fpos &fileSize = shaderFile.tellg(); std::vector buffer((fileSize / sizeof(uint32_t)) + 1); shaderFile.seekg(0); shaderFile.read(reinterpret_cast(buffer.data()), fileSize); shaderFile.close(); VkShaderModuleCreateInfo createInfo{}; createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; createInfo.codeSize = fileSize; createInfo.pCode = buffer.data(); VkShaderModule shaderModule; VkResult result = deviceFunctions->vkCreateShaderModule( device, &createInfo, nullptr, &shaderModule); if (result != VK_SUCCESS) { qFatal("Could not create shader module: code %d", result); } loadedShaders.push_back(shaderModule); } return loadedShaders; } void ShaderLoader::destroyShaders(VkDevice device, QVulkanDeviceFunctions *devFuncs) { for (auto &shaderModule : loadedShaders) { devFuncs->vkDestroyShaderModule(device, shaderModule, nullptr); } }