Refactored CREATE_RESOURCE_PARAMS structure to be safer
diff --git a/src/D3D12MemAlloc.cpp b/src/D3D12MemAlloc.cpp
index 315e8af..f569a56 100644
--- a/src/D3D12MemAlloc.cpp
+++ b/src/D3D12MemAlloc.cpp
@@ -6016,7 +6016,7 @@
const D3D12_RESOURCE_DESC* pResourceDesc,
D3D12_RESOURCE_STATES InitialResourceState,
const D3D12_CLEAR_VALUE* pOptimizedClearValue)
- : variant(VARIANT_WITH_STATE)
+ : Variant(VARIANT_WITH_STATE)
, pResourceDesc(pResourceDesc)
, InitialResourceState(InitialResourceState)
, pOptimizedClearValue(pOptimizedClearValue)
@@ -6027,7 +6027,7 @@
const D3D12_RESOURCE_DESC1* pResourceDesc,
D3D12_RESOURCE_STATES InitialResourceState,
const D3D12_CLEAR_VALUE* pOptimizedClearValue)
- : variant(VARIANT_WITH_STATE_AND_DESC1)
+ : Variant(VARIANT_WITH_STATE_AND_DESC1)
, pResourceDesc1(pResourceDesc)
, InitialResourceState(InitialResourceState)
, pOptimizedClearValue(pOptimizedClearValue)
@@ -6041,7 +6041,7 @@
const D3D12_CLEAR_VALUE* pOptimizedClearValue,
UINT32 NumCastableFormats,
DXGI_FORMAT* pCastableFormats)
- : variant(VARIANT_WITH_LAYOUT)
+ : Variant(VARIANT_WITH_LAYOUT)
, pResourceDesc1(pResourceDesc)
, InitialLayout(InitialLayout)
, pOptimizedClearValue(pOptimizedClearValue)
@@ -6055,15 +6055,69 @@
{
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;
+ VARIANT Variant = VARIANT_INVALID;
+
+ const D3D12_RESOURCE_DESC* GetResourceDesc() const
+ {
+ D3D12MA_ASSERT(Variant == VARIANT_WITH_STATE);
+ return pResourceDesc;
+ }
+ const D3D12_RESOURCE_DESC*& AccessResourceDesc()
+ {
+ D3D12MA_ASSERT(Variant == VARIANT_WITH_STATE);
+ return pResourceDesc;
+ }
+ const D3D12_RESOURCE_DESC* GetBaseResourceDesc() const
+ {
+ // D3D12_RESOURCE_DESC1 can be cast to D3D12_RESOURCE_DESC by discarding the new members at the end.
+ return pResourceDesc;
+ }
+ D3D12_RESOURCE_STATES GetInitialResourceState() const
+ {
+ D3D12MA_ASSERT(Variant < VARIANT_WITH_LAYOUT);
+ return InitialResourceState;
+ }
+ const D3D12_CLEAR_VALUE* GetOptimizedClearValue() const
+ {
+ return pOptimizedClearValue;
+ }
+
+#ifdef __ID3D12Device8_INTERFACE_DEFINED__
+ const D3D12_RESOURCE_DESC1* GetResourceDesc1() const
+ {
+ D3D12MA_ASSERT(Variant >= VARIANT_WITH_STATE_AND_DESC1);
+ return pResourceDesc1;
+ }
+ const D3D12_RESOURCE_DESC1*& AccessResourceDesc1()
+ {
+ D3D12MA_ASSERT(Variant >= VARIANT_WITH_STATE_AND_DESC1);
+ return pResourceDesc1;
+ }
+#endif
+
+#ifdef __ID3D12Device10_INTERFACE_DEFINED__
+ D3D12_BARRIER_LAYOUT GetInitialLayout() const
+ {
+ D3D12MA_ASSERT(Variant >= VARIANT_WITH_LAYOUT);
+ return InitialLayout;
+ }
+ UINT32 GetNumCastableFormats() const
+ {
+ D3D12MA_ASSERT(Variant >= VARIANT_WITH_LAYOUT);
+ return NumCastableFormats;
+ }
+ DXGI_FORMAT* GetCastableFormats() const
+ {
+ D3D12MA_ASSERT(Variant >= VARIANT_WITH_LAYOUT);
+ return pCastableFormats;
+ }
+#endif
+
+private:
union
{
const D3D12_RESOURCE_DESC* pResourceDesc;
@@ -6874,35 +6928,35 @@
void** ppvResource)
{
#ifdef __ID3D12Device10_INTERFACE_DEFINED__
- if (createParams.variant == CREATE_RESOURCE_PARAMS::VARIANT_WITH_LAYOUT)
+ 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);
+ createParams.GetResourceDesc1(), createParams.GetInitialLayout(),
+ createParams.GetOptimizedClearValue(), createParams.GetNumCastableFormats(),
+ createParams.GetCastableFormats(), riidResource, ppvResource);
} else
#endif
#ifdef __ID3D12Device8_INTERFACE_DEFINED__
- if (createParams.variant == CREATE_RESOURCE_PARAMS::VARIANT_WITH_STATE_AND_DESC1)
+ 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);
+ createParams.GetResourceDesc1(), createParams.GetInitialResourceState(),
+ createParams.GetOptimizedClearValue(), riidResource, ppvResource);
} else
#endif
- if (createParams.variant == CREATE_RESOURCE_PARAMS::VARIANT_WITH_STATE)
+ if (createParams.Variant == CREATE_RESOURCE_PARAMS::VARIANT_WITH_STATE)
{
return m_Device->CreatePlacedResource(pHeap, HeapOffset,
- createParams.pResourceDesc, createParams.InitialResourceState,
- createParams.pOptimizedClearValue, riidResource, ppvResource);
+ createParams.GetResourceDesc(), createParams.GetInitialResourceState(),
+ createParams.GetOptimizedClearValue(), riidResource, ppvResource);
}
else
{
@@ -6919,7 +6973,7 @@
REFIID riidResource,
void** ppvResource)
{
- D3D12MA_ASSERT(pAllocDesc && createParams.pResourceDesc && ppAllocation);
+ D3D12MA_ASSERT(pAllocDesc && createParams.GetBaseResourceDesc() && ppAllocation);
*ppAllocation = NULL;
if (ppvResource)
@@ -6933,33 +6987,33 @@
D3D12_RESOURCE_DESC1 finalResourceDesc1;
#endif
D3D12_RESOURCE_ALLOCATION_INFO resAllocInfo;
- if (createParams.variant == CREATE_RESOURCE_PARAMS::VARIANT_WITH_STATE)
+ if (createParams.Variant == CREATE_RESOURCE_PARAMS::VARIANT_WITH_STATE)
{
- finalResourceDesc = *createParams.pResourceDesc;
- finalCreateParams.pResourceDesc = &finalResourceDesc;
+ finalResourceDesc = *createParams.GetResourceDesc();
+ finalCreateParams.AccessResourceDesc() = &finalResourceDesc;
resAllocInfo = GetResourceAllocationInfo(finalResourceDesc);
}
#ifdef __ID3D12Device8_INTERFACE_DEFINED__
- else if (createParams.variant == CREATE_RESOURCE_PARAMS::VARIANT_WITH_STATE_AND_DESC1)
+ else if (createParams.Variant == CREATE_RESOURCE_PARAMS::VARIANT_WITH_STATE_AND_DESC1)
{
if (!m_Device8)
{
return E_NOINTERFACE;
}
- finalResourceDesc1 = *createParams.pResourceDesc1;
- finalCreateParams.pResourceDesc1 = &finalResourceDesc1;
+ finalResourceDesc1 = *createParams.GetResourceDesc1();
+ finalCreateParams.AccessResourceDesc1() = &finalResourceDesc1;
resAllocInfo = GetResourceAllocationInfo(finalResourceDesc1);
}
#endif
#ifdef __ID3D12Device10_INTERFACE_DEFINED__
- else if (createParams.variant == CREATE_RESOURCE_PARAMS::VARIANT_WITH_LAYOUT)
+ else if (createParams.Variant == CREATE_RESOURCE_PARAMS::VARIANT_WITH_LAYOUT)
{
if (!m_Device10)
{
return E_NOINTERFACE;
}
- finalResourceDesc1 = *createParams.pResourceDesc1;
- finalCreateParams.pResourceDesc1 = &finalResourceDesc1;
+ finalResourceDesc1 = *createParams.GetResourceDesc1();
+ finalCreateParams.AccessResourceDesc1() = &finalResourceDesc1;
resAllocInfo = GetResourceAllocationInfo(finalResourceDesc1);
}
#endif
@@ -6974,9 +7028,22 @@
BlockVector* blockVector = NULL;
CommittedAllocationParameters committedAllocationParams = {};
bool preferCommitted = false;
- HRESULT hr = CalcAllocationParams<D3D12_RESOURCE_DESC>(*pAllocDesc, resAllocInfo.SizeInBytes,
- createParams.pResourceDesc,
- blockVector, committedAllocationParams, preferCommitted);
+
+ HRESULT hr;
+#ifdef __ID3D12Device8_INTERFACE_DEFINED__
+ if (createParams.Variant >= CREATE_RESOURCE_PARAMS::VARIANT_WITH_STATE_AND_DESC1)
+ {
+ hr = CalcAllocationParams<D3D12_RESOURCE_DESC1>(*pAllocDesc, resAllocInfo.SizeInBytes,
+ createParams.GetResourceDesc1(),
+ blockVector, committedAllocationParams, preferCommitted);
+ }
+ else
+#endif
+ {
+ hr = CalcAllocationParams<D3D12_RESOURCE_DESC>(*pAllocDesc, resAllocInfo.SizeInBytes,
+ createParams.GetResourceDesc(),
+ blockVector, committedAllocationParams, preferCommitted);
+ }
if (FAILED(hr))
return hr;
@@ -7064,33 +7131,33 @@
D3D12_RESOURCE_DESC1 finalResourceDesc1;
#endif
D3D12_RESOURCE_ALLOCATION_INFO resAllocInfo;
- if (createParams.variant == CREATE_RESOURCE_PARAMS::VARIANT_WITH_STATE)
+ if (createParams.Variant == CREATE_RESOURCE_PARAMS::VARIANT_WITH_STATE)
{
- finalResourceDesc = *createParams.pResourceDesc;
- finalCreateParams.pResourceDesc = &finalResourceDesc;
+ finalResourceDesc = *createParams.GetResourceDesc();
+ finalCreateParams.AccessResourceDesc() = &finalResourceDesc;
resAllocInfo = GetResourceAllocationInfo(finalResourceDesc);
}
#ifdef __ID3D12Device8_INTERFACE_DEFINED__
- else if (createParams.variant == CREATE_RESOURCE_PARAMS::VARIANT_WITH_STATE_AND_DESC1)
+ else if (createParams.Variant == CREATE_RESOURCE_PARAMS::VARIANT_WITH_STATE_AND_DESC1)
{
if (!m_Device8)
{
return E_NOINTERFACE;
}
- finalResourceDesc1 = *createParams.pResourceDesc1;
- finalCreateParams.pResourceDesc1 = &finalResourceDesc1;
+ finalResourceDesc1 = *createParams.GetResourceDesc1();
+ finalCreateParams.AccessResourceDesc1() = &finalResourceDesc1;
resAllocInfo = GetResourceAllocationInfo(finalResourceDesc1);
}
#endif
#ifdef __ID3D12Device10_INTERFACE_DEFINED__
- else if (createParams.variant == CREATE_RESOURCE_PARAMS::VARIANT_WITH_LAYOUT)
+ else if (createParams.Variant == CREATE_RESOURCE_PARAMS::VARIANT_WITH_LAYOUT)
{
if (!m_Device10)
{
return E_NOINTERFACE;
}
- finalResourceDesc1 = *createParams.pResourceDesc1;
- finalCreateParams.pResourceDesc1 = &finalResourceDesc1;
+ finalResourceDesc1 = *createParams.GetResourceDesc1();
+ finalCreateParams.AccessResourceDesc1() = &finalResourceDesc1;
resAllocInfo = GetResourceAllocationInfo(finalResourceDesc1);
}
#endif
@@ -7713,7 +7780,7 @@
hr = res->QueryInterface(riidResource, ppvResource);
if (SUCCEEDED(hr))
{
- (*ppAllocation)->SetResourcePointer(res, createParams.pResourceDesc);
+ (*ppAllocation)->SetResourcePointer(res, createParams.GetBaseResourceDesc());
return hr;
}
res->Release();
@@ -7741,7 +7808,7 @@
*/
#ifdef __ID3D12Device10_INTERFACE_DEFINED__
- if (createParams.variant == CREATE_RESOURCE_PARAMS::VARIANT_WITH_LAYOUT)
+ if (createParams.Variant == CREATE_RESOURCE_PARAMS::VARIANT_WITH_LAYOUT)
{
if (!m_Device10)
{
@@ -7750,14 +7817,14 @@
hr = m_Device10->CreateCommittedResource3(
&committedAllocParams.m_HeapProperties,
committedAllocParams.m_HeapFlags & ~RESOURCE_CLASS_HEAP_FLAGS,
- createParams.pResourceDesc1, createParams.InitialLayout,
- createParams.pOptimizedClearValue, committedAllocParams.m_ProtectedSession,
- createParams.NumCastableFormats, createParams.pCastableFormats,
+ createParams.GetResourceDesc1(), createParams.GetInitialLayout(),
+ createParams.GetOptimizedClearValue(), committedAllocParams.m_ProtectedSession,
+ createParams.GetNumCastableFormats(), createParams.GetCastableFormats(),
D3D12MA_IID_PPV_ARGS(&res));
} else
#endif
#ifdef __ID3D12Device8_INTERFACE_DEFINED__
- if (createParams.variant == CREATE_RESOURCE_PARAMS::VARIANT_WITH_STATE_AND_DESC1)
+ if (createParams.Variant == CREATE_RESOURCE_PARAMS::VARIANT_WITH_STATE_AND_DESC1)
{
if (!m_Device8)
{
@@ -7766,12 +7833,12 @@
hr = m_Device8->CreateCommittedResource2(
&committedAllocParams.m_HeapProperties,
committedAllocParams.m_HeapFlags & ~RESOURCE_CLASS_HEAP_FLAGS,
- createParams.pResourceDesc1, createParams.InitialResourceState,
- createParams.pOptimizedClearValue, committedAllocParams.m_ProtectedSession,
+ createParams.GetResourceDesc1(), createParams.GetInitialResourceState(),
+ createParams.GetOptimizedClearValue(), committedAllocParams.m_ProtectedSession,
D3D12MA_IID_PPV_ARGS(&res));
} else
#endif
- if (createParams.variant == CREATE_RESOURCE_PARAMS::VARIANT_WITH_STATE)
+ if (createParams.Variant == CREATE_RESOURCE_PARAMS::VARIANT_WITH_STATE)
{
#ifdef __ID3D12Device4_INTERFACE_DEFINED__
if (m_Device4)
@@ -7779,8 +7846,8 @@
hr = m_Device4->CreateCommittedResource1(
&committedAllocParams.m_HeapProperties,
committedAllocParams.m_HeapFlags & ~RESOURCE_CLASS_HEAP_FLAGS,
- createParams.pResourceDesc, createParams.InitialResourceState,
- createParams.pOptimizedClearValue, committedAllocParams.m_ProtectedSession,
+ createParams.GetResourceDesc(), createParams.GetInitialResourceState(),
+ createParams.GetOptimizedClearValue(), committedAllocParams.m_ProtectedSession,
D3D12MA_IID_PPV_ARGS(&res));
}
else
@@ -7791,8 +7858,8 @@
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));
+ createParams.GetResourceDesc(), createParams.GetInitialResourceState(),
+ createParams.GetOptimizedClearValue(), D3D12MA_IID_PPV_ARGS(&res));
}
else
hr = E_NOINTERFACE;
@@ -7815,9 +7882,10 @@
if (SUCCEEDED(hr))
{
const BOOL wasZeroInitialized = TRUE;
- Allocation* alloc = m_AllocationObjectAllocator.Allocate(this, resourceSize, createParams.pResourceDesc->Alignment, wasZeroInitialized);
+ Allocation* alloc = m_AllocationObjectAllocator.Allocate(
+ this, resourceSize, createParams.GetBaseResourceDesc()->Alignment, wasZeroInitialized);
alloc->InitCommitted(committedAllocParams.m_List);
- alloc->SetResourcePointer(res, createParams.pResourceDesc);
+ alloc->SetResourcePointer(res, createParams.GetBaseResourceDesc());
alloc->SetPrivateData(pPrivateData);
*ppAllocation = alloc;
@@ -8578,7 +8646,7 @@
}
if (SUCCEEDED(hr))
{
- (*ppAllocation)->SetResourcePointer(res, createParams.pResourceDesc);
+ (*ppAllocation)->SetResourcePointer(res, createParams.GetBaseResourceDesc());
}
else
{