Move D3DDevice_LoadVertexShaderProgram implementation to XbVertexShader.cpp

This commit is contained in:
patrickvl 2020-04-30 15:34:22 +02:00
parent 00e85b8af8
commit 6a8534a22e
3 changed files with 18 additions and 14 deletions

View File

@ -7861,16 +7861,7 @@ VOID WINAPI XTL::EMUPATCH(D3DDevice_LoadVertexShaderProgram)
LOG_FUNC_ARG(Address)
LOG_FUNC_END;
// D3DDevice_LoadVertexShaderProgram splits the given function buffer into batch-wise pushes to the NV2A
// Copy shader instructions to shader slots
auto CxbxVertexShaderSlotPtr = GetCxbxVertexShaderSlotPtr(Address);
if (CxbxVertexShaderSlotPtr == nullptr)
return;
auto shaderHeader = *((XTL::X_VSH_SHADER_HEADER*) pFunction);
auto tokens = &pFunction[1];
memcpy(CxbxVertexShaderSlotPtr, tokens, shaderHeader.NumInst * X_VSH_INSTRUCTION_SIZE_BYTES);
CxbxImpl_LoadVertexShaderProgram(pFunction, Address);
}
// ******************************************************************

View File

@ -1403,6 +1403,20 @@ void CxbxImpl_SelectVertexShader(DWORD Handle, DWORD Address)
}
}
void CxbxImpl_LoadVertexShaderProgram(CONST DWORD* pFunction, DWORD Address)
{
// D3DDevice_LoadVertexShaderProgram splits the given function buffer into batch-wise pushes to the NV2A
// Copy shader instructions to shader slots
auto CxbxVertexShaderSlotPtr = GetCxbxVertexShaderSlotPtr(Address);
if (CxbxVertexShaderSlotPtr == nullptr)
return;
auto shaderHeader = *((XTL::X_VSH_SHADER_HEADER*) pFunction);
auto tokens = &pFunction[1];
memcpy(CxbxVertexShaderSlotPtr, tokens, shaderHeader.NumInst * X_VSH_INSTRUCTION_SIZE_BYTES);
}
void CxbxImpl_LoadVertexShader(DWORD Handle, DWORD Address)
{
// Handle is always address of an X_D3DVertexShader struct, thus always or-ed with 1 (X_D3DFVF_RESERVED0)

View File

@ -233,10 +233,9 @@ inline boolean VshHandleIsVertexShader(DWORD Handle) { return (Handle & X_D3DFVF
inline boolean VshHandleIsFVF(DWORD Handle) { return !VshHandleIsVertexShader(Handle); }
inline XTL::X_D3DVertexShader *VshHandleToXboxVertexShader(DWORD Handle) { return (XTL::X_D3DVertexShader *)(Handle & ~X_D3DFVF_RESERVED0);}
extern DWORD* GetCxbxVertexShaderSlotPtr(const DWORD SlotIndexAddress);
extern CxbxVertexShader* GetCxbxVertexShader(DWORD XboxVertexShaderHandle);
extern void SetCxbxVertexShader(DWORD XboxVertexShaderHandle, CxbxVertexShader* shader);
extern void SetCxbxVertexShader(CxbxVertexShader* pCxbxVertexShader);
extern CxbxVertexShader* GetCxbxVertexShader(DWORD XboxVertexShaderHandle);
extern void CxbxImpl_LoadVertexShaderProgram(CONST DWORD* pFunction, DWORD Address);
extern void CxbxImpl_LoadVertexShader(DWORD Handle, DWORD Address);
extern void CxbxImpl_SetVertexShader(DWORD Handle);
extern void CxbxImpl_SelectVertexShaderDirect(XTL::X_VERTEXATTRIBUTEFORMAT* pVAF, DWORD Address);