From 7dd16c66b901c4ed9683ccd655d60d9863019553 Mon Sep 17 00:00:00 2001 From: Georg Hagen Date: Tue, 28 May 2024 22:18:33 +0200 Subject: [PATCH 1/3] Fix multithreaded rendering --- openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp | 1 + openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp b/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp index 5d1b409..2e1a04f 100644 --- a/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp +++ b/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp @@ -345,6 +345,7 @@ namespace OpenVulkano::Vulkan VulkanShader* ResourceManager::CreateShader(Scene::Shader* shader) { const std::unique_lock lock(mutex); + if (shader->renderShader) return static_cast(shader->renderShader); VulkanShader* vkShader = new VulkanShader(); vkShader->Init(context, shader, this); shaders.emplace_back(vkShader); diff --git a/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp b/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp index 11870f3..88d2d1a 100644 --- a/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp +++ b/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp @@ -33,7 +33,6 @@ namespace OpenVulkano::Vulkan this->shader = shader; this->owner = owner; this->context = context; - shader->renderShader = this; shaderModules.reserve(shader->shaderPrograms.size()); shaderStageCreateInfo.resize(shader->shaderPrograms.size()); int i = 0; @@ -45,6 +44,7 @@ namespace OpenVulkano::Vulkan i++; } BuildPipeline(); + shader->renderShader = this; } void VulkanShader::BuildPipeline() From bc0e117d8368bceeb59ceaa78ee1ea5ec29fdb5e Mon Sep 17 00:00:00 2001 From: Georg Hagen Date: Tue, 28 May 2024 22:20:02 +0200 Subject: [PATCH 2/3] Fix memory alignment on Nvidia cards --- openVulkanoCpp/Vulkan/Resources/ManagedResource.hpp | 6 ++++++ openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp | 12 ++++++------ openVulkanoCpp/Vulkan/Resources/ResourceManager.hpp | 2 +- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/openVulkanoCpp/Vulkan/Resources/ManagedResource.hpp b/openVulkanoCpp/Vulkan/Resources/ManagedResource.hpp index 71df4dd..3bb41d4 100644 --- a/openVulkanoCpp/Vulkan/Resources/ManagedResource.hpp +++ b/openVulkanoCpp/Vulkan/Resources/ManagedResource.hpp @@ -11,6 +11,7 @@ #include #include #include +#include "Base/Utils.hpp" namespace OpenVulkano::Vulkan { @@ -44,6 +45,11 @@ namespace OpenVulkano::Vulkan return size - used; } + [[nodiscard]] size_t FreeSpace(size_t alignment) const + { + return size - Utils::Align(used, alignment); + } + void HandleChildMappingValidation() const; void* Map() diff --git a/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp b/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp index 2e1a04f..6cdbf4e 100644 --- a/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp +++ b/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp @@ -309,11 +309,11 @@ namespace OpenVulkano::Vulkan vk::Buffer buffer = device.createBuffer(bufferCreateInfo); const vk::MemoryRequirements memoryRequirements = device.getBufferMemoryRequirements(buffer); uint32_t memtype = context->device->GetMemoryType(memoryRequirements.memoryTypeBits, properties); - if (memoryRequirements.size != size) Logger::DATA->warn("Memory Requirement Size ({0}) != Size ({1})", memoryRequirements.size, size); - MemoryAllocation* allocation = GetFreeMemoryAllocation(memoryRequirements.size, memtype); - uint32_t offset = allocation->used; + if (memoryRequirements.size != size) Logger::DATA->debug("Memory Requirement Size ({0}) != Size ({1})", memoryRequirements.size, size); + MemoryAllocation* allocation = GetFreeMemoryAllocation(memoryRequirements.size, memoryRequirements.alignment, memtype); + uint32_t offset = Utils::Align(allocation->used, memoryRequirements.alignment); device.bindBufferMemory(buffer, allocation->memory, offset); - allocation->used += memoryRequirements.size; + allocation->used += memoryRequirements.size + (offset - allocation->used); return new ManagedBuffer{ allocation, offset, size, buffer, usage, properties, nullptr }; } @@ -326,12 +326,12 @@ namespace OpenVulkano::Vulkan return alloc; } - MemoryAllocation* ResourceManager::GetFreeMemoryAllocation(size_t size, uint32_t type, bool createIfAllFull) + MemoryAllocation* ResourceManager::GetFreeMemoryAllocation(size_t size, vk::DeviceSize alignment, uint32_t type, bool createIfAllFull) { MemoryAllocation* alloc = nullptr; for (auto& allocation : allocations) { - if (allocation->type == type && allocation->FreeSpace() >= size) + if (allocation->type == type && allocation->FreeSpace(alignment) >= size) { alloc = allocation.get(); break; diff --git a/openVulkanoCpp/Vulkan/Resources/ResourceManager.hpp b/openVulkanoCpp/Vulkan/Resources/ResourceManager.hpp index 51ad248..9fb0a9d 100644 --- a/openVulkanoCpp/Vulkan/Resources/ResourceManager.hpp +++ b/openVulkanoCpp/Vulkan/Resources/ResourceManager.hpp @@ -117,7 +117,7 @@ namespace OpenVulkano MemoryAllocation* CreateMemoryAllocation(size_t size, uint32_t type, bool addToCache = true); - MemoryAllocation* GetFreeMemoryAllocation(size_t size, uint32_t type, bool createIfAllFull = true); + MemoryAllocation* GetFreeMemoryAllocation(size_t size, size_t alignment, uint32_t type, bool createIfAllFull = true); vk::DescriptorSetLayout* GetDescriptorLayoutSet(const DescriptorSetLayoutBinding& descriptorSetLayoutBinding); From 5f65e9291aabbd2153e458c59f3bfbbc25dc2578 Mon Sep 17 00:00:00 2001 From: Georg Hagen Date: Tue, 28 May 2024 22:26:16 +0200 Subject: [PATCH 3/3] Fix dynamic offset count error spam --- openVulkanoCpp/Vulkan/Resources/UniformBuffer.cpp | 3 ++- openVulkanoCpp/Vulkan/Resources/UniformBuffer.hpp | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/openVulkanoCpp/Vulkan/Resources/UniformBuffer.cpp b/openVulkanoCpp/Vulkan/Resources/UniformBuffer.cpp index 9deaf8b..4246d55 100644 --- a/openVulkanoCpp/Vulkan/Resources/UniformBuffer.cpp +++ b/openVulkanoCpp/Vulkan/Resources/UniformBuffer.cpp @@ -25,6 +25,7 @@ namespace OpenVulkano::Vulkan writeDescriptorSet.pBufferInfo = &bufferInfo; buffer->allocation->device.updateDescriptorSets(1, &writeDescriptorSet, 0, nullptr); m_setOffset = setId; + m_dynamic = binding.descriptorType == DescriptorSetLayoutBinding::TYPE_UNIFORM_BUFFER_DYNAMIC || binding.descriptorType == DescriptorSetLayoutBinding::TYPE_STORAGE_BUFFER_DYNAMIC; } void UniformBuffer::Close() @@ -36,7 +37,7 @@ namespace OpenVulkano::Vulkan void UniformBuffer::Record(VulkanDrawContext* drawContext) { uint32_t frameOffset = m_frameOffset * drawContext->currentImageId; - drawContext->commandBuffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, drawContext->GetShader()->pipelineLayout, m_setOffset, m_setCount, &m_descriptorSet, (m_frameOffset) ? 1 : 0, &frameOffset); + drawContext->commandBuffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, drawContext->GetShader()->pipelineLayout, m_setOffset, m_setCount, &m_descriptorSet, (m_dynamic) ? 1 : 0, &frameOffset); } void UniformBuffer::Update(void* data, uint32_t size, uint32_t bufferId) const diff --git a/openVulkanoCpp/Vulkan/Resources/UniformBuffer.hpp b/openVulkanoCpp/Vulkan/Resources/UniformBuffer.hpp index cd83ecb..1f8d8a2 100644 --- a/openVulkanoCpp/Vulkan/Resources/UniformBuffer.hpp +++ b/openVulkanoCpp/Vulkan/Resources/UniformBuffer.hpp @@ -19,6 +19,7 @@ namespace OpenVulkano::Vulkan vk::DescriptorSet m_descriptorSet; uint32_t m_frameOffset; uint32_t m_setOffset, m_setCount = 1; + bool m_dynamic; public: ~UniformBuffer() override