diff --git a/Cxbx.dsp b/Cxbx.dsp index 49044290f..fd25a55c3 100644 --- a/Cxbx.dsp +++ b/Cxbx.dsp @@ -1,5 +1,5 @@ # Microsoft Developer Studio Project File - Name="Cxbx" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# Microsoft Developer Studio Generated Build File, Format Version 60000 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 @@ -74,8 +74,7 @@ PostBuild_Cmds=cd PostBuild upxCxbx.bat # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /Zi /Od /I "Include" /I "Include/Core/" /I "Include/Win32/" /I "Include/Win32/Cxbxkrnl" /I "Include/Win32/Cxbx" /I "Include/Win32/Cxbx/jpegdec" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c -# SUBTRACT CPP /Fr +# ADD CPP /nologo /MDd /W3 /Gm /Zi /Od /I "Include" /I "Include/Core/" /I "Include/Win32/" /I "Include/Win32/Cxbxkrnl" /I "Include/Win32/Cxbx" /I "Include/Win32/Cxbx/jpegdec" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /Fr /YX /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" diff --git a/Cxbx.opt b/Cxbx.opt index 02646b1e0..d6447cdea 100644 Binary files a/Cxbx.opt and b/Cxbx.opt differ diff --git a/Include/Win32/CxbxKrnl/EmuD3D8/VertexBuffer.h b/Include/Win32/CxbxKrnl/EmuD3D8/VertexBuffer.h index e9d34946f..d3e56e848 100644 --- a/Include/Win32/CxbxKrnl/EmuD3D8/VertexBuffer.h +++ b/Include/Win32/CxbxKrnl/EmuD3D8/VertexBuffer.h @@ -36,26 +36,37 @@ #include "Cxbx.h" -// fixup xbox extensions to be compatible with PC direct3d -extern UINT EmuFixupVerticesA -( - DWORD PrimitiveType, - UINT &PrimitiveCount, - XTL::IDirect3DVertexBuffer8 *&pOrigVertexBuffer8, - XTL::IDirect3DVertexBuffer8 *&pHackVertexBuffer8, - UINT dwOffset, - PVOID pVertexStreamZeroData, - UINT uiVertexStreamZeroStride, - PVOID *ppNewVertexStreamZeroData -); +typedef struct _VertexPatchDesc +{ + IN X_D3DPRIMITIVETYPE PrimitiveType; + IN DWORD dwPrimitiveCount; + IN DWORD dwOffset; + IN OUT PVOID pVertexStreamZeroData; + IN UINT uiVertexStreamZeroStride; +} +VertexPatchDesc; -// fixup xbox extensions to be compatible with PC direct3d -extern VOID EmuFixupVerticesB -( - UINT nStride, - XTL::IDirect3DVertexBuffer8 *&pOrigVertexBuffer8, - XTL::IDirect3DVertexBuffer8 *&pHackVertexBuffer8 -); +class VertexPatcher +{ + public: + VertexPatcher(); + ~VertexPatcher(); + + bool Apply(VertexPatchDesc *pPatchDesc); + bool Restore(); + + private: + + IDirect3DVertexBuffer8 *pOrigVertexBuffer8; + IDirect3DVertexBuffer8 *pPatchedVertexBuffer8; + + UINT uiStride; + + PVOID pNewVertexStreamZeroData; + + bool bPatched; + bool bAllocatedStreamZeroData; +}; // inline vertex buffer emulation extern DWORD *g_pIVBVertexBuffer; diff --git a/Include/Win32/CxbxKrnl/EmuXTL.h b/Include/Win32/CxbxKrnl/EmuXTL.h index 2de362771..23809e5de 100644 --- a/Include/Win32/CxbxKrnl/EmuXTL.h +++ b/Include/Win32/CxbxKrnl/EmuXTL.h @@ -49,6 +49,7 @@ namespace XTL #include "EmuXG.h" } -extern XTL::LPDIRECT3DDEVICE8 g_pD3DDevice8; +extern XTL::LPDIRECT3DDEVICE8 g_pD3DDevice8; +extern DWORD g_CurrentVertexShader; #endif diff --git a/Source/Win32/CxbxKrnl/EmuD3D8.cpp b/Source/Win32/CxbxKrnl/EmuD3D8.cpp index e728a539c..f96fae126 100644 --- a/Source/Win32/CxbxKrnl/EmuD3D8.cpp +++ b/Source/Win32/CxbxKrnl/EmuD3D8.cpp @@ -59,6 +59,7 @@ XTL::LPDIRECT3DDEVICE8 g_pD3DDevice8 = NULL; // Direct3D8 Device XTL::LPDIRECTDRAWSURFACE7 g_pDDSPrimary = NULL; // DirectDraw7 Primary Surface XTL::LPDIRECTDRAWSURFACE7 g_pDDSOverlay7 = NULL; // DirectDraw7 Overlay Surface XTL::LPDIRECTDRAWCLIPPER g_pDDClipper = NULL; // DirectDraw7 Clipper +DWORD g_CurrentVertexShader = 0; // Static Function(s) static BOOL WINAPI EmuEnumDisplayDevices(GUID FAR *lpGUID, LPSTR lpDriverDescription, LPSTR lpDriverName, LPVOID lpContext, HMONITOR hm); @@ -109,7 +110,6 @@ static XTL::X_D3DSurface *g_pCachedRenderTarget = NULL; static XTL::X_D3DSurface *g_pCachedZStencilSurface = NULL; static DWORD g_dwVertexShaderUsage = 0; static XTL::X_D3DSHADERCONSTANTMODE g_VertexShaderConstantMode = X_D3DSCM_192CONSTANTS; -static DWORD g_CurrentVertexShader = 0; static DWORD g_VertexShaderSlots[136]; // cached Direct3D tiles @@ -2503,7 +2503,7 @@ HRESULT WINAPI XTL::EmuIDirect3DDevice8_CreateTexture D3DFORMAT PCFormat = EmuXB2PC_D3DFormat(Format); // TODO: HACK: Devices that don't support this should somehow emulate it! - //* This is OK on my GeForce FX 5600 + /* This is OK on my GeForce FX 5600 if(PCFormat == D3DFMT_D16) { EmuWarning("D3DFMT_D16 is an unsupported texture format!"); @@ -2516,13 +2516,13 @@ HRESULT WINAPI XTL::EmuIDirect3DDevice8_CreateTexture PCFormat = D3DFMT_X8R8G8B8; } //*/ - //* This is OK on my GeForce FX 5600 + /* This is OK on my GeForce FX 5600 else if(PCFormat == D3DFMT_D24S8) { EmuWarning("D3DFMT_D24S8 is an unsupported texture format!"); PCFormat = D3DFMT_X8R8G8B8; }//*/ - else if(PCFormat == D3DFMT_YUY2) + /*else */if(PCFormat == D3DFMT_YUY2) { // cache the overlay size g_dwOverlayW = Width; @@ -2543,8 +2543,8 @@ HRESULT WINAPI XTL::EmuIDirect3DDevice8_CreateTexture *ppTexture = new X_D3DTexture(); // disabled along with D3DFMT_D16 above - //if(Usage & (D3DUSAGE_RENDERTARGET | D3DUSAGE_DEPTHSTENCIL)) - // PCPool = D3DPOOL_DEFAULT; + if(Usage & (D3DUSAGE_RENDERTARGET | D3DUSAGE_DEPTHSTENCIL)) + PCPool = D3DPOOL_DEFAULT; hRet = g_pD3DDevice8->CreateTexture ( @@ -6058,12 +6058,19 @@ VOID WINAPI XTL::EmuIDirect3DDevice8_DrawVertices // Convert from Xbox to PC enumeration D3DPRIMITIVETYPE PCPrimitiveType = EmuPrimitiveType(PrimitiveType); - IDirect3DVertexBuffer8 *pOrigVertexBuffer8 = 0; - IDirect3DVertexBuffer8 *pHackVertexBuffer8 = 0; + VertexPatchDesc VPDesc; - uint32 nStride = EmuFixupVerticesA(PrimitiveType, PrimitiveCount, pOrigVertexBuffer8, pHackVertexBuffer8, StartVertex, 0, 0, 0); + VPDesc.PrimitiveType = PrimitiveType; + VPDesc.dwPrimitiveCount = PrimitiveCount; + VPDesc.dwOffset = StartVertex; + VPDesc.pVertexStreamZeroData = 0; + VPDesc.uiVertexStreamZeroStride = 0; - if (IsValidCurrentShader()) + VertexPatcher VertPatch; + + bool bPatched = VertPatch.Apply(&VPDesc); + + if(IsValidCurrentShader()) { #ifdef _DEBUG_TRACK_VB if(g_bVBSkipStream) @@ -6082,16 +6089,14 @@ VOID WINAPI XTL::EmuIDirect3DDevice8_DrawVertices ( PCPrimitiveType, StartVertex, - PrimitiveCount + VPDesc.dwPrimitiveCount ); #ifdef _DEBUG_TRACK_VB } #endif } - // TODO: use original stride here (duh!) - if(nStride != -1) - EmuFixupVerticesB(nStride, pOrigVertexBuffer8, pHackVertexBuffer8); + VertPatch.Restore(); EmuSwapFS(); // XBox FS @@ -6191,12 +6196,17 @@ VOID WINAPI XTL::EmuIDirect3DDevice8_DrawVerticesUP // Convert from Xbox to PC enumeration D3DPRIMITIVETYPE PCPrimitiveType = EmuPrimitiveType(PrimitiveType); - IDirect3DVertexBuffer8 *pOrigVertexBuffer8 = 0; - IDirect3DVertexBuffer8 *pHackVertexBuffer8 = 0; + VertexPatchDesc VPDesc; - PVOID pNewVertexStreamZeroData = pVertexStreamZeroData; + VPDesc.PrimitiveType = PrimitiveType; + VPDesc.dwPrimitiveCount = PrimitiveCount; + VPDesc.dwOffset = 0; + VPDesc.pVertexStreamZeroData = pVertexStreamZeroData; + VPDesc.uiVertexStreamZeroStride = VertexStreamZeroStride; - uint32 nStride = EmuFixupVerticesA(PrimitiveType, PrimitiveCount, pOrigVertexBuffer8, pHackVertexBuffer8, 0, pVertexStreamZeroData, VertexStreamZeroStride, &pNewVertexStreamZeroData); + VertexPatcher VertPatch; + + bool bPatched = VertPatch.Apply(&VPDesc); if (IsValidCurrentShader()) { @@ -6208,9 +6218,9 @@ VOID WINAPI XTL::EmuIDirect3DDevice8_DrawVerticesUP g_pD3DDevice8->DrawPrimitiveUP ( PCPrimitiveType, - PrimitiveCount, - pNewVertexStreamZeroData, - VertexStreamZeroStride + VPDesc.dwPrimitiveCount, + VPDesc.pVertexStreamZeroData, + VPDesc.uiVertexStreamZeroStride ); #ifdef _DEBUG_TRACK_VB @@ -6218,13 +6228,7 @@ VOID WINAPI XTL::EmuIDirect3DDevice8_DrawVerticesUP #endif } - if(nStride != -1) - { - EmuFixupVerticesB(nStride, pOrigVertexBuffer8, pHackVertexBuffer8); - - if(pNewVertexStreamZeroData != 0) - CxbxFree(pNewVertexStreamZeroData); - } + VertPatch.Restore(); EmuSwapFS(); // XBox FS @@ -6294,10 +6298,17 @@ VOID WINAPI XTL::EmuIDirect3DDevice8_DrawIndexedVertices // Convert from Xbox to PC enumeration D3DPRIMITIVETYPE PCPrimitiveType = EmuPrimitiveType(PrimitiveType); - IDirect3DVertexBuffer8 *pOrigVertexBuffer8 = 0; - IDirect3DVertexBuffer8 *pHackVertexBuffer8 = 0; + VertexPatchDesc VPDesc; - uint32 nStride = EmuFixupVerticesA(PrimitiveType, PrimitiveCount, pOrigVertexBuffer8, pHackVertexBuffer8, 0, 0, 0, 0); + VPDesc.PrimitiveType = PrimitiveType; + VPDesc.dwPrimitiveCount = PrimitiveCount; + VPDesc.dwOffset = 0; + VPDesc.pVertexStreamZeroData = 0; + VPDesc.uiVertexStreamZeroStride = 0; + + VertexPatcher VertPatch; + + bool bPatched = VertPatch.Apply(&VPDesc); #ifdef _DEBUG_TRACK_VB if(!g_bVBSkipStream) @@ -6315,15 +6326,16 @@ VOID WINAPI XTL::EmuIDirect3DDevice8_DrawIndexedVertices g_pD3DDevice8->GetIndices(&pIndexBuffer, &BaseIndex); if(pIndexBuffer != 0) + { bActiveIB = true; - - pIndexBuffer->Release(); + pIndexBuffer->Release(); + } } UINT uiNumVertices = 0; UINT uiStartIndex = 0; - // TODO: Caching (if it becomes noticably slow to recreate the buffer each time) + // TODO: caching (if it becomes noticably slow to recreate the buffer each time) if(!bActiveIB) { g_pD3DDevice8->CreateIndexBuffer(VertexCount*2, D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED, &pIndexBuffer); @@ -6353,11 +6365,11 @@ VOID WINAPI XTL::EmuIDirect3DDevice8_DrawIndexedVertices uiStartIndex = ((DWORD)pIndexData)/2; } - if (IsValidCurrentShader()) + if(IsValidCurrentShader()) { g_pD3DDevice8->DrawIndexedPrimitive ( - PCPrimitiveType, 0, uiNumVertices, uiStartIndex, PrimitiveCount + PCPrimitiveType, 0, uiNumVertices, uiStartIndex, VPDesc.dwPrimitiveCount ); } @@ -6371,8 +6383,7 @@ VOID WINAPI XTL::EmuIDirect3DDevice8_DrawIndexedVertices } #endif - if(nStride != -1) - EmuFixupVerticesB(nStride, pOrigVertexBuffer8, pHackVertexBuffer8); + VertPatch.Restore(); EmuSwapFS(); // XBox FS @@ -6417,12 +6428,17 @@ VOID WINAPI XTL::EmuIDirect3DDevice8_DrawIndexedVerticesUP // Convert from Xbox to PC enumeration D3DPRIMITIVETYPE PCPrimitiveType = EmuPrimitiveType(PrimitiveType); - IDirect3DVertexBuffer8 *pOrigVertexBuffer8 = 0; - IDirect3DVertexBuffer8 *pHackVertexBuffer8 = 0; + VertexPatchDesc VPDesc; - PVOID pNewVertexStreamZeroData = pVertexStreamZeroData; + VPDesc.PrimitiveType = PrimitiveType; + VPDesc.dwPrimitiveCount = PrimitiveCount; + VPDesc.dwOffset = 0; + VPDesc.pVertexStreamZeroData = pVertexStreamZeroData; + VPDesc.uiVertexStreamZeroStride = VertexStreamZeroStride; - uint32 nStride = EmuFixupVerticesA(PrimitiveType, PrimitiveCount, pOrigVertexBuffer8, pHackVertexBuffer8, 0, pVertexStreamZeroData, VertexStreamZeroStride, &pNewVertexStreamZeroData); + VertexPatcher VertPatch; + + bool bPatched = VertPatch.Apply(&VPDesc); #ifdef _DEBUG_TRACK_VB if(!g_bVBSkipStream) @@ -6433,7 +6449,7 @@ VOID WINAPI XTL::EmuIDirect3DDevice8_DrawIndexedVerticesUP { g_pD3DDevice8->DrawIndexedPrimitiveUP ( - PCPrimitiveType, 0, VertexCount, PrimitiveCount, pIndexData, D3DFMT_INDEX16, pNewVertexStreamZeroData, VertexStreamZeroStride + PCPrimitiveType, 0, VertexCount, VPDesc.dwPrimitiveCount, pIndexData, D3DFMT_INDEX16, VPDesc.pVertexStreamZeroData, VPDesc.uiVertexStreamZeroStride ); } @@ -6441,13 +6457,7 @@ VOID WINAPI XTL::EmuIDirect3DDevice8_DrawIndexedVerticesUP } #endif - if(nStride != -1) - { - EmuFixupVerticesB(nStride, pOrigVertexBuffer8, pHackVertexBuffer8); - - if(pNewVertexStreamZeroData != 0) - CxbxFree(pNewVertexStreamZeroData); - } + VertPatch.Restore(); EmuSwapFS(); // XBox FS diff --git a/Source/Win32/CxbxKrnl/EmuD3D8/PushBuffer.cpp b/Source/Win32/CxbxKrnl/EmuD3D8/PushBuffer.cpp index f293d855c..12cc637cb 100644 --- a/Source/Win32/CxbxKrnl/EmuD3D8/PushBuffer.cpp +++ b/Source/Win32/CxbxKrnl/EmuD3D8/PushBuffer.cpp @@ -234,7 +234,7 @@ void XTL::EmuExecutePushBuffer if(!g_bPBSkipPusher) { - if (IsValidCurrentShader()) + if(IsValidCurrentShader()) { g_pD3DDevice8->DrawIndexedPrimitive ( diff --git a/Source/Win32/CxbxKrnl/EmuD3D8/VertexBuffer.cpp b/Source/Win32/CxbxKrnl/EmuD3D8/VertexBuffer.cpp index 3ff802198..40b8ed0e8 100644 --- a/Source/Win32/CxbxKrnl/EmuD3D8/VertexBuffer.cpp +++ b/Source/Win32/CxbxKrnl/EmuD3D8/VertexBuffer.cpp @@ -45,25 +45,26 @@ XTL::X_D3DPRIMITIVETYPE XTL::g_IVBPrimitiveType = 0; UINT XTL::g_IVBTblOffs = 0; struct XTL::_D3DIVB *XTL::g_IVBTable = 0; -// fixup xbox extensions to be compatible with PC direct3d -UINT XTL::EmuFixupVerticesA -( - DWORD PrimitiveType, - UINT &PrimitiveCount, - XTL::IDirect3DVertexBuffer8 *&pOrigVertexBuffer8, - XTL::IDirect3DVertexBuffer8 *&pHackVertexBuffer8, - UINT dwOffset, - PVOID pVertexStreamZeroData, - UINT uiVertexStreamZeroStride, - PVOID *ppNewVertexStreamZeroData -) +XTL::VertexPatcher::VertexPatcher() { - // only quad and listloop are supported right now - if(PrimitiveType != 8 && PrimitiveType != 3) - return -1; + this->pOrigVertexBuffer8 = 0; + this->pPatchedVertexBuffer8 = 0; + this->uiStride = 0; + this->bPatched = false; + this->bAllocatedStreamZeroData = false; +} - // stride of this stream source - UINT uiStride = 0; +XTL::VertexPatcher::~VertexPatcher() +{ +} + +bool XTL::VertexPatcher::Apply(VertexPatchDesc *pPatchDesc) +{ + // only quad and listloop are currently supported + if((pPatchDesc->PrimitiveType != 8) && (pPatchDesc->PrimitiveType != 3)) + return false; + + uiStride = 0; // sizes of our part in the vertex buffer DWORD dwOriginalSize = 0; @@ -75,27 +76,29 @@ UINT XTL::EmuFixupVerticesA // vertex data arrays BYTE *pOrigVertexData = 0; - BYTE *pHackVertexData = 0; + BYTE *pPatchedVertexData = 0; - if(pVertexStreamZeroData == 0) + if(pPatchDesc->pVertexStreamZeroData == 0) { g_pD3DDevice8->GetStreamSource(0, &pOrigVertexBuffer8, &uiStride); - if(PrimitiveType == 8) // Quad + // Quad + if(pPatchDesc->PrimitiveType == 8) { - PrimitiveCount *= 2; + pPatchDesc->dwPrimitiveCount *= 2; // This is a list of sqares/rectangles, so we convert it to a list of triangles - dwOriginalSize = PrimitiveCount*uiStride*2; - dwNewSize = PrimitiveCount*uiStride*3; + dwOriginalSize = pPatchDesc->dwPrimitiveCount*uiStride*2; + dwNewSize = pPatchDesc->dwPrimitiveCount*uiStride*3; } - else if(PrimitiveType == 3) // LineLoop + // LineLoop + else if(pPatchDesc->PrimitiveType == 3) { - PrimitiveCount += 1; + pPatchDesc->dwPrimitiveCount += 1; // We will add exactly one more line - dwOriginalSize = PrimitiveCount*uiStride; - dwNewSize = PrimitiveCount*uiStride + uiStride; + dwOriginalSize = pPatchDesc->dwPrimitiveCount*uiStride; + dwNewSize = pPatchDesc->dwPrimitiveCount*uiStride + uiStride; } // Retrieve the original buffer size @@ -113,42 +116,45 @@ UINT XTL::EmuFixupVerticesA dwNewSizeWR = dwNewSize + dwOriginalSizeWR - dwOriginalSize; } - g_pD3DDevice8->CreateVertexBuffer(dwNewSizeWR, 0, 0, XTL::D3DPOOL_MANAGED, &pHackVertexBuffer8); + g_pD3DDevice8->CreateVertexBuffer(dwNewSizeWR, 0, 0, XTL::D3DPOOL_MANAGED, &pPatchedVertexBuffer8); if(pOrigVertexBuffer8 != 0) pOrigVertexBuffer8->Lock(0, 0, &pOrigVertexData, 0); - if(pHackVertexBuffer8 != 0) - pHackVertexBuffer8->Lock(0, 0, &pHackVertexData, 0); + if(pPatchedVertexBuffer8 != 0) + pPatchedVertexBuffer8->Lock(0, 0, &pPatchedVertexData, 0); } else { - uiStride = uiVertexStreamZeroStride; + uiStride = pPatchDesc->uiVertexStreamZeroStride; - if(PrimitiveType == 8) // Quad + if(pPatchDesc->PrimitiveType == 8) // Quad { - PrimitiveCount *= 2; + pPatchDesc->dwPrimitiveCount *= 2; // This is a list of sqares/rectangles, so we convert it to a list of triangles - dwOriginalSize = PrimitiveCount*uiStride*2; - dwNewSize = PrimitiveCount*uiStride*3; + dwOriginalSize = pPatchDesc->dwPrimitiveCount*uiStride*2; + dwNewSize = pPatchDesc->dwPrimitiveCount*uiStride*3; } - else if(PrimitiveType == 3) // LineLoop + else if(pPatchDesc->PrimitiveType == 3) // LineLoop { - PrimitiveCount += 1; + pPatchDesc->dwPrimitiveCount += 1; // We will add exactly one more line - dwOriginalSize = PrimitiveCount*uiStride; - dwNewSize = PrimitiveCount*uiStride + uiStride; + dwOriginalSize = pPatchDesc->dwPrimitiveCount*uiStride; + dwNewSize = pPatchDesc->dwPrimitiveCount*uiStride + uiStride; } dwOriginalSizeWR = dwOriginalSize; dwNewSizeWR = dwNewSize; - pHackVertexData = (uint08*)CxbxMalloc(dwNewSizeWR); - pOrigVertexData = (uint08*)pVertexStreamZeroData; + pNewVertexStreamZeroData = (uint08*)CxbxMalloc(dwNewSizeWR); + this->bAllocatedStreamZeroData = true; - *ppNewVertexStreamZeroData = pHackVertexData; + pPatchedVertexData = (uint08*)pNewVertexStreamZeroData; + pOrigVertexData = (uint08*)pPatchDesc->pVertexStreamZeroData; + + pPatchDesc->pVertexStreamZeroData = pPatchedVertexData; } DWORD dwVertexShader = NULL; @@ -156,31 +162,34 @@ UINT XTL::EmuFixupVerticesA g_pD3DDevice8->GetVertexShader(&dwVertexShader); // Copy the nonmodified data - memcpy(pHackVertexData, pOrigVertexData, dwOffset); - memcpy(&pHackVertexData[dwOffset+dwNewSize], &pOrigVertexData[dwOffset+dwOriginalSize], dwOriginalSizeWR-dwOffset-dwOriginalSize); + memcpy(pPatchedVertexData, pOrigVertexData, pPatchDesc->dwOffset); + memcpy(&pPatchedVertexData[pPatchDesc->dwOffset+dwNewSize], + &pOrigVertexData[pPatchDesc->dwOffset+dwOriginalSize], + dwOriginalSizeWR - pPatchDesc->dwOffset - dwOriginalSize); - if(PrimitiveType == 8) // Quad + // Quad + if(pPatchDesc->PrimitiveType == 8) { - uint08 *pHack1 = &pHackVertexData[dwOffset+0*uiStride]; - uint08 *pHack2 = &pHackVertexData[dwOffset+3*uiStride]; - uint08 *pHack3 = &pHackVertexData[dwOffset+4*uiStride]; - uint08 *pHack4 = &pHackVertexData[dwOffset+5*uiStride]; + uint08 *pPatch1 = &pPatchedVertexData[pPatchDesc->dwOffset+0*uiStride]; + uint08 *pPatch2 = &pPatchedVertexData[pPatchDesc->dwOffset+3*uiStride]; + uint08 *pPatch3 = &pPatchedVertexData[pPatchDesc->dwOffset+4*uiStride]; + uint08 *pPatch4 = &pPatchedVertexData[pPatchDesc->dwOffset+5*uiStride]; - uint08 *pOrig1 = &pOrigVertexData[dwOffset+0*uiStride]; - uint08 *pOrig2 = &pOrigVertexData[dwOffset+2*uiStride]; - uint08 *pOrig3 = &pOrigVertexData[dwOffset+3*uiStride]; + uint08 *pOrig1 = &pOrigVertexData[pPatchDesc->dwOffset+0*uiStride]; + uint08 *pOrig2 = &pOrigVertexData[pPatchDesc->dwOffset+2*uiStride]; + uint08 *pOrig3 = &pOrigVertexData[pPatchDesc->dwOffset+3*uiStride]; - for(uint32 i=0;idwPrimitiveCount/2;i++) { - memcpy(pHack1, pOrig1, uiStride*3); // Vertex 0,1,2 := Vertex 0,1,2 - memcpy(pHack2, pOrig2, uiStride); // Vertex 3 := Vertex 2 - memcpy(pHack3, pOrig3, uiStride); // Vertex 4 := Vertex 3 - memcpy(pHack4, pOrig1, uiStride); // Vertex 5 := Vertex 0 + memcpy(pPatch1, pOrig1, uiStride*3); // Vertex 0,1,2 := Vertex 0,1,2 + memcpy(pPatch2, pOrig2, uiStride); // Vertex 3 := Vertex 2 + memcpy(pPatch3, pOrig3, uiStride); // Vertex 4 := Vertex 3 + memcpy(pPatch4, pOrig1, uiStride); // Vertex 5 := Vertex 0 - pHack1 += uiStride*6; - pHack2 += uiStride*6; - pHack3 += uiStride*6; - pHack4 += uiStride*6; + pPatch1 += uiStride*6; + pPatch2 += uiStride*6; + pPatch3 += uiStride*6; + pPatch4 += uiStride*6; pOrig1 += uiStride*4; pOrig2 += uiStride*4; @@ -190,47 +199,52 @@ UINT XTL::EmuFixupVerticesA { for(int z=0;z<6;z++) { - if(((FLOAT*)&pHackVertexData[dwOffset+i*uiStride*6+z*uiStride])[2] == 0.0f) - ((FLOAT*)&pHackVertexData[dwOffset+i*uiStride*6+z*uiStride])[2] = 1.0f; - if(((FLOAT*)&pHackVertexData[dwOffset+i*uiStride*6+z*uiStride])[3] == 0.0f) - ((FLOAT*)&pHackVertexData[dwOffset+i*uiStride*6+z*uiStride])[3] = 1.0f; + if(((FLOAT*)&pPatchedVertexData[pPatchDesc->dwOffset+i*uiStride*6+z*uiStride])[2] == 0.0f) + ((FLOAT*)&pPatchedVertexData[pPatchDesc->dwOffset+i*uiStride*6+z*uiStride])[2] = 1.0f; + if(((FLOAT*)&pPatchedVertexData[pPatchDesc->dwOffset+i*uiStride*6+z*uiStride])[3] == 0.0f) + ((FLOAT*)&pPatchedVertexData[pPatchDesc->dwOffset+i*uiStride*6+z*uiStride])[3] = 1.0f; } } } } - else if(PrimitiveType == 3) + // LineLoop + else if(pPatchDesc->PrimitiveType == 3) { - memcpy(&pHackVertexData[dwOffset], &pOrigVertexData[dwOffset], dwOriginalSize); - memcpy(&pHackVertexData[dwOffset + dwOriginalSize], &pOrigVertexData[dwOffset], uiStride); + memcpy(&pPatchedVertexData[pPatchDesc->dwOffset], &pOrigVertexData[pPatchDesc->dwOffset], dwOriginalSize); + memcpy(&pPatchedVertexData[pPatchDesc->dwOffset + dwOriginalSize], &pOrigVertexData[pPatchDesc->dwOffset], uiStride); } - if(pVertexStreamZeroData == 0) + if(pPatchDesc->pVertexStreamZeroData == 0) { pOrigVertexBuffer8->Unlock(); - pHackVertexBuffer8->Unlock(); + pPatchedVertexBuffer8->Unlock(); - g_pD3DDevice8->SetStreamSource(0, pHackVertexBuffer8, uiStride); + g_pD3DDevice8->SetStreamSource(0, pPatchedVertexBuffer8, uiStride); } - return uiStride; + this->bPatched = true; + + return true; } -// fixup xbox extensions to be compatible with PC direct3d -VOID XTL::EmuFixupVerticesB -( - UINT nStride, - XTL::IDirect3DVertexBuffer8 *&pOrigVertexBuffer8, - XTL::IDirect3DVertexBuffer8 *&pHackVertexBuffer8 -) +bool XTL::VertexPatcher::Restore() { - if(pOrigVertexBuffer8 != 0 && pHackVertexBuffer8 != 0) - g_pD3DDevice8->SetStreamSource(0, pOrigVertexBuffer8, nStride); + if(!this->bPatched) + return false; + + if(pOrigVertexBuffer8 != 0 && pPatchedVertexBuffer8 != 0) + g_pD3DDevice8->SetStreamSource(0, pOrigVertexBuffer8, uiStride); if(pOrigVertexBuffer8 != 0) pOrigVertexBuffer8->Release(); - if(pHackVertexBuffer8 != 0) - pHackVertexBuffer8->Release(); + if(pPatchedVertexBuffer8 != 0) + pPatchedVertexBuffer8->Release(); + + if(this->bAllocatedStreamZeroData) + CxbxFree(pNewVertexStreamZeroData); + + return true; } VOID XTL::EmuFlushIVB()