mirror of
https://github.com/GPUOpen-LibrariesAndSDKs/D3D12MemoryAllocator.git
synced 2024-11-24 21:10:11 +00:00
Add ALLOCATOR_FLAG_ALWAYS_COMMITTED, remove debug macro D3D12MA_DEBUG_ALWAYS_COMMITTED
Also fixed nasty bug with uninitialized member of Allocation class.
This commit is contained in:
parent
42693ff059
commit
6deedf96b5
@ -51,14 +51,6 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef D3D12MA_DEBUG_ALWAYS_COMMITTED
|
|
||||||
/*
|
|
||||||
Every allocation will have its own memory block.
|
|
||||||
Define to 1 for debugging purposes only.
|
|
||||||
*/
|
|
||||||
#define D3D12MA_DEBUG_ALWAYS_COMMITTED (0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef D3D12MA_DEBUG_ALIGNMENT
|
#ifndef D3D12MA_DEBUG_ALIGNMENT
|
||||||
/*
|
/*
|
||||||
Minimum alignment of all allocations, in bytes.
|
Minimum alignment of all allocations, in bytes.
|
||||||
@ -2139,7 +2131,8 @@ private:
|
|||||||
*/
|
*/
|
||||||
static bool PrefersCommittedAllocation(const D3D12_RESOURCE_DESC& resourceDesc);
|
static bool PrefersCommittedAllocation(const D3D12_RESOURCE_DESC& resourceDesc);
|
||||||
|
|
||||||
bool m_UseMutex;
|
const bool m_UseMutex;
|
||||||
|
const bool m_AlwaysCommitted;
|
||||||
ID3D12Device* m_Device;
|
ID3D12Device* m_Device;
|
||||||
UINT64 m_PreferredBlockSize;
|
UINT64 m_PreferredBlockSize;
|
||||||
ALLOCATION_CALLBACKS m_AllocationCallbacks;
|
ALLOCATION_CALLBACKS m_AllocationCallbacks;
|
||||||
@ -3239,6 +3232,7 @@ void BlockVector::WriteBlockInfoToJson(JsonWriter& json)
|
|||||||
|
|
||||||
AllocatorPimpl::AllocatorPimpl(const ALLOCATION_CALLBACKS& allocationCallbacks, const ALLOCATOR_DESC& desc) :
|
AllocatorPimpl::AllocatorPimpl(const ALLOCATION_CALLBACKS& allocationCallbacks, const ALLOCATOR_DESC& desc) :
|
||||||
m_UseMutex((desc.Flags & ALLOCATOR_FLAG_SINGLETHREADED) == 0),
|
m_UseMutex((desc.Flags & ALLOCATOR_FLAG_SINGLETHREADED) == 0),
|
||||||
|
m_AlwaysCommitted((desc.Flags & ALLOCATOR_FLAG_ALWAYS_COMMITTED) != 0),
|
||||||
m_Device(desc.pDevice),
|
m_Device(desc.pDevice),
|
||||||
m_PreferredBlockSize(desc.PreferredBlockSize != 0 ? desc.PreferredBlockSize : D3D12MA_DEFAULT_BLOCK_SIZE),
|
m_PreferredBlockSize(desc.PreferredBlockSize != 0 ? desc.PreferredBlockSize : D3D12MA_DEFAULT_BLOCK_SIZE),
|
||||||
m_AllocationCallbacks(allocationCallbacks),
|
m_AllocationCallbacks(allocationCallbacks),
|
||||||
@ -3338,7 +3332,7 @@ HRESULT AllocatorPimpl::CreateResource(
|
|||||||
|
|
||||||
const UINT64 preferredBlockSize = blockVector->GetPreferredBlockSize();
|
const UINT64 preferredBlockSize = blockVector->GetPreferredBlockSize();
|
||||||
bool preferCommittedMemory =
|
bool preferCommittedMemory =
|
||||||
D3D12MA_DEBUG_ALWAYS_COMMITTED ||
|
m_AlwaysCommitted ||
|
||||||
PrefersCommittedAllocation(*pResourceDesc) ||
|
PrefersCommittedAllocation(*pResourceDesc) ||
|
||||||
// Heuristics: Allocate committed memory if requested size if greater than half of preferred block size.
|
// Heuristics: Allocate committed memory if requested size if greater than half of preferred block size.
|
||||||
resAllocInfo.SizeInBytes > preferredBlockSize / 2;
|
resAllocInfo.SizeInBytes > preferredBlockSize / 2;
|
||||||
@ -3433,7 +3427,7 @@ HRESULT AllocatorPimpl::AllocateMemory(
|
|||||||
|
|
||||||
const UINT64 preferredBlockSize = blockVector->GetPreferredBlockSize();
|
const UINT64 preferredBlockSize = blockVector->GetPreferredBlockSize();
|
||||||
bool preferCommittedMemory =
|
bool preferCommittedMemory =
|
||||||
D3D12MA_DEBUG_ALWAYS_COMMITTED ||
|
m_AlwaysCommitted ||
|
||||||
// Heuristics: Allocate committed memory if requested size if greater than half of preferred block size.
|
// Heuristics: Allocate committed memory if requested size if greater than half of preferred block size.
|
||||||
pAllocInfo->SizeInBytes > preferredBlockSize / 2;
|
pAllocInfo->SizeInBytes > preferredBlockSize / 2;
|
||||||
if(preferCommittedMemory &&
|
if(preferCommittedMemory &&
|
||||||
@ -4039,6 +4033,7 @@ void Allocation::InitHeap(AllocatorPimpl* allocator, UINT64 size, D3D12_HEAP_TYP
|
|||||||
m_Allocator = allocator;
|
m_Allocator = allocator;
|
||||||
m_Type = TYPE_HEAP;
|
m_Type = TYPE_HEAP;
|
||||||
m_Size = size;
|
m_Size = size;
|
||||||
|
m_Resource = NULL;
|
||||||
m_Name = NULL;
|
m_Name = NULL;
|
||||||
m_Heap.heapType = heapType;
|
m_Heap.heapType = heapType;
|
||||||
m_Heap.heap = heap;
|
m_Heap.heap = heap;
|
||||||
|
@ -539,6 +539,12 @@ typedef enum ALLOCATOR_FLAGS
|
|||||||
Using this flag may increase performance because internal mutexes are not used.
|
Using this flag may increase performance because internal mutexes are not used.
|
||||||
*/
|
*/
|
||||||
ALLOCATOR_FLAG_SINGLETHREADED = 0x1,
|
ALLOCATOR_FLAG_SINGLETHREADED = 0x1,
|
||||||
|
|
||||||
|
/**
|
||||||
|
Every allocation will have its own memory block.
|
||||||
|
To be used for debugging purposes.
|
||||||
|
*/
|
||||||
|
ALLOCATOR_FLAG_ALWAYS_COMMITTED = 0x2,
|
||||||
} ALLOCATOR_FLAGS;
|
} ALLOCATOR_FLAGS;
|
||||||
|
|
||||||
/// \brief Parameters of created Allocator object. To be used with CreateAllocator().
|
/// \brief Parameters of created Allocator object. To be used with CreateAllocator().
|
||||||
|
@ -48,6 +48,7 @@ static const D3D_FEATURE_LEVEL MY_D3D_FEATURE_LEVEL = D3D_FEATURE_LEVEL_12_0;
|
|||||||
static const bool ENABLE_DEBUG_LAYER = true;
|
static const bool ENABLE_DEBUG_LAYER = true;
|
||||||
static const bool ENABLE_CPU_ALLOCATION_CALLBACKS = true;
|
static const bool ENABLE_CPU_ALLOCATION_CALLBACKS = true;
|
||||||
static const bool ENABLE_CPU_ALLOCATION_CALLBACKS_PRINT = false;
|
static const bool ENABLE_CPU_ALLOCATION_CALLBACKS_PRINT = false;
|
||||||
|
static constexpr D3D12MA::ALLOCATOR_FLAGS g_AllocatorFlags = D3D12MA::ALLOCATOR_FLAG_NONE;
|
||||||
|
|
||||||
static HINSTANCE g_Instance;
|
static HINSTANCE g_Instance;
|
||||||
static HWND g_Wnd;
|
static HWND g_Wnd;
|
||||||
@ -417,7 +418,7 @@ void InitD3D() // initializes direct3d 12
|
|||||||
|
|
||||||
{
|
{
|
||||||
D3D12MA::ALLOCATOR_DESC desc = {};
|
D3D12MA::ALLOCATOR_DESC desc = {};
|
||||||
desc.Flags = D3D12MA::ALLOCATOR_FLAG_NONE;
|
desc.Flags = g_AllocatorFlags;
|
||||||
desc.pDevice = device;
|
desc.pDevice = device;
|
||||||
|
|
||||||
D3D12MA::ALLOCATION_CALLBACKS allocationCallbacks = {};
|
D3D12MA::ALLOCATION_CALLBACKS allocationCallbacks = {};
|
||||||
@ -1376,6 +1377,7 @@ static void ExecuteTests()
|
|||||||
TestContext ctx = {};
|
TestContext ctx = {};
|
||||||
ctx.device = g_Device;
|
ctx.device = g_Device;
|
||||||
ctx.allocator = g_Allocator;
|
ctx.allocator = g_Allocator;
|
||||||
|
ctx.allocatorFlags = g_AllocatorFlags;
|
||||||
Test(ctx);
|
Test(ctx);
|
||||||
}
|
}
|
||||||
catch(const std::exception& ex)
|
catch(const std::exception& ex)
|
||||||
|
@ -217,6 +217,8 @@ static void TestPlacedResources(const TestContext& ctx)
|
|||||||
{
|
{
|
||||||
wprintf(L"Test placed resources\n");
|
wprintf(L"Test placed resources\n");
|
||||||
|
|
||||||
|
const bool alwaysCommitted = (ctx.allocatorFlags & D3D12MA::ALLOCATOR_FLAG_ALWAYS_COMMITTED) != 0;
|
||||||
|
|
||||||
const UINT count = 4;
|
const UINT count = 4;
|
||||||
const UINT64 bufSize = 32ull * 1024;
|
const UINT64 bufSize = 32ull * 1024;
|
||||||
ResourceWithAllocation resources[count];
|
ResourceWithAllocation resources[count];
|
||||||
@ -240,8 +242,11 @@ static void TestPlacedResources(const TestContext& ctx)
|
|||||||
resources[i].allocation.reset(alloc);
|
resources[i].allocation.reset(alloc);
|
||||||
|
|
||||||
// Make sure it doesn't have implicit heap.
|
// Make sure it doesn't have implicit heap.
|
||||||
|
if(!alwaysCommitted)
|
||||||
|
{
|
||||||
CHECK_BOOL( resources[i].allocation->GetHeap() != NULL );
|
CHECK_BOOL( resources[i].allocation->GetHeap() != NULL );
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Make sure at least some of the resources belong to the same heap, but their memory ranges don't overlap.
|
// Make sure at least some of the resources belong to the same heap, but their memory ranges don't overlap.
|
||||||
bool sameHeapFound = false;
|
bool sameHeapFound = false;
|
||||||
@ -260,7 +265,10 @@ static void TestPlacedResources(const TestContext& ctx)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(!alwaysCommitted)
|
||||||
|
{
|
||||||
CHECK_BOOL(sameHeapFound);
|
CHECK_BOOL(sameHeapFound);
|
||||||
|
}
|
||||||
|
|
||||||
// Additionally create a texture to see if no error occurs due to bad handling of Resource Tier.
|
// Additionally create a texture to see if no error occurs due to bad handling of Resource Tier.
|
||||||
resourceDesc = {};
|
resourceDesc = {};
|
||||||
@ -347,7 +355,7 @@ static void TestAliasingMemory(const TestContext& ctx)
|
|||||||
|
|
||||||
D3D12_RESOURCE_ALLOCATION_INFO allocInfo = {};
|
D3D12_RESOURCE_ALLOCATION_INFO allocInfo = {};
|
||||||
allocInfo.Alignment = std::max(allocInfo1.Alignment, allocInfo2.Alignment);
|
allocInfo.Alignment = std::max(allocInfo1.Alignment, allocInfo2.Alignment);
|
||||||
allocInfo.SizeInBytes = std::max(allocInfo1.SizeInBytes, allocInfo2.SizeInBytes);
|
allocInfo.SizeInBytes = AlignUp(std::max(allocInfo1.SizeInBytes, allocInfo2.SizeInBytes), 64ull * 1024);
|
||||||
|
|
||||||
D3D12MA::Allocation* allocPtr = NULL;
|
D3D12MA::Allocation* allocPtr = NULL;
|
||||||
CHECK_HR( ctx.allocator->AllocateMemory(
|
CHECK_HR( ctx.allocator->AllocateMemory(
|
||||||
|
@ -28,6 +28,7 @@ struct TestContext
|
|||||||
{
|
{
|
||||||
ID3D12Device* device;
|
ID3D12Device* device;
|
||||||
D3D12MA::Allocator* allocator;
|
D3D12MA::Allocator* allocator;
|
||||||
|
D3D12MA::ALLOCATOR_FLAGS allocatorFlags;
|
||||||
};
|
};
|
||||||
|
|
||||||
void Test(const TestContext& ctx);
|
void Test(const TestContext& ctx);
|
||||||
|
Loading…
Reference in New Issue
Block a user