Start refactoring shader system
This commit is contained in:
@@ -12,40 +12,28 @@
|
||||
|
||||
namespace openVulkanoCpp::Vulkan
|
||||
{
|
||||
namespace
|
||||
{
|
||||
constexpr vk::PrimitiveTopology ToVkTopology(Scene::Topology topology)
|
||||
{
|
||||
switch (topology)
|
||||
{
|
||||
case Scene::Topology::PointList: return vk::PrimitiveTopology::ePointList;
|
||||
case Scene::Topology::LineList: return vk::PrimitiveTopology::eLineList;
|
||||
case Scene::Topology::LineStripe: return vk::PrimitiveTopology::eLineStrip;
|
||||
case Scene::Topology::TriangleList: return vk::PrimitiveTopology::eTriangleList;
|
||||
case Scene::Topology::TriangleStripe: return vk::PrimitiveTopology::eTriangleStrip;
|
||||
default: throw std::runtime_error("Unknown topology!");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void VulkanShader::Init(Context* context, Scene::Shader* shader, IShaderOwner* owner)
|
||||
{
|
||||
this->device = context->device->device;
|
||||
this->shader = shader;
|
||||
this->owner = owner;
|
||||
this->context = context;
|
||||
shaderModuleVertex = context->device->CreateShaderModule(shader->vertexShaderName + ".vert.spv");
|
||||
shaderModuleFragment = context->device->CreateShaderModule(shader->fragmentShaderName + ".frag.spv");
|
||||
shaderModules.reserve(shader->shaderPrograms.size());
|
||||
shaderStageCreateInfo.resize(shader->shaderPrograms.size());
|
||||
int i = 0;
|
||||
for(const auto& shaderProgram : shader->shaderPrograms)
|
||||
{
|
||||
const auto shaderModule = context->device->CreateShaderModule(shaderProgram.GetShaderNameVulkan());
|
||||
shaderModules.push_back(shaderModule);
|
||||
shaderStageCreateInfo[i] = {{}, static_cast<vk::ShaderStageFlagBits>(static_cast<uint32_t>(shaderProgram.type)), shaderModule, "main"};
|
||||
i++;
|
||||
}
|
||||
BuildPipeline();
|
||||
}
|
||||
|
||||
void VulkanShader::BuildPipeline()
|
||||
{
|
||||
std::vector<vk::PipelineShaderStageCreateInfo> shaderStageCreateInfos(2);
|
||||
shaderStageCreateInfos[0] = { {}, vk::ShaderStageFlagBits::eVertex, shaderModuleVertex, "main" };
|
||||
shaderStageCreateInfos[1] = { {}, vk::ShaderStageFlagBits::eFragment, shaderModuleFragment, "main" };
|
||||
|
||||
auto vertexBindDesc = vk::VertexInputBindingDescription(0, sizeof(Vertex), vk::VertexInputRate::eVertex);
|
||||
vk::VertexInputBindingDescription vertexBindDesc(0, sizeof(Vertex), vk::VertexInputRate::eVertex);
|
||||
std::vector<vk::VertexInputAttributeDescription> attributeDescriptions;
|
||||
attributeDescriptions.emplace_back(0, 0, vk::Format::eR32G32B32Sfloat, offsetof(Vertex, position));
|
||||
attributeDescriptions.emplace_back(1, 0, vk::Format::eR32G32B32Sfloat, offsetof(Vertex, normal));
|
||||
@@ -57,7 +45,7 @@ namespace openVulkanoCpp::Vulkan
|
||||
vk::PipelineViewportStateCreateInfo viewportStateCreateInfo = { {}, 1, &context->swapChain.GetFullscreenViewport(), 1, &context->swapChain.GetFullscreenScissor() };
|
||||
vk::PipelineVertexInputStateCreateInfo pipelineVertexInputStateCreateInfo = { {}, 1, &vertexBindDesc,
|
||||
static_cast<uint32_t>(attributeDescriptions.size()), attributeDescriptions.data() };
|
||||
vk::PipelineInputAssemblyStateCreateInfo inputAssembly = { {}, ToVkTopology(shader->topology), 0 };
|
||||
vk::PipelineInputAssemblyStateCreateInfo inputAssembly = { {}, static_cast<vk::PrimitiveTopology>(shader->topology), 0 };
|
||||
vk::PipelineRasterizationStateCreateInfo rasterizer = {};
|
||||
rasterizer.cullMode = vk::CullModeFlagBits::eBack;
|
||||
vk::PipelineMultisampleStateCreateInfo msaa = {};
|
||||
@@ -71,7 +59,7 @@ namespace openVulkanoCpp::Vulkan
|
||||
|
||||
|
||||
|
||||
vk::GraphicsPipelineCreateInfo pipelineCreateInfo = { {}, static_cast<uint32_t>(shaderStageCreateInfos.size()), shaderStageCreateInfos.data(), &pipelineVertexInputStateCreateInfo, &inputAssembly,
|
||||
vk::GraphicsPipelineCreateInfo pipelineCreateInfo = { {}, static_cast<uint32_t>(shaderStageCreateInfo.size()), shaderStageCreateInfo.data(), &pipelineVertexInputStateCreateInfo, &inputAssembly,
|
||||
nullptr, &viewportStateCreateInfo, &rasterizer, &msaa, &depth, &colorInfo, nullptr, context->pipeline.pipelineLayout, context->swapChainRenderPass.renderPass };
|
||||
pipeline = this->device.createGraphicsPipeline({}, pipelineCreateInfo).value;
|
||||
}
|
||||
@@ -92,7 +80,9 @@ namespace openVulkanoCpp::Vulkan
|
||||
owner->RemoveShader(this);
|
||||
shader = nullptr;
|
||||
device.destroyPipeline(pipeline);
|
||||
device.destroyShaderModule(shaderModuleVertex);
|
||||
device.destroyShaderModule(shaderModuleFragment);
|
||||
for(auto& shaderModule : shaderModules)
|
||||
{
|
||||
device.destroyShaderModule(shaderModule);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user