Cleanup shader handling

This commit is contained in:
2023-08-05 21:01:11 +02:00
parent 836e9dce42
commit da1782c4a9
9 changed files with 28 additions and 24 deletions

View File

@@ -15,8 +15,6 @@ namespace openVulkanoCpp
{ {
namespace Scene namespace Scene
{ {
class Shader;
class Scene : virtual public IInitable, virtual public ICloseable class Scene : virtual public IInitable, virtual public ICloseable
{ {
public: public:

View File

@@ -154,6 +154,7 @@ namespace openVulkanoCpp::Vulkan
while((drawablePointer = jobQueue->Pop()) != nullptr) while((drawablePointer = jobQueue->Pop()) != nullptr)
{ {
Scene::Drawable* drawable = *drawablePointer; Scene::Drawable* drawable = *drawablePointer;
drawContext.EncodeShader(drawable->GetShader());
drawable->GetEncoder().vulkan(drawable, &drawContext); drawable->GetEncoder().vulkan(drawable, &drawContext);
} }
cmdHelper->cmdBuffer.end(); cmdHelper->cmdBuffer.end();

View File

@@ -61,10 +61,7 @@ namespace openVulkanoCpp::Vulkan
device.freeCommandBuffers(cmdPools[i], 1, &cmdBuffers[i]); device.freeCommandBuffers(cmdPools[i], 1, &cmdBuffers[i]);
device.destroyCommandPool(cmdPools[i]); device.destroyCommandPool(cmdPools[i]);
} }
for (auto shader : shaders) shaders.clear();
{
shader->Close();
}
cmdBuffers = nullptr; cmdBuffers = nullptr;
cmdPools = nullptr; cmdPools = nullptr;
device = nullptr; device = nullptr;
@@ -88,7 +85,7 @@ namespace openVulkanoCpp::Vulkan
void ResourceManager::Resize() void ResourceManager::Resize()
{ {
for (auto shader : shaders) for (auto& shader : shaders)
{ {
shader->Resize(); shader->Resize();
} }
@@ -173,7 +170,12 @@ namespace openVulkanoCpp::Vulkan
void ResourceManager::RemoveShader(VulkanShader* shader) void ResourceManager::RemoveShader(VulkanShader* shader)
{ {
Utils::Remove(shaders, shader); const std::unique_lock lock(mutex);
std::vector<std::unique_ptr<VulkanShader>>::iterator object =
find_if(shaders.begin(), shaders.end(),
[&](auto& obj){ return obj.get() == shader; }
);
shaders.erase(object);
} }
void ResourceManager::FreeBuffer(ManagedBuffer* buffer) void ResourceManager::FreeBuffer(ManagedBuffer* buffer)
@@ -267,9 +269,10 @@ namespace openVulkanoCpp::Vulkan
VulkanShader* ResourceManager::CreateShader(Scene::Shader* shader) VulkanShader* ResourceManager::CreateShader(Scene::Shader* shader)
{ {
const std::unique_lock lock(mutex);
VulkanShader* vkShader = new VulkanShader(); VulkanShader* vkShader = new VulkanShader();
vkShader->Init(context, shader, this); vkShader->Init(context, shader, this);
shaders.push_back(vkShader); shaders.emplace_back(vkShader);
return vkShader; return vkShader;
} }

View File

@@ -38,7 +38,7 @@ namespace openVulkanoCpp
vk::CommandBuffer* cmdBuffers = nullptr; vk::CommandBuffer* cmdBuffers = nullptr;
vk::Semaphore* semaphores = nullptr; vk::Semaphore* semaphores = nullptr;
std::vector<MemoryAllocation*> allocations; std::vector<MemoryAllocation*> allocations;
std::vector<VulkanShader*> shaders; std::vector<std::unique_ptr<VulkanShader>> shaders;
MemoryAllocation* lastAllocation = nullptr; MemoryAllocation* lastAllocation = nullptr;
std::mutex mutex; std::mutex mutex;
vk::DeviceSize uniformBufferAlignment; vk::DeviceSize uniformBufferAlignment;

View File

@@ -15,15 +15,14 @@ namespace openVulkanoCpp::Vulkan
{ {
void EncodeSimpleDrawable(Drawable* instance, Vulkan::VulkanDrawContext* drawContext) void EncodeSimpleDrawable(Drawable* instance, Vulkan::VulkanDrawContext* drawContext)
{ {
drawContext->EncodeShader(instance->GetShader()); Geometry* mesh = static_cast<SimpleDrawable*>(instance)->GetMesh();
Geometry* mesh = dynamic_cast<SimpleDrawable*>(instance)->GetMesh(); VulkanGeometry* renderGeo = static_cast<VulkanGeometry*>(mesh->renderGeo);
VulkanGeometry* renderGeo = dynamic_cast<VulkanGeometry*>(mesh->renderGeo);
if (!mesh->renderGeo) renderGeo = drawContext->renderer->GetResourceManager().PrepareGeometry(mesh); if (!mesh->renderGeo) renderGeo = drawContext->renderer->GetResourceManager().PrepareGeometry(mesh);
renderGeo->RecordBind(drawContext->commandBuffer); renderGeo->RecordBind(drawContext->commandBuffer);
for(Node* node : instance->GetNodes()) for(Node* node : instance->GetNodes())
{ {
if (!node->renderNode) drawContext->renderer->GetResourceManager().PrepareNode(node); if (!node->renderNode) drawContext->renderer->GetResourceManager().PrepareNode(node);
dynamic_cast<VulkanNode*>(node->renderNode)->Record(drawContext->commandBuffer, drawContext->currentImageId); static_cast<VulkanNode*>(node->renderNode)->Record(drawContext->commandBuffer, drawContext->currentImageId);
renderGeo->RecordDraw(drawContext->commandBuffer); renderGeo->RecordDraw(drawContext->commandBuffer);
} }
} }

View File

@@ -13,7 +13,7 @@
namespace openVulkanoCpp::Vulkan namespace openVulkanoCpp::Vulkan
{ {
class VulkanGeometry final : virtual public ICloseable class VulkanGeometry final : public ICloseable
{ {
Scene::Geometry* m_geometry; Scene::Geometry* m_geometry;
ManagedBuffer::Ptr m_vertexBuffer; ManagedBuffer::Ptr m_vertexBuffer;

View File

@@ -15,7 +15,7 @@ namespace openVulkanoCpp
{ {
namespace Vulkan namespace Vulkan
{ {
struct VulkanNode : virtual IRecordable, virtual ICloseable struct VulkanNode : IRecordable, ICloseable
{ {
Scene::Node* node = nullptr; Scene::Node* node = nullptr;
UniformBuffer* buffer = nullptr; UniformBuffer* buffer = nullptr;

View File

@@ -11,6 +11,16 @@
namespace openVulkanoCpp::Vulkan namespace openVulkanoCpp::Vulkan
{ {
VulkanShader::~VulkanShader()
{
if (!shader) return;
device.destroyPipeline(pipeline);
for(auto& shaderModule : shaderModules)
{
device.destroyShaderModule(shaderModule);
}
}
void VulkanShader::Init(Context* context, Scene::Shader* shader, IShaderOwner* owner) void VulkanShader::Init(Context* context, Scene::Shader* shader, IShaderOwner* owner)
{ {
this->device = context->device->device; this->device = context->device->device;
@@ -108,11 +118,5 @@ namespace openVulkanoCpp::Vulkan
void VulkanShader::Close() void VulkanShader::Close()
{ {
owner->RemoveShader(this); owner->RemoveShader(this);
shader = nullptr;
device.destroyPipeline(pipeline);
for(auto& shaderModule : shaderModules)
{
device.destroyShaderModule(shaderModule);
}
} }
} }

View File

@@ -35,8 +35,7 @@ namespace openVulkanoCpp
VulkanShader() = default; VulkanShader() = default;
~VulkanShader() override ~VulkanShader() override;
{ if (shader) VulkanShader::Close(); }
void Init(Context* context, Scene::Shader* shader, IShaderOwner* owner); void Init(Context* context, Scene::Shader* shader, IShaderOwner* owner);