38 lines
1.5 KiB
C++
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);
|
|
}
|
|
}
|