From c15ea2f1edb840cda612c6ddbe2c3a142a0e1ee0 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Thu, 7 Sep 2017 11:45:43 +1000 Subject: [PATCH 1/2] D3D: Fix crash if shaders fail to compile --- Source/Core/VideoBackends/D3D/GeometryShaderCache.cpp | 2 +- Source/Core/VideoBackends/D3D/PixelShaderCache.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/Core/VideoBackends/D3D/GeometryShaderCache.cpp b/Source/Core/VideoBackends/D3D/GeometryShaderCache.cpp index d712761a12..5f4072022b 100644 --- a/Source/Core/VideoBackends/D3D/GeometryShaderCache.cpp +++ b/Source/Core/VideoBackends/D3D/GeometryShaderCache.cpp @@ -251,7 +251,7 @@ bool GeometryShaderCache::CompileShader(const GeometryShaderUid& uid) ShaderCode code = GenerateGeometryShaderCode(APIType::D3D, ShaderHostConfig::GetCurrent(), uid.GetUidData()); if (!D3D::CompileGeometryShader(code.GetBuffer(), &bytecode) || - !InsertByteCode(uid, bytecode->Data(), bytecode->Size())) + !InsertByteCode(uid, bytecode ? bytecode->Data() : nullptr, bytecode ? bytecode->Size() : 0)) { SAFE_RELEASE(bytecode); return false; diff --git a/Source/Core/VideoBackends/D3D/PixelShaderCache.cpp b/Source/Core/VideoBackends/D3D/PixelShaderCache.cpp index 326f840db1..3625cf4e0c 100644 --- a/Source/Core/VideoBackends/D3D/PixelShaderCache.cpp +++ b/Source/Core/VideoBackends/D3D/PixelShaderCache.cpp @@ -644,7 +644,7 @@ bool PixelShaderCache::SetShader() ShaderCode code = GeneratePixelShaderCode(APIType::D3D, ShaderHostConfig::GetCurrent(), uid.GetUidData()); D3D::CompilePixelShader(code.GetBuffer(), &bytecode); - if (!InsertByteCode(uid, bytecode->Data(), bytecode->Size())) + if (!InsertByteCode(uid, bytecode ? bytecode->Data() : nullptr, bytecode ? bytecode->Size() : 0)) { SAFE_RELEASE(bytecode); return false; @@ -687,7 +687,7 @@ bool PixelShaderCache::SetUberShader() ShaderCode code = UberShader::GenPixelShader(APIType::D3D, ShaderHostConfig::GetCurrent(), uid.GetUidData()); D3D::CompilePixelShader(code.GetBuffer(), &bytecode); - if (!InsertByteCode(uid, bytecode->Data(), bytecode->Size())) + if (!InsertByteCode(uid, bytecode ? bytecode->Data() : nullptr, bytecode ? bytecode->Size() : 0)) { SAFE_RELEASE(bytecode); return false; From b573319f8f2f0f4deab98b9261b585610ecb6143 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Thu, 7 Sep 2017 11:48:01 +1000 Subject: [PATCH 2/2] D3D: Fix shader compile error with logicop and alpha test enabled --- Source/Core/VideoCommon/PixelShaderGen.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Core/VideoCommon/PixelShaderGen.cpp b/Source/Core/VideoCommon/PixelShaderGen.cpp index 990f5f938f..b217e6f176 100644 --- a/Source/Core/VideoCommon/PixelShaderGen.cpp +++ b/Source/Core/VideoCommon/PixelShaderGen.cpp @@ -1232,7 +1232,7 @@ static void WriteAlphaTest(ShaderCode& out, const pixel_shader_uid_data* uid_dat out.Write(")) {\n"); out.Write("\t\tocol0 = float4(0.0, 0.0, 0.0, 0.0);\n"); - if (use_dual_source) + if (use_dual_source && !(ApiType == APIType::D3D && uid_data->uint_output)) out.Write("\t\tocol1 = float4(0.0, 0.0, 0.0, 0.0);\n"); if (per_pixel_depth) {