From c1fdd0cffb7e934444d281df3bb0bfeb68bec2a6 Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Wed, 22 Feb 2023 09:48:00 +0100 Subject: [PATCH] Fixed SSAO flickering when TAA is off #744 --- neo/renderer/BufferObject.h | 10 +++++----- neo/renderer/NVRHI/BufferObject_NVRHI.cpp | 22 +++++++++++++++++++++- neo/renderer/NVRHI/Image_NVRHI.cpp | 8 ++++++-- neo/renderer/Passes/SsaoPass.cpp | 1 + neo/renderer/RenderBackend.cpp | 14 ++++++++++++++ neo/sys/DeviceManager_VK.cpp | 12 ++++++------ 6 files changed, 53 insertions(+), 14 deletions(-) diff --git a/neo/renderer/BufferObject.h b/neo/renderer/BufferObject.h index 864a3cea..6eb6d14f 100644 --- a/neo/renderer/BufferObject.h +++ b/neo/renderer/BufferObject.h @@ -37,10 +37,10 @@ If you have questions concerning this license or the applicable additional terms #if defined( USE_NVRHI ) #include -#if defined( USE_AMD_ALLOCATOR ) - #include - #include "vk_mem_alloc.h" -#endif + #if defined( USE_AMD_ALLOCATOR ) + #include + #include "vk_mem_alloc.h" + #endif #endif enum bufferMapType_t @@ -151,7 +151,7 @@ protected: nvrhi::BufferHandle bufferHandle; void* buffer; idStr debugName; - + #if defined( USE_AMD_ALLOCATOR ) VkBuffer vkBuffer; VmaAllocation allocation; diff --git a/neo/renderer/NVRHI/BufferObject_NVRHI.cpp b/neo/renderer/NVRHI/BufferObject_NVRHI.cpp index 97fb270d..b9c7b04f 100644 --- a/neo/renderer/NVRHI/BufferObject_NVRHI.cpp +++ b/neo/renderer/NVRHI/BufferObject_NVRHI.cpp @@ -76,35 +76,55 @@ vk::BufferUsageFlags pickBufferUsage( const nvrhi::BufferDesc& desc ) vk::BufferUsageFlagBits::eTransferDst; if( desc.isVertexBuffer ) + { usageFlags |= vk::BufferUsageFlagBits::eVertexBuffer; + } if( desc.isIndexBuffer ) + { usageFlags |= vk::BufferUsageFlagBits::eIndexBuffer; + } if( desc.isDrawIndirectArgs ) + { usageFlags |= vk::BufferUsageFlagBits::eIndirectBuffer; + } if( desc.isConstantBuffer ) + { usageFlags |= vk::BufferUsageFlagBits::eUniformBuffer; + } if( desc.structStride != 0 || desc.canHaveUAVs || desc.canHaveRawViews ) + { usageFlags |= vk::BufferUsageFlagBits::eStorageBuffer; + } if( desc.canHaveTypedViews ) + { usageFlags |= vk::BufferUsageFlagBits::eUniformTexelBuffer; + } if( desc.canHaveTypedViews && desc.canHaveUAVs ) + { usageFlags |= vk::BufferUsageFlagBits::eStorageTexelBuffer; + } if( desc.isAccelStructBuildInput ) + { usageFlags |= vk::BufferUsageFlagBits::eAccelerationStructureBuildInputReadOnlyKHR; + } if( desc.isAccelStructStorage ) + { usageFlags |= vk::BufferUsageFlagBits::eAccelerationStructureStorageKHR; + } if( deviceManager->IsVulkanDeviceExtensionEnabled( VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME ) ) + { usageFlags |= vk::BufferUsageFlagBits::eShaderDeviceAddress; - + } + return usageFlags; } #endif diff --git a/neo/renderer/NVRHI/Image_NVRHI.cpp b/neo/renderer/NVRHI/Image_NVRHI.cpp index a2ef1d2a..76ebf549 100644 --- a/neo/renderer/NVRHI/Image_NVRHI.cpp +++ b/neo/renderer/NVRHI/Image_NVRHI.cpp @@ -96,10 +96,14 @@ vk::ImageUsageFlags pickImageUsage( const nvrhi::TextureDesc& desc ) } if( desc.isUAV ) + { usageFlags |= vk::ImageUsageFlagBits::eStorage; + } if( desc.isShadingRateSurface ) + { usageFlags |= vk::ImageUsageFlagBits::eFragmentShadingRateAttachmentKHR; + } return usageFlags; } @@ -113,12 +117,12 @@ idImage::idImage idImage::idImage( const char* name ) : imgName( name ) { texture.Reset(); - + #if defined( USE_AMD_ALLOCATOR ) image = VK_NULL_HANDLE; allocation = NULL; #endif - + generatorFunction = NULL; filter = TF_DEFAULT; repeat = TR_REPEAT; diff --git a/neo/renderer/Passes/SsaoPass.cpp b/neo/renderer/Passes/SsaoPass.cpp index 5fbeb5f0..25b127e2 100644 --- a/neo/renderer/Passes/SsaoPass.cpp +++ b/neo/renderer/Passes/SsaoPass.cpp @@ -255,6 +255,7 @@ void SsaoPass::Render( // TODO required and remove this by fixing the shaders renderProgManager.BindShader_TextureVertexColor(); + renderProgManager.CommitConstantBuffer( commandList, true ); SsaoConstants ssaoConstants = {}; diff --git a/neo/renderer/RenderBackend.cpp b/neo/renderer/RenderBackend.cpp index 372f03ad..1c182b77 100644 --- a/neo/renderer/RenderBackend.cpp +++ b/neo/renderer/RenderBackend.cpp @@ -2091,6 +2091,20 @@ void idRenderBackend::AmbientPass( const drawSurf_t* const* drawSurfs, int numDr renderLog.OpenMainBlock( fillGbuffer ? MRB_FILL_GEOMETRY_BUFFER : MRB_AMBIENT_PASS ); renderLog.OpenBlock( fillGbuffer ? "Fill_GeometryBuffer" : "Render_AmbientPass", colorBlue ); + // make sure rpWindowCoord is set even without post processing surfaces in the view + int x = viewDef->viewport.x1; + int y = viewDef->viewport.y1; + int w = viewDef->viewport.x2 - viewDef->viewport.x1 + 1; + int h = viewDef->viewport.y2 - viewDef->viewport.y1 + 1; + + // window coord to 0.0 to 1.0 conversion + float windowCoordParm[4]; + windowCoordParm[0] = 1.0f / w; + windowCoordParm[1] = 1.0f / h; + windowCoordParm[2] = w; + windowCoordParm[3] = h; + renderProgManager.SetUniformValue( RENDERPARM_WINDOWCOORD, windowCoordParm ); // rpWindowCoord + if( fillGbuffer ) { commandList->clearTextureFloat( globalImages->gbufferNormalsRoughnessImage->GetTextureHandle(), nvrhi::AllSubresources, nvrhi::Color( 0.f ) ); diff --git a/neo/sys/DeviceManager_VK.cpp b/neo/sys/DeviceManager_VK.cpp index ae02d78f..9b760356 100644 --- a/neo/sys/DeviceManager_VK.cpp +++ b/neo/sys/DeviceManager_VK.cpp @@ -39,14 +39,14 @@ #include #if defined( USE_AMD_ALLOCATOR ) -#define VMA_IMPLEMENTATION -#define VMA_STATIC_VULKAN_FUNCTIONS 0 -#define VMA_DYNAMIC_VULKAN_FUNCTIONS 1 -#include "vk_mem_alloc.h" + #define VMA_IMPLEMENTATION + #define VMA_STATIC_VULKAN_FUNCTIONS 0 + #define VMA_DYNAMIC_VULKAN_FUNCTIONS 1 + #include "vk_mem_alloc.h" -VmaAllocator m_VmaAllocator = nullptr; + VmaAllocator m_VmaAllocator = nullptr; -idCVar r_vmaDeviceLocalMemoryMB( "r_vmaDeviceLocalMemoryMB", "256", CVAR_INTEGER | CVAR_INIT, "Size of VMA allocation block for gpu memory." ); + idCVar r_vmaDeviceLocalMemoryMB( "r_vmaDeviceLocalMemoryMB", "256", CVAR_INTEGER | CVAR_INIT, "Size of VMA allocation block for gpu memory." ); #endif // Define the Vulkan dynamic dispatcher - this needs to occur in exactly one cpp file in the program.