UMA direct access WIP.

This commit is contained in:
Branimir Karadžić
2017-12-08 22:55:18 -08:00
parent 66dfeaa699
commit 11d0ec5dd1
2 changed files with 44 additions and 9 deletions

View File

@@ -381,6 +381,7 @@ namespace bgfx { namespace d3d12
enum Enum
{
Default,
Texture,
Upload,
ReadBack,
@@ -391,14 +392,31 @@ namespace bgfx { namespace d3d12
D3D12_RESOURCE_STATES m_state;
};
static const HeapProperty s_heapProperties[] =
static HeapProperty s_heapProperties[] =
{
{ { D3D12_HEAP_TYPE_DEFAULT, D3D12_CPU_PAGE_PROPERTY_UNKNOWN, D3D12_MEMORY_POOL_UNKNOWN, 1, 1 }, D3D12_RESOURCE_STATE_COMMON },
{ { D3D12_HEAP_TYPE_UPLOAD, D3D12_CPU_PAGE_PROPERTY_UNKNOWN, D3D12_MEMORY_POOL_UNKNOWN, 1, 1 }, D3D12_RESOURCE_STATE_GENERIC_READ },
{ { D3D12_HEAP_TYPE_READBACK, D3D12_CPU_PAGE_PROPERTY_UNKNOWN, D3D12_MEMORY_POOL_UNKNOWN, 1, 1 }, D3D12_RESOURCE_STATE_COPY_DEST },
{ { D3D12_HEAP_TYPE_DEFAULT, D3D12_CPU_PAGE_PROPERTY_UNKNOWN, D3D12_MEMORY_POOL_UNKNOWN, 0, 0 }, D3D12_RESOURCE_STATE_COMMON },
{ { D3D12_HEAP_TYPE_DEFAULT, D3D12_CPU_PAGE_PROPERTY_UNKNOWN, D3D12_MEMORY_POOL_UNKNOWN, 0, 0 }, D3D12_RESOURCE_STATE_COMMON },
{ { D3D12_HEAP_TYPE_UPLOAD, D3D12_CPU_PAGE_PROPERTY_UNKNOWN, D3D12_MEMORY_POOL_UNKNOWN, 0, 0 }, D3D12_RESOURCE_STATE_GENERIC_READ },
{ { D3D12_HEAP_TYPE_READBACK, D3D12_CPU_PAGE_PROPERTY_UNKNOWN, D3D12_MEMORY_POOL_UNKNOWN, 0, 0 }, D3D12_RESOURCE_STATE_COPY_DEST },
};
BX_STATIC_ASSERT(BX_COUNTOF(s_heapProperties) == HeapProperty::Count);
static void initHeapProperties(ID3D12Device* _device, D3D12_HEAP_PROPERTIES& _properties)
{
if (D3D12_HEAP_TYPE_CUSTOM != _properties.Type)
{
_properties = _device->GetCustomHeapProperties(1, _properties.Type);
}
}
static void initHeapProperties(ID3D12Device* _device)
{
initHeapProperties(_device, s_heapProperties[HeapProperty::Default ].m_properties);
initHeapProperties(_device, s_heapProperties[HeapProperty::Texture ].m_properties);
initHeapProperties(_device, s_heapProperties[HeapProperty::Upload ].m_properties);
initHeapProperties(_device, s_heapProperties[HeapProperty::ReadBack].m_properties);
}
ID3D12Resource* createCommittedResource(ID3D12Device* _device, HeapProperty::Enum _heapProperty, D3D12_RESOURCE_DESC* _resourceDesc, D3D12_CLEAR_VALUE* _clearValue)
{
const HeapProperty& heapProperty = s_heapProperties[_heapProperty];
@@ -874,6 +892,8 @@ namespace bgfx { namespace d3d12
BX_TRACE("\tCrossNodeSharingTier %d", m_options.CrossNodeSharingTier);
BX_TRACE("\tResourceHeapTier %d", m_options.ResourceHeapTier);
initHeapProperties(m_device);
m_cmd.init(m_device);
errorState = ErrorState::CreatedCommandQueue;
@@ -1492,8 +1512,7 @@ namespace bgfx { namespace d3d12
void* createTexture(TextureHandle _handle, Memory* _mem, uint32_t _flags, uint8_t _skip) override
{
m_textures[_handle.idx].create(_mem, _flags, _skip);
return NULL;
return m_textures[_handle.idx].create(_mem, _flags, _skip);
}
void updateTextureBegin(TextureHandle /*_handle*/, uint8_t /*_side*/, uint8_t /*_mip*/) override
@@ -4103,7 +4122,7 @@ data.NumQualityLevels = 0;
bx::read(&reader, m_size);
}
void TextureD3D12::create(const Memory* _mem, uint32_t _flags, uint8_t _skip)
void* TextureD3D12::create(const Memory* _mem, uint32_t _flags, uint8_t _skip)
{
bimg::ImageContainer imageContainer;
@@ -4415,7 +4434,13 @@ data.NumQualityLevels = 0;
break;
}
m_ptr = createCommittedResource(device, HeapProperty::Default, &resourceDesc, clearValue);
m_ptr = createCommittedResource(device, HeapProperty::Texture, &resourceDesc, clearValue);
if (kk != 0)
{
// void* directAccessPtr;
// DX_CHECK(m_ptr->Map(0, NULL, &directAccessPtr) );
}
{
uint64_t uploadBufferSize;
@@ -4479,12 +4504,20 @@ data.NumQualityLevels = 0;
}
}
}
return m_directAccessPtr;
}
void TextureD3D12::destroy()
{
if (NULL != m_ptr)
{
if (NULL != m_directAccessPtr)
{
m_ptr->Unmap(0, NULL);
m_directAccessPtr = NULL;
}
s_renderD3D12->m_cmd.release(m_ptr);
m_ptr = NULL;
}

View File

@@ -268,6 +268,7 @@ namespace bgfx { namespace d3d12
TextureD3D12()
: m_ptr(NULL)
, m_directAccessPtr(NULL)
, m_state(D3D12_RESOURCE_STATE_COMMON)
, m_numMips(0)
{
@@ -275,7 +276,7 @@ namespace bgfx { namespace d3d12
bx::memSet(&m_uavd, 0, sizeof(m_uavd) );
}
void create(const Memory* _mem, uint32_t _flags, uint8_t _skip);
void* create(const Memory* _mem, uint32_t _flags, uint8_t _skip);
void destroy();
void update(ID3D12GraphicsCommandList* _commandList, uint8_t _side, uint8_t _mip, const Rect& _rect, uint16_t _z, uint16_t _depth, uint16_t _pitch, const Memory* _mem);
void resolve();
@@ -284,6 +285,7 @@ namespace bgfx { namespace d3d12
D3D12_SHADER_RESOURCE_VIEW_DESC m_srvd;
D3D12_UNORDERED_ACCESS_VIEW_DESC m_uavd;
ID3D12Resource* m_ptr;
void* m_directAccessPtr;
D3D12_RESOURCE_STATES m_state;
uint32_t m_flags;
uint32_t m_width;