[D3D12] Non-zeroed heaps on 2004
This commit is contained in:
@@ -646,14 +646,16 @@ ID3D12Resource* D3D12CommandProcessor::RequestScratchGPUBuffer(
|
||||
|
||||
size = xe::align(size, kScratchBufferSizeIncrement);
|
||||
|
||||
auto device = GetD3D12Context().GetD3D12Provider().GetDevice();
|
||||
auto& provider = GetD3D12Context().GetD3D12Provider();
|
||||
auto device = provider.GetDevice();
|
||||
D3D12_RESOURCE_DESC buffer_desc;
|
||||
ui::d3d12::util::FillBufferResourceDesc(
|
||||
buffer_desc, size, D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS);
|
||||
ID3D12Resource* buffer;
|
||||
if (FAILED(device->CreateCommittedResource(
|
||||
&ui::d3d12::util::kHeapPropertiesDefault, D3D12_HEAP_FLAG_NONE,
|
||||
&buffer_desc, state, nullptr, IID_PPV_ARGS(&buffer)))) {
|
||||
&ui::d3d12::util::kHeapPropertiesDefault,
|
||||
provider.GetHeapFlagCreateNotZeroed(), &buffer_desc, state, nullptr,
|
||||
IID_PPV_ARGS(&buffer)))) {
|
||||
XELOGE("Failed to create a {} MB scratch GPU buffer", size >> 20);
|
||||
return nullptr;
|
||||
}
|
||||
@@ -889,7 +891,7 @@ bool D3D12CommandProcessor::SetupContext() {
|
||||
|
||||
// Initialize resource binding.
|
||||
constant_buffer_pool_ =
|
||||
std::make_unique<ui::d3d12::UploadBufferPool>(device, 1024 * 1024);
|
||||
std::make_unique<ui::d3d12::UploadBufferPool>(provider, 1024 * 1024);
|
||||
if (bindless_resources_used_) {
|
||||
D3D12_DESCRIPTOR_HEAP_DESC view_bindless_heap_desc;
|
||||
view_bindless_heap_desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
|
||||
@@ -1181,6 +1183,9 @@ bool D3D12CommandProcessor::SetupContext() {
|
||||
return false;
|
||||
}
|
||||
|
||||
D3D12_HEAP_FLAGS heap_flag_create_not_zeroed =
|
||||
provider.GetHeapFlagCreateNotZeroed();
|
||||
|
||||
// Create gamma ramp resources. The PWL gamma ramp is 16-bit, but 6 bits are
|
||||
// hardwired to zero, so DXGI_FORMAT_R10G10B10A2_UNORM can be used for it too.
|
||||
// https://www.x.org/docs/AMD/old/42590_m76_rrg_1.01o.pdf
|
||||
@@ -1202,7 +1207,7 @@ bool D3D12CommandProcessor::SetupContext() {
|
||||
// The first action will be uploading.
|
||||
gamma_ramp_texture_state_ = D3D12_RESOURCE_STATE_COPY_DEST;
|
||||
if (FAILED(device->CreateCommittedResource(
|
||||
&ui::d3d12::util::kHeapPropertiesDefault, D3D12_HEAP_FLAG_NONE,
|
||||
&ui::d3d12::util::kHeapPropertiesDefault, heap_flag_create_not_zeroed,
|
||||
&gamma_ramp_desc, gamma_ramp_texture_state_, nullptr,
|
||||
IID_PPV_ARGS(&gamma_ramp_texture_)))) {
|
||||
XELOGE("Failed to create the gamma ramp texture");
|
||||
@@ -1218,7 +1223,7 @@ bool D3D12CommandProcessor::SetupContext() {
|
||||
ui::d3d12::util::FillBufferResourceDesc(
|
||||
gamma_ramp_desc, gamma_ramp_upload_size, D3D12_RESOURCE_FLAG_NONE);
|
||||
if (FAILED(device->CreateCommittedResource(
|
||||
&ui::d3d12::util::kHeapPropertiesUpload, D3D12_HEAP_FLAG_NONE,
|
||||
&ui::d3d12::util::kHeapPropertiesUpload, heap_flag_create_not_zeroed,
|
||||
&gamma_ramp_desc, D3D12_RESOURCE_STATE_GENERIC_READ, nullptr,
|
||||
IID_PPV_ARGS(&gamma_ramp_upload_)))) {
|
||||
XELOGE("Failed to create the gamma ramp upload buffer");
|
||||
@@ -1246,7 +1251,7 @@ bool D3D12CommandProcessor::SetupContext() {
|
||||
swap_texture_desc.Flags = D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET;
|
||||
// Can be sampled at any time, switch to render target when needed, then back.
|
||||
if (FAILED(device->CreateCommittedResource(
|
||||
&ui::d3d12::util::kHeapPropertiesDefault, D3D12_HEAP_FLAG_NONE,
|
||||
&ui::d3d12::util::kHeapPropertiesDefault, heap_flag_create_not_zeroed,
|
||||
&swap_texture_desc, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE,
|
||||
nullptr, IID_PPV_ARGS(&swap_texture_)))) {
|
||||
XELOGE("Failed to create the command processor front buffer");
|
||||
@@ -4286,15 +4291,16 @@ ID3D12Resource* D3D12CommandProcessor::RequestReadbackBuffer(uint32_t size) {
|
||||
}
|
||||
size = xe::align(size, kReadbackBufferSizeIncrement);
|
||||
if (size > readback_buffer_size_) {
|
||||
auto device = GetD3D12Context().GetD3D12Provider().GetDevice();
|
||||
auto& provider = GetD3D12Context().GetD3D12Provider();
|
||||
auto device = provider.GetDevice();
|
||||
D3D12_RESOURCE_DESC buffer_desc;
|
||||
ui::d3d12::util::FillBufferResourceDesc(buffer_desc, size,
|
||||
D3D12_RESOURCE_FLAG_NONE);
|
||||
ID3D12Resource* buffer;
|
||||
if (FAILED(device->CreateCommittedResource(
|
||||
&ui::d3d12::util::kHeapPropertiesReadback, D3D12_HEAP_FLAG_NONE,
|
||||
&buffer_desc, D3D12_RESOURCE_STATE_COPY_DEST, nullptr,
|
||||
IID_PPV_ARGS(&buffer)))) {
|
||||
&ui::d3d12::util::kHeapPropertiesReadback,
|
||||
provider.GetHeapFlagCreateNotZeroed(), &buffer_desc,
|
||||
D3D12_RESOURCE_STATE_COPY_DEST, nullptr, IID_PPV_ARGS(&buffer)))) {
|
||||
XELOGE("Failed to create a {} MB readback buffer", size >> 20);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@@ -47,14 +47,16 @@ PrimitiveConverter::PrimitiveConverter(D3D12CommandProcessor& command_processor,
|
||||
PrimitiveConverter::~PrimitiveConverter() { Shutdown(); }
|
||||
|
||||
bool PrimitiveConverter::Initialize() {
|
||||
auto device =
|
||||
command_processor_.GetD3D12Context().GetD3D12Provider().GetDevice();
|
||||
auto& provider = command_processor_.GetD3D12Context().GetD3D12Provider();
|
||||
auto device = provider.GetDevice();
|
||||
D3D12_HEAP_FLAGS heap_flag_create_not_zeroed =
|
||||
provider.GetHeapFlagCreateNotZeroed();
|
||||
|
||||
// There can be at most 65535 indices in a Xenos draw call, but they can be up
|
||||
// to 4 bytes large, and conversion can add more indices (almost triple the
|
||||
// count for triangle strips, for instance).
|
||||
buffer_pool_ =
|
||||
std::make_unique<ui::d3d12::UploadBufferPool>(device, 4 * 1024 * 1024);
|
||||
std::make_unique<ui::d3d12::UploadBufferPool>(provider, 4 * 1024 * 1024);
|
||||
|
||||
// Create the static index buffer for non-indexed drawing.
|
||||
D3D12_RESOURCE_DESC static_ib_desc;
|
||||
@@ -62,7 +64,7 @@ bool PrimitiveConverter::Initialize() {
|
||||
static_ib_desc, kStaticIBTotalCount * sizeof(uint16_t),
|
||||
D3D12_RESOURCE_FLAG_NONE);
|
||||
if (FAILED(device->CreateCommittedResource(
|
||||
&ui::d3d12::util::kHeapPropertiesUpload, D3D12_HEAP_FLAG_NONE,
|
||||
&ui::d3d12::util::kHeapPropertiesUpload, heap_flag_create_not_zeroed,
|
||||
&static_ib_desc, D3D12_RESOURCE_STATE_GENERIC_READ, nullptr,
|
||||
IID_PPV_ARGS(&static_ib_upload_)))) {
|
||||
XELOGE(
|
||||
@@ -108,7 +110,7 @@ bool PrimitiveConverter::Initialize() {
|
||||
// Not uploaded yet.
|
||||
static_ib_upload_submission_ = UINT64_MAX;
|
||||
if (FAILED(device->CreateCommittedResource(
|
||||
&ui::d3d12::util::kHeapPropertiesDefault, D3D12_HEAP_FLAG_NONE,
|
||||
&ui::d3d12::util::kHeapPropertiesDefault, heap_flag_create_not_zeroed,
|
||||
&static_ib_desc, D3D12_RESOURCE_STATE_COPY_DEST, nullptr,
|
||||
IID_PPV_ARGS(&static_ib_)))) {
|
||||
XELOGE("Failed to create the primitive conversion static index buffer");
|
||||
|
||||
@@ -137,8 +137,6 @@ bool RenderTargetCache::Initialize(const TextureCache& texture_cache) {
|
||||
uint32_t edram_buffer_size = GetEdramBufferSize();
|
||||
|
||||
// Create the buffer for reinterpreting EDRAM contents.
|
||||
// No need to clear it in the first frame, memory is zeroed out when allocated
|
||||
// on Windows.
|
||||
D3D12_RESOURCE_DESC edram_buffer_desc;
|
||||
ui::d3d12::util::FillBufferResourceDesc(
|
||||
edram_buffer_desc, edram_buffer_size,
|
||||
@@ -147,8 +145,15 @@ bool RenderTargetCache::Initialize(const TextureCache& texture_cache) {
|
||||
edram_buffer_state_ = edram_rov_used_
|
||||
? D3D12_RESOURCE_STATE_UNORDERED_ACCESS
|
||||
: D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE;
|
||||
// Request zeroed (though no guarantee) when not using ROV so the host 32-bit
|
||||
// depth buffer will be initialized to deterministic values (because it's
|
||||
// involved in comparison with converted 24-bit values - whether the 32-bit
|
||||
// value is up to date is determined by whether it's equal to the 24-bit
|
||||
// value in the main EDRAM buffer when converted to 24-bit).
|
||||
if (FAILED(device->CreateCommittedResource(
|
||||
&ui::d3d12::util::kHeapPropertiesDefault, D3D12_HEAP_FLAG_NONE,
|
||||
&ui::d3d12::util::kHeapPropertiesDefault,
|
||||
edram_rov_used_ ? provider.GetHeapFlagCreateNotZeroed()
|
||||
: D3D12_HEAP_FLAG_NONE,
|
||||
&edram_buffer_desc, edram_buffer_state_, nullptr,
|
||||
IID_PPV_ARGS(&edram_buffer_)))) {
|
||||
XELOGE("Failed to create the EDRAM buffer");
|
||||
@@ -1451,10 +1456,11 @@ bool RenderTargetCache::InitializeTraceSubmitDownloads() {
|
||||
ui::d3d12::util::FillBufferResourceDesc(edram_snapshot_download_buffer_desc,
|
||||
xenos::kEdramSizeBytes,
|
||||
D3D12_RESOURCE_FLAG_NONE);
|
||||
auto device =
|
||||
command_processor_.GetD3D12Context().GetD3D12Provider().GetDevice();
|
||||
auto& provider = command_processor_.GetD3D12Context().GetD3D12Provider();
|
||||
auto device = provider.GetDevice();
|
||||
if (FAILED(device->CreateCommittedResource(
|
||||
&ui::d3d12::util::kHeapPropertiesReadback, D3D12_HEAP_FLAG_NONE,
|
||||
&ui::d3d12::util::kHeapPropertiesReadback,
|
||||
provider.GetHeapFlagCreateNotZeroed(),
|
||||
&edram_snapshot_download_buffer_desc,
|
||||
D3D12_RESOURCE_STATE_COPY_DEST, nullptr,
|
||||
IID_PPV_ARGS(&edram_snapshot_download_buffer_)))) {
|
||||
@@ -1493,10 +1499,9 @@ void RenderTargetCache::RestoreEdramSnapshot(const void* snapshot) {
|
||||
return;
|
||||
}
|
||||
auto& provider = command_processor_.GetD3D12Context().GetD3D12Provider();
|
||||
auto device = provider.GetDevice();
|
||||
if (!edram_snapshot_restore_pool_) {
|
||||
edram_snapshot_restore_pool_ =
|
||||
std::make_unique<ui::d3d12::UploadBufferPool>(device,
|
||||
std::make_unique<ui::d3d12::UploadBufferPool>(provider,
|
||||
xenos::kEdramSizeBytes);
|
||||
}
|
||||
ID3D12Resource* upload_buffer;
|
||||
@@ -1603,14 +1608,15 @@ bool RenderTargetCache::MakeHeapResident(uint32_t heap_index) {
|
||||
if (heaps_[heap_index] != nullptr) {
|
||||
return true;
|
||||
}
|
||||
auto device =
|
||||
command_processor_.GetD3D12Context().GetD3D12Provider().GetDevice();
|
||||
auto& provider = command_processor_.GetD3D12Context().GetD3D12Provider();
|
||||
auto device = provider.GetDevice();
|
||||
D3D12_HEAP_DESC heap_desc = {};
|
||||
heap_desc.SizeInBytes = kHeap4MBPages << 22;
|
||||
heap_desc.Properties.Type = D3D12_HEAP_TYPE_DEFAULT;
|
||||
// TODO(Triang3l): If real MSAA is added, alignment must be 4 MB.
|
||||
heap_desc.Alignment = 0;
|
||||
heap_desc.Flags = D3D12_HEAP_FLAG_ALLOW_ONLY_RT_DS_TEXTURES;
|
||||
heap_desc.Flags = D3D12_HEAP_FLAG_ALLOW_ONLY_RT_DS_TEXTURES |
|
||||
provider.GetHeapFlagCreateNotZeroed();
|
||||
if (FAILED(
|
||||
device->CreateHeap(&heap_desc, IID_PPV_ARGS(&heaps_[heap_index])))) {
|
||||
XELOGE("Failed to create a {} MB heap for render targets",
|
||||
@@ -1756,8 +1762,9 @@ RenderTargetCache::RenderTarget* RenderTargetCache::FindOrCreateRenderTarget(
|
||||
}
|
||||
#else
|
||||
if (FAILED(device->CreateCommittedResource(
|
||||
&ui::d3d12::util::kHeapPropertiesDefault, D3D12_HEAP_FLAG_NONE,
|
||||
&resource_desc, state, nullptr, IID_PPV_ARGS(&resource)))) {
|
||||
&ui::d3d12::util::kHeapPropertiesDefault,
|
||||
provider.GetHeapFlagCreateNotZeroed(), &resource_desc, state, nullptr,
|
||||
IID_PPV_ARGS(&resource)))) {
|
||||
XELOGE(
|
||||
"Failed to create a committed resource for {}x{} {} render target with "
|
||||
"format {}",
|
||||
|
||||
@@ -73,8 +73,9 @@ bool SharedMemory::Initialize() {
|
||||
"resources yet.");
|
||||
}
|
||||
if (FAILED(device->CreateCommittedResource(
|
||||
&ui::d3d12::util::kHeapPropertiesDefault, D3D12_HEAP_FLAG_NONE,
|
||||
&buffer_desc, buffer_state_, nullptr, IID_PPV_ARGS(&buffer_)))) {
|
||||
&ui::d3d12::util::kHeapPropertiesDefault,
|
||||
provider.GetHeapFlagCreateNotZeroed(), &buffer_desc, buffer_state_,
|
||||
nullptr, IID_PPV_ARGS(&buffer_)))) {
|
||||
XELOGE("Shared memory: Failed to create the 512 MB buffer");
|
||||
Shutdown();
|
||||
return false;
|
||||
@@ -153,7 +154,7 @@ bool SharedMemory::Initialize() {
|
||||
system_page_flags_.resize((page_count_ + 63) / 64);
|
||||
|
||||
upload_buffer_pool_ = std::make_unique<ui::d3d12::UploadBufferPool>(
|
||||
device,
|
||||
provider,
|
||||
xe::align(uint32_t(4 * 1024 * 1024), uint32_t(1) << page_size_log2_));
|
||||
|
||||
memory_invalidation_callback_handle_ =
|
||||
@@ -370,7 +371,8 @@ bool SharedMemory::EnsureTilesResident(uint32_t start, uint32_t length) {
|
||||
D3D12_HEAP_DESC heap_desc = {};
|
||||
heap_desc.SizeInBytes = kHeapSize;
|
||||
heap_desc.Properties.Type = D3D12_HEAP_TYPE_DEFAULT;
|
||||
heap_desc.Flags = D3D12_HEAP_FLAG_ALLOW_ONLY_BUFFERS;
|
||||
heap_desc.Flags = D3D12_HEAP_FLAG_ALLOW_ONLY_BUFFERS |
|
||||
provider.GetHeapFlagCreateNotZeroed();
|
||||
if (FAILED(device->CreateHeap(&heap_desc, IID_PPV_ARGS(&heaps_[i])))) {
|
||||
XELOGE("Shared memory: Failed to create a tile heap");
|
||||
return false;
|
||||
@@ -890,11 +892,12 @@ bool SharedMemory::InitializeTraceSubmitDownloads() {
|
||||
ui::d3d12::util::FillBufferResourceDesc(
|
||||
gpu_written_buffer_desc, gpu_written_page_count << page_size_log2_,
|
||||
D3D12_RESOURCE_FLAG_NONE);
|
||||
auto device =
|
||||
command_processor_.GetD3D12Context().GetD3D12Provider().GetDevice();
|
||||
auto& provider = command_processor_.GetD3D12Context().GetD3D12Provider();
|
||||
auto device = provider.GetDevice();
|
||||
if (FAILED(device->CreateCommittedResource(
|
||||
&ui::d3d12::util::kHeapPropertiesReadback, D3D12_HEAP_FLAG_NONE,
|
||||
&gpu_written_buffer_desc, D3D12_RESOURCE_STATE_COPY_DEST, nullptr,
|
||||
&ui::d3d12::util::kHeapPropertiesReadback,
|
||||
provider.GetHeapFlagCreateNotZeroed(), &gpu_written_buffer_desc,
|
||||
D3D12_RESOURCE_STATE_COPY_DEST, nullptr,
|
||||
IID_PPV_ARGS(&trace_gpu_written_buffer_)))) {
|
||||
XELOGE(
|
||||
"Shared memory: Failed to create a {} KB GPU-written memory download "
|
||||
|
||||
@@ -1633,7 +1633,8 @@ bool TextureCache::EnsureScaledResolveBufferResident(uint32_t start_unscaled,
|
||||
D3D12_HEAP_DESC heap_desc = {};
|
||||
heap_desc.SizeInBytes = kScaledResolveHeapSize;
|
||||
heap_desc.Properties.Type = D3D12_HEAP_TYPE_DEFAULT;
|
||||
heap_desc.Flags = D3D12_HEAP_FLAG_ALLOW_ONLY_BUFFERS;
|
||||
heap_desc.Flags = D3D12_HEAP_FLAG_ALLOW_ONLY_BUFFERS |
|
||||
provider.GetHeapFlagCreateNotZeroed();
|
||||
if (FAILED(device->CreateHeap(&heap_desc,
|
||||
IID_PPV_ARGS(&scaled_resolve_heaps_[i])))) {
|
||||
XELOGE("Texture cache: Failed to create a scaled resolve tile heap");
|
||||
@@ -1953,14 +1954,15 @@ TextureCache::Texture* TextureCache::FindOrCreateTexture(TextureKey key) {
|
||||
// Untiling through a buffer instead of using unordered access because copying
|
||||
// is not done that often.
|
||||
desc.Flags = D3D12_RESOURCE_FLAG_NONE;
|
||||
auto device =
|
||||
command_processor_.GetD3D12Context().GetD3D12Provider().GetDevice();
|
||||
auto& provider = command_processor_.GetD3D12Context().GetD3D12Provider();
|
||||
auto device = provider.GetDevice();
|
||||
// Assuming untiling will be the next operation.
|
||||
D3D12_RESOURCE_STATES state = D3D12_RESOURCE_STATE_COPY_DEST;
|
||||
ID3D12Resource* resource;
|
||||
if (FAILED(device->CreateCommittedResource(
|
||||
&ui::d3d12::util::kHeapPropertiesDefault, D3D12_HEAP_FLAG_NONE, &desc,
|
||||
state, nullptr, IID_PPV_ARGS(&resource)))) {
|
||||
&ui::d3d12::util::kHeapPropertiesDefault,
|
||||
provider.GetHeapFlagCreateNotZeroed(), &desc, state, nullptr,
|
||||
IID_PPV_ARGS(&resource)))) {
|
||||
LogTextureKeyAction(key, "Failed to create");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user