#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); assert(shaderFile.is_open()); // std::ios::ate starts at the end of file => position is the file size const std::fpos &fileSize = shaderFile.tellg(); std::vector buffer(fileSize); shaderFile.seekg(0); shaderFile.read(buffer.data(), fileSize); shaderFile.close(); VkShaderModuleCreateInfo createInfo{}; createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; createInfo.codeSize = buffer.size(); createInfo.pCode = reinterpret_cast(buffer.data()); VkShaderModule shaderModule; VkResult result = deviceFunctions->vkCreateShaderModule( device, &createInfo, nullptr, &shaderModule); assert(result == VK_SUCCESS); loadedShaders.push_back(shaderModule); } return loadedShaders; } void ShaderLoader::destroyShaders(VkDevice device, QVulkanDeviceFunctions *devFuncs) { for (auto &shaderModule : loadedShaders) { devFuncs->vkDestroyShaderModule(device, shaderModule, nullptr); } }