2019-12-26 14:45:42 -05:00
// Copyright Epic Games, Inc. All Rights Reserved.
2019-06-11 18:27:07 -04:00
# include "RenderGraphPass.h"
2020-07-06 18:58:26 -04:00
# include "RenderGraphPrivate.h"
2024-08-19 16:29:07 -04:00
# include "RenderGraphBuilder.h"
2019-06-11 18:27:07 -04:00
2024-09-03 14:18:13 -04:00
FEmptyShaderParameters FRDGSentinelPass : : EmptyShaderParameters ;
2021-01-13 16:51:48 -04:00
FUniformBufferStaticBindings FRDGParameterStruct : : GetStaticUniformBuffers ( ) const
2020-01-24 18:07:01 -05:00
{
FUniformBufferStaticBindings GlobalUniformBuffers ;
2020-09-24 00:43:27 -04:00
for ( uint32 Index = 0 , Count = Layout - > UniformBuffers . Num ( ) ; Index < Count ; + + Index )
2020-01-24 18:07:01 -05:00
{
2020-09-24 00:43:27 -04:00
const uint32 MemberOffset = Layout - > UniformBuffers [ Index ] . MemberOffset ;
2020-12-07 17:42:32 -04:00
const FUniformBufferBinding & UniformBuffer = * reinterpret_cast < const FUniformBufferBinding * > ( const_cast < uint8 * > ( Contents + MemberOffset ) ) ;
2020-01-24 18:07:01 -05:00
2020-12-07 17:42:32 -04:00
if ( UniformBuffer & & UniformBuffer . IsStatic ( ) )
2020-01-24 18:07:01 -05:00
{
2020-12-07 17:42:32 -04:00
GlobalUniformBuffers . AddUniformBuffer ( UniformBuffer . GetUniformBuffer ( ) ) ;
2020-01-24 18:07:01 -05:00
}
}
2020-12-07 17:42:32 -04:00
EnumerateUniformBuffers ( [ & ] ( FRDGUniformBufferBinding UniformBuffer )
2020-09-24 00:43:27 -04:00
{
2020-12-07 17:42:32 -04:00
if ( UniformBuffer . IsStatic ( ) )
2020-09-24 00:43:27 -04:00
{
GlobalUniformBuffers . AddUniformBuffer ( UniformBuffer - > GetRHI ( ) ) ;
}
} ) ;
2020-01-24 18:07:01 -05:00
return GlobalUniformBuffers ;
}
2020-09-24 00:43:27 -04:00
FRHIRenderPassInfo FRDGParameterStruct : : GetRenderPassInfo ( ) const
2020-07-06 18:58:26 -04:00
{
2020-09-24 00:43:27 -04:00
const FRenderTargetBindingSlots & RenderTargets = GetRenderTargets ( ) ;
FRHIRenderPassInfo RenderPassInfo ;
uint32 SampleCount = 0 ;
uint32 RenderTargetIndex = 0 ;
RenderTargets . Enumerate ( [ & ] ( FRenderTargetBinding RenderTarget )
{
FRDGTextureRef Texture = RenderTarget . GetTexture ( ) ;
FRDGTextureRef ResolveTexture = RenderTarget . GetResolveTexture ( ) ;
ERenderTargetStoreAction StoreAction = EnumHasAnyFlags ( Texture - > Desc . Flags , TexCreate_Memoryless ) ? ERenderTargetStoreAction : : ENoAction : ERenderTargetStoreAction : : EStore ;
if ( ResolveTexture )
{
// Silently skip the resolve if the resolve texture is the same as the render target texture.
if ( ResolveTexture ! = Texture )
{
StoreAction = ERenderTargetStoreAction : : EMultisampleResolve ;
}
else
{
ResolveTexture = nullptr ;
}
}
auto & ColorRenderTarget = RenderPassInfo . ColorRenderTargets [ RenderTargetIndex ] ;
ColorRenderTarget . RenderTarget = Texture - > GetRHI ( ) ;
ColorRenderTarget . ResolveTarget = ResolveTexture ? ResolveTexture - > GetRHI ( ) : nullptr ;
ColorRenderTarget . ArraySlice = RenderTarget . GetArraySlice ( ) ;
ColorRenderTarget . MipIndex = RenderTarget . GetMipIndex ( ) ;
ColorRenderTarget . Action = MakeRenderTargetActions ( RenderTarget . GetLoadAction ( ) , StoreAction ) ;
SampleCount | = ColorRenderTarget . RenderTarget - > GetNumSamples ( ) ;
+ + RenderTargetIndex ;
} ) ;
const FDepthStencilBinding & DepthStencil = RenderTargets . DepthStencil ;
if ( FRDGTextureRef Texture = DepthStencil . GetTexture ( ) )
{
const FExclusiveDepthStencil ExclusiveDepthStencil = DepthStencil . GetDepthStencilAccess ( ) ;
2024-04-24 06:43:38 -04:00
ERenderTargetStoreAction StoreAction = EnumHasAnyFlags ( Texture - > Desc . Flags , TexCreate_Memoryless ) ? ERenderTargetStoreAction : : ENoAction : ERenderTargetStoreAction : : EStore ;
FRDGTextureRef ResolveTexture = DepthStencil . GetResolveTexture ( ) ;
if ( ResolveTexture )
{
// Silently skip the resolve if the resolve texture is the same as the render target texture.
if ( ResolveTexture ! = Texture )
{
StoreAction = ERenderTargetStoreAction : : EMultisampleResolve ;
}
else
{
ResolveTexture = nullptr ;
}
}
2020-09-24 00:43:27 -04:00
const ERenderTargetStoreAction DepthStoreAction = ExclusiveDepthStencil . IsUsingDepth ( ) ? StoreAction : ERenderTargetStoreAction : : ENoAction ;
const ERenderTargetStoreAction StencilStoreAction = ExclusiveDepthStencil . IsUsingStencil ( ) ? StoreAction : ERenderTargetStoreAction : : ENoAction ;
auto & DepthStencilTarget = RenderPassInfo . DepthStencilRenderTarget ;
DepthStencilTarget . DepthStencilTarget = Texture - > GetRHI ( ) ;
2024-04-24 06:43:38 -04:00
DepthStencilTarget . ResolveTarget = ResolveTexture ? ResolveTexture - > GetRHI ( ) : nullptr ;
2020-09-24 00:43:27 -04:00
DepthStencilTarget . Action = MakeDepthStencilTargetActions (
MakeRenderTargetActions ( DepthStencil . GetDepthLoadAction ( ) , DepthStoreAction ) ,
MakeRenderTargetActions ( DepthStencil . GetStencilLoadAction ( ) , StencilStoreAction ) ) ;
DepthStencilTarget . ExclusiveDepthStencil = ExclusiveDepthStencil ;
SampleCount | = DepthStencilTarget . DepthStencilTarget - > GetNumSamples ( ) ;
}
2022-05-18 12:29:26 -04:00
RenderPassInfo . ResolveRect = RenderTargets . ResolveRect ;
2020-09-24 00:43:27 -04:00
RenderPassInfo . NumOcclusionQueries = RenderTargets . NumOcclusionQueries ;
2020-12-04 12:07:09 -04:00
RenderPassInfo . SubpassHint = RenderTargets . SubpassHint ;
RenderPassInfo . MultiViewCount = RenderTargets . MultiViewCount ;
2021-02-18 18:13:28 -04:00
RenderPassInfo . ShadingRateTexture = RenderTargets . ShadingRateTexture ? RenderTargets . ShadingRateTexture - > GetRHI ( ) : nullptr ;
2021-04-08 14:32:07 -04:00
// @todo: should define this as a state that gets passed through? Max seems appropriate for now.
RenderPassInfo . ShadingRateTextureCombiner = RenderPassInfo . ShadingRateTexture . IsValid ( ) ? VRSRB_Max : VRSRB_Passthrough ;
2020-09-24 00:43:27 -04:00
return RenderPassInfo ;
2020-07-06 18:58:26 -04:00
}
2024-08-19 16:29:07 -04:00
FRHICommandList * FRDGDispatchPassBuilder : : CreateCommandList ( )
{
FRHICommandList * RHICmdList = new FRHICommandList ( Pass - > GetGPUMask ( ) ) ;
RHICmdList - > SwitchPipeline ( Pass - > GetPipeline ( ) ) ;
// When parallel executing, the pass commands are embedded directly into the first command list.
if ( Pass - > bParallelExecute & & Pass - > CommandLists . IsEmpty ( ) )
{
FRDGBuilder : : PushPreScopes ( * RHICmdList , Pass ) ;
FRDGBuilder : : ExecutePassPrologue ( * RHICmdList , Pass ) ;
}
if ( RenderPassInfo )
{
RHICmdList - > BeginRenderPass ( * RenderPassInfo , TEXT ( " DispatchPass " ) ) ;
}
RHICmdList - > SetStaticUniformBuffers ( StaticUniformBuffers ) ;
2024-08-20 16:41:43 -04:00
Pass - > CommandLists . Emplace ( RHICmdList ) ;
2024-08-19 16:29:07 -04:00
return RHICmdList ;
}
void FRDGDispatchPassBuilder : : Finish ( )
{
// With serial execution the pass commands are embedded in the immediate command list instead.
if ( ! Pass - > bParallelExecute )
{
Pass - > CommandListsEvent . Trigger ( ) ;
return ;
}
const bool bEmptyCommandLists = Pass - > CommandLists . IsEmpty ( ) ;
// Create a command list to embed the epilogue (and prologue as well if no user command lists were requested).
FRHICommandList * RHICmdList = new FRHICommandList ( Pass - > GetGPUMask ( ) ) ;
Pass - > CommandLists . Emplace ( RHICmdList ) ;
Pass - > CommandListsEvent . Trigger ( ) ;
RHICmdList - > SwitchPipeline ( Pass - > GetPipeline ( ) ) ;
if ( bEmptyCommandLists )
{
FRDGBuilder : : PushPreScopes ( * RHICmdList , Pass ) ;
FRDGBuilder : : ExecutePassPrologue ( * RHICmdList , Pass ) ;
}
FRDGBuilder : : ExecutePassEpilogue ( * RHICmdList , Pass ) ;
FRDGBuilder : : PopPreScopes ( * RHICmdList , Pass ) ;
RHICmdList - > FinishRecording ( ) ;
}
2021-05-19 17:54:58 -04:00
FRDGBarrierBatchBegin : : FRDGBarrierBatchBegin ( ERHIPipeline InPipelineToBegin , ERHIPipeline InPipelinesToEnd , const TCHAR * InDebugName , FRDGPass * InDebugPass )
: PipelinesToBegin ( InPipelineToBegin )
, PipelinesToEnd ( InPipelinesToEnd )
# if RDG_ENABLE_DEBUG
, DebugPasses ( InPlace , nullptr )
, DebugName ( InDebugName )
# endif
2020-07-06 18:58:26 -04:00
{
2021-05-19 17:54:58 -04:00
# if RDG_ENABLE_DEBUG
DebugPasses [ InPipelineToBegin ] = InDebugPass ;
# endif
2020-07-06 18:58:26 -04:00
}
2021-05-19 17:54:58 -04:00
FRDGBarrierBatchBegin : : FRDGBarrierBatchBegin ( ERHIPipeline InPipelinesToBegin , ERHIPipeline InPipelinesToEnd , const TCHAR * InDebugName , FRDGPassesByPipeline InDebugPasses )
2020-11-11 19:22:36 -04:00
: PipelinesToBegin ( InPipelinesToBegin )
, PipelinesToEnd ( InPipelinesToEnd )
# if RDG_ENABLE_DEBUG
, DebugPasses ( InDebugPasses )
, DebugName ( InDebugName )
# endif
2021-05-19 17:54:58 -04:00
{ }
2020-07-06 18:58:26 -04:00
2024-01-22 11:04:48 -05:00
void FRDGBarrierBatchBegin : : AddTransition ( FRDGViewableResource * Resource , FRDGTransitionInfo Info )
2020-07-06 18:58:26 -04:00
{
Transitions . Add ( Info ) ;
2020-11-11 19:22:36 -04:00
bTransitionNeeded = true ;
2020-09-24 00:43:27 -04:00
2022-11-09 04:11:18 -05:00
# if RDG_STATS
2020-09-24 00:43:27 -04:00
GRDGStatTransitionCount + + ;
# endif
# if RDG_ENABLE_DEBUG
2021-03-17 12:44:59 -04:00
DebugTransitionResources . Add ( Resource ) ;
# endif
}
2022-03-25 11:19:10 -04:00
void FRDGBarrierBatchBegin : : AddAlias ( FRDGViewableResource * Resource , const FRHITransientAliasingInfo & Info )
2021-03-17 12:44:59 -04:00
{
Aliases . Add ( Info ) ;
bTransitionNeeded = true ;
2022-11-09 04:11:18 -05:00
# if RDG_STATS
2021-03-17 12:44:59 -04:00
GRDGStatAliasingCount + + ;
# endif
# if RDG_ENABLE_DEBUG
DebugAliasingResources . Add ( Resource ) ;
2020-09-24 00:43:27 -04:00
# endif
2020-07-06 18:58:26 -04:00
}
2024-01-22 11:04:48 -05:00
void FRDGBarrierBatchBegin : : CreateTransition ( TConstArrayView < FRHITransitionInfo > TransitionsRHI )
2021-05-19 17:54:58 -04:00
{
check ( bTransitionNeeded & & ! Transition ) ;
2024-01-22 11:04:48 -05:00
Transition = RHICreateTransition ( FRHITransitionCreateInfo ( PipelinesToBegin , PipelinesToEnd , TransitionFlags , TransitionsRHI , Aliases ) ) ;
2024-10-16 05:44:42 -04:00
if ( bSeparateFenceTransitionNeeded )
{
SeparateFenceTransition = RHICreateTransition ( FRHITransitionCreateInfo ( PipelinesToBegin , PipelinesToEnd ) ) ;
}
2021-05-19 17:54:58 -04:00
}
2020-11-11 19:22:36 -04:00
void FRDGBarrierBatchBegin : : Submit ( FRHIComputeCommandList & RHICmdList , ERHIPipeline Pipeline , FRDGTransitionQueue & TransitionsToBegin )
2020-07-06 18:58:26 -04:00
{
2024-10-16 05:44:42 -04:00
if ( SeparateFenceTransition )
{
TransitionsToBegin . Emplace ( SeparateFenceTransition ) ;
}
2020-11-11 19:22:36 -04:00
if ( Transition )
{
2021-05-19 17:54:58 -04:00
TransitionsToBegin . Emplace ( Transition ) ;
2020-11-11 19:22:36 -04:00
}
2020-09-24 00:43:27 -04:00
2022-11-09 04:11:18 -05:00
# if RDG_STATS
2020-11-11 19:22:36 -04:00
GRDGStatTransitionBatchCount + + ;
2020-09-24 00:43:27 -04:00
# endif
2020-07-06 18:58:26 -04:00
}
2022-05-02 18:31:37 -04:00
FRDGBarrierBatchEndId FRDGBarrierBatchEnd : : GetId ( ) const
{
return FRDGBarrierBatchEndId ( Pass - > GetHandle ( ) , BarrierLocation ) ;
}
bool FRDGBarrierBatchEnd : : IsPairedWith ( const FRDGBarrierBatchBegin & BeginBatch ) const
{
return GetId ( ) = = BeginBatch . BarriersToEnd [ Pass - > GetPipeline ( ) ] ;
}
2020-11-11 19:22:36 -04:00
void FRDGBarrierBatchBegin : : Submit ( FRHIComputeCommandList & RHICmdList , ERHIPipeline Pipeline )
2020-07-06 18:58:26 -04:00
{
2020-11-11 19:22:36 -04:00
FRDGTransitionQueue TransitionsToBegin ;
Submit ( RHICmdList , Pipeline , TransitionsToBegin ) ;
2021-05-19 17:54:58 -04:00
if ( ! TransitionsToBegin . IsEmpty ( ) )
{
RHICmdList . BeginTransitions ( TransitionsToBegin ) ;
}
2020-09-24 00:43:27 -04:00
}
2020-07-06 18:58:26 -04:00
void FRDGBarrierBatchEnd : : AddDependency ( FRDGBarrierBatchBegin * BeginBatch )
{
2020-12-07 18:45:31 -04:00
# if RDG_ENABLE_DEBUG
check ( BeginBatch ) ;
2024-03-06 06:47:07 -05:00
for ( ERHIPipeline Pipeline : MakeFlagsRange ( ERHIPipeline : : All ) )
2020-12-07 18:45:31 -04:00
{
2021-05-19 17:54:58 -04:00
const FRDGPass * BeginPass = BeginBatch - > DebugPasses [ Pipeline ] ;
if ( BeginPass )
2020-12-07 18:45:31 -04:00
{
2021-05-19 17:54:58 -04:00
checkf ( BeginPass - > GetHandle ( ) < = Pass - > GetHandle ( ) , TEXT ( " A transition end batch for pass %s is dependent on begin batch for pass %s. " ) , Pass - > GetName ( ) , BeginPass - > GetName ( ) ) ;
2020-12-07 18:45:31 -04:00
}
}
# endif
2021-07-13 12:38:27 -04:00
{
2022-05-02 18:31:37 -04:00
const FRDGBarrierBatchEndId Id = GetId ( ) ;
2021-07-13 12:38:27 -04:00
FRDGBarrierBatchEndId & EarliestEndId = BeginBatch - > BarriersToEnd [ Pass - > GetPipeline ( ) ] ;
if ( EarliestEndId = = Id )
{
return ;
}
const FRDGBarrierBatchEndId MinId (
FRDGPassHandle : : Min ( EarliestEndId . PassHandle , Id . PassHandle ) ,
( ERDGBarrierLocation ) FMath : : Min ( ( int32 ) EarliestEndId . BarrierLocation , ( int32 ) Id . BarrierLocation ) ) ;
if ( MinId = = Id )
{
Dependencies . Add ( BeginBatch ) ;
EarliestEndId = MinId ;
}
}
2020-07-06 18:58:26 -04:00
}
2020-11-11 19:22:36 -04:00
void FRDGBarrierBatchEnd : : Submit ( FRHIComputeCommandList & RHICmdList , ERHIPipeline Pipeline )
2020-07-06 18:58:26 -04:00
{
2021-07-13 12:38:27 -04:00
const FRDGBarrierBatchEndId Id ( Pass - > GetHandle ( ) , BarrierLocation ) ;
2021-05-19 17:54:58 -04:00
FRDGTransitionQueue Transitions ;
Transitions . Reserve ( Dependencies . Num ( ) ) ;
2020-07-06 18:58:26 -04:00
for ( FRDGBarrierBatchBegin * Dependent : Dependencies )
{
2021-07-13 12:38:27 -04:00
if ( Dependent - > BarriersToEnd [ Pipeline ] = = Id )
2020-07-06 18:58:26 -04:00
{
2024-10-16 05:44:42 -04:00
if ( Dependent - > SeparateFenceTransition )
{
Transitions . Emplace ( Dependent - > SeparateFenceTransition ) ;
}
2021-05-19 17:54:58 -04:00
Transitions . Emplace ( Dependent - > Transition ) ;
2020-07-06 18:58:26 -04:00
}
}
2021-05-19 17:54:58 -04:00
if ( ! Transitions . IsEmpty ( ) )
{
RHICmdList . EndTransitions ( Transitions ) ;
}
2020-07-06 18:58:26 -04:00
}
2021-05-19 17:54:58 -04:00
FRDGBarrierBatchBegin & FRDGPass : : GetPrologueBarriersToBegin ( FRDGAllocator & Allocator , FRDGTransitionCreateQueue & CreateQueue )
2020-09-24 00:43:27 -04:00
{
if ( ! PrologueBarriersToBegin )
{
2020-11-11 19:22:36 -04:00
PrologueBarriersToBegin = Allocator . AllocNoDestruct < FRDGBarrierBatchBegin > ( Pipeline , Pipeline , TEXT ( " Prologue " ) , this ) ;
2021-05-19 17:54:58 -04:00
CreateQueue . Emplace ( PrologueBarriersToBegin ) ;
2020-09-24 00:43:27 -04:00
}
return * PrologueBarriersToBegin ;
}
2021-05-19 17:54:58 -04:00
FRDGBarrierBatchBegin & FRDGPass : : GetEpilogueBarriersToBeginForGraphics ( FRDGAllocator & Allocator , FRDGTransitionCreateQueue & CreateQueue )
2020-09-24 00:43:27 -04:00
{
2021-05-19 17:54:58 -04:00
if ( ! EpilogueBarriersToBeginForGraphics . IsTransitionNeeded ( ) )
2020-09-24 00:43:27 -04:00
{
2021-05-19 17:54:58 -04:00
EpilogueBarriersToBeginForGraphics . Reserve ( TextureStates . Num ( ) + BufferStates . Num ( ) ) ;
CreateQueue . Emplace ( & EpilogueBarriersToBeginForGraphics ) ;
2020-09-24 00:43:27 -04:00
}
2021-05-19 17:54:58 -04:00
return EpilogueBarriersToBeginForGraphics ;
2020-09-24 00:43:27 -04:00
}
2021-05-19 17:54:58 -04:00
FRDGBarrierBatchBegin & FRDGPass : : GetEpilogueBarriersToBeginForAsyncCompute ( FRDGAllocator & Allocator , FRDGTransitionCreateQueue & CreateQueue )
2020-09-24 00:43:27 -04:00
{
if ( ! EpilogueBarriersToBeginForAsyncCompute )
{
2020-11-11 19:22:36 -04:00
EpilogueBarriersToBeginForAsyncCompute = Allocator . AllocNoDestruct < FRDGBarrierBatchBegin > ( Pipeline , ERHIPipeline : : AsyncCompute , GetEpilogueBarriersToBeginDebugName ( ERHIPipeline : : AsyncCompute ) , this ) ;
2021-05-19 17:54:58 -04:00
CreateQueue . Emplace ( EpilogueBarriersToBeginForAsyncCompute ) ;
2020-09-24 00:43:27 -04:00
}
return * EpilogueBarriersToBeginForAsyncCompute ;
}
2021-05-19 17:54:58 -04:00
FRDGBarrierBatchBegin & FRDGPass : : GetEpilogueBarriersToBeginForAll ( FRDGAllocator & Allocator , FRDGTransitionCreateQueue & CreateQueue )
2020-11-11 19:22:36 -04:00
{
if ( ! EpilogueBarriersToBeginForAll )
{
2024-04-15 17:15:11 -04:00
EpilogueBarriersToBeginForAll = Allocator . AllocNoDestruct < FRDGBarrierBatchBegin > ( Pipeline , ERHIPipeline : : All , GetEpilogueBarriersToBeginDebugName ( ERHIPipeline : : All ) , this ) ;
2021-05-19 17:54:58 -04:00
CreateQueue . Emplace ( EpilogueBarriersToBeginForAll ) ;
2020-11-11 19:22:36 -04:00
}
return * EpilogueBarriersToBeginForAll ;
}
FRDGBarrierBatchEnd & FRDGPass : : GetPrologueBarriersToEnd ( FRDGAllocator & Allocator )
{
2021-05-19 17:54:58 -04:00
return PrologueBarriersToEnd ;
2020-11-11 19:22:36 -04:00
}
FRDGBarrierBatchEnd & FRDGPass : : GetEpilogueBarriersToEnd ( FRDGAllocator & Allocator )
{
if ( ! EpilogueBarriersToEnd )
{
2021-07-13 12:38:27 -04:00
EpilogueBarriersToEnd = Allocator . AllocNoDestruct < FRDGBarrierBatchEnd > ( this , ERDGBarrierLocation : : Epilogue ) ;
2020-11-11 19:22:36 -04:00
}
return * EpilogueBarriersToEnd ;
}
2019-06-11 18:27:07 -04:00
FRDGPass : : FRDGPass (
FRDGEventName & & InName ,
2020-09-24 00:43:27 -04:00
FRDGParameterStruct InParameterStruct ,
2024-09-03 11:39:06 -04:00
ERDGPassFlags InFlags ,
ERDGPassTaskMode InTaskMode )
2020-07-06 18:58:26 -04:00
: Name ( Forward < FRDGEventName & & > ( InName ) )
2019-06-11 18:27:07 -04:00
, ParameterStruct ( InParameterStruct )
2020-07-06 18:58:26 -04:00
, Flags ( InFlags )
2024-09-03 11:39:06 -04:00
, TaskMode ( InTaskMode )
2020-09-24 00:43:27 -04:00
, Pipeline ( EnumHasAnyFlags ( Flags , ERDGPassFlags : : AsyncCompute ) ? ERHIPipeline : : AsyncCompute : ERHIPipeline : : Graphics )
2021-07-13 12:38:27 -04:00
, PrologueBarriersToEnd ( this , ERDGBarrierLocation : : Prologue )
2021-05-19 17:54:58 -04:00
, EpilogueBarriersToBeginForGraphics ( Pipeline , ERHIPipeline : : Graphics , GetEpilogueBarriersToBeginDebugName ( ERHIPipeline : : Graphics ) , this )
2019-09-14 09:45:25 -04:00
{ }
2019-06-11 18:27:07 -04:00
2020-09-24 00:43:27 -04:00
# if RDG_ENABLE_DEBUG
const TCHAR * FRDGPass : : GetName ( ) const
{
// When in debug runtime mode, use the full path name.
if ( ! FullPathIfDebug . IsEmpty ( ) )
{
return * FullPathIfDebug ;
}
else
{
return Name . GetTCHAR ( ) ;
}
}
2023-01-27 14:54:10 -05:00
# endif