Works around broken Intel Windows video drivers.
Just use regular boolean negation in our pixel shader's depth test everywhere except on Qualcomm. This works around a bug in the Intel Windows driver where comparing a boolean value against true or false fails but boolean negation works fine. Quite silly. Should fix issues #7830 and #7899.
This commit is contained in:
parent
22209bcc62
commit
5c3bbf7409
|
@ -48,6 +48,7 @@ namespace DriverDetails
|
|||
{OS_ALL, VENDOR_QUALCOMM, DRIVER_QUALCOMM_3XX, -1, BUG_BROKENBUFFERSTREAM, -1.0, -1.0, true},
|
||||
{OS_ALL, VENDOR_QUALCOMM, DRIVER_QUALCOMM_3XX, -1, BUG_BROKENTEXTURESIZE, -1.0, 65.0, true},
|
||||
{OS_ALL, VENDOR_QUALCOMM, DRIVER_QUALCOMM_3XX, -1, BUG_BROKENATTRIBUTELESS, -1.0, 94.0, true},
|
||||
{OS_ALL, VENDOR_QUALCOMM, DRIVER_QUALCOMM_3XX, -1, BUG_BROKENNEGATEDBOOLEAN,-1.0, -1.0, true},
|
||||
{OS_ALL, VENDOR_ARM, DRIVER_ARM_MIDGARD, -1, BUG_BROKENBUFFERSTREAM, -1.0, -1.0, true},
|
||||
{OS_ALL, VENDOR_MESA, DRIVER_NOUVEAU, -1, BUG_BROKENUBO, 900, 916, true},
|
||||
{OS_ALL, VENDOR_MESA, DRIVER_R600, -1, BUG_BROKENUBO, 900, 913, true},
|
||||
|
|
|
@ -178,6 +178,31 @@ namespace DriverDetails
|
|||
// This was fixed in a v66 development version, the first shipping driver version with the release was v95.
|
||||
// To be safe, make v95 the minimum version to work around this issue
|
||||
BUG_BROKENATTRIBUTELESS,
|
||||
// Bug: Qualcomm has broken boolean negation
|
||||
// Affected devices: Adreno
|
||||
// Started Version: -1
|
||||
// Ended Version: -1
|
||||
// Qualcomm has the boolean negation broken in their shader compiler
|
||||
// Instead of inverting the boolean value it does a binary negation on the full 32bit register
|
||||
// This causes a compare against zero to fail in their shader since it is no longer a 0 or 1 value
|
||||
// but 0xFFFFFFFF or 0xFFFFFFFE depending on what the boolean value was before the negation.
|
||||
//
|
||||
// This bug has a secondary issue tied to it unlike other bugs.
|
||||
// The correction of this bug is to check the boolean value against false which results in us
|
||||
// not doing a negation of the source but instead checking against the boolean value we want.
|
||||
// The issue with this is that Intel's Window driver is broken when checking if a boolean value is
|
||||
// equal to true or false, so one has to do a boolean negation of the source
|
||||
//
|
||||
// eg.
|
||||
// Broken on Qualcomm
|
||||
// Works on Windows Intel
|
||||
// if (!cond)
|
||||
//
|
||||
// Works on Qualcomm
|
||||
// Broken on Windows Intel
|
||||
// if (cond == false)
|
||||
BUG_BROKENNEGATEDBOOLEAN,
|
||||
|
||||
};
|
||||
|
||||
// Initializes our internal vendor, device family, and driver version
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include "VideoCommon/BoundingBox.h"
|
||||
#include "VideoCommon/BPMemory.h"
|
||||
#include "VideoCommon/ConstantManager.h"
|
||||
#include "VideoCommon/DriverDetails.h"
|
||||
#include "VideoCommon/LightingShaderGen.h"
|
||||
#include "VideoCommon/NativeVertexFormat.h"
|
||||
#include "VideoCommon/PixelShaderGen.h"
|
||||
|
@ -981,10 +982,10 @@ static inline void WriteAlphaTest(T& out, pixel_shader_uid_data* uid_data, API_T
|
|||
|
||||
out.SetConstantsUsed(C_ALPHA, C_ALPHA);
|
||||
|
||||
// This outputted if statement is not like 'if(!(cond))' for a reason.
|
||||
// Qualcomm's v95 drivers produce incorrect code using logical not
|
||||
// Checking against false produces the correct code.
|
||||
if (DriverDetails::HasBug(DriverDetails::BUG_BROKENNEGATEDBOOLEAN))
|
||||
out.Write("\tif(( ");
|
||||
else
|
||||
out.Write("\tif(!( ");
|
||||
|
||||
uid_data->alpha_test_comp0 = bpmem.alpha_test.comp0;
|
||||
uid_data->alpha_test_comp1 = bpmem.alpha_test.comp1;
|
||||
|
@ -999,7 +1000,11 @@ static inline void WriteAlphaTest(T& out, pixel_shader_uid_data* uid_data, API_T
|
|||
// Lookup the second component from the alpha function table
|
||||
compindex = bpmem.alpha_test.comp1;
|
||||
out.Write(tevAlphaFuncsTable[compindex], alphaRef[1]);
|
||||
|
||||
if (DriverDetails::HasBug(DriverDetails::BUG_BROKENNEGATEDBOOLEAN))
|
||||
out.Write(") == false) {\n");
|
||||
else
|
||||
out.Write(")) {\n");
|
||||
|
||||
out.Write("\t\tocol0 = float4(0.0, 0.0, 0.0, 0.0);\n");
|
||||
if (dstAlphaMode == DSTALPHA_DUAL_SOURCE_BLEND)
|
||||
|
|
Loading…
Reference in New Issue