diff --git a/openVulkanoCpp/Scene/Scene.hpp b/openVulkanoCpp/Scene/Scene.hpp index 2ab6a02..58720b9 100644 --- a/openVulkanoCpp/Scene/Scene.hpp +++ b/openVulkanoCpp/Scene/Scene.hpp @@ -15,8 +15,6 @@ namespace openVulkanoCpp { namespace Scene { - class Shader; - class Scene : virtual public IInitable, virtual public ICloseable { public: diff --git a/openVulkanoCpp/Vulkan/Renderer.cpp b/openVulkanoCpp/Vulkan/Renderer.cpp index a2595b8..7543952 100644 --- a/openVulkanoCpp/Vulkan/Renderer.cpp +++ b/openVulkanoCpp/Vulkan/Renderer.cpp @@ -154,6 +154,7 @@ namespace openVulkanoCpp::Vulkan while((drawablePointer = jobQueue->Pop()) != nullptr) { Scene::Drawable* drawable = *drawablePointer; + drawContext.EncodeShader(drawable->GetShader()); drawable->GetEncoder().vulkan(drawable, &drawContext); } cmdHelper->cmdBuffer.end(); diff --git a/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp b/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp index d4870f3..65bca69 100644 --- a/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp +++ b/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp @@ -61,10 +61,7 @@ namespace openVulkanoCpp::Vulkan device.freeCommandBuffers(cmdPools[i], 1, &cmdBuffers[i]); device.destroyCommandPool(cmdPools[i]); } - for (auto shader : shaders) - { - shader->Close(); - } + shaders.clear(); cmdBuffers = nullptr; cmdPools = nullptr; device = nullptr; @@ -88,7 +85,7 @@ namespace openVulkanoCpp::Vulkan void ResourceManager::Resize() { - for (auto shader : shaders) + for (auto& shader : shaders) { shader->Resize(); } @@ -173,7 +170,12 @@ namespace openVulkanoCpp::Vulkan void ResourceManager::RemoveShader(VulkanShader* shader) { - Utils::Remove(shaders, shader); + const std::unique_lock lock(mutex); + std::vector>::iterator object = + find_if(shaders.begin(), shaders.end(), + [&](auto& obj){ return obj.get() == shader; } + ); + shaders.erase(object); } void ResourceManager::FreeBuffer(ManagedBuffer* buffer) @@ -267,9 +269,10 @@ namespace openVulkanoCpp::Vulkan VulkanShader* ResourceManager::CreateShader(Scene::Shader* shader) { + const std::unique_lock lock(mutex); VulkanShader* vkShader = new VulkanShader(); vkShader->Init(context, shader, this); - shaders.push_back(vkShader); + shaders.emplace_back(vkShader); return vkShader; } diff --git a/openVulkanoCpp/Vulkan/Resources/ResourceManager.hpp b/openVulkanoCpp/Vulkan/Resources/ResourceManager.hpp index b1b656e..d63b962 100644 --- a/openVulkanoCpp/Vulkan/Resources/ResourceManager.hpp +++ b/openVulkanoCpp/Vulkan/Resources/ResourceManager.hpp @@ -38,7 +38,7 @@ namespace openVulkanoCpp vk::CommandBuffer* cmdBuffers = nullptr; vk::Semaphore* semaphores = nullptr; std::vector allocations; - std::vector shaders; + std::vector> shaders; MemoryAllocation* lastAllocation = nullptr; std::mutex mutex; vk::DeviceSize uniformBufferAlignment; diff --git a/openVulkanoCpp/Vulkan/Scene/SimpleDrawableVulkanEncoder.cpp b/openVulkanoCpp/Vulkan/Scene/SimpleDrawableVulkanEncoder.cpp index 8a4f70b..d68ec4b 100644 --- a/openVulkanoCpp/Vulkan/Scene/SimpleDrawableVulkanEncoder.cpp +++ b/openVulkanoCpp/Vulkan/Scene/SimpleDrawableVulkanEncoder.cpp @@ -15,15 +15,14 @@ namespace openVulkanoCpp::Vulkan { void EncodeSimpleDrawable(Drawable* instance, Vulkan::VulkanDrawContext* drawContext) { - drawContext->EncodeShader(instance->GetShader()); - Geometry* mesh = dynamic_cast(instance)->GetMesh(); - VulkanGeometry* renderGeo = dynamic_cast(mesh->renderGeo); + Geometry* mesh = static_cast(instance)->GetMesh(); + VulkanGeometry* renderGeo = static_cast(mesh->renderGeo); if (!mesh->renderGeo) renderGeo = drawContext->renderer->GetResourceManager().PrepareGeometry(mesh); renderGeo->RecordBind(drawContext->commandBuffer); for(Node* node : instance->GetNodes()) { if (!node->renderNode) drawContext->renderer->GetResourceManager().PrepareNode(node); - dynamic_cast(node->renderNode)->Record(drawContext->commandBuffer, drawContext->currentImageId); + static_cast(node->renderNode)->Record(drawContext->commandBuffer, drawContext->currentImageId); renderGeo->RecordDraw(drawContext->commandBuffer); } } diff --git a/openVulkanoCpp/Vulkan/Scene/VulkanGeometry.hpp b/openVulkanoCpp/Vulkan/Scene/VulkanGeometry.hpp index 29e04a9..920fc8d 100644 --- a/openVulkanoCpp/Vulkan/Scene/VulkanGeometry.hpp +++ b/openVulkanoCpp/Vulkan/Scene/VulkanGeometry.hpp @@ -13,7 +13,7 @@ namespace openVulkanoCpp::Vulkan { - class VulkanGeometry final : virtual public ICloseable + class VulkanGeometry final : public ICloseable { Scene::Geometry* m_geometry; ManagedBuffer::Ptr m_vertexBuffer; diff --git a/openVulkanoCpp/Vulkan/Scene/VulkanNode.hpp b/openVulkanoCpp/Vulkan/Scene/VulkanNode.hpp index 7e7d8b8..eb9af89 100644 --- a/openVulkanoCpp/Vulkan/Scene/VulkanNode.hpp +++ b/openVulkanoCpp/Vulkan/Scene/VulkanNode.hpp @@ -15,7 +15,7 @@ namespace openVulkanoCpp { namespace Vulkan { - struct VulkanNode : virtual IRecordable, virtual ICloseable + struct VulkanNode : IRecordable, ICloseable { Scene::Node* node = nullptr; UniformBuffer* buffer = nullptr; diff --git a/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp b/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp index fd7e24d..fcd5e20 100644 --- a/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp +++ b/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp @@ -11,6 +11,16 @@ 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) { this->device = context->device->device; @@ -108,11 +118,5 @@ namespace openVulkanoCpp::Vulkan void VulkanShader::Close() { owner->RemoveShader(this); - shader = nullptr; - device.destroyPipeline(pipeline); - for(auto& shaderModule : shaderModules) - { - device.destroyShaderModule(shaderModule); - } } } \ No newline at end of file diff --git a/openVulkanoCpp/Vulkan/Scene/VulkanShader.hpp b/openVulkanoCpp/Vulkan/Scene/VulkanShader.hpp index 961d98e..92f0efe 100644 --- a/openVulkanoCpp/Vulkan/Scene/VulkanShader.hpp +++ b/openVulkanoCpp/Vulkan/Scene/VulkanShader.hpp @@ -35,8 +35,7 @@ namespace openVulkanoCpp VulkanShader() = default; - ~VulkanShader() override - { if (shader) VulkanShader::Close(); } + ~VulkanShader() override; void Init(Context* context, Scene::Shader* shader, IShaderOwner* owner);