From 8417e21e8d496c13a30a1e300ff6b651947d0ede Mon Sep 17 00:00:00 2001 From: Vincent Lejeune Date: Mon, 28 Dec 2015 22:39:12 +0100 Subject: [PATCH 1/7] d3d12: Set command heap only when necessary. --- rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp | 6 ------ rpcs3/Emu/RSX/D3D12/D3D12MemoryHelpers.cpp | 7 +++++++ rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp | 7 +++++++ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp index 488f35d058..034bac2027 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp @@ -301,12 +301,6 @@ void D3D12GSRender::end() { upload_and_bind_textures(get_current_resource_storage().command_list.Get(), currentDescriptorIndex + 3, std::get<2>(*m_current_pso) > 0); - ID3D12DescriptorHeap *descriptors[] = - { - get_current_resource_storage().descriptors_heap.Get(), - get_current_resource_storage().sampler_descriptor_heap[get_current_resource_storage().sampler_descriptors_heap_index].Get(), - }; - get_current_resource_storage().command_list->SetDescriptorHeaps(2, descriptors); get_current_resource_storage().command_list->SetGraphicsRootDescriptorTable(0, CD3DX12_GPU_DESCRIPTOR_HANDLE(get_current_resource_storage().descriptors_heap->GetGPUDescriptorHandleForHeapStart()) diff --git a/rpcs3/Emu/RSX/D3D12/D3D12MemoryHelpers.cpp b/rpcs3/Emu/RSX/D3D12/D3D12MemoryHelpers.cpp index a85bc8fb58..a07e09fd73 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12MemoryHelpers.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12MemoryHelpers.cpp @@ -85,6 +85,13 @@ void resource_storage::reset() void resource_storage::set_new_command_list() { CHECK_HRESULT(command_list->Reset(command_allocator.Get(), nullptr)); + + ID3D12DescriptorHeap *descriptors[] = + { + descriptors_heap.Get(), + sampler_descriptor_heap[sampler_descriptors_heap_index].Get(), + }; + command_list->SetDescriptorHeaps(2, descriptors); } void resource_storage::init(ID3D12Device *device) diff --git a/rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp b/rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp index 7a8d55eddd..09eb91b5ac 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp @@ -335,6 +335,13 @@ void D3D12GSRender::upload_and_bind_textures(ID3D12GraphicsCommandList *command_ { get_current_resource_storage().sampler_descriptors_heap_index = 1; get_current_resource_storage().current_sampler_index = 0; + + ID3D12DescriptorHeap *descriptors[] = + { + get_current_resource_storage().descriptors_heap.Get(), + get_current_resource_storage().sampler_descriptor_heap[get_current_resource_storage().sampler_descriptors_heap_index].Get(), + }; + command_list->SetDescriptorHeaps(2, descriptors); } m_device->CreateSampler(&get_sampler_desc(textures[i]), CD3DX12_CPU_DESCRIPTOR_HANDLE(get_current_resource_storage().sampler_descriptor_heap[get_current_resource_storage().sampler_descriptors_heap_index]->GetCPUDescriptorHandleForHeapStart()) From 07f689662229705aab9ef07088d184b40e90c8a4 Mon Sep 17 00:00:00 2001 From: Vincent Lejeune Date: Mon, 28 Dec 2015 22:57:47 +0100 Subject: [PATCH 2/7] d3d12: Throw if program failed to build. --- rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp | 7 +------ rpcs3/Emu/RSX/D3D12/D3D12PipelineState.h | 2 +- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp index 034bac2027..80c30e49d2 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp @@ -271,12 +271,7 @@ void D3D12GSRender::end() m_timers.m_vertex_index_duration += std::chrono::duration_cast(vertex_index_duration_end - vertex_index_duration_start).count(); std::chrono::time_point program_load_start = std::chrono::system_clock::now(); - if (!load_program()) - { - LOG_ERROR(RSX, "LoadProgram failed."); - Emu.Pause(); - return; - } + load_program(); std::chrono::time_point program_load_end = std::chrono::system_clock::now(); m_timers.m_program_load_duration += std::chrono::duration_cast(program_load_end - program_load_start).count(); diff --git a/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.h b/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.h index 66547599f8..d4c4a8bb0c 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.h +++ b/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.h @@ -220,7 +220,7 @@ struct D3D12Traits graphicPipelineStateDesc.IBStripCutValue = pipelineProperties.CutValue; - extraData.first->CreateGraphicsPipelineState(&graphicPipelineStateDesc, IID_PPV_ARGS(&std::get<0>(*result))); + CHECK_HRESULT(extraData.first->CreateGraphicsPipelineState(&graphicPipelineStateDesc, IID_PPV_ARGS(&std::get<0>(*result)))); std::get<1>(*result) = vertexProgramData.vertex_shader_inputs; std::wstring name = L"PSO_" + std::to_wstring(vertexProgramData.id) + L"_" + std::to_wstring(fragmentProgramData.id); From 324b2da3ec337383fc9bfc18ebdff92a9a4f9324 Mon Sep 17 00:00:00 2001 From: Vincent Lejeune Date: Tue, 29 Dec 2015 18:09:59 +0100 Subject: [PATCH 3/7] d3d12: Recreate RTTs if size doesn't match. Fix Bomberman Ultra --- rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp b/rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp index 1afb8ca766..95f50089bd 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp @@ -272,7 +272,7 @@ ID3D12Resource *render_targets::bind_address_as_render_targets(ID3D12Device *dev { ComPtr rtt; rtt = It->second.Get(); - if (rtt->GetDesc().Format == dxgi_format) + if (rtt->GetDesc().Format == dxgi_format && rtt->GetDesc().Width == width && rtt->GetDesc().Height == height) { cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(rtt.Get(), D3D12_RESOURCE_STATE_GENERIC_READ, D3D12_RESOURCE_STATE_RENDER_TARGET)); return rtt.Get(); From 2a1f19b77633fc61ac9d77fdb480c7828cf97724 Mon Sep 17 00:00:00 2001 From: Zangetsu38 Date: Fri, 18 Dec 2015 14:21:42 +0100 Subject: [PATCH 4/7] d3d12: Fix for BIT.TRIP Runner2 --- rpcs3/Emu/RSX/D3D12/D3D12Formats.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rpcs3/Emu/RSX/D3D12/D3D12Formats.cpp b/rpcs3/Emu/RSX/D3D12/D3D12Formats.cpp index dc67d025e2..e0000fd83c 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12Formats.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12Formats.cpp @@ -303,9 +303,11 @@ DXGI_FORMAT get_color_surface_format(u8 format) switch (format) { case CELL_GCM_SURFACE_R5G6B5: return DXGI_FORMAT_B5G6R5_UNORM; + case CELL_GCM_SURFACE_X8R8G8B8_O8R8G8B8: return DXGI_FORMAT_B8G8R8X8_UNORM; //BIT.TRIP Runner2 use this case CELL_GCM_SURFACE_A8R8G8B8: return DXGI_FORMAT_R8G8B8A8_UNORM; case CELL_GCM_SURFACE_F_W16Z16Y16X16: return DXGI_FORMAT_R16G16B16A16_FLOAT; case CELL_GCM_SURFACE_F_X32: return DXGI_FORMAT_R32_FLOAT; + case CELL_GCM_SURFACE_A8B8G8R8: return DXGI_FORMAT_R8G8B8A8_UNORM; } throw EXCEPTION("Invalid format (0x%x)", format); } From 3529554c88c5f1b45507206dfc09e08649284f7f Mon Sep 17 00:00:00 2001 From: Zangetsu38 Date: Wed, 30 Dec 2015 06:59:57 +0100 Subject: [PATCH 5/7] d3d12: Fix Super Dub 'a' Dub --- rpcs3/Emu/RSX/D3D12/D3D12Formats.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/RSX/D3D12/D3D12Formats.cpp b/rpcs3/Emu/RSX/D3D12/D3D12Formats.cpp index e0000fd83c..2810b038ae 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12Formats.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12Formats.cpp @@ -38,8 +38,8 @@ D3D12_BLEND get_blend_factor(u16 factor) case CELL_GCM_DST_COLOR: return D3D12_BLEND_DEST_COLOR; case CELL_GCM_ONE_MINUS_DST_COLOR: return D3D12_BLEND_INV_DEST_COLOR; case CELL_GCM_SRC_ALPHA_SATURATE: return D3D12_BLEND_SRC_ALPHA_SAT; - case CELL_GCM_CONSTANT_COLOR: - case CELL_GCM_ONE_MINUS_CONSTANT_COLOR: + case CELL_GCM_CONSTANT_COLOR: return D3D12_BLEND_DEST_COLOR; + case CELL_GCM_ONE_MINUS_CONSTANT_COLOR: return D3D12_BLEND_INV_DEST_COLOR; case CELL_GCM_CONSTANT_ALPHA: case CELL_GCM_ONE_MINUS_CONSTANT_ALPHA: break; From 854365e6cec75fe377ffe8ac212370d580897237 Mon Sep 17 00:00:00 2001 From: Vincent Lejeune Date: Fri, 1 Jan 2016 22:11:41 +0100 Subject: [PATCH 6/7] d3d12: Reenable missing case for CELL_GCM_PRIMITIVE_LINE_LOOP --- rpcs3/Emu/RSX/D3D12/D3D12Formats.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rpcs3/Emu/RSX/D3D12/D3D12Formats.cpp b/rpcs3/Emu/RSX/D3D12/D3D12Formats.cpp index 2810b038ae..eb76f61f64 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12Formats.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12Formats.cpp @@ -292,8 +292,7 @@ D3D12_PRIMITIVE_TOPOLOGY_TYPE get_primitive_topology_type(u8 draw_mode) case CELL_GCM_PRIMITIVE_QUADS: return D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE; case CELL_GCM_PRIMITIVE_QUAD_STRIP: return D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE; case CELL_GCM_PRIMITIVE_POLYGON: return D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE; - case CELL_GCM_PRIMITIVE_LINE_LOOP: - break; + case CELL_GCM_PRIMITIVE_LINE_LOOP: return D3D12_PRIMITIVE_TOPOLOGY_TYPE_LINE; } throw EXCEPTION("Invalid or unsupported draw mode (0x%x)", draw_mode); } From f38d0e92e7ccf4c759e111e238881cf764672ec0 Mon Sep 17 00:00:00 2001 From: Vincent Lejeune Date: Fri, 1 Jan 2016 19:15:14 +0100 Subject: [PATCH 7/7] d3d12: Avoid implicit cast from int to bool in CHECK_HRESULT macro --- rpcs3/Emu/RSX/D3D12/D3D12Utils.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/D3D12/D3D12Utils.h b/rpcs3/Emu/RSX/D3D12/D3D12Utils.h index 82850e19ee..294b4b6ec7 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12Utils.h +++ b/rpcs3/Emu/RSX/D3D12/D3D12Utils.h @@ -9,7 +9,7 @@ using namespace Microsoft::WRL; -#define CHECK_HRESULT(expr) if (HRESULT hr = (expr)) if (FAILED(hr)) throw EXCEPTION("HRESULT = 0x%x", hr) +#define CHECK_HRESULT(expr) { HRESULT hr = (expr); if (FAILED(hr)) throw EXCEPTION("HRESULT = 0x%x", hr); } /** * Send data to dst pointer without polluting cache.