From 2f5448259210c4c4cdb9f499bcf57aa3bf51537b Mon Sep 17 00:00:00 2001 From: vlj Date: Thu, 11 Jun 2015 19:26:52 +0200 Subject: [PATCH] d3d12: Make depth test optionnal and use (0,0,0,0) when texture unit is disabled --- rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp | 4 +++- rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp | 3 ++- rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp | 6 +++++- rpcs3/Emu/RSX/D3D12/D3D12VertexProgramDecompiler.cpp | 1 + 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp b/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp index 777e9faa99..aee9dcb749 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp @@ -436,7 +436,9 @@ void D3D12GSRender::setScaleOffset() void *scaleOffsetMap; check(scaleOffsetBuffer->Map(0, nullptr, &scaleOffsetMap)); streamToBuffer(scaleOffsetMap, scaleOffsetMat, 16 * sizeof(float)); - streamToBuffer((char*)scaleOffsetMap + 16 * sizeof(float), &m_alpha_ref, sizeof(float)); + int isAlphaTested = m_set_alpha_test; + streamToBuffer((char*)scaleOffsetMap + 16 * sizeof(float), &isAlphaTested, sizeof(int)); + streamToBuffer((char*)scaleOffsetMap + 17 * sizeof(float), &m_alpha_ref, sizeof(float)); scaleOffsetBuffer->Unmap(0, nullptr); D3D12_CONSTANT_BUFFER_VIEW_DESC constantBufferViewDesc = {}; diff --git a/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp b/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp index cc51b4450e..8916a9738b 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp @@ -37,6 +37,7 @@ void D3D12FragmentDecompiler::insertHeader(std::stringstream & OS) OS << "cbuffer SCALE_OFFSET : register(b0)" << std::endl; OS << "{" << std::endl; OS << " float4x4 scaleOffsetMat;" << std::endl; + OS << " int isAlphaTested;" << std::endl; OS << " float alphaRef;" << std::endl; OS << "};" << std::endl; } @@ -162,7 +163,7 @@ void D3D12FragmentDecompiler::insertMainEnd(std::stringstream & OS) else if (m_parr.HasParam(PF_PARAM_NONE, "float4", table2[i].second)) OS << " Out." << table2[i].first << " = " << table2[i].second << ";" << std::endl; } - OS << " if (Out.ocol0.a <= alphaRef) discard;" << std::endl; + OS << " if (isAlphaTested && Out.ocol0.a <= alphaRef) discard;" << std::endl; OS << " return Out;" << std::endl; OS << "}" << std::endl; } diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp index a611bf9dcc..1ab8d52163 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp @@ -664,7 +664,11 @@ void D3D12GSRender::ExecCMD() srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; srvDesc.Texture2D.MipLevels = 1; - srvDesc.Shader4ComponentMapping = D3D12_ENCODE_SHADER_4_COMPONENT_MAPPING(D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_1, D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_1, D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_1, D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_1); + srvDesc.Shader4ComponentMapping = D3D12_ENCODE_SHADER_4_COMPONENT_MAPPING( + D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_0, + D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_0, + D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_0, + D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_0); m_device->CreateShaderResourceView(m_dummyTexture, &srvDesc, Handle); D3D12_SAMPLER_DESC samplerDesc = {}; diff --git a/rpcs3/Emu/RSX/D3D12/D3D12VertexProgramDecompiler.cpp b/rpcs3/Emu/RSX/D3D12/D3D12VertexProgramDecompiler.cpp index 50bf886b32..11d7ddf342 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12VertexProgramDecompiler.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12VertexProgramDecompiler.cpp @@ -26,6 +26,7 @@ void D3D12VertexProgramDecompiler::insertHeader(std::stringstream &OS) OS << "cbuffer SCALE_OFFSET : register(b0)" << std::endl; OS << "{" << std::endl; OS << " float4x4 scaleOffsetMat;" << std::endl; + OS << " int isAlphaTested;" << std::endl; OS << " float alphaRef;" << std::endl; OS << "};" << std::endl; }