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:
parent
c3568f6ea3
commit
dab1da6caf
|
@ -3061,6 +3061,8 @@ void Direct3D_CreateDevice_Start
|
|||
xbox::X_D3DPRESENT_PARAMETERS *pPresentationParameters
|
||||
)
|
||||
{
|
||||
CxbxVertexShaderSetFlags();
|
||||
|
||||
if (!XboxRenderStates.Init()) {
|
||||
CxbxKrnlCleanup("Failed to init XboxRenderStates");
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue