Skip to content

Commit 0f6c391

Browse files
azhirnovTheMostDiligent
authored andcommitted
Added aliasing barrier for NVApi resources
1 parent 1edf9ce commit 0f6c391

File tree

4 files changed

+36
-8
lines changed

4 files changed

+36
-8
lines changed

Graphics/GraphicsEngineD3D11/src/DeviceContextD3D11Impl.cpp

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2009,16 +2009,20 @@ static void AliasingBarrier(ID3D11DeviceContext* pd3d11Ctx, IDeviceObject* pReso
20092009
{
20102010
DEV_CHECK_ERR(CComQIPtr<ID3D11DeviceContext2>{pd3d11Ctx}, "Failed to query ID3D11DeviceContext2");
20112011
auto* pd3d11DeviceContext2 = static_cast<ID3D11DeviceContext2*>(pd3d11Ctx);
2012+
bool UseNVApi = false;
20122013

2013-
auto GetD3D11Resource = [](IDeviceObject* pResource) -> ID3D11Resource* //
2014+
auto GetD3D11Resource = [&UseNVApi](IDeviceObject* pResource) -> ID3D11Resource* //
20142015
{
20152016
if (RefCntAutoPtr<ITextureD3D11> pTexture{pResource, IID_TextureD3D11})
20162017
{
2018+
const auto* pTexD3D11 = pTexture.RawPtr<const TextureBaseD3D11>();
2019+
if (pTexD3D11->IsUsingNVApi())
2020+
UseNVApi = true;
20172021
return pTexture->GetD3D11Texture();
20182022
}
20192023
else if (RefCntAutoPtr<IBufferD3D11> pBuffer{pResource, IID_BufferD3D11})
20202024
{
2021-
return pBuffer->GetD3D11Buffer();
2025+
return pBuffer.RawPtr<BufferD3D11Impl>()->GetD3D11Buffer();
20222026
}
20232027
else
20242028
{
@@ -2029,7 +2033,17 @@ static void AliasingBarrier(ID3D11DeviceContext* pd3d11Ctx, IDeviceObject* pReso
20292033
auto* pd3d11ResourceBefore = GetD3D11Resource(pResourceBefore);
20302034
auto* pd3d11ResourceAfter = GetD3D11Resource(pResourceAfter);
20312035

2032-
pd3d11DeviceContext2->TiledResourceBarrier(pd3d11ResourceBefore, pd3d11ResourceAfter);
2036+
#ifdef DILIGENT_ENABLE_D3D_NVAPI
2037+
if (UseNVApi)
2038+
{
2039+
NvAPI_D3D11_TiledResourceBarrier(pd3d11DeviceContext2, pd3d11ResourceBefore, pd3d11ResourceAfter);
2040+
}
2041+
else
2042+
#endif
2043+
{
2044+
VERIFY_EXPR(!UseNVApi);
2045+
pd3d11DeviceContext2->TiledResourceBarrier(pd3d11ResourceBefore, pd3d11ResourceAfter);
2046+
}
20332047
}
20342048

20352049
void DeviceContextD3D11Impl::TransitionResourceStates(Uint32 BarrierCount, const StateTransitionDesc* pResourceBarriers)

Graphics/GraphicsEngineD3D12/include/TextureD3D12Impl.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ class TextureD3D12Impl final : public TextureBase<EngineD3D12ImplTraits>, public
6565
IMPLEMENT_QUERY_INTERFACE_IN_PLACE(IID_TextureD3D12, TTextureBase)
6666

6767
/// Implementation of ITextureD3D12::GetD3D12Texture().
68-
virtual ID3D12Resource* DILIGENT_CALL_TYPE GetD3D12Texture() override final { return GetD3D12Resource(); }
68+
virtual ID3D12Resource* DILIGENT_CALL_TYPE GetD3D12Texture() const override final { return GetD3D12Resource(); }
6969

7070
/// Implementation of ITexture::GetNativeHandle() in Direct3D12 backend.
7171
virtual Uint64 DILIGENT_CALL_TYPE GetNativeHandle() override final { return BitCast<Uint64>(GetD3D12Texture()); }

Graphics/GraphicsEngineD3D12/interface/TextureD3D12.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ DILIGENT_BEGIN_INTERFACE(ITextureD3D12, ITexture)
5454

5555
/// The method does *NOT* increment the reference counter of the returned object,
5656
/// so Release() must not be called.
57-
VIRTUAL ID3D12Resource* METHOD(GetD3D12Texture)(THIS) PURE;
57+
VIRTUAL ID3D12Resource* METHOD(GetD3D12Texture)(THIS) CONST PURE;
5858

5959
/// Sets the texture usage state
6060

Graphics/GraphicsEngineD3D12/src/DeviceContextD3D12Impl.cpp

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2354,11 +2354,15 @@ void DeviceContextD3D12Impl::EndQuery(IQuery* pQuery)
23542354

23552355
static void AliasingBarrier(CommandContext& CmdCtx, IDeviceObject* pResourceBefore, IDeviceObject* pResourceAfter)
23562356
{
2357-
auto GetD3D12Resource = [](IDeviceObject* pResource) -> ID3D12Resource* //
2357+
bool UseNVApi = false;
2358+
auto GetD3D12Resource = [&UseNVApi](IDeviceObject* pResource) -> ID3D12Resource* //
23582359
{
23592360
if (RefCntAutoPtr<ITextureD3D12> pTexture{pResource, IID_TextureD3D12})
23602361
{
2361-
return pTexture.RawPtr<TextureD3D12Impl>()->GetD3D12Texture();
2362+
const auto* pTexD3D12 = pTexture.RawPtr<const TextureD3D12Impl>();
2363+
if (pTexD3D12->IsUsingNVApi())
2364+
UseNVApi = true;
2365+
return pTexD3D12->GetD3D12Texture();
23622366
}
23632367
else if (RefCntAutoPtr<IBufferD3D12> pBuffer{pResource, IID_BufferD3D12})
23642368
{
@@ -2376,7 +2380,17 @@ static void AliasingBarrier(CommandContext& CmdCtx, IDeviceObject* pResourceBefo
23762380
Barrier.Aliasing.pResourceBefore = GetD3D12Resource(pResourceBefore);
23772381
Barrier.Aliasing.pResourceAfter = GetD3D12Resource(pResourceAfter);
23782382

2379-
CmdCtx.ResourceBarrier(Barrier);
2383+
#ifdef DILIGENT_ENABLE_D3D_NVAPI
2384+
if (UseNVApi)
2385+
{
2386+
NvAPI_D3D12_ResourceAliasingBarrier(CmdCtx.GetCommandList(), 1, &Barrier);
2387+
}
2388+
else
2389+
#endif
2390+
{
2391+
VERIFY_EXPR(!UseNVApi);
2392+
CmdCtx.ResourceBarrier(Barrier);
2393+
}
23802394
}
23812395

23822396
void DeviceContextD3D12Impl::TransitionResourceStates(Uint32 BarrierCount, const StateTransitionDesc* pResourceBarriers)

0 commit comments

Comments
 (0)