Change shader handling

This commit is contained in:
2023-08-04 20:20:20 +02:00
parent 4dac821abb
commit 836e9dce42
13 changed files with 71 additions and 23 deletions

View File

@@ -59,8 +59,6 @@ namespace openVulkanoCpp::Vulkan
}
}
shader = resourceManager.CreateShader(scene->shader);
logger->info("Vulkan renderer initialized");
}
@@ -145,15 +143,12 @@ namespace openVulkanoCpp::Vulkan
void Renderer::RecordSecondaryBuffer(Data::ReadOnlyAtomicArrayQueue<Scene::Drawable*>* jobQueue, uint32_t poolId)
{
Scene::Geometry* lastGeo = nullptr;
Scene::Node* lastNode = nullptr;
CommandHelper* cmdHelper = GetCommandData(poolId);
cmdHelper->Reset();
vk::CommandBufferInheritanceInfo inheritance = { context.swapChainRenderPass.renderPass, 0, context.swapChainRenderPass.GetFrameBuffer()->GetCurrentFrameBuffer() };
cmdHelper->cmdBuffer.begin(vk::CommandBufferBeginInfo{ vk::CommandBufferUsageFlagBits::eOneTimeSubmit | vk::CommandBufferUsageFlagBits::eRenderPassContinue, &inheritance });
cmdHelper->cmdBuffer.pushConstants(context.pipeline.pipelineLayout, vk::ShaderStageFlagBits::eVertex, 0, 3 * sizeof(Math::Matrix4f) + sizeof(Math::Vector4f) + 4 * sizeof(float), &scene->GetCamera()->GetViewProjectionMatrix());
shader->Record(cmdHelper->cmdBuffer, currentImageId);
Scene::Drawable** drawablePointer;
VulkanDrawContext drawContext { poolId, currentImageId, cmdHelper->cmdBuffer, this };
while((drawablePointer = jobQueue->Pop()) != nullptr)

View File

@@ -37,7 +37,6 @@ namespace openVulkanoCpp::Vulkan
std::vector<std::vector<CommandHelper>> commands;
std::vector<std::vector<vk::CommandBuffer>> submitBuffers;
UiRenderer uiRenderer;
VulkanShader* shader;
public:
Renderer() = default;

View File

@@ -15,6 +15,7 @@ namespace openVulkanoCpp::Vulkan
{
void EncodeSimpleDrawable(Drawable* instance, Vulkan::VulkanDrawContext* drawContext)
{
drawContext->EncodeShader(instance->GetShader());
Geometry* mesh = dynamic_cast<SimpleDrawable*>(instance)->GetMesh();
VulkanGeometry* renderGeo = dynamic_cast<VulkanGeometry*>(mesh->renderGeo);
if (!mesh->renderGeo) renderGeo = drawContext->renderer->GetResourceManager().PrepareGeometry(mesh);

View File

@@ -23,15 +23,15 @@ namespace openVulkanoCpp
class Context;
class IShaderOwner;
struct VulkanShader final : virtual public ICloseable, virtual public IRecordable
struct VulkanShader final : public ICloseable, public IRecordable
{
Scene::Shader* shader = nullptr;
vk::Device device;
std::vector<vk::ShaderModule> shaderModules; // TODO manage live time somewhere else to allow sharing of shader programs
std::vector<vk::PipelineShaderStageCreateInfo> shaderStageCreateInfo;
vk::Pipeline pipeline; // TODO pipeline and shader config should be split
IShaderOwner* owner;
Context* context;
IShaderOwner* owner = nullptr;
Context* context = nullptr;
VulkanShader() = default;

View File

@@ -0,0 +1,24 @@
/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
#include "VulkanDrawContext.hpp"
#include "Scene/Shader.hpp"
#include "Scene/VulkanShader.hpp"
namespace openVulkanoCpp::Vulkan
{
void VulkanDrawContext::EncodeShader(Scene::Shader* shader)
{
VulkanShader* vkShader = static_cast<VulkanShader*>(shader->renderShader);
if (!vkShader)
{
vkShader = renderer->GetResourceManager().CreateShader(shader);
}
else if (m_lastShader == vkShader) return; // Skip it if shader is already bound
vkShader->Record(commandBuffer, currentImageId);
m_lastShader = vkShader;
}
}

View File

@@ -10,10 +10,18 @@ namespace openVulkanoCpp::Vulkan
{
class VulkanDrawContext
{
VulkanShader* m_lastShader = nullptr;
public:
size_t encoderThreadId;
size_t currentImageId;
vk::CommandBuffer& commandBuffer;
Renderer* renderer;
VulkanDrawContext(size_t encThreadId, size_t currentImgId, vk::CommandBuffer& buffer, Renderer* render)
: encoderThreadId(encThreadId), currentImageId(currentImgId), commandBuffer(buffer), renderer(render)
{}
void EncodeShader(Scene::Shader* shader);
};
}