Oops: badly named variables caused confusion: OriginalDeclarationSize was a count, HostDeclarationSize was actual size

This commit is contained in:
Luke Usher 2018-10-05 08:56:56 +01:00
parent f8b1c890be
commit 04bc37589f
3 changed files with 20 additions and 21 deletions

View File

@ -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;
}
}

View File

@ -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;

View File

@ -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(DeclarationSize);
memset(pRecompiled, 0, DeclarationSize);
D3DVERTEXELEMENT *pRecompiled = (D3DVERTEXELEMENT *)malloc(HostDeclarationSize);
memset(pRecompiled, 0, HostDeclarationSize);
uint8_t *pRecompiledBufferOverflow = ((uint8_t*)pRecompiled) + DeclarationSize;
uint8_t *pRecompiledBufferOverflow = ((uint8_t*)pRecompiled) + HostDeclarationSize;
*ppRecompiledDeclaration = pRecompiled;
*pHostDeclarationSize = DeclarationSize;
CxbxVertexShaderPatch PatchData = { 0 };
PatchData.pVertexShaderInfoToSet = pVertexShaderInfo;