From 987571ee2e2ae228233e0fdc9b0b16776be457a8 Mon Sep 17 00:00:00 2001 From: Luke Usher Date: Tue, 30 Jan 2018 08:55:22 +0000 Subject: [PATCH] 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) --- src/CxbxKrnl/EmuD3D8/VertexShader.h | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/CxbxKrnl/EmuD3D8/VertexShader.h b/src/CxbxKrnl/EmuD3D8/VertexShader.h index 7d61fbacc..23c406bf3 100644 --- a/src/CxbxKrnl/EmuD3D8/VertexShader.h +++ b/src/CxbxKrnl/EmuD3D8/VertexShader.h @@ -75,10 +75,9 @@ extern void FreeVertexDynamicPatch(VERTEX_SHADER *pVertexShader); extern boolean IsValidCurrentShader(void); extern boolean VshHandleIsValidShader(DWORD Handle); -// Dxbx note : On Xbox, a FVF is recognizable when the handle <= 0x0000FFFF -// (as all values above are allocated VertexShader addresses). -inline boolean VshHandleIsFVF(DWORD Handle) { return (Handle > NULL) && (Handle <= 0x0000FFFF); } -inline boolean VshHandleIsVertexShader(DWORD Handle) { return (Handle > 0x0000FFFF) ? TRUE : FALSE; } +// Dxbx note : On Xbox, a FVF is recognizable when the handle has D3DFVF_RESERVED0 non zero. +inline boolean VshHandleIsVertexShader(DWORD Handle) { return (Handle & D3DFVF_RESERVED0) > 0 ? TRUE : FALSE; } +inline boolean VshHandleIsFVF(DWORD Handle) { return !VshHandleIsVertexShader(Handle); } inline X_D3DVertexShader *VshHandleGetVertexShader(DWORD Handle) { return VshHandleIsVertexShader(Handle) ? (X_D3DVertexShader *)Handle : nullptr; } VERTEX_DYNAMIC_PATCH *VshGetVertexDynamicPatch(DWORD Handle);