Add automatic usage of D3D12_HEAP_FLAG_ALLOW_SHADER_ATOMICS and configuration macro D3D12MA_EXTRA_DEFAULT_TYPE_HEAP_FLAGS.
diff --git a/src/D3D12MemAlloc.cpp b/src/D3D12MemAlloc.cpp
index d5279f7..bcd7287 100644
--- a/src/D3D12MemAlloc.cpp
+++ b/src/D3D12MemAlloc.cpp
@@ -86,6 +86,15 @@
#define D3D12MA_DEFAULT_BLOCK_SIZE (256ull * 1024 * 1024)
#endif
+#ifndef D3D12MA_EXTRA_DEFAULT_TYPE_HEAP_FLAGS
+ /*
+ Here you can control additional heap flags added to heaps/resources created in DEFAULT heap type.
+ It's mostly for automatic usage of the cryptic, undocumented flag D3D12_HEAP_FLAG_ALLOW_SHADER_ATOMICS.
+ Its absence doesn't seem to change anything but better to use it always, just in case.
+ */
+ #define D3D12MA_EXTRA_DEFAULT_TYPE_HEAP_FLAGS (D3D12_HEAP_FLAG_ALLOW_SHADER_ATOMICS)
+#endif
+
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//
@@ -3840,9 +3849,13 @@
D3D12_HEAP_PROPERTIES heapProps = {};
heapProps.Type = pAllocDesc->HeapType;
+
+ const D3D12_HEAP_FLAGS heapFlags = pAllocDesc->HeapType == D3D12_HEAP_TYPE_DEFAULT ?
+ D3D12MA_EXTRA_DEFAULT_TYPE_HEAP_FLAGS : D3D12_HEAP_FLAG_NONE;
+
ID3D12Resource* res = NULL;
HRESULT hr = m_Device->CreateCommittedResource(
- &heapProps, D3D12_HEAP_FLAG_NONE, pResourceDesc, InitialResourceState,
+ &heapProps, heapFlags, pResourceDesc, InitialResourceState,
pOptimizedClearValue, riidResource, (void**)&res);
if(SUCCEEDED(hr))
{
@@ -3889,6 +3902,11 @@
}
}
+ if(pAllocDesc->HeapType == D3D12_HEAP_TYPE_DEFAULT)
+ {
+ heapFlags |= D3D12MA_EXTRA_DEFAULT_TYPE_HEAP_FLAGS;
+ }
+
D3D12_HEAP_DESC heapDesc = {};
heapDesc.SizeInBytes = allocInfo.SizeInBytes;
heapDesc.Properties.Type = pAllocDesc->HeapType;
@@ -4026,6 +4044,11 @@
default:
D3D12MA_ASSERT(0);
}
+
+ if(outHeapType == D3D12_HEAP_TYPE_DEFAULT)
+ {
+ outHeapFlags |= D3D12MA_EXTRA_DEFAULT_TYPE_HEAP_FLAGS;
+ }
}
void AllocatorPimpl::RegisterCommittedAllocation(Allocation* alloc, D3D12_HEAP_TYPE heapType)