cpp-vulkan-setup/src/ShaderLoader.cpp

38 lines
1.5 KiB
C++

#include "ShaderLoader.h"
#include <fstream>
std::vector<VkShaderModule> 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<mbstate_t> &fileSize = shaderFile.tellg();
std::vector<char> 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<const uint32_t *>(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);
}
}