From 030deeb13622ea8e1496435ecc2909e4ecd30790 Mon Sep 17 00:00:00 2001 From: rob krajcarski Date: Wed, 2 Mar 2022 17:32:07 -0500 Subject: [PATCH] Fix for crash with landscapes when using -rhivalidation. Ensures that the RHIBuffer is held for the life of the frame because not all RHI backends will have the SRV maintain a hard reference to the source buffer #jira UE-143221 #rb mihnea.balta #preflight 621fcf56e15c51d8c50b9b9a #lockdown michal.valient #ROBOMERGE-AUTHOR: rob.krajcarski #ROBOMERGE-SOURCE: CL 19228270 in //UE5/Release-5.0/... via CL 19229143 #ROBOMERGE-BOT: UE5 (Release-Engine-Staging -> Main) (v921-19075845) [CL 19231609 by rob krajcarski in ue5-main branch] --- .../Source/Runtime/Landscape/Private/LandscapeRender.cpp | 7 +++++-- Engine/Source/Runtime/Landscape/Public/LandscapeRender.h | 4 ++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Engine/Source/Runtime/Landscape/Private/LandscapeRender.cpp b/Engine/Source/Runtime/Landscape/Private/LandscapeRender.cpp index f559cfca3c3e..358ad4cb1548 100644 --- a/Engine/Source/Runtime/Landscape/Private/LandscapeRender.cpp +++ b/Engine/Source/Runtime/Landscape/Private/LandscapeRender.cpp @@ -1091,11 +1091,11 @@ void FLandscapeSceneViewExtension::PreRenderView_RenderThread(FRHICommandListImm } FRHIResourceCreateInfo CreateInfoLODBuffer(TEXT("LandscapeLODDataBuffer"), &LandscapeLODData); - FBufferRHIRef LandscapeLODDataBuffer = RHICreateVertexBuffer(LandscapeLODData.GetResourceDataSize(), BUF_ShaderResource | BUF_Volatile, CreateInfoLODBuffer); + LandscapeLODDataBuffer = RHICreateVertexBuffer(LandscapeLODData.GetResourceDataSize(), BUF_ShaderResource | BUF_Volatile, CreateInfoLODBuffer); LODDataSRV = RHICreateShaderResourceView(LandscapeLODDataBuffer, sizeof(float), PF_R32_FLOAT); FRHIResourceCreateInfo CreateInfoIndirection(TEXT("LandscapeIndirectionBuffer"), &LandscapeIndirection); - FBufferRHIRef LandscapeIndirectionBuffer = RHICreateVertexBuffer(LandscapeIndirection.GetResourceDataSize(), BUF_ShaderResource | BUF_Volatile, CreateInfoIndirection); + LandscapeIndirectionBuffer = RHICreateVertexBuffer(LandscapeIndirection.GetResourceDataSize(), BUF_ShaderResource | BUF_Volatile, CreateInfoIndirection); IndirectionSRV = RHICreateShaderResourceView(LandscapeIndirectionBuffer, sizeof(uint32), PF_R32_UINT); } else @@ -1116,6 +1116,9 @@ void FLandscapeSceneViewExtension::EndFrame_RenderThread() RenderSystem.EndFrame(); } + + LandscapeLODDataBuffer = FBufferRHIRef(); + LandscapeIndirectionBuffer = FBufferRHIRef(); } // diff --git a/Engine/Source/Runtime/Landscape/Public/LandscapeRender.h b/Engine/Source/Runtime/Landscape/Public/LandscapeRender.h index 6115f39d67df..a52c0e82e6cb 100644 --- a/Engine/Source/Runtime/Landscape/Public/LandscapeRender.h +++ b/Engine/Source/Runtime/Landscape/Public/LandscapeRender.h @@ -497,6 +497,10 @@ public: virtual void PreRenderViewFamily_RenderThread(FRHICommandListImmediate& RHICmdList, FSceneViewFamily& InViewFamily) override; virtual void PreRenderView_RenderThread(FRHICommandListImmediate& RHICmdList, FSceneView& InView) override; + +private: + FBufferRHIRef LandscapeLODDataBuffer; + FBufferRHIRef LandscapeIndirectionBuffer; };