Fix X_VERTEXSHADER_FLAG_PROGRAM flag for XDK-3948

In this XDK X_VERTEXSHADER_FLAG_PROGRAM appears to have a value of 4,
not 16. Adjusted the code accordingly and added test cases to verify
that assumption.
This commit is contained in:
Silent 2020-11-15 21:17:59 +01:00
parent c3568f6ea3
commit dab1da6caf
No known key found for this signature in database
GPG Key ID: AE53149BB0C45AF1
4 changed files with 30 additions and 6 deletions

View File

@ -3061,6 +3061,8 @@ void Direct3D_CreateDevice_Start
xbox::X_D3DPRESENT_PARAMETERS *pPresentationParameters
)
{
CxbxVertexShaderSetFlags();
if (!XboxRenderStates.Init()) {
CxbxKrnlCleanup("Failed to init XboxRenderStates");
}

View File

@ -1149,14 +1149,16 @@ struct X_D3DVertexShader
// X_D3DVertexShader.Flags values :
#define X_VERTEXSHADER_FLAG_WRITE (1 << 0) // = 0x0001 // Set for Xbox ShaderType != X_VST_NORMAL
#define X_VERTEXSHADER_FLAG_PASSTHROUGH (1 << 1) // = 0x0002
#define X_VERTEXSHADER_FLAG_UNKNOWN (1 << 2) // = 0x0004 // Test case: Amped
#define X_VERTEXSHADER_FLAG_STATE (1 << 3) // = 0x0008 // Set for Xbox ShaderType == X_VST_STATE
#define X_VERTEXSHADER_FLAG_PROGRAM (1 << 4) // = 0x0010 // Set when X_D3DVertexShader was created with assigned function data
#define X_VERTEXSHADER_FLAG_PROGRAM (1 << 4) // = 0x0010 // Set when X_D3DVertexShader was created with assigned function data; introduced after XDK 3948; don't use directly, use g_X_VERTEXSHADER_FLAG_PROGRAM instead
#define X_VERTEXSHADER_FLAG_HASDIFFUSE (1 << 10) // = 0x0400 Corresponds to X_D3DUSAGE_PERSISTENTDIFFUSE
#define X_VERTEXSHADER_FLAG_HASSPECULAR (1 << 11) // = 0x0800 Corresponds to X_D3DUSAGE_PERSISTENTSPECULAR
#define X_VERTEXSHADER_FLAG_HASBACKDIFFUSE (1 << 12) // = 0x1000 Corresponds to X_D3DUSAGE_PERSISTENTBACKDIFFUSE
#define X_VERTEXSHADER_FLAG_HASBACKSPECULAR (1 << 13) // = 0x2000 Corresponds to X_D3DUSAGE_PERSISTENTBACKSPECULAR
// X_D3DVertexShader3948.Flags values, only those which differ from the above :
#define X_VERTEXSHADER3948_FLAG_PROGRAM (1 << 2) // = 0x0004 // Test case: Amped, NASCAR Heat 2002; don't use directly, use g_X_VERTEXSHADER_FLAG_PROGRAM instead
// vertex shader input registers for fixed function vertex shader
// Name Register number D3DFVF

View File

@ -77,6 +77,23 @@ extern XboxRenderStateConverter XboxRenderStates; // Declared in Direct3D9.cpp
static xbox::X_D3DVertexShader g_Xbox_VertexShader_ForFVF = {};
static uint32_t g_X_VERTEXSHADER_FLAG_PROGRAM; // X_VERTEXSHADER_FLAG_PROGRAM flag varies per XDK, so it is set on runtime
static uint32_t g_X_VERTEXSHADER_FLAG_VALID_MASK; // For a test case
void CxbxVertexShaderSetFlags()
{
// Set an appropriate X_VERTEXSHADER_FLAG_PROGRAM version and mask off the "wrong" one
// to allow the test case to spot it
if (g_LibVersion_D3D8 <= 3948) {
g_X_VERTEXSHADER_FLAG_PROGRAM = X_VERTEXSHADER3948_FLAG_PROGRAM;
g_X_VERTEXSHADER_FLAG_VALID_MASK = ~X_VERTEXSHADER_FLAG_PROGRAM;
}
else {
g_X_VERTEXSHADER_FLAG_PROGRAM = X_VERTEXSHADER_FLAG_PROGRAM;
g_X_VERTEXSHADER_FLAG_VALID_MASK = ~X_VERTEXSHADER3948_FLAG_PROGRAM;
}
}
// Converts an Xbox FVF shader handle to X_D3DVertexShader
// Note : Temporary, until we reliably locate the Xbox internal state for this
// See D3DXDeclaratorFromFVF docs https://docs.microsoft.com/en-us/windows/win32/direct3d9/d3dxdeclaratorfromfvf
@ -1408,7 +1425,12 @@ void CxbxImpl_SetVertexShader(DWORD Handle)
xbox::X_D3DVertexShader* pXboxVertexShader = CxbxGetXboxVertexShaderForHandle(Handle);
g_Xbox_VertexShader_IsPassthrough = false;
if (pXboxVertexShader->Flags & X_VERTEXSHADER_FLAG_PROGRAM) {
if ((pXboxVertexShader->Flags & g_X_VERTEXSHADER_FLAG_VALID_MASK) != pXboxVertexShader->Flags) {
LOG_TEST_CASE("Unknown vertex shader flag");
}
if (pXboxVertexShader->Flags & g_X_VERTEXSHADER_FLAG_PROGRAM) { // Global variable set from CxbxVertexShaderSetFlags
#if 0 // Since the D3DDevice_SetVertexShader patch already called it's trampoline, these calls have already been executed :
CxbxImpl_LoadVertexShader(Handle, 0);
CxbxImpl_SelectVertexShader(Handle, 0);
@ -1465,9 +1487,6 @@ void CxbxImpl_SetVertexShader(DWORD Handle)
CxbxSetVertexShaderPassthroughProgram();
g_Xbox_VertexShader_IsFixedFunction = false;
g_Xbox_VertexShader_IsPassthrough = true;
} else if (pXboxVertexShader->Flags & X_VERTEXSHADER_FLAG_UNKNOWN) {
// Test-case : Amped
LOG_TEST_CASE("unknown vertex shader flag (4)");
} else {
// Test-case : Many XDK samples, Crazy taxi 3
//LOG_TEST_CASE("Other or no vertex shader flags");

View File

@ -213,5 +213,6 @@ extern void CxbxImpl_SelectVertexShader(DWORD Handle, DWORD Address);
extern void CxbxImpl_SetVertexShaderInput(DWORD Handle, UINT StreamCount, xbox::X_STREAMINPUT* pStreamInputs);
extern void CxbxImpl_SetVertexShaderConstant(INT Register, PVOID pConstantData, DWORD ConstantCount);
extern void CxbxImpl_DeleteVertexShader(DWORD Handle);
extern void CxbxVertexShaderSetFlags();
#endif