Update VshHandleIsVertexShader to work the same way as the Xbox counterpart.

It turns out the D3DFVF_RESERVED0 bit is used for this, making our old method unreliable.

This fixes a crash in Kingdom Under Fire (and likely other titles too)
This commit is contained in:
Luke Usher 2018-01-30 08:55:22 +00:00
parent ad8a181a19
commit 987571ee2e
1 changed files with 3 additions and 4 deletions

View File

@ -75,10 +75,9 @@ extern void FreeVertexDynamicPatch(VERTEX_SHADER *pVertexShader);
extern boolean IsValidCurrentShader(void); extern boolean IsValidCurrentShader(void);
extern boolean VshHandleIsValidShader(DWORD Handle); extern boolean VshHandleIsValidShader(DWORD Handle);
// Dxbx note : On Xbox, a FVF is recognizable when the handle <= 0x0000FFFF // Dxbx note : On Xbox, a FVF is recognizable when the handle has D3DFVF_RESERVED0 non zero.
// (as all values above are allocated VertexShader addresses). inline boolean VshHandleIsVertexShader(DWORD Handle) { return (Handle & D3DFVF_RESERVED0) > 0 ? TRUE : FALSE; }
inline boolean VshHandleIsFVF(DWORD Handle) { return (Handle > NULL) && (Handle <= 0x0000FFFF); } inline boolean VshHandleIsFVF(DWORD Handle) { return !VshHandleIsVertexShader(Handle); }
inline boolean VshHandleIsVertexShader(DWORD Handle) { return (Handle > 0x0000FFFF) ? TRUE : FALSE; }
inline X_D3DVertexShader *VshHandleGetVertexShader(DWORD Handle) { return VshHandleIsVertexShader(Handle) ? (X_D3DVertexShader *)Handle : nullptr; } inline X_D3DVertexShader *VshHandleGetVertexShader(DWORD Handle) { return VshHandleIsVertexShader(Handle) ? (X_D3DVertexShader *)Handle : nullptr; }
VERTEX_DYNAMIC_PATCH *VshGetVertexDynamicPatch(DWORD Handle); VERTEX_DYNAMIC_PATCH *VshGetVertexDynamicPatch(DWORD Handle);