From 3abbafa53074e89d681084ca83192015cc157649 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Tue, 6 Sep 2022 22:54:00 +0200 Subject: [PATCH] Fixes for Vulkan --- .../Engine/GraphicsDevice/Vulkan/GPUBufferVulkan.cpp | 3 ++- .../Engine/GraphicsDevice/Vulkan/GPUContextVulkan.cpp | 10 ++++++++++ .../GraphicsDevice/Vulkan/GPUSwapChainVulkan.cpp | 1 + Source/Engine/Particles/Particles.cpp | 1 - 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Source/Engine/GraphicsDevice/Vulkan/GPUBufferVulkan.cpp b/Source/Engine/GraphicsDevice/Vulkan/GPUBufferVulkan.cpp index 6ebfb239a2..6e4301c394 100644 --- a/Source/Engine/GraphicsDevice/Vulkan/GPUBufferVulkan.cpp +++ b/Source/Engine/GraphicsDevice/Vulkan/GPUBufferVulkan.cpp @@ -25,7 +25,8 @@ void GPUBufferViewVulkan::Init(GPUDeviceVulkan* device, GPUBufferVulkan* owner, viewInfo.format = RenderToolsVulkan::ToVulkanFormat(format); viewInfo.offset = 0; viewInfo.range = Size; - ASSERT_LOW_LAYER(viewInfo.format != VK_FORMAT_UNDEFINED); + if (viewInfo.format == VK_FORMAT_UNDEFINED) + return; // Skip for structured buffers that use custom structure type and have unknown format VALIDATE_VULKAN_RESULT(vkCreateBufferView(device->Device, &viewInfo, nullptr, &View)); } } diff --git a/Source/Engine/GraphicsDevice/Vulkan/GPUContextVulkan.cpp b/Source/Engine/GraphicsDevice/Vulkan/GPUContextVulkan.cpp index 702c8afaab..bc768f64c1 100644 --- a/Source/Engine/GraphicsDevice/Vulkan/GPUContextVulkan.cpp +++ b/Source/Engine/GraphicsDevice/Vulkan/GPUContextVulkan.cpp @@ -1309,6 +1309,11 @@ void GPUContextVulkan::UpdateBuffer(GPUBuffer* buffer, const void* data, uint32 const auto bufferVulkan = static_cast(buffer); + // Memory transfer barrier + // TODO: batch pipeline barriers + const VkMemoryBarrier barrierBefore = { VK_STRUCTURE_TYPE_MEMORY_BARRIER, nullptr, VK_ACCESS_MEMORY_WRITE_BIT, VK_ACCESS_MEMORY_READ_BIT }; + vkCmdPipelineBarrier(cmdBuffer->GetHandle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1, &barrierBefore, 0, nullptr, 0, nullptr); + // Use direct update for small buffers if (size <= 16 * 1024) { @@ -1331,6 +1336,11 @@ void GPUContextVulkan::UpdateBuffer(GPUBuffer* buffer, const void* data, uint32 _device->StagingManager.ReleaseBuffer(cmdBuffer, staging); } + + // Memory transfer barrier + // TODO: batch pipeline barriers + const VkMemoryBarrier barrierAfter = { VK_STRUCTURE_TYPE_MEMORY_BARRIER, nullptr, VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT }; + vkCmdPipelineBarrier(cmdBuffer->GetHandle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 1, &barrierAfter, 0, nullptr, 0, nullptr); } void GPUContextVulkan::CopyBuffer(GPUBuffer* dstBuffer, GPUBuffer* srcBuffer, uint32 size, uint32 dstOffset, uint32 srcOffset) diff --git a/Source/Engine/GraphicsDevice/Vulkan/GPUSwapChainVulkan.cpp b/Source/Engine/GraphicsDevice/Vulkan/GPUSwapChainVulkan.cpp index 4c719844fb..b16fe6caa1 100644 --- a/Source/Engine/GraphicsDevice/Vulkan/GPUSwapChainVulkan.cpp +++ b/Source/Engine/GraphicsDevice/Vulkan/GPUSwapChainVulkan.cpp @@ -195,6 +195,7 @@ bool GPUSwapChainVulkan::CreateSwapChain(int32 width, int32 height) LOG(Warning, "Failed to create Vulkan surface."); return true; } + _memoryUsage = 1; const auto& gpu = _device->Adapter->Gpu; diff --git a/Source/Engine/Particles/Particles.cpp b/Source/Engine/Particles/Particles.cpp index 042eaa7d83..5a7e776bc8 100644 --- a/Source/Engine/Particles/Particles.cpp +++ b/Source/Engine/Particles/Particles.cpp @@ -702,7 +702,6 @@ void DrawEmitterGPU(RenderContext& renderContext, ParticleBuffer* buffer, DrawCa // TODO: model LOD picking for particles? int32 lodIndex = 0; ModelLOD& lod = model->LODs[lodIndex]; - drawCalls += lod.Meshes.Count(); for (int32 meshIndex = 0; meshIndex < lod.Meshes.Count(); meshIndex++) { Mesh& mesh = lod.Meshes[meshIndex];