Browse Source

Merge pull request #93707 from RandomShaper/fix_d3d12_stating

D3D12: Use the right state for resources in certain heap types
Rémi Verschelde 1 year ago
parent
commit
92c8e87cd9
1 changed files with 5 additions and 2 deletions
  1. 5 2
      drivers/d3d12/rendering_device_driver_d3d12.cpp

+ 5 - 2
drivers/d3d12/rendering_device_driver_d3d12.cpp

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