D3D12: Add helper for offsetting descriptors

This commit is contained in:
Connor McLaughlin 2021-07-30 00:40:51 +10:00
parent cb1e15da58
commit aff9f1c25f
2 changed files with 42 additions and 14 deletions

View File

@ -51,7 +51,7 @@ void DescriptorHeapManager::Destroy()
m_free_slots.clear(); m_free_slots.clear();
} }
bool DescriptorHeapManager::Allocate(DescriptorHandle* handle) bool DescriptorHeapManager::Allocate(DescriptorHandle* handle, u32 count /* = 1 */)
{ {
// Start past the temporary slots, no point in searching those. // Start past the temporary slots, no point in searching those.
for (u32 group = 0; group < m_free_slots.size(); group++) for (u32 group = 0; group < m_free_slots.size(); group++)
@ -64,11 +64,22 @@ bool DescriptorHeapManager::Allocate(DescriptorHandle* handle)
for (; bit < BITSET_SIZE; bit++) for (; bit < BITSET_SIZE; bit++)
{ {
if (bs[bit]) if (bs[bit])
break; {
u32 offset;
for (offset = 0; offset < count; offset++)
{
if (!bs[bit + offset])
break;
}
if (offset == count)
break;
}
} }
u32 index = group * BITSET_SIZE + bit; u32 index = group * BITSET_SIZE + bit;
bs[bit] = false; for (u32 offset = 0; offset < count; offset++)
bs[bit + offset] = false;
handle->index = index; handle->index = index;
handle->cpu_handle.ptr = m_heap_base_cpu.ptr + index * m_descriptor_increment_size; handle->cpu_handle.ptr = m_heap_base_cpu.ptr + index * m_descriptor_increment_size;
@ -80,21 +91,24 @@ bool DescriptorHeapManager::Allocate(DescriptorHandle* handle)
return false; return false;
} }
void DescriptorHeapManager::Free(u32 index) void DescriptorHeapManager::Free(u32 index, u32 count /* = 1 */)
{ {
Assert(index < m_num_descriptors); Assert(index < m_num_descriptors);
u32 group = index / BITSET_SIZE; for (u32 i = 0; i < count; i++, index++)
u32 bit = index % BITSET_SIZE; {
m_free_slots[group][bit] = true; u32 group = index / BITSET_SIZE;
u32 bit = index % BITSET_SIZE;
m_free_slots[group][bit] = true;
}
} }
void DescriptorHeapManager::Free(DescriptorHandle* handle) void DescriptorHeapManager::Free(DescriptorHandle* handle, u32 count /* = 1 */)
{ {
if (handle->index == DescriptorHandle::INVALID_INDEX) if (handle->index == DescriptorHandle::INVALID_INDEX)
return; return;
Free(handle->index); Free(handle->index, count);
handle->Clear(); handle->Clear();
} }

View File

@ -44,15 +44,29 @@ public:
DescriptorHeapManager(); DescriptorHeapManager();
~DescriptorHeapManager(); ~DescriptorHeapManager();
ID3D12DescriptorHeap* GetDescriptorHeap() const { return m_descriptor_heap.Get(); } ALWAYS_INLINE ID3D12DescriptorHeap* GetDescriptorHeap() const { return m_descriptor_heap.Get(); }
u32 GetDescriptorIncrementSize() const { return m_descriptor_increment_size; } ALWAYS_INLINE u32 GetDescriptorIncrementSize() const { return m_descriptor_increment_size; }
ALWAYS_INLINE D3D12_CPU_DESCRIPTOR_HANDLE OffsetCPUHandle(D3D12_CPU_DESCRIPTOR_HANDLE handle, u32 count) const
{
D3D12_CPU_DESCRIPTOR_HANDLE ret;
ret.ptr = handle.ptr + m_descriptor_increment_size * count;
return ret;
}
ALWAYS_INLINE D3D12_GPU_DESCRIPTOR_HANDLE OffsetGPUHandle(D3D12_GPU_DESCRIPTOR_HANDLE handle, u32 count) const
{
D3D12_GPU_DESCRIPTOR_HANDLE ret;
ret.ptr = handle.ptr + m_descriptor_increment_size * count;
return ret;
}
bool Create(ID3D12Device* device, D3D12_DESCRIPTOR_HEAP_TYPE type, u32 num_descriptors, bool shader_visible); bool Create(ID3D12Device* device, D3D12_DESCRIPTOR_HEAP_TYPE type, u32 num_descriptors, bool shader_visible);
void Destroy(); void Destroy();
bool Allocate(DescriptorHandle* handle); bool Allocate(DescriptorHandle* handle, u32 count = 1);
void Free(DescriptorHandle* handle); void Free(DescriptorHandle* handle, u32 count = 1);
void Free(u32 index); void Free(u32 index, u32 count = 1);
private: private:
Microsoft::WRL::ComPtr<ID3D12DescriptorHeap> m_descriptor_heap; Microsoft::WRL::ComPtr<ID3D12DescriptorHeap> m_descriptor_heap;