From aa9161a16f74eea1b72b0284d28dc5ae7d318fd5 Mon Sep 17 00:00:00 2001 From: Wojciech Figat Date: Tue, 22 Mar 2022 12:55:33 +0100 Subject: [PATCH] Fix some issues --- .../GraphicsDevice/Vulkan/GPUBufferVulkan.cpp | 2 +- .../GraphicsDevice/Vulkan/GPUDeviceVulkan.cpp | 19 +++++++++++++++---- .../Renderer/GlobalSignDistanceFieldPass.cpp | 6 +++--- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/Source/Engine/GraphicsDevice/Vulkan/GPUBufferVulkan.cpp b/Source/Engine/GraphicsDevice/Vulkan/GPUBufferVulkan.cpp index 389d19d3f..0dda4488f 100644 --- a/Source/Engine/GraphicsDevice/Vulkan/GPUBufferVulkan.cpp +++ b/Source/Engine/GraphicsDevice/Vulkan/GPUBufferVulkan.cpp @@ -98,7 +98,7 @@ bool GPUBufferVulkan::OnInit() bufferInfo.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT; if (useSRV && !(_desc.Flags & GPUBufferFlags::Structured)) bufferInfo.usage |= VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT; - if (useUAV || _desc.Flags & GPUBufferFlags::RawBuffer) + if (useUAV || _desc.Flags & GPUBufferFlags::RawBuffer || _desc.Flags & GPUBufferFlags::Structured) bufferInfo.usage |= VK_BUFFER_USAGE_STORAGE_BUFFER_BIT; if (useUAV && useSRV) bufferInfo.usage |= VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT; diff --git a/Source/Engine/GraphicsDevice/Vulkan/GPUDeviceVulkan.cpp b/Source/Engine/GraphicsDevice/Vulkan/GPUDeviceVulkan.cpp index 1bc66b5b6..fc8e1f4bc 100644 --- a/Source/Engine/GraphicsDevice/Vulkan/GPUDeviceVulkan.cpp +++ b/Source/Engine/GraphicsDevice/Vulkan/GPUDeviceVulkan.cpp @@ -209,11 +209,22 @@ static VKAPI_ATTR VkBool32 VKAPI_PTR DebugUtilsCallback(VkDebugUtilsMessageSever type = TEXT("Perf"); } - if (callbackData->pMessageIdName) - LOG(Info, "[Vulkan] {0} {1}:{2}({3}) {4}", type, severity, callbackData->messageIdNumber, String(callbackData->pMessageIdName), String(callbackData->pMessage)); - else - LOG(Info, "[Vulkan] {0} {1}:{2} {3}", type, severity, callbackData->messageIdNumber, String(callbackData->pMessage)); + // Fix invalid characters in hex values (bug in Debug Layer) + char* handleStart = (char*)StringUtils::FindIgnoreCase(callbackData->pMessage, "0x"); + while (handleStart != nullptr) + { + while (*handleStart != ' ' && *handleStart != 0) + *handleStart++ = Math::Clamp(*handleStart, '0', 'z'); + if (*handleStart == 0) + break; + handleStart = (char*)StringUtils::FindIgnoreCase(handleStart, "0x"); + } + const String message(callbackData->pMessage); + if (callbackData->pMessageIdName) + LOG(Info, "[Vulkan] {0} {1}:{2}({3}) {4}", type, severity, callbackData->messageIdNumber, String(callbackData->pMessageIdName), message); + else + LOG(Info, "[Vulkan] {0} {1}:{2} {3}", type, severity, callbackData->messageIdNumber, message); return VK_FALSE; } diff --git a/Source/Engine/Renderer/GlobalSignDistanceFieldPass.cpp b/Source/Engine/Renderer/GlobalSignDistanceFieldPass.cpp index 881d8dd6e..e919fa76e 100644 --- a/Source/Engine/Renderer/GlobalSignDistanceFieldPass.cpp +++ b/Source/Engine/Renderer/GlobalSignDistanceFieldPass.cpp @@ -204,7 +204,7 @@ void GlobalSignDistanceFieldPass::Dispose() RendererPass::Dispose(); // Cleanup - Delete(_modelsBuffer); + SAFE_DELETE(_modelsBuffer); _modelsTextures.Resize(0); SAFE_DELETE_GPU_RESOURCE(_psDebug); _shader = nullptr; @@ -455,7 +455,7 @@ bool GlobalSignDistanceFieldPass::Render(RenderContext& renderContext, GPUContex if (_cb1) context->UpdateCB(_cb1, &data); context->Dispatch(_csClearChunk, chunkDispatchGroups, chunkDispatchGroups, chunkDispatchGroups); - // TODO: don't stall with UAV barrier on D3D12 if UAVs don't change between dispatches + // TODO: don't stall with UAV barrier on D3D12/Vulkan if UAVs don't change between dispatches } } // TODO: rasterize models into global sdf relative to the cascade origin to prevent fp issues on large worlds @@ -490,7 +490,7 @@ bool GlobalSignDistanceFieldPass::Render(RenderContext& renderContext, GPUContex cs = _csRasterizeModel1; } context->Dispatch(cs, chunkDispatchGroups, chunkDispatchGroups, chunkDispatchGroups); - // TODO: don't stall with UAV barrier on D3D12 if UAVs don't change between dispatches - only for a sequence of _csRasterizeModel0 dispatches (maybe cache per-shader write/read flags for all UAVs?) + // TODO: don't stall with UAV barrier on D3D12/Vulkan if UAVs don't change between dispatches - only for a sequence of _csRasterizeModel0 dispatches (maybe cache per-shader write/read flags for all UAVs?) #if GLOBAL_SDF_DEBUG_CHUNKS // Debug draw chunk bounds in world space with number of models in it