cpp-vulkan-setup/src/ShaderLoader.cpp

42 lines
1.6 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);
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<mbstate_t> &fileSize = shaderFile.tellg();
std::vector<uint32_t> buffer((fileSize / sizeof(uint32_t)) + 1);
shaderFile.seekg(0);
shaderFile.read(reinterpret_cast<char *>(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);
}
}