|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "NvCoDx12Resource.h" |
|
|
|
|
|
#include <assert.h> |
|
|
|
|
|
#define NOMINMAX |
|
|
#include <wrl.h> |
|
|
using namespace Microsoft::WRL; |
|
|
|
|
|
namespace nvidia { |
|
|
namespace Common { |
|
|
|
|
|
|
|
|
|
|
|
void Dx12BarrierSubmitter::_flush() |
|
|
{ |
|
|
assert(m_numBarriers > 0); |
|
|
|
|
|
if (m_commandList) |
|
|
{ |
|
|
m_commandList->ResourceBarrier(UINT(m_numBarriers), m_barriers); |
|
|
} |
|
|
m_numBarriers = 0; |
|
|
} |
|
|
|
|
|
D3D12_RESOURCE_BARRIER& Dx12BarrierSubmitter::_expandOne() |
|
|
{ |
|
|
_flush(); |
|
|
return m_barriers[m_numBarriers++]; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Dx12ResourceBase::transition(D3D12_RESOURCE_STATES nextState, Dx12BarrierSubmitter& submitter) |
|
|
{ |
|
|
|
|
|
if (!m_resource) |
|
|
{ |
|
|
return; |
|
|
} |
|
|
|
|
|
if (nextState != m_state) |
|
|
{ |
|
|
D3D12_RESOURCE_BARRIER& barrier = submitter.expandOne(); |
|
|
|
|
|
const UINT subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; |
|
|
const D3D12_RESOURCE_BARRIER_FLAGS flags = D3D12_RESOURCE_BARRIER_FLAG_NONE; |
|
|
|
|
|
memset(&barrier, 0, sizeof(barrier)); |
|
|
barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; |
|
|
barrier.Flags = flags; |
|
|
barrier.Transition.pResource = m_resource; |
|
|
barrier.Transition.StateBefore = m_state; |
|
|
barrier.Transition.StateAfter = nextState; |
|
|
barrier.Transition.Subresource = subresource; |
|
|
|
|
|
m_prevState = m_state; |
|
|
m_state = nextState; |
|
|
} |
|
|
else |
|
|
{ |
|
|
if (nextState == D3D12_RESOURCE_STATE_UNORDERED_ACCESS) |
|
|
{ |
|
|
D3D12_RESOURCE_BARRIER& barrier = submitter.expandOne(); |
|
|
|
|
|
memset(&barrier, 0, sizeof(barrier)); |
|
|
barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_UAV; |
|
|
barrier.UAV.pResource = m_resource; |
|
|
|
|
|
m_state = nextState; |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
DXGI_FORMAT Dx12ResourceBase::calcFormat(DxFormatUtil::UsageType usage, ID3D12Resource* resource) |
|
|
{ |
|
|
return resource ? DxFormatUtil::calcFormat(usage, resource->GetDesc().Format) : DXGI_FORMAT_UNKNOWN; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Dx12Resource::setDebugName(ID3D12Resource* resource, const std::wstring& name) |
|
|
{ |
|
|
if (resource) |
|
|
{ |
|
|
resource->SetName(name.c_str()); |
|
|
} |
|
|
} |
|
|
|
|
|
void Dx12Resource::setDebugName(const std::wstring& name) |
|
|
{ |
|
|
setDebugName(m_resource, name); |
|
|
} |
|
|
|
|
|
void Dx12Resource::setDebugName(const wchar_t* name) |
|
|
{ |
|
|
if (m_resource) |
|
|
{ |
|
|
m_resource->SetName(name); |
|
|
} |
|
|
} |
|
|
|
|
|
void Dx12Resource::setResource(ID3D12Resource* resource, D3D12_RESOURCE_STATES initialState) |
|
|
{ |
|
|
if (resource != m_resource) |
|
|
{ |
|
|
if (resource) |
|
|
{ |
|
|
resource->AddRef(); |
|
|
} |
|
|
if (m_resource) |
|
|
{ |
|
|
m_resource->Release(); |
|
|
} |
|
|
m_resource = resource; |
|
|
} |
|
|
m_prevState = initialState; |
|
|
m_state = initialState; |
|
|
} |
|
|
|
|
|
void Dx12Resource::setResourceNull() |
|
|
{ |
|
|
if (m_resource) |
|
|
{ |
|
|
m_resource->Release(); |
|
|
m_resource = nullptr; |
|
|
} |
|
|
} |
|
|
|
|
|
int Dx12Resource::initCommitted(ID3D12Device* device, const D3D12_HEAP_PROPERTIES& heapProps, D3D12_HEAP_FLAGS heapFlags, const D3D12_RESOURCE_DESC& resourceDesc, D3D12_RESOURCE_STATES initState, const D3D12_CLEAR_VALUE * clearValue) |
|
|
{ |
|
|
setResourceNull(); |
|
|
ComPtr<ID3D12Resource> resource; |
|
|
NV_RETURN_ON_FAIL(device->CreateCommittedResource(&heapProps, heapFlags, &resourceDesc, initState, clearValue, IID_PPV_ARGS(&resource))); |
|
|
setResource(resource.Get(), initState); |
|
|
return NV_OK; |
|
|
} |
|
|
|
|
|
ID3D12Resource* Dx12Resource::detach() |
|
|
{ |
|
|
ID3D12Resource* resource = m_resource; |
|
|
m_resource = nullptr; |
|
|
return resource; |
|
|
} |
|
|
|
|
|
void Dx12Resource::swap(ComPtr<ID3D12Resource>& resourceInOut) |
|
|
{ |
|
|
ID3D12Resource* tmp = m_resource; |
|
|
m_resource = resourceInOut.Detach(); |
|
|
resourceInOut.Attach(tmp); |
|
|
} |
|
|
|
|
|
void Dx12Resource::setState(D3D12_RESOURCE_STATES state) |
|
|
{ |
|
|
m_prevState = state; |
|
|
m_state = state; |
|
|
} |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|