From 224facf3ba654bf67ef7f925787249769d3eaa05 Mon Sep 17 00:00:00 2001 From: Vincent Lejeune Date: Wed, 13 Jan 2016 00:36:39 +0100 Subject: [PATCH 1/4] d3d12: Never pass nullptr as render target descriptor, even if unused. Function interface doesn't allow this. --- rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp b/rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp index bdc74f8ed7..ea6a80a57f 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp @@ -257,9 +257,8 @@ void D3D12GSRender::prepare_render_targets(ID3D12GraphicsCommandList *copycmdlis void D3D12GSRender::set_rtt_and_ds(ID3D12GraphicsCommandList *command_list) { UINT num_rtt = get_num_rtt(to_surface_target(rsx::method_registers[NV4097_SET_SURFACE_COLOR_TARGET])); - D3D12_CPU_DESCRIPTOR_HANDLE* rtt_handle = (num_rtt > 0) ? &m_rtts.current_rtts_handle : nullptr; D3D12_CPU_DESCRIPTOR_HANDLE* ds_handle = (std::get<1>(m_rtts.m_bound_depth_stencil) != nullptr) ? &m_rtts.current_ds_handle : nullptr; - command_list->OMSetRenderTargets((UINT)num_rtt, rtt_handle, true, ds_handle); + command_list->OMSetRenderTargets((UINT)num_rtt, &m_rtts.current_rtts_handle, true, ds_handle); } void render_targets::init(ID3D12Device *device) From b8e10225f9e3227422c4b3ec5d43ed89b26de34a Mon Sep 17 00:00:00 2001 From: Vincent Lejeune Date: Wed, 13 Jan 2016 19:25:28 +0100 Subject: [PATCH 2/4] d3d12: Use first color output for alpha discard instead of 0. Fix Naruto 2 shader miscompilation. --- rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp b/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp index b14e9046b1..f40c238929 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp @@ -222,21 +222,21 @@ void D3D12FragmentDecompiler::insertMainEnd(std::stringstream & OS) { "ocol3", m_ctrl & CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS ? "r4" : "h8" }, }; - size_t num_output = 0; + std::string first_output_name; OS << " PixelOutput Out = (PixelOutput)0;" << std::endl; for (int i = 0; i < sizeof(table) / sizeof(*table); ++i) { if (m_parr.HasParam(PF_PARAM_NONE, "float4", table[i].second)) { OS << " Out." << table[i].first << " = " << table[i].second << ";" << std::endl; - num_output++; + if (first_output_name.empty()) first_output_name = table[i].first; } } if (m_ctrl & CELL_GCM_SHADER_CONTROL_DEPTH_EXPORT) OS << " Out.depth = " << ((m_ctrl & CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS) ? "r1.z;" : "h0.z;") << std::endl; // Shaders don't always output colors (for instance if they write to depth only) - if (num_output > 0) - OS << " if (isAlphaTested && Out.ocol0.a <= alphaRef) discard;" << std::endl; + if (!first_output_name.empty()) + OS << " if (isAlphaTested && Out." << first_output_name << ".a <= alphaRef) discard;\n"; OS << " return Out;" << std::endl; OS << "}" << std::endl; } From 5ace4438e268d7a30a0c9fe1e5c92d8a45bb6860 Mon Sep 17 00:00:00 2001 From: Vincent Lejeune Date: Sat, 16 Jan 2016 02:04:00 +0100 Subject: [PATCH 3/4] d3d12: Fix texture proj I misinterpreted "last component" from glsl doc... it's w, not z. --- rpcs3/Emu/RSX/D3D12/D3D12CommonDecompiler.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/RSX/D3D12/D3D12CommonDecompiler.cpp b/rpcs3/Emu/RSX/D3D12/D3D12CommonDecompiler.cpp index f484cd2d2b..2cfcacc802 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12CommonDecompiler.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12CommonDecompiler.cpp @@ -45,9 +45,9 @@ std::string getFunctionImp(FUNCTION f) case FUNCTION::FUNCTION_TEXTURE_SAMPLE: return "$t.Sample($tsampler, $0.xy * $t_scale)"; case FUNCTION::FUNCTION_TEXTURE_SAMPLE_PROJ: - return "$t.Sample($tsampler, ($0.xy / $0.z) * $t_scale)"; + return "$t.Sample($tsampler, ($0.xy / $0.w) * $t_scale)"; case FUNCTION::FUNCTION_TEXTURE_SAMPLE_LOD: - return "$t.SampleLevel($tsampler, ($0.xy / $0.z) * $t_scale, $1)"; + return "$t.SampleLevel($tsampler, ($0.xy / $0.w) * $t_scale, $1)"; case FUNCTION::FUNCTION_TEXTURE_CUBE_SAMPLE: return "$t.Sample($tsampler, $0.xyz)"; case FUNCTION::FUNCTION_TEXTURE_CUBE_SAMPLE_PROJ: From 26f329d186c65cad4b04190a8487ea6feff186d8 Mon Sep 17 00:00:00 2001 From: Vincent Lejeune Date: Sat, 16 Jan 2016 02:25:25 +0100 Subject: [PATCH 4/4] d3d12: Fix dsv increment size Typo. --- 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 ea6a80a57f..3549925d0c 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp @@ -246,7 +246,7 @@ void D3D12GSRender::prepare_render_targets(ID3D12GraphicsCommandList *copycmdlis if (std::get<1>(m_rtts.m_bound_depth_stencil) == nullptr) return; m_rtts.current_ds_handle = CD3DX12_CPU_DESCRIPTOR_HANDLE(get_current_resource_storage().depth_stencil_descriptor_heap->GetCPUDescriptorHandleForHeapStart()) - .Offset((INT)get_current_resource_storage().depth_stencil_descriptor_heap_index * g_descriptor_stride_rtv); + .Offset((INT)get_current_resource_storage().depth_stencil_descriptor_heap_index * g_descriptor_stride_dsv); get_current_resource_storage().depth_stencil_descriptor_heap_index += 1; D3D12_DEPTH_STENCIL_VIEW_DESC depth_stencil_view_desc = {}; depth_stencil_view_desc.Format = get_depth_stencil_surface_format(m_surface.depth_format);