Merge pull request #1865 from LukeUsher/amd-gpu-workaround
prevent missing polygons with AMD GPU
This commit is contained in:
commit
238dda162f
|
@ -48,11 +48,16 @@ float4 c(int register_number)
|
|||
// Map Xbox [-96, 95] to Host [0, 191]
|
||||
// Account for Xbox's negative constant indexes
|
||||
register_number += X_D3DSCM_CORRECTION;
|
||||
if (register_number < 0)
|
||||
return 0;
|
||||
|
||||
|
||||
// Like Xbox, out-of-range indices are guaranteed to be zero in HLSL
|
||||
// so no need to bounds check negative numbers
|
||||
// if (register_number < 0)
|
||||
// return 0;
|
||||
|
||||
// If the index is too large, set it to -1 so 0 is returned
|
||||
// Note: returning 0 directly requires many more instructions
|
||||
if (register_number >= X_D3DVS_CONSTREG_COUNT) // X_D3DVS_CONSTREG_COUNT
|
||||
return 0;
|
||||
register_number = -1;
|
||||
|
||||
return C[register_number];
|
||||
}
|
||||
|
|
|
@ -1662,6 +1662,17 @@ VOID EmuD3DInit()
|
|||
std::cout << "Host D3DCaps : " << g_D3DCaps << "\n";
|
||||
std::cout << "----------------------------------------\n";
|
||||
}
|
||||
|
||||
// AMD compatibility workaround since VS model 3.0 doesn't work as intended with Direct3D9.
|
||||
{
|
||||
D3DADAPTER_IDENTIFIER9 adapter_info;
|
||||
HRESULT status = g_pDirect3D->GetAdapterIdentifier(g_EmuCDPD.Adapter, 0, &adapter_info);
|
||||
// 1002 and 1022 are vendor ids of AMD gpus
|
||||
if (status == D3D_OK && (adapter_info.VendorId == 0x1002 || adapter_info.VendorId == 0x1022)) {
|
||||
g_vs_model = vs_model_2_a;
|
||||
EmuLogInit(LOG_LEVEL::WARNING, "AMD GPU Detected, falling back to shader model 2.X to prevent missing polygons");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// cleanup Direct3D
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
|
||||
#include <sstream>
|
||||
|
||||
extern const char* g_vs_model = vs_model_3_0;
|
||||
|
||||
// HLSL generation
|
||||
void OutputHlsl(std::stringstream& hlsl, VSH_IMD_OUTPUT& dest)
|
||||
{
|
||||
|
@ -247,9 +249,8 @@ extern HRESULT EmuCompileShader
|
|||
EmuLog(LOG_LEVEL::DEBUG, DebugPrependLineNumbers(hlsl_str).c_str());
|
||||
EmuLog(LOG_LEVEL::DEBUG, "-----------------------");
|
||||
|
||||
// Level 0 for fastest runtime compilation
|
||||
// TODO Can we recompile an optimized shader in the background?
|
||||
UINT flags1 = D3DCOMPILE_OPTIMIZATION_LEVEL0;
|
||||
|
||||
UINT flags1 = D3DCOMPILE_OPTIMIZATION_LEVEL3 | D3DCOMPILE_AVOID_FLOW_CONTROL;
|
||||
|
||||
hRet = D3DCompile(
|
||||
hlsl_str.c_str(),
|
||||
|
@ -258,7 +259,7 @@ extern HRESULT EmuCompileShader
|
|||
nullptr, // pDefines
|
||||
nullptr, // pInclude // TODO precompile x_* HLSL functions?
|
||||
"main", // shader entry poiint
|
||||
"vs_3_0", // shader profile
|
||||
g_vs_model, // shader profile
|
||||
flags1, // flags1
|
||||
0, // flags2
|
||||
ppHostShader, // out
|
||||
|
@ -275,7 +276,7 @@ extern HRESULT EmuCompileShader
|
|||
nullptr, // pDefines
|
||||
nullptr, // pInclude // TODO precompile x_* HLSL functions?
|
||||
"main", // shader entry poiint
|
||||
"vs_3_0", // shader profile
|
||||
g_vs_model, // shader profile
|
||||
flags1, // flags1
|
||||
0, // flags2
|
||||
ppHostShader, // out
|
||||
|
|
|
@ -10,6 +10,10 @@ enum class ShaderType {
|
|||
Unsupported,
|
||||
};
|
||||
|
||||
static const char* vs_model_2_a = "vs_2_a";
|
||||
static const char* vs_model_3_0 = "vs_3_0";
|
||||
extern const char* g_vs_model;
|
||||
|
||||
extern ShaderType EmuGetShaderInfo(IntermediateVertexShader* pIntermediateShader);
|
||||
|
||||
extern HRESULT EmuCompileShader
|
||||
|
|
Loading…
Reference in New Issue