D3D12: Use the right state for resources in certain heap types
This commit is contained in:
parent
4ab8fb8093
commit
207f523441
|
@ -872,6 +872,7 @@ RDD::BufferID RenderingDeviceDriverD3D12::buffer_create(uint64_t p_size, BitFiel
|
|||
|
||||
D3D12MA::ALLOCATION_DESC allocation_desc = {};
|
||||
allocation_desc.HeapType = D3D12_HEAP_TYPE_DEFAULT;
|
||||
D3D12_RESOURCE_STATES initial_state = D3D12_RESOURCE_STATE_COMMON;
|
||||
switch (p_allocation_type) {
|
||||
case MEMORY_ALLOCATION_TYPE_CPU: {
|
||||
bool is_src = p_usage.has_flag(BUFFER_USAGE_TRANSFER_FROM_BIT);
|
||||
|
@ -879,10 +880,12 @@ RDD::BufferID RenderingDeviceDriverD3D12::buffer_create(uint64_t p_size, BitFiel
|
|||
if (is_src && !is_dst) {
|
||||
// Looks like a staging buffer: CPU maps, writes sequentially, then GPU copies to VRAM.
|
||||
allocation_desc.HeapType = D3D12_HEAP_TYPE_UPLOAD;
|
||||
initial_state = D3D12_RESOURCE_STATE_GENERIC_READ;
|
||||
}
|
||||
if (is_dst && !is_src) {
|
||||
// Looks like a readback buffer: GPU copies from VRAM, then CPU maps and reads.
|
||||
allocation_desc.HeapType = D3D12_HEAP_TYPE_READBACK;
|
||||
initial_state = D3D12_RESOURCE_STATE_COPY_DEST;
|
||||
}
|
||||
} break;
|
||||
case MEMORY_ALLOCATION_TYPE_GPU: {
|
||||
|
@ -911,7 +914,7 @@ RDD::BufferID RenderingDeviceDriverD3D12::buffer_create(uint64_t p_size, BitFiel
|
|||
res = allocator->CreateResource(
|
||||
&allocation_desc,
|
||||
reinterpret_cast<const D3D12_RESOURCE_DESC *>(&resource_desc),
|
||||
D3D12_RESOURCE_STATE_COMMON,
|
||||
initial_state,
|
||||
nullptr,
|
||||
allocation.GetAddressOf(),
|
||||
IID_PPV_ARGS(buffer.GetAddressOf()));
|
||||
|
@ -925,7 +928,7 @@ RDD::BufferID RenderingDeviceDriverD3D12::buffer_create(uint64_t p_size, BitFiel
|
|||
buf_info->resource = buffer.Get();
|
||||
buf_info->owner_info.resource = buffer;
|
||||
buf_info->owner_info.allocation = allocation;
|
||||
buf_info->owner_info.states.subresource_states.push_back(D3D12_RESOURCE_STATE_COMMON);
|
||||
buf_info->owner_info.states.subresource_states.push_back(initial_state);
|
||||
buf_info->states_ptr = &buf_info->owner_info.states;
|
||||
buf_info->size = p_size;
|
||||
buf_info->flags.usable_as_uav = (resource_desc.Flags & D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS);
|
||||
|
|
Loading…
Reference in New Issue