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");