Files
UnrealEngine/Engine/Source/Runtime/D3D12RHI/Private/D3D12TextureReference.h
Brandyn / Techy fcc1b09210 init
2026-04-04 15:40:51 -05:00

78 lines
2.7 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "D3D12RHIPrivate.h"
#include "RHITextureReference.h"
class FD3D12RHITextureReference;
/** Resource which might needs to be notified about changes on replaced referenced textures */
struct FD3D12TextureReferenceReplaceListener
{
virtual void TextureReplaced(FD3D12ContextArray const& Contexts, FD3D12RHITextureReference* TextureReference, FD3D12Texture* CurrentTexture, FD3D12Texture* NewTexture) = 0;
};
class FD3D12RHITextureReference : public FD3D12DeviceChild, public FRHITextureReference, public FD3D12LinkedAdapterObject<FD3D12RHITextureReference>
#if PLATFORM_SUPPORTS_BINDLESS_RENDERING
, public FD3D12ShaderResourceRenameListener
#endif
{
public:
FD3D12RHITextureReference() = delete;
FD3D12RHITextureReference(FD3D12Device* InDevice, FD3D12Texture* InReferencedTexture, FD3D12RHITextureReference* FirstLinkedObject);
~FD3D12RHITextureReference();
#if PLATFORM_SUPPORTS_BINDLESS_RENDERING
// FD3D12ShaderResourceRenameListener
virtual void ResourceRenamed(FD3D12ContextArray const& Contexts, FD3D12BaseShaderResource* InRenamedResource, FD3D12ResourceLocation* InNewResourceLocation) final override;
#endif // PLATFORM_SUPPORTS_BINDLESS_RENDERING
void SwitchToNewTexture(FD3D12ContextArray const& Contexts, FD3D12Texture* InNewTexture);
#if PLATFORM_SUPPORTS_BINDLESS_RENDERING
uint32 ReferencedDescriptorVersion{};
#endif
void AddReplaceListener(FD3D12TextureReferenceReplaceListener* InListener)
{
FScopeLock Lock(&TextureReplaceListenersCS);
check(!TextureReplaceListeners.Contains(InListener));
TextureReplaceListeners.Add(InListener);
}
void RemoveReplaceListener(FD3D12TextureReferenceReplaceListener* InListener)
{
FScopeLock Lock(&TextureReplaceListenersCS);
uint32 Removed = TextureReplaceListeners.Remove(InListener);
checkf(Removed == 1, TEXT("Should have exactly one registered listener during remove (same listener shouldn't registered twice and we shouldn't call this if not registered"));
}
private:
bool HasListeners() const
{
FScopeLock Lock(&TextureReplaceListenersCS);
return TextureReplaceListeners.Num() != 0;
}
void NotifyListeners(FD3D12ContextArray const& Contexts, FD3D12Texture* CurrentTexture, FD3D12Texture* NewTexture)
{
FScopeLock Lock(&TextureReplaceListenersCS);
for (FD3D12TextureReferenceReplaceListener* ReplaceListener : TextureReplaceListeners)
{
ReplaceListener->TextureReplaced(Contexts, this, CurrentTexture, NewTexture);
}
}
mutable FCriticalSection TextureReplaceListenersCS;
TArray<FD3D12TextureReferenceReplaceListener*> TextureReplaceListeners;
};
template<>
struct TD3D12ResourceTraits<FRHITextureReference>
{
using TConcreteType = FD3D12RHITextureReference;
};