diff --git a/src/core/HLE/D3D8/Direct3D9/Direct3D9.cpp b/src/core/HLE/D3D8/Direct3D9/Direct3D9.cpp index 74851dfc8..6960aea7c 100644 --- a/src/core/HLE/D3D8/Direct3D9/Direct3D9.cpp +++ b/src/core/HLE/D3D8/Direct3D9/Direct3D9.cpp @@ -3445,13 +3445,13 @@ HRESULT WINAPI XTL::EMUPATCH(D3DDevice_CreateVertexShader) DWORD *pRecompiledDeclaration = NULL; DWORD *pRecompiledFunction = NULL; DWORD VertexShaderSize = 0; - DWORD OriginalDeclarationSize = 0; + DWORD OriginalDeclarationCount = 0; DWORD HostDeclarationSize = 0; DWORD Handle = 0; HRESULT hRet = XTL::EmuRecompileVshDeclaration((DWORD*)pDeclaration, (XTL::D3DVERTEXELEMENT9**)&pRecompiledDeclaration, - &OriginalDeclarationSize, + &OriginalDeclarationCount, &HostDeclarationSize, pFunction == NULL, &pVertexShader->VertexShaderInfo); @@ -3548,14 +3548,14 @@ HRESULT WINAPI XTL::EMUPATCH(D3DDevice_CreateVertexShader) free(pRecompiledDeclaration); - pVertexShader->pDeclaration = (DWORD*)g_VMManager.Allocate(HostDeclarationSize); - memcpy(pVertexShader->pDeclaration, pDeclaration, HostDeclarationSize); + pVertexShader->pDeclaration = (DWORD*)g_VMManager.Allocate(OriginalDeclarationCount * sizeof(DWORD)); + memcpy(pVertexShader->pDeclaration, pDeclaration, OriginalDeclarationCount * sizeof(DWORD)); pVertexShader->FunctionSize = 0; pVertexShader->pFunction = NULL; pVertexShader->Type = X_VST_NORMAL; pVertexShader->Size = (VertexShaderSize - sizeof(VSH_SHADER_HEADER)) / VSH_INSTRUCTION_SIZE_BYTES; - pVertexShader->OriginalDeclarationSize = OriginalDeclarationSize; + pVertexShader->OriginalDeclarationCount = OriginalDeclarationCount; pVertexShader->HostDeclarationSize = HostDeclarationSize; if(SUCCEEDED(hRet)) @@ -8349,8 +8349,8 @@ VOID WINAPI XTL::EMUPATCH(D3DDevice_LoadVertexShaderProgram) DWORD hNewShader = 0; // Save the contents of the existing vertex shader program - DWORD* pDeclaration = (DWORD*) malloc( pVertexShader->OriginalDeclarationSize ); - memmove( pDeclaration, pVertexShader->pDeclaration, pVertexShader->OriginalDeclarationSize); + DWORD* pDeclaration = (DWORD*) malloc( pVertexShader->OriginalDeclarationCount * sizeof(DWORD) ); + memmove( pDeclaration, pVertexShader->pDeclaration, pVertexShader->OriginalDeclarationCount * sizeof(DWORD)); // Create a new vertex shader with the new HRESULT hr = EMUPATCH(D3DDevice_CreateVertexShader)( pDeclaration, pFunction, &hNewShader, 0 ); @@ -8424,13 +8424,13 @@ HRESULT WINAPI XTL::EMUPATCH(D3DDevice_GetVertexShaderDeclaration) if (pSizeOfData) { CxbxVertexShader *pVertexShader = MapXboxVertexShaderHandleToCxbxVertexShader(Handle); if (pVertexShader) { - DWORD sizeOfData = pVertexShader->OriginalDeclarationSize * sizeof(DWORD); + DWORD sizeOfData = pVertexShader->OriginalDeclarationCount * sizeof(DWORD); if (*pSizeOfData < sizeOfData || !pData) { *pSizeOfData = sizeOfData; hRet = !pData ? D3D_OK : D3DERR_MOREDATA; } else { - memcpy(pData, pVertexShader->pDeclaration, pVertexShader->OriginalDeclarationSize); + memcpy(pData, pVertexShader->pDeclaration, pVertexShader->OriginalDeclarationCount * sizeof(DWORD)); hRet = D3D_OK; } } diff --git a/src/core/HLE/D3D8/XbD3D8Types.h b/src/core/HLE/D3D8/XbD3D8Types.h index db8c9f6dd..a89fa64b4 100644 --- a/src/core/HLE/D3D8/XbD3D8Types.h +++ b/src/core/HLE/D3D8/XbD3D8Types.h @@ -516,7 +516,7 @@ typedef struct _CxbxVertexShader // we save them to be able to return them when necessary. UINT Size; DWORD *pDeclaration; - DWORD OriginalDeclarationSize; + DWORD OriginalDeclarationCount; XTL::LPDIRECT3DVERTEXDECLARATION9 pHostDeclaration; DWORD HostDeclarationSize; DWORD *pFunction; diff --git a/src/core/HLE/D3D8/XbVertexShader.cpp b/src/core/HLE/D3D8/XbVertexShader.cpp index 05eb6ea18..82df11195 100644 --- a/src/core/HLE/D3D8/XbVertexShader.cpp +++ b/src/core/HLE/D3D8/XbVertexShader.cpp @@ -1768,7 +1768,7 @@ CxbxVertexShaderPatch; #define DEF_VSH_END 0xFFFFFFFF #define DEF_VSH_NOP 0x00000000 -static DWORD VshGetDeclarationSize(DWORD *pDeclaration) +static DWORD VshGetDeclarationCount(DWORD *pDeclaration) { DWORD Pos = 0; while (*(pDeclaration + Pos) != DEF_VSH_END) @@ -2361,7 +2361,7 @@ DWORD XTL::EmuRecompileVshDeclaration ( DWORD *pDeclaration, D3DVERTEXELEMENT **ppRecompiledDeclaration, - DWORD *pOriginalDeclarationSize, + DWORD *pOriginalDeclarationCount, DWORD *pHostDeclarationSize, boolean IsFixedFunction, CxbxVertexShaderInfo *pVertexShaderInfo @@ -2378,18 +2378,17 @@ DWORD XTL::EmuRecompileVshDeclaration // 0x00000000 - nop (means that this value is ignored) // Calculate size of declaration - DWORD DeclarationSize = VshGetDeclarationSize(pDeclaration); - *pOriginalDeclarationSize = DeclarationSize; - + DWORD DeclarationCount = VshGetDeclarationCount(pDeclaration); // For Direct3D9, we need to reserve at least twice the number of elements, as one token can generate two registers (in and out) : - DeclarationSize *= sizeof(D3DVERTEXELEMENT) * 2; + DWORD HostDeclarationSize = DeclarationCount * sizeof(D3DVERTEXELEMENT) * 2; + *pOriginalDeclarationCount = DeclarationCount; + *pHostDeclarationSize = HostDeclarationSize; + + D3DVERTEXELEMENT *pRecompiled = (D3DVERTEXELEMENT *)malloc(HostDeclarationSize); + memset(pRecompiled, 0, HostDeclarationSize); - D3DVERTEXELEMENT *pRecompiled = (D3DVERTEXELEMENT *)malloc(DeclarationSize); - memset(pRecompiled, 0, DeclarationSize); - - uint8_t *pRecompiledBufferOverflow = ((uint8_t*)pRecompiled) + DeclarationSize; + uint8_t *pRecompiledBufferOverflow = ((uint8_t*)pRecompiled) + HostDeclarationSize; *ppRecompiledDeclaration = pRecompiled; - *pHostDeclarationSize = DeclarationSize; CxbxVertexShaderPatch PatchData = { 0 }; PatchData.pVertexShaderInfoToSet = pVertexShaderInfo;