vertex buffer patching cleanup, etc

This commit is contained in:
Aaron Robinson 2004-03-27 09:49:27 +00:00
parent e6db025c3d
commit e2d25e3075
7 changed files with 192 additions and 157 deletions

View File

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

BIN
Cxbx.opt

Binary file not shown.

View File

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

View File

@ -49,6 +49,7 @@ namespace XTL
#include "EmuXG.h"
}
extern XTL::LPDIRECT3DDEVICE8 g_pD3DDevice8;
extern XTL::LPDIRECT3DDEVICE8 g_pD3DDevice8;
extern DWORD g_CurrentVertexShader;
#endif

View File

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

View File

@ -234,7 +234,7 @@ void XTL::EmuExecutePushBuffer
if(!g_bPBSkipPusher)
{
if (IsValidCurrentShader())
if(IsValidCurrentShader())
{
g_pD3DDevice8->DrawIndexedPrimitive
(

View File

@ -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;i<PrimitiveCount/2;i++)
for(uint32 i=0;i<pPatchDesc->dwPrimitiveCount/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()