add support of ID3D12Device10::CreateCommittedResource3, ID3D12Device8::CreatePlacedResource2 and perhaps all possible future versions of them
diff --git a/include/D3D12MemAlloc.h b/include/D3D12MemAlloc.h
index a8a63d5..44286b3 100644
--- a/include/D3D12MemAlloc.h
+++ b/include/D3D12MemAlloc.h
@@ -1157,7 +1157,26 @@
Allocation** ppAllocation,
REFIID riidResource,
void** ppvResource);
-#endif // #ifdef __ID3D12Device4_INTERFACE_DEFINED__
+#endif // #ifdef __ID3D12Device8_INTERFACE_DEFINED__
+
+#ifdef __ID3D12Device10_INTERFACE_DEFINED__
+ /** \brief Similar to Allocator::CreateResource2, but there are initial layout instead of state and
+ castable formats list
+
+ It internally uses `ID3D12Device10::CreateCommittedResource3` or `ID3D12Device10::CreatePlacedResource2`.
+
+ To work correctly, `ID3D12Device10` interface must be available in the current system. Otherwise, `E_NOINTERFACE` is returned.
+ */
+ HRESULT CreateResource3(const ALLOCATION_DESC* pAllocDesc,
+ const D3D12_RESOURCE_DESC1* pResourceDesc,
+ D3D12_BARRIER_LAYOUT InitialLayout,
+ const D3D12_CLEAR_VALUE* pOptimizedClearValue,
+ UINT32 NumCastableFormats,
+ DXGI_FORMAT* pCastableFormats,
+ Allocation** ppAllocation,
+ REFIID riidResource,
+ void** ppvResource);
+#endif // #ifdef __ID3D12Device10_INTERFACE_DEFINED__
/** \brief Allocates memory without creating any resource placed in it.
@@ -1214,6 +1233,41 @@
REFIID riidResource,
void** ppvResource);
+#ifdef __ID3D12Device8_INTERFACE_DEFINED__
+ /** \brief Similar to Allocator::CreateAliasingResource, but supports new structure `D3D12_RESOURCE_DESC1`.
+
+ It internally uses `ID3D12Device8::CreatePlacedResource1`.
+
+ To work correctly, `ID3D12Device8` interface must be available in the current system. Otherwise, `E_NOINTERFACE` is returned.
+ */
+ HRESULT CreateAliasingResource1(Allocation* pAllocation,
+ UINT64 AllocationLocalOffset,
+ const D3D12_RESOURCE_DESC1* pResourceDesc,
+ D3D12_RESOURCE_STATES InitialResourceState,
+ const D3D12_CLEAR_VALUE* pOptimizedClearValue,
+ REFIID riidResource,
+ void** ppvResource);
+#endif // #ifdef __ID3D12Device8_INTERFACE_DEFINED__
+
+#ifdef __ID3D12Device10_INTERFACE_DEFINED__
+ /** \brief Similar to Allocator::CreateAliasingResource1, but there are initial layout instead of state and
+ castable formats list
+
+ It internally uses `ID3D12Device10::CreatePlacedResource2`.
+
+ To work correctly, `ID3D12Device10` interface must be available in the current system. Otherwise, `E_NOINTERFACE` is returned.
+ */
+ HRESULT CreateAliasingResource2(Allocation* pAllocation,
+ UINT64 AllocationLocalOffset,
+ const D3D12_RESOURCE_DESC1* pResourceDesc,
+ D3D12_BARRIER_LAYOUT InitialLayout,
+ const D3D12_CLEAR_VALUE* pOptimizedClearValue,
+ UINT32 NumCastableFormats,
+ DXGI_FORMAT* pCastableFormats,
+ REFIID riidResource,
+ void** ppvResource);
+#endif // #ifdef __ID3D12Device10_INTERFACE_DEFINED__
+
/** \brief Creates custom pool.
*/
HRESULT CreatePool(
diff --git a/src/D3D12MemAlloc.cpp b/src/D3D12MemAlloc.cpp
index 060de01..af9b595 100644
--- a/src/D3D12MemAlloc.cpp
+++ b/src/D3D12MemAlloc.cpp
@@ -5950,6 +5950,83 @@
};
#endif // _D3D12M_COMMITTED_ALLOCATION_PARAMETERS
+// Simple variant data structure to hold all possible variations of ID3D12Device*::CreateCommittedResource* and ID3D12Device*::CreatePlacedResource* arguments
+struct CREATE_RESOURCE_PARAMS
+{
+ CREATE_RESOURCE_PARAMS() = delete;
+ CREATE_RESOURCE_PARAMS(
+ const D3D12_RESOURCE_DESC* pResourceDesc,
+ D3D12_RESOURCE_STATES InitialResourceState,
+ const D3D12_CLEAR_VALUE* pOptimizedClearValue)
+ : variant(VARIANT_WITH_STATE)
+ , pResourceDesc(pResourceDesc)
+ , InitialResourceState(InitialResourceState)
+ , pOptimizedClearValue(pOptimizedClearValue)
+ {
+ }
+#ifdef __ID3D12Device8_INTERFACE_DEFINED__
+ CREATE_RESOURCE_PARAMS(
+ const D3D12_RESOURCE_DESC1* pResourceDesc,
+ D3D12_RESOURCE_STATES InitialResourceState,
+ const D3D12_CLEAR_VALUE* pOptimizedClearValue)
+ : variant(VARIANT_WITH_STATE_AND_DESC1)
+ , pResourceDesc1(pResourceDesc)
+ , InitialResourceState(InitialResourceState)
+ , pOptimizedClearValue(pOptimizedClearValue)
+ {
+ }
+#endif
+#ifdef __ID3D12Device10_INTERFACE_DEFINED__
+ CREATE_RESOURCE_PARAMS(
+ const D3D12_RESOURCE_DESC1* pResourceDesc,
+ D3D12_BARRIER_LAYOUT InitialLayout,
+ const D3D12_CLEAR_VALUE* pOptimizedClearValue,
+ UINT32 NumCastableFormats,
+ DXGI_FORMAT* pCastableFormats)
+ : variant(VARIANT_WITH_LAYOUT)
+ , pResourceDesc1(pResourceDesc)
+ , InitialLayout(InitialLayout)
+ , pOptimizedClearValue(pOptimizedClearValue)
+ , NumCastableFormats(NumCastableFormats)
+ , pCastableFormats(pCastableFormats)
+ {
+ }
+#endif
+
+ enum VARIANT
+ {
+ VARIANT_INVALID = 0,
+ VARIANT_WITH_STATE,
+#ifdef __ID3D12Device8_INTERFACE_DEFINED__
+ VARIANT_WITH_STATE_AND_DESC1,
+#endif
+#ifdef __ID3D12Device10_INTERFACE_DEFINED__
+ VARIANT_WITH_LAYOUT
+#endif
+ };
+
+ VARIANT variant = VARIANT_INVALID;
+ union
+ {
+ const D3D12_RESOURCE_DESC* pResourceDesc;
+#ifdef __ID3D12Device8_INTERFACE_DEFINED__
+ const D3D12_RESOURCE_DESC1* pResourceDesc1;
+#endif
+ };
+ union
+ {
+ D3D12_RESOURCE_STATES InitialResourceState;
+#ifdef __ID3D12Device10_INTERFACE_DEFINED__
+ D3D12_BARRIER_LAYOUT InitialLayout;
+#endif
+ };
+ const D3D12_CLEAR_VALUE* pOptimizedClearValue;
+#ifdef __ID3D12Device10_INTERFACE_DEFINED__
+ UINT32 NumCastableFormats;
+ DXGI_FORMAT* pCastableFormats;
+#endif
+};
+
#ifndef _D3D12MA_BLOCK_VECTOR
/*
Sequence of NormalBlock. Represents memory blocks allocated for a specific
@@ -6003,26 +6080,11 @@
UINT64 size,
UINT64 alignment,
const ALLOCATION_DESC& allocDesc,
- const D3D12_RESOURCE_DESC& resourceDesc,
- D3D12_RESOURCE_STATES InitialResourceState,
- const D3D12_CLEAR_VALUE *pOptimizedClearValue,
+ const CREATE_RESOURCE_PARAMS& createParams,
Allocation** ppAllocation,
REFIID riidResource,
void** ppvResource);
-#ifdef __ID3D12Device8_INTERFACE_DEFINED__
- HRESULT CreateResource2(
- UINT64 size,
- UINT64 alignment,
- const ALLOCATION_DESC& allocDesc,
- const D3D12_RESOURCE_DESC1& resourceDesc,
- D3D12_RESOURCE_STATES InitialResourceState,
- const D3D12_CLEAR_VALUE *pOptimizedClearValue,
- Allocation** ppAllocation,
- REFIID riidResource,
- void** ppvResource);
-#endif // #ifdef __ID3D12Device8_INTERFACE_DEFINED__
-
void AddStatistics(Statistics& inoutStats);
void AddDetailedStatistics(DetailedStatistics& inoutStats);
@@ -6402,32 +6464,24 @@
UINT HeapPropertiesToMemorySegmentGroup(const D3D12_HEAP_PROPERTIES& heapProps) const;
UINT64 GetMemoryCapacity(UINT memorySegmentGroup) const;
- HRESULT CreateResource(
- const ALLOCATION_DESC* pAllocDesc,
- const D3D12_RESOURCE_DESC* pResourceDesc,
- D3D12_RESOURCE_STATES InitialResourceState,
- const D3D12_CLEAR_VALUE *pOptimizedClearValue,
- Allocation** ppAllocation,
+ HRESULT CreatePlacedResourceWrap(
+ ID3D12Heap *pHeap,
+ UINT64 HeapOffset,
+ const CREATE_RESOURCE_PARAMS& createParams,
REFIID riidResource,
void** ppvResource);
-#ifdef __ID3D12Device8_INTERFACE_DEFINED__
- HRESULT CreateResource2(
+ HRESULT CreateResource(
const ALLOCATION_DESC* pAllocDesc,
- const D3D12_RESOURCE_DESC1* pResourceDesc,
- D3D12_RESOURCE_STATES InitialResourceState,
- const D3D12_CLEAR_VALUE *pOptimizedClearValue,
+ const CREATE_RESOURCE_PARAMS& createParams,
Allocation** ppAllocation,
REFIID riidResource,
void** ppvResource);
-#endif // #ifdef __ID3D12Device8_INTERFACE_DEFINED__
HRESULT CreateAliasingResource(
Allocation* pAllocation,
UINT64 AllocationLocalOffset,
- const D3D12_RESOURCE_DESC* pResourceDesc,
- D3D12_RESOURCE_STATES InitialResourceState,
- const D3D12_CLEAR_VALUE *pOptimizedClearValue,
+ const CREATE_RESOURCE_PARAMS& createParams,
REFIID riidResource,
void** ppvResource);
@@ -6469,6 +6523,9 @@
#ifdef __ID3D12Device8_INTERFACE_DEFINED__
ID3D12Device8* m_Device8 = NULL; // AddRef, optional
#endif
+#ifdef __ID3D12Device10_INTERFACE_DEFINED__
+ ID3D12Device10* m_Device10 = NULL; // AddRef, optional
+#endif
IDXGIAdapter* m_Adapter; // AddRef
#if D3D12MA_DXGI_1_4
IDXGIAdapter3* m_Adapter3 = NULL; // AddRef, optional
@@ -6499,19 +6556,9 @@
HRESULT AllocateCommittedResource(
const CommittedAllocationParameters& committedAllocParams,
UINT64 resourceSize, bool withinBudget, void* pPrivateData,
- const D3D12_RESOURCE_DESC* pResourceDesc,
- D3D12_RESOURCE_STATES InitialResourceState, const D3D12_CLEAR_VALUE *pOptimizedClearValue,
+ const CREATE_RESOURCE_PARAMS& createParams,
Allocation** ppAllocation, REFIID riidResource, void** ppvResource);
-#ifdef __ID3D12Device8_INTERFACE_DEFINED__
- HRESULT AllocateCommittedResource2(
- const CommittedAllocationParameters& committedAllocParams,
- UINT64 resourceSize, bool withinBudget, void* pPrivateData,
- const D3D12_RESOURCE_DESC1* pResourceDesc,
- D3D12_RESOURCE_STATES InitialResourceState, const D3D12_CLEAR_VALUE *pOptimizedClearValue,
- Allocation** ppAllocation, REFIID riidResource, void** ppvResource);
-#endif
-
// Allocates and registers new heap without any resources placed in it, as dedicated allocation.
// Creates and returns Allocation object.
HRESULT AllocateHeap(
@@ -6602,6 +6649,10 @@
}
#endif
+#ifdef __ID3D12Device10_INTERFACE_DEFINED__
+ m_Device->QueryInterface(D3D12MA_IID_PPV_ARGS(&m_Device10));
+#endif
+
HRESULT hr = m_Adapter->GetDesc(&m_AdapterDesc);
if (FAILED(hr))
{
@@ -6738,16 +6789,60 @@
}
}
+HRESULT AllocatorPimpl::CreatePlacedResourceWrap(
+ ID3D12Heap *pHeap,
+ UINT64 HeapOffset,
+ const CREATE_RESOURCE_PARAMS& createParams,
+ REFIID riidResource,
+ void** ppvResource)
+{
+#ifdef __ID3D12Device10_INTERFACE_DEFINED__
+ if (createParams.variant == CREATE_RESOURCE_PARAMS::VARIANT_WITH_LAYOUT)
+ {
+ if (!m_Device10)
+ {
+ return E_NOINTERFACE;
+ }
+ return m_Device10->CreatePlacedResource2(pHeap, HeapOffset,
+ createParams.pResourceDesc1, createParams.InitialLayout,
+ createParams.pOptimizedClearValue, createParams.NumCastableFormats,
+ createParams.pCastableFormats, riidResource, ppvResource);
+ } else
+#endif
+#ifdef __ID3D12Device8_INTERFACE_DEFINED__
+ if (createParams.variant == CREATE_RESOURCE_PARAMS::VARIANT_WITH_STATE_AND_DESC1)
+ {
+ if (!m_Device8)
+ {
+ return E_NOINTERFACE;
+ }
+ return m_Device8->CreatePlacedResource1(pHeap, HeapOffset,
+ createParams.pResourceDesc1, createParams.InitialResourceState,
+ createParams.pOptimizedClearValue, riidResource, ppvResource);
+ } else
+#endif
+ if (createParams.variant == CREATE_RESOURCE_PARAMS::VARIANT_WITH_STATE)
+ {
+ return m_Device->CreatePlacedResource(pHeap, HeapOffset,
+ createParams.pResourceDesc, createParams.InitialResourceState,
+ createParams.pOptimizedClearValue, riidResource, ppvResource);
+ }
+ else
+ {
+ D3D12MA_ASSERT(0);
+ return E_INVALIDARG;
+ }
+}
+
+
HRESULT AllocatorPimpl::CreateResource(
const ALLOCATION_DESC* pAllocDesc,
- const D3D12_RESOURCE_DESC* pResourceDesc,
- D3D12_RESOURCE_STATES InitialResourceState,
- const D3D12_CLEAR_VALUE* pOptimizedClearValue,
+ const CREATE_RESOURCE_PARAMS& createParams,
Allocation** ppAllocation,
REFIID riidResource,
void** ppvResource)
{
- D3D12MA_ASSERT(pAllocDesc && pResourceDesc && ppAllocation);
+ D3D12MA_ASSERT(pAllocDesc && createParams.pResourceDesc && ppAllocation);
*ppAllocation = NULL;
if (ppvResource)
@@ -6755,8 +6850,47 @@
*ppvResource = NULL;
}
- D3D12_RESOURCE_DESC finalResourceDesc = *pResourceDesc;
- D3D12_RESOURCE_ALLOCATION_INFO resAllocInfo = GetResourceAllocationInfo(finalResourceDesc);
+ CREATE_RESOURCE_PARAMS finalCreateParams = createParams;
+ D3D12_RESOURCE_DESC finalResourceDesc;
+#ifdef __ID3D12Device8_INTERFACE_DEFINED__
+ D3D12_RESOURCE_DESC1 finalResourceDesc1;
+#endif
+ D3D12_RESOURCE_ALLOCATION_INFO resAllocInfo;
+ if (createParams.variant == CREATE_RESOURCE_PARAMS::VARIANT_WITH_STATE)
+ {
+ finalResourceDesc = *createParams.pResourceDesc;
+ finalCreateParams.pResourceDesc = &finalResourceDesc;
+ resAllocInfo = GetResourceAllocationInfo(finalResourceDesc);
+ }
+#ifdef __ID3D12Device8_INTERFACE_DEFINED__
+ else if (createParams.variant == CREATE_RESOURCE_PARAMS::VARIANT_WITH_STATE_AND_DESC1)
+ {
+ if (!m_Device8)
+ {
+ return E_NOINTERFACE;
+ }
+ finalResourceDesc1 = *createParams.pResourceDesc1;
+ finalCreateParams.pResourceDesc1 = &finalResourceDesc1;
+ resAllocInfo = GetResourceAllocationInfo(finalResourceDesc1);
+ }
+#endif
+#ifdef __ID3D12Device10_INTERFACE_DEFINED__
+ else if (createParams.variant == CREATE_RESOURCE_PARAMS::VARIANT_WITH_LAYOUT)
+ {
+ if (!m_Device10)
+ {
+ return E_NOINTERFACE;
+ }
+ finalResourceDesc1 = *createParams.pResourceDesc1;
+ finalCreateParams.pResourceDesc1 = &finalResourceDesc1;
+ resAllocInfo = GetResourceAllocationInfo(finalResourceDesc1);
+ }
+#endif
+ else
+ {
+ D3D12MA_ASSERT(0);
+ return E_INVALIDARG;
+ }
D3D12MA_ASSERT(IsPow2(resAllocInfo.Alignment));
D3D12MA_ASSERT(resAllocInfo.SizeInBytes > 0);
@@ -6764,7 +6898,7 @@
CommittedAllocationParameters committedAllocationParams = {};
bool preferCommitted = false;
HRESULT hr = CalcAllocationParams<D3D12_RESOURCE_DESC>(*pAllocDesc, resAllocInfo.SizeInBytes,
- pResourceDesc,
+ createParams.pResourceDesc,
blockVector, committedAllocationParams, preferCommitted);
if (FAILED(hr))
return hr;
@@ -6775,16 +6909,14 @@
{
hr = AllocateCommittedResource(committedAllocationParams,
resAllocInfo.SizeInBytes, withinBudget, pAllocDesc->pPrivateData,
- &finalResourceDesc, InitialResourceState, pOptimizedClearValue,
- ppAllocation, riidResource, ppvResource);
+ finalCreateParams, ppAllocation, riidResource, ppvResource);
if (SUCCEEDED(hr))
return hr;
}
if (blockVector != NULL)
{
hr = blockVector->CreateResource(resAllocInfo.SizeInBytes, resAllocInfo.Alignment,
- *pAllocDesc, finalResourceDesc,
- InitialResourceState, pOptimizedClearValue,
+ *pAllocDesc, finalCreateParams,
ppAllocation, riidResource, ppvResource);
if (SUCCEEDED(hr))
return hr;
@@ -6793,83 +6925,13 @@
{
hr = AllocateCommittedResource(committedAllocationParams,
resAllocInfo.SizeInBytes, withinBudget, pAllocDesc->pPrivateData,
- &finalResourceDesc, InitialResourceState, pOptimizedClearValue,
- ppAllocation, riidResource, ppvResource);
+ finalCreateParams, ppAllocation, riidResource, ppvResource);
if (SUCCEEDED(hr))
return hr;
}
return hr;
}
-#ifdef __ID3D12Device8_INTERFACE_DEFINED__
-HRESULT AllocatorPimpl::CreateResource2(
- const ALLOCATION_DESC* pAllocDesc,
- const D3D12_RESOURCE_DESC1* pResourceDesc,
- D3D12_RESOURCE_STATES InitialResourceState,
- const D3D12_CLEAR_VALUE* pOptimizedClearValue,
- Allocation** ppAllocation,
- REFIID riidResource,
- void** ppvResource)
-{
- D3D12MA_ASSERT(pAllocDesc && pResourceDesc && ppAllocation);
-
- *ppAllocation = NULL;
- if (ppvResource)
- {
- *ppvResource = NULL;
- }
- if (m_Device8 == NULL)
- {
- return E_NOINTERFACE;
- }
-
- D3D12_RESOURCE_DESC1 finalResourceDesc = *pResourceDesc;
- D3D12_RESOURCE_ALLOCATION_INFO resAllocInfo = GetResourceAllocationInfo(finalResourceDesc);
- D3D12MA_ASSERT(IsPow2(resAllocInfo.Alignment));
- D3D12MA_ASSERT(resAllocInfo.SizeInBytes > 0);
-
- BlockVector* blockVector = NULL;
- CommittedAllocationParameters committedAllocationParams = {};
- bool preferCommitted = false;
- HRESULT hr = CalcAllocationParams<D3D12_RESOURCE_DESC1>(*pAllocDesc, resAllocInfo.SizeInBytes,
- pResourceDesc,
- blockVector, committedAllocationParams, preferCommitted);
- if (FAILED(hr))
- return hr;
-
- const bool withinBudget = (pAllocDesc->Flags & ALLOCATION_FLAG_WITHIN_BUDGET) != 0;
- hr = E_INVALIDARG;
- if (committedAllocationParams.IsValid() && preferCommitted)
- {
- hr = AllocateCommittedResource2(committedAllocationParams,
- resAllocInfo.SizeInBytes, withinBudget, pAllocDesc->pPrivateData,
- &finalResourceDesc, InitialResourceState, pOptimizedClearValue,
- ppAllocation, riidResource, ppvResource);
- if (SUCCEEDED(hr))
- return hr;
- }
- if (blockVector != NULL)
- {
- hr = blockVector->CreateResource2(resAllocInfo.SizeInBytes, resAllocInfo.Alignment,
- *pAllocDesc, finalResourceDesc,
- InitialResourceState, pOptimizedClearValue,
- ppAllocation, riidResource, ppvResource);
- if (SUCCEEDED(hr))
- return hr;
- }
- if (committedAllocationParams.IsValid() && !preferCommitted)
- {
- hr = AllocateCommittedResource2(committedAllocationParams,
- resAllocInfo.SizeInBytes, withinBudget, pAllocDesc->pPrivateData,
- &finalResourceDesc, InitialResourceState, pOptimizedClearValue,
- ppAllocation, riidResource, ppvResource);
- if (SUCCEEDED(hr))
- return hr;
- }
- return hr;
-}
-#endif // #ifdef __ID3D12Device8_INTERFACE_DEFINED__
-
HRESULT AllocatorPimpl::AllocateMemory(
const ALLOCATION_DESC* pAllocDesc,
const D3D12_RESOURCE_ALLOCATION_INFO* pAllocInfo,
@@ -6913,16 +6975,53 @@
HRESULT AllocatorPimpl::CreateAliasingResource(
Allocation* pAllocation,
UINT64 AllocationLocalOffset,
- const D3D12_RESOURCE_DESC* pResourceDesc,
- D3D12_RESOURCE_STATES InitialResourceState,
- const D3D12_CLEAR_VALUE* pOptimizedClearValue,
+ const CREATE_RESOURCE_PARAMS& createParams,
REFIID riidResource,
void** ppvResource)
{
*ppvResource = NULL;
- D3D12_RESOURCE_DESC resourceDesc2 = *pResourceDesc;
- D3D12_RESOURCE_ALLOCATION_INFO resAllocInfo = GetResourceAllocationInfo(resourceDesc2);
+ CREATE_RESOURCE_PARAMS finalCreateParams = createParams;
+ D3D12_RESOURCE_DESC finalResourceDesc;
+#ifdef __ID3D12Device8_INTERFACE_DEFINED__
+ D3D12_RESOURCE_DESC1 finalResourceDesc1;
+#endif
+ D3D12_RESOURCE_ALLOCATION_INFO resAllocInfo;
+ if (createParams.variant == CREATE_RESOURCE_PARAMS::VARIANT_WITH_STATE)
+ {
+ finalResourceDesc = *createParams.pResourceDesc;
+ finalCreateParams.pResourceDesc = &finalResourceDesc;
+ resAllocInfo = GetResourceAllocationInfo(finalResourceDesc);
+ }
+#ifdef __ID3D12Device8_INTERFACE_DEFINED__
+ else if (createParams.variant == CREATE_RESOURCE_PARAMS::VARIANT_WITH_STATE_AND_DESC1)
+ {
+ if (!m_Device8)
+ {
+ return E_NOINTERFACE;
+ }
+ finalResourceDesc1 = *createParams.pResourceDesc1;
+ finalCreateParams.pResourceDesc1 = &finalResourceDesc1;
+ resAllocInfo = GetResourceAllocationInfo(finalResourceDesc1);
+ }
+#endif
+#ifdef __ID3D12Device10_INTERFACE_DEFINED__
+ else if (createParams.variant == CREATE_RESOURCE_PARAMS::VARIANT_WITH_LAYOUT)
+ {
+ if (!m_Device10)
+ {
+ return E_NOINTERFACE;
+ }
+ finalResourceDesc1 = *createParams.pResourceDesc1;
+ finalCreateParams.pResourceDesc1 = &finalResourceDesc1;
+ resAllocInfo = GetResourceAllocationInfo(finalResourceDesc1);
+ }
+#endif
+ else
+ {
+ D3D12MA_ASSERT(0);
+ return E_INVALIDARG;
+ }
D3D12MA_ASSERT(IsPow2(resAllocInfo.Alignment));
D3D12MA_ASSERT(resAllocInfo.SizeInBytes > 0);
@@ -6938,14 +7037,7 @@
return E_INVALIDARG;
}
- return m_Device->CreatePlacedResource(
- existingHeap,
- newOffset,
- &resourceDesc2,
- InitialResourceState,
- pOptimizedClearValue,
- riidResource,
- ppvResource);
+ return CreatePlacedResourceWrap(existingHeap, newOffset, finalCreateParams, riidResource, ppvResource);
}
void AllocatorPimpl::FreeCommittedMemory(Allocation* allocation)
@@ -7509,8 +7601,7 @@
HRESULT AllocatorPimpl::AllocateCommittedResource(
const CommittedAllocationParameters& committedAllocParams,
UINT64 resourceSize, bool withinBudget, void* pPrivateData,
- const D3D12_RESOURCE_DESC* pResourceDesc,
- D3D12_RESOURCE_STATES InitialResourceState, const D3D12_CLEAR_VALUE* pOptimizedClearValue,
+ const CREATE_RESOURCE_PARAMS& createParams,
Allocation** ppAllocation, REFIID riidResource, void** ppvResource)
{
D3D12MA_ASSERT(committedAllocParams.IsValid());
@@ -7526,16 +7617,15 @@
hr = AllocateHeap(committedAllocParams, heapAllocInfo, withinBudget, pPrivateData, ppAllocation);
if (SUCCEEDED(hr))
{
- hr = m_Device->CreatePlacedResource((*ppAllocation)->GetHeap(), 0,
- pResourceDesc, InitialResourceState,
- pOptimizedClearValue, D3D12MA_IID_PPV_ARGS(&res));
+ hr = CreatePlacedResourceWrap((*ppAllocation)->GetHeap(), 0,
+ createParams, D3D12MA_IID_PPV_ARGS(&res));
if (SUCCEEDED(hr))
{
if (ppvResource != NULL)
hr = res->QueryInterface(riidResource, ppvResource);
if (SUCCEEDED(hr))
{
- (*ppAllocation)->SetResourcePointer(res, pResourceDesc);
+ (*ppAllocation)->SetResourcePointer(res, createParams.pResourceDesc);
return hr;
}
res->Release();
@@ -7561,28 +7651,69 @@
*
* [ STATE_CREATION ERROR #640: CREATERESOURCEANDHEAP_INVALIDHEAPMISCFLAGS]
*/
-#ifdef __ID3D12Device4_INTERFACE_DEFINED__
- if (m_Device4)
+
+#ifdef __ID3D12Device10_INTERFACE_DEFINED__
+ if (createParams.variant == CREATE_RESOURCE_PARAMS::VARIANT_WITH_LAYOUT)
{
- hr = m_Device4->CreateCommittedResource1(
+ if (!m_Device10)
+ {
+ return E_NOINTERFACE;
+ }
+ hr = m_Device10->CreateCommittedResource3(
&committedAllocParams.m_HeapProperties,
committedAllocParams.m_HeapFlags & ~RESOURCE_CLASS_HEAP_FLAGS,
- pResourceDesc, InitialResourceState,
- pOptimizedClearValue, committedAllocParams.m_ProtectedSession, D3D12MA_IID_PPV_ARGS(&res));
+ createParams.pResourceDesc1, createParams.InitialLayout,
+ createParams.pOptimizedClearValue, committedAllocParams.m_ProtectedSession,
+ createParams.NumCastableFormats, createParams.pCastableFormats,
+ D3D12MA_IID_PPV_ARGS(&res));
+ } else
+#endif
+#ifdef __ID3D12Device8_INTERFACE_DEFINED__
+ if (createParams.variant == CREATE_RESOURCE_PARAMS::VARIANT_WITH_STATE_AND_DESC1)
+ {
+ if (!m_Device8)
+ {
+ return E_NOINTERFACE;
+ }
+ hr = m_Device8->CreateCommittedResource2(
+ &committedAllocParams.m_HeapProperties,
+ committedAllocParams.m_HeapFlags & ~RESOURCE_CLASS_HEAP_FLAGS,
+ createParams.pResourceDesc1, createParams.InitialResourceState,
+ createParams.pOptimizedClearValue, committedAllocParams.m_ProtectedSession,
+ D3D12MA_IID_PPV_ARGS(&res));
+ } else
+#endif
+ if (createParams.variant == CREATE_RESOURCE_PARAMS::VARIANT_WITH_STATE)
+ {
+#ifdef __ID3D12Device4_INTERFACE_DEFINED__
+ if (m_Device4)
+ {
+ hr = m_Device4->CreateCommittedResource1(
+ &committedAllocParams.m_HeapProperties,
+ committedAllocParams.m_HeapFlags & ~RESOURCE_CLASS_HEAP_FLAGS,
+ createParams.pResourceDesc, createParams.InitialResourceState,
+ createParams.pOptimizedClearValue, committedAllocParams.m_ProtectedSession,
+ D3D12MA_IID_PPV_ARGS(&res));
+ }
+ else
+#endif
+ {
+ if (committedAllocParams.m_ProtectedSession == NULL)
+ {
+ hr = m_Device->CreateCommittedResource(
+ &committedAllocParams.m_HeapProperties,
+ committedAllocParams.m_HeapFlags & ~RESOURCE_CLASS_HEAP_FLAGS,
+ createParams.pResourceDesc, createParams.InitialResourceState,
+ createParams.pOptimizedClearValue, D3D12MA_IID_PPV_ARGS(&res));
+ }
+ else
+ hr = E_NOINTERFACE;
+ }
}
else
-#endif
{
- if (committedAllocParams.m_ProtectedSession == NULL)
- {
- hr = m_Device->CreateCommittedResource(
- &committedAllocParams.m_HeapProperties,
- committedAllocParams.m_HeapFlags & ~RESOURCE_CLASS_HEAP_FLAGS,
- pResourceDesc, InitialResourceState,
- pOptimizedClearValue, D3D12MA_IID_PPV_ARGS(&res));
- }
- else
- hr = E_NOINTERFACE;
+ D3D12MA_ASSERT(0);
+ return E_INVALIDARG;
}
if (SUCCEEDED(hr))
@@ -7594,9 +7725,9 @@
if (SUCCEEDED(hr))
{
const BOOL wasZeroInitialized = TRUE;
- Allocation* alloc = m_AllocationObjectAllocator.Allocate(this, resourceSize, pResourceDesc->Alignment, wasZeroInitialized);
+ Allocation* alloc = m_AllocationObjectAllocator.Allocate(this, resourceSize, createParams.pResourceDesc->Alignment, wasZeroInitialized);
alloc->InitCommitted(committedAllocParams.m_List);
- alloc->SetResourcePointer(res, pResourceDesc);
+ alloc->SetResourcePointer(res, createParams.pResourceDesc);
alloc->SetPrivateData(pPrivateData);
*ppAllocation = alloc;
@@ -7615,93 +7746,6 @@
return hr;
}
-#ifdef __ID3D12Device8_INTERFACE_DEFINED__
-HRESULT AllocatorPimpl::AllocateCommittedResource2(
- const CommittedAllocationParameters& committedAllocParams,
- UINT64 resourceSize, bool withinBudget, void* pPrivateData,
- const D3D12_RESOURCE_DESC1* pResourceDesc,
- D3D12_RESOURCE_STATES InitialResourceState, const D3D12_CLEAR_VALUE* pOptimizedClearValue,
- Allocation** ppAllocation, REFIID riidResource, void** ppvResource)
-{
- D3D12MA_ASSERT(committedAllocParams.IsValid());
-
- if (m_Device8 == NULL)
- {
- return E_NOINTERFACE;
- }
-
- HRESULT hr;
- ID3D12Resource* res = NULL;
- // Allocate aliasing memory with explicit heap
- if (committedAllocParams.m_CanAlias)
- {
- D3D12_RESOURCE_ALLOCATION_INFO heapAllocInfo = {};
- heapAllocInfo.SizeInBytes = resourceSize;
- heapAllocInfo.Alignment = HeapFlagsToAlignment(committedAllocParams.m_HeapFlags, m_MsaaAlwaysCommitted);
- hr = AllocateHeap(committedAllocParams, heapAllocInfo, withinBudget, pPrivateData, ppAllocation);
- if (SUCCEEDED(hr))
- {
- hr = m_Device8->CreatePlacedResource1((*ppAllocation)->GetHeap(), 0,
- pResourceDesc, InitialResourceState,
- pOptimizedClearValue, D3D12MA_IID_PPV_ARGS(&res));
- if (SUCCEEDED(hr))
- {
- if (ppvResource != NULL)
- hr = res->QueryInterface(riidResource, ppvResource);
- if (SUCCEEDED(hr))
- {
- (*ppAllocation)->SetResourcePointer(res, pResourceDesc);
- return hr;
- }
- res->Release();
- }
- FreeHeapMemory(*ppAllocation);
- }
- return hr;
- }
-
- if (withinBudget &&
- !NewAllocationWithinBudget(committedAllocParams.m_HeapProperties.Type, resourceSize))
- {
- return E_OUTOFMEMORY;
- }
-
- hr = m_Device8->CreateCommittedResource2(
- &committedAllocParams.m_HeapProperties,
- committedAllocParams.m_HeapFlags & ~RESOURCE_CLASS_HEAP_FLAGS, // D3D12 ERROR: ID3D12Device::CreateCommittedResource: When creating a committed resource, D3D12_HEAP_FLAGS must not have either D3D12_HEAP_FLAG_DENY_NON_RT_DS_TEXTURES, D3D12_HEAP_FLAG_DENY_RT_DS_TEXTURES, nor D3D12_HEAP_FLAG_DENY_BUFFERS set. These flags will be set automatically to correspond with the committed resource type. [ STATE_CREATION ERROR #640: CREATERESOURCEANDHEAP_INVALIDHEAPMISCFLAGS]
- pResourceDesc, InitialResourceState,
- pOptimizedClearValue, committedAllocParams.m_ProtectedSession, D3D12MA_IID_PPV_ARGS(&res));
- if (SUCCEEDED(hr))
- {
- if (ppvResource != NULL)
- {
- hr = res->QueryInterface(riidResource, ppvResource);
- }
- if (SUCCEEDED(hr))
- {
- const BOOL wasZeroInitialized = TRUE;
- Allocation* alloc = m_AllocationObjectAllocator.Allocate(this, resourceSize, pResourceDesc->Alignment, wasZeroInitialized);
- alloc->InitCommitted(committedAllocParams.m_List);
- alloc->SetResourcePointer(res, pResourceDesc);
- alloc->SetPrivateData(pPrivateData);
-
- *ppAllocation = alloc;
-
- committedAllocParams.m_List->Register(alloc);
-
- const UINT memSegmentGroup = HeapPropertiesToMemorySegmentGroup(committedAllocParams.m_HeapProperties);
- m_Budget.AddBlock(memSegmentGroup, resourceSize);
- m_Budget.AddAllocation(memSegmentGroup, resourceSize);
- }
- else
- {
- res->Release();
- }
- }
- return hr;
-}
-#endif // #ifdef __ID3D12Device8_INTERFACE_DEFINED__
-
HRESULT AllocatorPimpl::AllocateHeap(
const CommittedAllocationParameters& committedAllocParams,
const D3D12_RESOURCE_ALLOCATION_INFO& allocInfo, bool withinBudget,
@@ -8411,9 +8455,7 @@
UINT64 size,
UINT64 alignment,
const ALLOCATION_DESC& allocDesc,
- const D3D12_RESOURCE_DESC& resourceDesc,
- D3D12_RESOURCE_STATES InitialResourceState,
- const D3D12_CLEAR_VALUE* pOptimizedClearValue,
+ const CREATE_RESOURCE_PARAMS& createParams,
Allocation** ppAllocation,
REFIID riidResource,
void** ppvResource)
@@ -8422,12 +8464,10 @@
if (SUCCEEDED(hr))
{
ID3D12Resource* res = NULL;
- hr = m_hAllocator->GetDevice()->CreatePlacedResource(
+ hr = m_hAllocator->CreatePlacedResourceWrap(
(*ppAllocation)->m_Placed.block->GetHeap(),
(*ppAllocation)->GetOffset(),
- &resourceDesc,
- InitialResourceState,
- pOptimizedClearValue,
+ createParams,
D3D12MA_IID_PPV_ARGS(&res));
if (SUCCEEDED(hr))
{
@@ -8437,7 +8477,7 @@
}
if (SUCCEEDED(hr))
{
- (*ppAllocation)->SetResourcePointer(res, &resourceDesc);
+ (*ppAllocation)->SetResourcePointer(res, createParams.pResourceDesc);
}
else
{
@@ -8453,60 +8493,6 @@
return hr;
}
-#ifdef __ID3D12Device8_INTERFACE_DEFINED__
-HRESULT BlockVector::CreateResource2(
- UINT64 size,
- UINT64 alignment,
- const ALLOCATION_DESC& allocDesc,
- const D3D12_RESOURCE_DESC1& resourceDesc,
- D3D12_RESOURCE_STATES InitialResourceState,
- const D3D12_CLEAR_VALUE* pOptimizedClearValue,
- Allocation** ppAllocation,
- REFIID riidResource,
- void** ppvResource)
-{
- ID3D12Device8* const device8 = m_hAllocator->GetDevice8();
- if (device8 == NULL)
- {
- return E_NOINTERFACE;
- }
-
- HRESULT hr = Allocate(size, alignment, allocDesc, 1, ppAllocation);
- if (SUCCEEDED(hr))
- {
- ID3D12Resource* res = NULL;
- hr = device8->CreatePlacedResource1(
- (*ppAllocation)->m_Placed.block->GetHeap(),
- (*ppAllocation)->GetOffset(),
- &resourceDesc,
- InitialResourceState,
- pOptimizedClearValue,
- D3D12MA_IID_PPV_ARGS(&res));
- if (SUCCEEDED(hr))
- {
- if (ppvResource != NULL)
- {
- hr = res->QueryInterface(riidResource, ppvResource);
- }
- if (SUCCEEDED(hr))
- {
- (*ppAllocation)->SetResourcePointer(res, &resourceDesc);
- }
- else
- {
- res->Release();
- SAFE_RELEASE(*ppAllocation);
- }
- }
- else
- {
- SAFE_RELEASE(*ppAllocation);
- }
- }
- return hr;
-}
-#endif // #ifdef __ID3D12Device8_INTERFACE_DEFINED__
-
void BlockVector::AddStatistics(Statistics& inoutStats)
{
MutexLockRead lock(m_Mutex, m_hAllocator->UseMutex());
@@ -9961,7 +9947,12 @@
return E_INVALIDARG;
}
D3D12MA_DEBUG_GLOBAL_MUTEX_LOCK
- return m_Pimpl->CreateResource(pAllocDesc, pResourceDesc, InitialResourceState, pOptimizedClearValue, ppAllocation, riidResource, ppvResource);
+ return m_Pimpl->CreateResource(
+ pAllocDesc,
+ CREATE_RESOURCE_PARAMS(pResourceDesc, InitialResourceState, pOptimizedClearValue),
+ ppAllocation,
+ riidResource,
+ ppvResource);
}
#ifdef __ID3D12Device8_INTERFACE_DEFINED__
@@ -9980,10 +9971,42 @@
return E_INVALIDARG;
}
D3D12MA_DEBUG_GLOBAL_MUTEX_LOCK
- return m_Pimpl->CreateResource2(pAllocDesc, pResourceDesc, InitialResourceState, pOptimizedClearValue, ppAllocation, riidResource, ppvResource);
+ return m_Pimpl->CreateResource(
+ pAllocDesc,
+ CREATE_RESOURCE_PARAMS(pResourceDesc, InitialResourceState, pOptimizedClearValue),
+ ppAllocation,
+ riidResource,
+ ppvResource);
}
#endif // #ifdef __ID3D12Device8_INTERFACE_DEFINED__
+#ifdef __ID3D12Device10_INTERFACE_DEFINED__
+HRESULT Allocator::CreateResource3(
+ const ALLOCATION_DESC* pAllocDesc,
+ const D3D12_RESOURCE_DESC1* pResourceDesc,
+ D3D12_BARRIER_LAYOUT InitialLayout,
+ const D3D12_CLEAR_VALUE* pOptimizedClearValue,
+ UINT32 NumCastableFormats,
+ DXGI_FORMAT* pCastableFormats,
+ Allocation** ppAllocation,
+ REFIID riidResource,
+ void** ppvResource)
+{
+ if (!pAllocDesc || !pResourceDesc || !ppAllocation)
+ {
+ D3D12MA_ASSERT(0 && "Invalid arguments passed to Allocator::CreateResource2.");
+ return E_INVALIDARG;
+ }
+ D3D12MA_DEBUG_GLOBAL_MUTEX_LOCK
+ return m_Pimpl->CreateResource(
+ pAllocDesc,
+ CREATE_RESOURCE_PARAMS(pResourceDesc, InitialLayout, pOptimizedClearValue, NumCastableFormats, pCastableFormats),
+ ppAllocation,
+ riidResource,
+ ppvResource);
+}
+#endif // #ifdef __ID3D12Device10_INTERFACE_DEFINED__
+
HRESULT Allocator::AllocateMemory(
const ALLOCATION_DESC* pAllocDesc,
const D3D12_RESOURCE_ALLOCATION_INFO* pAllocInfo,
@@ -10013,9 +10036,66 @@
return E_INVALIDARG;
}
D3D12MA_DEBUG_GLOBAL_MUTEX_LOCK
- return m_Pimpl->CreateAliasingResource(pAllocation, AllocationLocalOffset, pResourceDesc, InitialResourceState, pOptimizedClearValue, riidResource, ppvResource);
+ return m_Pimpl->CreateAliasingResource(
+ pAllocation,
+ AllocationLocalOffset,
+ CREATE_RESOURCE_PARAMS(pResourceDesc, InitialResourceState, pOptimizedClearValue),
+ riidResource,
+ ppvResource);
}
+#ifdef __ID3D12Device8_INTERFACE_DEFINED__
+HRESULT Allocator::CreateAliasingResource1(
+ Allocation* pAllocation,
+ UINT64 AllocationLocalOffset,
+ const D3D12_RESOURCE_DESC1* pResourceDesc,
+ D3D12_RESOURCE_STATES InitialResourceState,
+ const D3D12_CLEAR_VALUE* pOptimizedClearValue,
+ REFIID riidResource,
+ void** ppvResource)
+{
+ if (!pAllocation || !pResourceDesc || !ppvResource)
+ {
+ D3D12MA_ASSERT(0 && "Invalid arguments passed to Allocator::CreateAliasingResource.");
+ return E_INVALIDARG;
+ }
+ D3D12MA_DEBUG_GLOBAL_MUTEX_LOCK
+ return m_Pimpl->CreateAliasingResource(
+ pAllocation,
+ AllocationLocalOffset,
+ CREATE_RESOURCE_PARAMS(pResourceDesc, InitialResourceState, pOptimizedClearValue),
+ riidResource,
+ ppvResource);
+}
+#endif // #ifdef __ID3D12Device8_INTERFACE_DEFINED__
+
+#ifdef __ID3D12Device10_INTERFACE_DEFINED__
+HRESULT Allocator::CreateAliasingResource2(
+ Allocation* pAllocation,
+ UINT64 AllocationLocalOffset,
+ const D3D12_RESOURCE_DESC1* pResourceDesc,
+ D3D12_BARRIER_LAYOUT InitialLayout,
+ const D3D12_CLEAR_VALUE* pOptimizedClearValue,
+ UINT32 NumCastableFormats,
+ DXGI_FORMAT* pCastableFormats,
+ REFIID riidResource,
+ void** ppvResource)
+{
+ if (!pAllocation || !pResourceDesc || !ppvResource)
+ {
+ D3D12MA_ASSERT(0 && "Invalid arguments passed to Allocator::CreateAliasingResource.");
+ return E_INVALIDARG;
+ }
+ D3D12MA_DEBUG_GLOBAL_MUTEX_LOCK
+ return m_Pimpl->CreateAliasingResource(
+ pAllocation,
+ AllocationLocalOffset,
+ CREATE_RESOURCE_PARAMS(pResourceDesc, InitialLayout, pOptimizedClearValue, NumCastableFormats, pCastableFormats),
+ riidResource,
+ ppvResource);
+}
+#endif // #ifdef __ID3D12Device10_INTERFACE_DEFINED__
+
HRESULT Allocator::CreatePool(
const POOL_DESC* pPoolDesc,
Pool** ppPool)
diff --git a/src/Tests.cpp b/src/Tests.cpp
index 1f77b87..7d60f33 100644
--- a/src/Tests.cpp
+++ b/src/Tests.cpp
@@ -2820,19 +2820,99 @@
&allocPtr0, IID_PPV_ARGS(&res0)));
CHECK_BOOL(allocPtr0->GetHeap() == NULL);
- // Create a placed buffer
+ // Create a heap and placed buffer in it
- allocDesc.Flags &= ~D3D12MA::ALLOCATION_FLAG_COMMITTED;
+ allocDesc.Flags |= D3D12MA::ALLOCATION_FLAG_CAN_ALIAS;
ComPtr<D3D12MA::Allocation> allocPtr1;
ComPtr<ID3D12Resource> res1;
CHECK_HR(ctx.allocator->CreateResource2(&allocDesc, &resourceDesc,
D3D12_RESOURCE_STATE_COMMON, NULL,
&allocPtr1, IID_PPV_ARGS(&res1)));
- CHECK_BOOL(allocPtr1->GetHeap()!= NULL);
+ CHECK_BOOL(allocPtr1->GetHeap() != NULL);
+
+ // Create a placed buffer
+
+ allocDesc.Flags &= ~D3D12MA::ALLOCATION_FLAG_COMMITTED;
+
+ ComPtr<D3D12MA::Allocation> allocPtr2;
+ ComPtr<ID3D12Resource> res2;
+ CHECK_HR(ctx.allocator->CreateResource2(&allocDesc, &resourceDesc,
+ D3D12_RESOURCE_STATE_COMMON, NULL,
+ &allocPtr2, IID_PPV_ARGS(&res2)));
+ CHECK_BOOL(allocPtr2->GetHeap()!= NULL);
+
+ // Create an aliasing buffer
+ ComPtr<ID3D12Resource> res3;
+ CHECK_HR(ctx.allocator->CreateAliasingResource1(allocPtr2.Get(), 0, &resourceDesc,
+ D3D12_RESOURCE_STATE_COMMON, NULL,
+ IID_PPV_ARGS(&res3)));
}
#endif // #ifdef __ID3D12Device8_INTERFACE_DEFINED__
+#ifdef __ID3D12Device10_INTERFACE_DEFINED__
+static void TestDevice10(const TestContext& ctx)
+{
+ wprintf(L"Test ID3D12Device10\n");
+
+ ComPtr<ID3D12Device10> dev10;
+ CHECK_HR(ctx.device->QueryInterface(IID_PPV_ARGS(&dev10)));
+
+ D3D12_RESOURCE_DESC1 resourceDesc = {};
+ resourceDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
+ resourceDesc.Alignment = 0;
+ resourceDesc.Width = 1920;
+ resourceDesc.Height = 1080;
+ resourceDesc.DepthOrArraySize = 1;
+ resourceDesc.MipLevels = 1;
+ resourceDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
+ resourceDesc.SampleDesc.Count = 1;
+ resourceDesc.SampleDesc.Quality = 0;
+ resourceDesc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN;
+
+ // Create a committed texture
+
+ D3D12MA::ALLOCATION_DESC allocDesc = {};
+ allocDesc.HeapType = D3D12_HEAP_TYPE_DEFAULT;
+ allocDesc.Flags = D3D12MA::ALLOCATION_FLAG_COMMITTED;
+
+ ComPtr<D3D12MA::Allocation> allocPtr0;
+ ComPtr<ID3D12Resource> res0;
+ CHECK_HR(ctx.allocator->CreateResource3(&allocDesc, &resourceDesc,
+ D3D12_BARRIER_LAYOUT_UNDEFINED, NULL, 0, NULL,
+ &allocPtr0, IID_PPV_ARGS(&res0)));
+ CHECK_BOOL(allocPtr0->GetHeap() == NULL);
+
+ // Create a heap and placed texture in it
+
+ allocDesc.Flags |= D3D12MA::ALLOCATION_FLAG_CAN_ALIAS;
+
+ ComPtr<D3D12MA::Allocation> allocPtr1;
+ ComPtr<ID3D12Resource> res1;
+ CHECK_HR(ctx.allocator->CreateResource3(&allocDesc, &resourceDesc,
+ D3D12_BARRIER_LAYOUT_UNDEFINED, NULL, 0, NULL,
+ &allocPtr1, IID_PPV_ARGS(&res1)));
+ CHECK_BOOL(allocPtr1->GetHeap() != NULL);
+
+ // Create a placed texture
+
+ allocDesc.Flags &= ~D3D12MA::ALLOCATION_FLAG_COMMITTED;
+
+ ComPtr<D3D12MA::Allocation> allocPtr2;
+ ComPtr<ID3D12Resource> res2;
+ CHECK_HR(ctx.allocator->CreateResource3(&allocDesc, &resourceDesc,
+ D3D12_BARRIER_LAYOUT_UNDEFINED, NULL, 0, NULL,
+ &allocPtr2, IID_PPV_ARGS(&res2)));
+ CHECK_BOOL(allocPtr2->GetHeap() != NULL);
+
+ // Create an aliasing texture
+ ComPtr<ID3D12Resource> res3;
+ CHECK_HR(ctx.allocator->CreateAliasingResource2(allocPtr2.Get(), 0, &resourceDesc,
+ D3D12_BARRIER_LAYOUT_UNDEFINED, NULL, 0, NULL,
+ IID_PPV_ARGS(&res3)));
+}
+#endif // #ifdef __ID3D12Device10_INTERFACE_DEFINED__
+
static void TestVirtualBlocks(const TestContext& ctx)
{
wprintf(L"Test virtual blocks\n");
@@ -4095,6 +4175,9 @@
#ifdef __ID3D12Device8_INTERFACE_DEFINED__
TestDevice8(ctx);
#endif
+#ifdef __ID3D12Device10_INTERFACE_DEFINED__
+ TestDevice10(ctx);
+#endif
FILE* file;
fopen_s(&file, "Results.csv", "w");