From 86a6e486d55b427a19cd59e3b59a13a6d75d543a Mon Sep 17 00:00:00 2001 From: Stephen Saunders Date: Mon, 13 Feb 2023 15:42:16 -0500 Subject: [PATCH] Set NVRHI upload buffer size to avoid Vulkan staging buffer fragmentation (cherry picked from commit 3a55e9701a6f4ad5297d41e3486aeb4075972383) --- neo/renderer/ImageManager.cpp | 19 +++++++++++++++++-- neo/renderer/ModelManager.cpp | 12 ++++++++++-- neo/renderer/NVRHI/RenderBackend_NVRHI.cpp | 11 ++++++++++- 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/neo/renderer/ImageManager.cpp b/neo/renderer/ImageManager.cpp index 482bc595..ce60db42 100644 --- a/neo/renderer/ImageManager.cpp +++ b/neo/renderer/ImageManager.cpp @@ -40,6 +40,7 @@ idImageManager imageManager; idImageManager* globalImages = &imageManager; extern DeviceManager* deviceManager; +extern idCVar r_uploadBufferSizeMB; idCVar preLoad_Images( "preLoad_Images", "1", CVAR_SYSTEM | CVAR_BOOL, "preload images during beginlevelload" ); @@ -891,7 +892,14 @@ int idImageManager::LoadLevelImages( bool pacifier ) #if defined( USE_NVRHI ) if( !commandList ) { - commandList = deviceManager->GetDevice()->createCommandList(); + nvrhi::CommandListParameters params = {}; + if( deviceManager->GetGraphicsAPI() == nvrhi::GraphicsAPI::VULKAN ) + { + // SRS - set upload buffer size to avoid Vulkan staging buffer fragmentation + size_t maxBufferSize = ( size_t )( r_uploadBufferSizeMB.GetInteger() * 1024 * 1024 ); + params.setUploadChunkSize( maxBufferSize ); + } + commandList = deviceManager->GetDevice()->createCommandList( params ); } common->UpdateLevelLoadPacifier(); @@ -1017,7 +1025,14 @@ void idImageManager::LoadDeferredImages( nvrhi::ICommandList* _commandList ) { if( !commandList ) { - commandList = deviceManager->GetDevice()->createCommandList(); + nvrhi::CommandListParameters params = {}; + if( deviceManager->GetGraphicsAPI() == nvrhi::GraphicsAPI::VULKAN ) + { + // SRS - set upload buffer size to avoid Vulkan staging buffer fragmentation + size_t maxBufferSize = ( size_t )( r_uploadBufferSizeMB.GetInteger() * 1024 * 1024 ); + params.setUploadChunkSize( maxBufferSize ); + } + commandList = deviceManager->GetDevice()->createCommandList( params ); } nvrhi::ICommandList* thisCmdList = _commandList; diff --git a/neo/renderer/ModelManager.cpp b/neo/renderer/ModelManager.cpp index 3e75440c..0fa42892 100644 --- a/neo/renderer/ModelManager.cpp +++ b/neo/renderer/ModelManager.cpp @@ -38,6 +38,7 @@ If you have questions concerning this license or the applicable additional terms #include extern DeviceManager* deviceManager; + extern idCVar r_uploadBufferSizeMB; #endif idCVar binaryLoadRenderModels( "binaryLoadRenderModels", "1", 0, "enable binary load/write of render models" ); @@ -245,7 +246,14 @@ void idRenderModelManagerLocal::Init() #if defined( USE_NVRHI ) if( !commandList ) { - commandList = deviceManager->GetDevice()->createCommandList(); + nvrhi::CommandListParameters params = {}; + if( deviceManager->GetGraphicsAPI() == nvrhi::GraphicsAPI::VULKAN ) + { + // SRS - set upload buffer size to avoid Vulkan staging buffer fragmentation + size_t maxBufferSize = ( size_t )( r_uploadBufferSizeMB.GetInteger() * 1024 * 1024 ); + params.setUploadChunkSize( maxBufferSize ); + } + commandList = deviceManager->GetDevice()->createCommandList( params ); } #endif @@ -1513,4 +1521,4 @@ void idImportOptions::Init( const char* commandline, const char* ospath ) } } -// RB end \ No newline at end of file +// RB end diff --git a/neo/renderer/NVRHI/RenderBackend_NVRHI.cpp b/neo/renderer/NVRHI/RenderBackend_NVRHI.cpp index 90d610c2..58c21891 100644 --- a/neo/renderer/NVRHI/RenderBackend_NVRHI.cpp +++ b/neo/renderer/NVRHI/RenderBackend_NVRHI.cpp @@ -55,6 +55,8 @@ idCVar stereoRender_warpTargetFraction( "stereoRender_warpTargetFraction", "1.0" idCVar r_showSwapBuffers( "r_showSwapBuffers", "0", CVAR_BOOL, "Show timings from GL_BlockingSwapBuffers" ); idCVar r_syncEveryFrame( "r_syncEveryFrame", "1", CVAR_BOOL, "Don't let the GPU buffer execution past swapbuffers" ); +idCVar r_uploadBufferSizeMB( "r_uploadBufferSizeMB", "64", CVAR_INTEGER | CVAR_INIT, "Size of gpu upload buffer (Vulkan only)" ); + // SRS - What is GLimp_SwapBuffers() used for? Disable for now //void GLimp_SwapBuffers(); void RB_SetMVP( const idRenderMatrix& mvp ); @@ -214,7 +216,14 @@ void idRenderBackend::Init() if( !commandList ) { - commandList = deviceManager->GetDevice()->createCommandList(); + nvrhi::CommandListParameters params = {}; + if( deviceManager->GetGraphicsAPI() == nvrhi::GraphicsAPI::VULKAN ) + { + // SRS - set upload buffer size to avoid Vulkan staging buffer fragmentation + size_t maxBufferSize = ( size_t )( r_uploadBufferSizeMB.GetInteger() * 1024 * 1024 ); + params.setUploadChunkSize( maxBufferSize ); + } + commandList = deviceManager->GetDevice()->createCommandList( params ); } // allocate the vertex array range or vertex objects