vertex buffer patching cleanup, etc
This commit is contained in:
parent
e6db025c3d
commit
e2d25e3075
5
Cxbx.dsp
5
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"
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -49,6 +49,7 @@ namespace XTL
|
|||
#include "EmuXG.h"
|
||||
}
|
||||
|
||||
extern XTL::LPDIRECT3DDEVICE8 g_pD3DDevice8;
|
||||
extern XTL::LPDIRECT3DDEVICE8 g_pD3DDevice8;
|
||||
extern DWORD g_CurrentVertexShader;
|
||||
|
||||
#endif
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -234,7 +234,7 @@ void XTL::EmuExecutePushBuffer
|
|||
|
||||
if(!g_bPBSkipPusher)
|
||||
{
|
||||
if (IsValidCurrentShader())
|
||||
if(IsValidCurrentShader())
|
||||
{
|
||||
g_pD3DDevice8->DrawIndexedPrimitive
|
||||
(
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue