42 lines
1.6 KiB
C++
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);
|
|
}
|
|
}
|