_Begin/_End etc work

This commit is contained in:
Aaron Robinson 2004-04-18 22:22:57 +00:00
parent c1669099c3
commit 03813735fd
8 changed files with 212 additions and 157 deletions

BIN
Cxbx.opt

Binary file not shown.

View File

@ -124,10 +124,12 @@ class VertexPatcher
// inline vertex buffer emulation
extern DWORD *g_pIVBVertexBuffer;
extern X_D3DPRIMITIVETYPE g_IVBPrimitiveType;
extern DWORD g_IVBFVF;
extern struct _D3DIVB
{
XTL::D3DXVECTOR3 Position; // Position
FLOAT Rhw; // Rhw
XTL::DWORD dwSpecular; // Specular
XTL::DWORD dwDiffuse; // Diffuse
XTL::D3DXVECTOR3 Normal; // Normal

View File

@ -1628,6 +1628,17 @@ HRESULT WINAPI XTL::EmuIDirect3DDevice8_CopyRects
GetCurrentThreadId(), pSourceSurface, pSourceRectsArray, cRects,
pDestinationSurface, pDestPointsArray);
pSourceSurface->EmuSurface8->UnlockRect();
/*
static int kthx = 0;
char fileName[255];
sprintf(fileName, "C:\\Aaron\\Textures\\SourceSurface-%d.bmp", kthx++);
D3DXSaveSurfaceToFile(fileName, D3DXIFF_BMP, pSourceSurface->EmuSurface8, NULL, NULL);
//*/
HRESULT hRet = g_pD3DDevice8->CopyRects
(
pSourceSurface->EmuSurface8,
@ -3137,31 +3148,10 @@ HRESULT WINAPI XTL::EmuIDirect3DDevice8_Begin
// allocate a max of 32 entries
g_IVBTable = (struct XTL::_D3DIVB*)CxbxMalloc(sizeof(XTL::_D3DIVB)*32);
g_IVBTblOffs = 0;
g_IVBFVF = 0;
// default values
for(int v=0;v<32;v++)
{
g_IVBTable[v].Position.x = 0;
g_IVBTable[v].Position.y = 0;
g_IVBTable[v].Position.z = 0;
g_IVBTable[v].Normal.x = 0;
g_IVBTable[v].Normal.y = 0;
g_IVBTable[v].Normal.z = 0;
g_IVBTable[v].dwDiffuse = 0x00000000;
g_IVBTable[v].dwSpecular = 0x00000000;
g_IVBTable[v].TexCoord1.x = 0;
g_IVBTable[v].TexCoord1.y = 0;
g_IVBTable[v].TexCoord2.x = 0;
g_IVBTable[v].TexCoord2.y = 0;
g_IVBTable[v].TexCoord3.x = 0;
g_IVBTable[v].TexCoord3.y = 0;
g_IVBTable[v].TexCoord4.x = 0;
g_IVBTable[v].TexCoord4.y = 0;
}
DWORD dwShader = -1;
g_pD3DDevice8->GetVertexShader(&dwShader);
ZeroMemory(g_IVBTable, sizeof(XTL::_D3DIVB)*32);
g_pIVBVertexBuffer = (DWORD*)CxbxMalloc(sizeof(struct XTL::_D3DIVB)*32);
@ -3198,6 +3188,9 @@ HRESULT WINAPI XTL::EmuIDirect3DDevice8_SetVertexData2f
return EmuIDirect3DDevice8_SetVertexData4f(Register, a, b, 0.0f, 1.0f);
}
static inline DWORD FtoDW(FLOAT f) { return *((DWORD*)&f); }
static inline FLOAT DWtoF(DWORD f) { return *((FLOAT*)&f); }
// ******************************************************************
// * func: EmuIDirect3DDevice8_SetVertexData4f
// ******************************************************************
@ -3226,7 +3219,22 @@ HRESULT WINAPI XTL::EmuIDirect3DDevice8_SetVertexData4f
switch(Register)
{
case 9:
case 3: // D3DVSDE_DIFFUSE
{
int o = g_IVBTblOffs;
DWORD ca = FtoDW(d) << 24;
DWORD cr = FtoDW(a) << 16;
DWORD cg = FtoDW(b) << 8;
DWORD cb = FtoDW(c) << 0;
g_IVBTable[o].dwDiffuse = ca | cr | cg | cb;
g_IVBFVF |= D3DFVF_DIFFUSE;
}
break;
case 9: // D3DVSDE_TEXCOORD0
{
int o = g_IVBTblOffs;
@ -3238,6 +3246,11 @@ HRESULT WINAPI XTL::EmuIDirect3DDevice8_SetVertexData4f
g_IVBTable[o].TexCoord1.x = a;
g_IVBTable[o].TexCoord1.y = b;
if( (g_IVBFVF & D3DFVF_TEXCOUNT_MASK) < D3DFVF_TEX1)
{
g_IVBFVF |= D3DFVF_TEX1;
}
}
break;
@ -3245,8 +3258,8 @@ HRESULT WINAPI XTL::EmuIDirect3DDevice8_SetVertexData4f
{
int o = g_IVBTblOffs;
// a = (a/320.0f) - 1.0f;
// b = (b/240.0f) - 1.0f;
a = (a/320.0f) - 1.0f;
b = (b/240.0f) - 1.0f;
g_IVBTable[o].Position.x = a;
g_IVBTable[o].Position.y = b;
@ -3254,6 +3267,8 @@ HRESULT WINAPI XTL::EmuIDirect3DDevice8_SetVertexData4f
g_IVBTblOffs++;
g_IVBFVF |= D3DFVF_XYZ;
EmuFlushIVB();
}
break;
@ -3267,9 +3282,6 @@ HRESULT WINAPI XTL::EmuIDirect3DDevice8_SetVertexData4f
return hRet;
}
static inline DWORD FtoDW(FLOAT f) { return *((DWORD*)&f); }
static inline FLOAT DWtoF(DWORD f) { return *((FLOAT*)&f); }
// ******************************************************************
// * func: EmuIDirect3DDevice8_SetVertexDataColor
// ******************************************************************

View File

@ -385,38 +385,12 @@ void XTL::EmuExecutePushBuffer
{
#endif
if(!g_bPBSkipPusher)
if(!g_bPBSkipPusher && IsValidCurrentShader())
{
if(IsValidCurrentShader())
{
//g_pD3DDevice8->SetVertexShader(D3DFVF_XYZ | D3DFVF_TEX0);
/* these don't help the turok lighting problems :[
g_pD3DDevice8->SetRenderState(D3DRS_LIGHTING, FALSE);
g_pD3DDevice8->SetRenderState(D3DRS_FOGENABLE, FALSE);
g_pD3DDevice8->SetRenderState(D3DRS_FOGTABLEMODE, D3DFOG_NONE);
g_pD3DDevice8->SetRenderState(D3DRS_SPECULARENABLE, FALSE);
g_pD3DDevice8->SetRenderState(D3DRS_ZVISIBLE, FALSE);
g_pD3DDevice8->SetRenderState(D3DRS_RANGEFOGENABLE, FALSE);
g_pD3DDevice8->SetRenderState(D3DRS_AMBIENT, RGB(255,125,125));
g_pD3DDevice8->SetRenderState(D3DRS_AMBIENTMATERIALSOURCE, D3DMCS_COLOR1);
D3DMATERIAL8 mtrl;
ZeroMemory( &mtrl, sizeof(D3DMATERIAL8) );
mtrl.Diffuse.r = mtrl.Ambient.r = mtrl.Specular.r = 1.0f;
mtrl.Diffuse.g = mtrl.Ambient.g = mtrl.Specular.r = 0.0f;
mtrl.Diffuse.b = mtrl.Ambient.b = mtrl.Specular.r = 0.0f;
mtrl.Diffuse.a = mtrl.Ambient.a = mtrl.Specular.r = 1.0f;
g_pD3DDevice8->SetMaterial(&mtrl);
//*/
g_pD3DDevice8->DrawIndexedPrimitive
(
PCPrimitiveType, 0, /*dwCount*2*/8*1024*1024, 0, PrimitiveCount
);
}
g_pD3DDevice8->DrawIndexedPrimitive
(
PCPrimitiveType, 0, /*dwCount*2*/8*1024*1024, 0, PrimitiveCount
);
}
#ifdef _DEBUG_TRACK_PB

View File

@ -49,6 +49,7 @@ XTL::DWORD *XTL::g_pIVBVertexBuffer = 0;
XTL::X_D3DPRIMITIVETYPE XTL::g_IVBPrimitiveType = XTL::X_D3DPT_INVALID;
UINT XTL::g_IVBTblOffs = 0;
struct XTL::_D3DIVB *XTL::g_IVBTable = 0;
extern DWORD XTL::g_IVBFVF = 0;
static unsigned int crctab[256];
@ -937,146 +938,90 @@ bool XTL::VertexPatcher::Restore()
VOID XTL::EmuFlushIVB()
{
if((g_IVBPrimitiveType == X_D3DPT_QUADSTRIP) && (g_IVBTblOffs == 4))
if((g_IVBPrimitiveType == X_D3DPT_QUADLIST) && (g_IVBTblOffs == 4))
{
DWORD dwShader = -1;
DWORD *pdwVB = g_pIVBVertexBuffer;
XTL::EmuUpdateDeferredStates();
g_pD3DDevice8->GetVertexShader(&dwShader);
DWORD *pdwVB = (DWORD*)g_IVBTable;
UINT uiStride = 0;
for(int v=0;v<4;v++)
{
DWORD dwPos = dwShader & D3DFVF_POSITION_MASK;
DWORD dwPos = g_IVBFVF & D3DFVF_POSITION_MASK;
if(dwPos == D3DFVF_XYZRHW)
if(dwPos == D3DFVF_XYZ)
{
*(FLOAT*)pdwVB++ = g_IVBTable[v].Position.x;
*(FLOAT*)pdwVB++ = g_IVBTable[v].Position.y;
*(FLOAT*)pdwVB++ = g_IVBTable[v].Position.z;
uiStride += (sizeof(FLOAT)*3);
if(v == 0)
{
uiStride += (sizeof(FLOAT)*3);
}
DbgPrintf("IVB Position := {%f, %f, %f}\n", g_IVBTable[v].Position.x, g_IVBTable[v].Position.y, g_IVBTable[v].Position.z);
}
else
{
EmuCleanup("Unsupported Position Mask (FVF := 0x%.08X)", dwShader);
EmuCleanup("Unsupported Position Mask (FVF := 0x%.08X)", g_IVBFVF);
}
if(dwShader & D3DFVF_NORMAL)
{
*(FLOAT*)pdwVB++ = g_IVBTable[v].Normal.x;
*(FLOAT*)pdwVB++ = g_IVBTable[v].Normal.y;
*(FLOAT*)pdwVB++ = g_IVBTable[v].Normal.z;
uiStride += sizeof(FLOAT)*3;
DbgPrintf("IVB Normal := {%f, %f, %f}\n", g_IVBTable[v].Normal.x, g_IVBTable[v].Normal.y, g_IVBTable[v].Normal.z);
}
if(dwShader & D3DFVF_DIFFUSE)
if(g_IVBFVF & D3DFVF_DIFFUSE)
{
*(DWORD*)pdwVB++ = g_IVBTable[v].dwDiffuse;
if(v == 0)
{
uiStride += sizeof(DWORD);
}
DbgPrintf("IVB Diffuse := 0x%.08X\n", g_IVBTable[v].dwDiffuse);
}
if(dwShader & D3DFVF_SPECULAR)
{
*(DWORD*)pdwVB++ = g_IVBTable[v].dwSpecular;
uiStride += sizeof(DWORD);
DbgPrintf("IVB Specular := 0x%.08X\n", g_IVBTable[v].dwSpecular);
}
DWORD dwTexN = (dwShader & D3DFVF_TEXCOUNT_MASK) >> D3DFVF_TEXCOUNT_SHIFT;
DWORD dwTexN = (g_IVBFVF & D3DFVF_TEXCOUNT_MASK) >> D3DFVF_TEXCOUNT_SHIFT;
if(dwTexN >= 1)
{
*(FLOAT*)pdwVB++ = g_IVBTable[v].TexCoord1.x;
*(FLOAT*)pdwVB++ = g_IVBTable[v].TexCoord1.y;
uiStride += sizeof(FLOAT)*2;
if(v == 0)
{
uiStride += sizeof(FLOAT)*2;
}
DbgPrintf("IVB TexCoord1 := {%f, %f}\n", g_IVBTable[v].TexCoord1.x, g_IVBTable[v].TexCoord1.y);
}
if(dwTexN >= 2)
{
*(FLOAT*)pdwVB++ = g_IVBTable[v].TexCoord2.x;
*(FLOAT*)pdwVB++ = g_IVBTable[v].TexCoord2.y;
uiStride += sizeof(FLOAT)*2;
DbgPrintf("IVB TexCoord2 := {%f, %f}\n", g_IVBTable[v].TexCoord2.x, g_IVBTable[v].TexCoord2.y);
}
if(dwTexN >= 3)
{
*(FLOAT*)pdwVB++ = g_IVBTable[v].TexCoord3.x;
*(FLOAT*)pdwVB++ = g_IVBTable[v].TexCoord3.y;
uiStride += sizeof(FLOAT)*2;
DbgPrintf("IVB TexCoord3 := {%f, %f}\n", g_IVBTable[v].TexCoord3.x, g_IVBTable[v].TexCoord3.y);
}
if(dwTexN >= 4)
{
*(FLOAT*)pdwVB++ = g_IVBTable[v].TexCoord4.x;
*(FLOAT*)pdwVB++ = g_IVBTable[v].TexCoord4.y;
uiStride += sizeof(FLOAT)*2;
DbgPrintf("IVB TexCoord4 := {%f, %f}\n", g_IVBTable[v].TexCoord4.x, g_IVBTable[v].TexCoord4.y);
}
}
/*
static XTL::IDirect3DTexture8 *pTexture = 0;
g_pD3DDevice8->SetVertexShader(g_IVBFVF);
g_pD3DDevice8->SetPixelShader(NULL);
if(pTexture == 0)
{
g_pD3DDevice8->CreateTexture(512, 512, 1, 0, D3DFMT_X8R8G8B8, D3DPOOL_MANAGED, &pTexture);
// patch buffer
UINT PrimitiveCount = EmuD3DVertex2PrimitiveCount(g_IVBPrimitiveType, 4);
IDirect3DSurface8 *pSurface = 0;;
VertexPatchDesc VPDesc;
pTexture->GetSurfaceLevel(0, &pSurface);
VPDesc.dwVertexCount = 4;
VPDesc.PrimitiveType = g_IVBPrimitiveType;
VPDesc.dwPrimitiveCount = PrimitiveCount;
VPDesc.dwOffset = 0;
VPDesc.pVertexStreamZeroData = g_IVBTable;
VPDesc.uiVertexStreamZeroStride = uiStride;
// TODO: Set the current shader and let the patcher handle it..
VPDesc.hVertexShader = g_IVBFVF;
D3DXLoadSurfaceFromFileA(pSurface, NULL, NULL, "C:\\texture.bmp", NULL, D3DX_FILTER_NONE, 0, NULL);
VertexPatcher VertPatch;
pSurface->Release();
}
bool bPatched = VertPatch.Apply(&VPDesc);
g_pD3DDevice8->SetTexture(0, pTexture);
//*/
g_pD3DDevice8->DrawPrimitiveUP(D3DPT_TRIANGLELIST, VPDesc.dwPrimitiveCount, VPDesc.pVertexStreamZeroData, VPDesc.uiVertexStreamZeroStride);
/*
IDirect3DBaseTexture8 *pTexture = 0;
g_pD3DDevice8->GetTexture(0, &pTexture);
if(pTexture != NULL)
{
static int dwDumpTexture = 0;
char szBuffer[255];
sprintf(szBuffer, "C:\\Aaron\\Textures\\Texture-Active%.03d.bmp", dwDumpTexture++);
D3DXSaveTextureToFile(szBuffer, D3DXIFF_BMP, pTexture, NULL);
}
//*/
XTL::EmuUpdateDeferredStates();
g_pD3DDevice8->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, g_pIVBVertexBuffer, uiStride);
g_pD3DDevice8->Present(0,0,0,0);
VertPatch.Restore();
// ignore
g_IVBTblOffs = 0;
}

View File

@ -726,6 +726,9 @@ BOOL WINAPI XTL::EmuSetThreadPriority
if(bRet == FALSE)
EmuWarning("SetThreadPriority Failed!");
// HACK!
Sleep(10);
EmuSwapFS(); // XBox FS
return bRet;

View File

@ -493,6 +493,29 @@ SOOVPA<12> IDirect3DDevice8_SetShaderConstantMode_1_0_4627 =
}
};
// ******************************************************************
// * IDirect3DDevice8_CopyRects
// ******************************************************************
SOOVPA<8> IDirect3DDevice8_CopyRects_1_0_4627 =
{
0, // Large == 0
8, // Count == 8
-1, // XRef Not Saved
0, // XRef Not Used
{
{ 0x1E, 0x57 },
{ 0x3E, 0xF6 },
{ 0x5E, 0x00 },
{ 0x7E, 0x01 },
{ 0x9E, 0x00 },
{ 0xBE, 0x0C },
{ 0xDE, 0xF7 },
{ 0xFE, 0x00 },
}
};
// ******************************************************************
// * IDirect3DDevice8_GetBackBuffer2
// ******************************************************************
@ -3013,6 +3036,16 @@ OOVPATable D3D8_1_0_4627[] =
"EmuIDirect3D8_KickOffAndWaitForIdle2"
#endif
},
// IDirect3DDevice8::CopyRects
{
(OOVPA*)&IDirect3DDevice8_CopyRects_1_0_4627,
XTL::EmuIDirect3DDevice8_CopyRects,
#ifdef _DEBUG_TRACE
"EmuIDirect3DDevice8_CopyRects"
#endif
},
// IDirect3DDevice8::GetBackBuffer2
{
(OOVPA*)&IDirect3DDevice8_GetBackBuffer2_1_0_4627,

View File

@ -237,6 +237,72 @@ SOOVPA<7> IDirect3DDevice8_SetPixelShader_1_0_5849 =
}
};
// ******************************************************************
// * IDirect3DDevice8_SetVertexData4f
// ******************************************************************
SOOVPA<17> IDirect3DDevice8_SetVertexData4f_1_0_5849 =
{
0, // Large == 0
7, // Count == 7
-1, // XRef Not Saved
0, // XRef Not Used
{
{ 0x0A, 0x46 },
{ 0x16, 0x08 },
{ 0x22, 0x09 },
{ 0x2E, 0x24 },
{ 0x3A, 0x24 },
{ 0x46, 0x8B },
{ 0x52, 0x14 },
}
};
// ******************************************************************
// * IDirect3DDevice8_SetVertexDataColor
// ******************************************************************
SOOVPA<17> IDirect3DDevice8_SetVertexDataColor_1_0_5849 =
{
0, // Large == 0
7, // Count == 7
-1, // XRef Not Saved
0, // XRef Not Used
{
{ 0x08, 0x06 },
{ 0x14, 0x8B },
{ 0x1C, 0x19 },
{ 0x26, 0xB6 },
{ 0x30, 0x00 },
{ 0x3A, 0xFF },
{ 0x44, 0x08 },
}
};
// ******************************************************************
// * IDirect3DDevice8_End
// ******************************************************************
SOOVPA<17> IDirect3DDevice8_End_1_0_5849 =
{
0, // Large == 0
7, // Count == 7
-1, // XRef Not Saved
0, // XRef Not Used
{
{ 0x07, 0x8B },
{ 0x13, 0xC7 },
{ 0x19, 0xC7 },
{ 0x22, 0x08 },
{ 0x2B, 0xE1 },
{ 0x34, 0x4E },
{ 0x40, 0xC3 },
}
};
// ******************************************************************
// * IDirect3DDevice8_SetRenderState_CullMode
// ******************************************************************
@ -646,9 +712,9 @@ OOVPATable D3D8_1_0_5849[] =
"EmuIDirect3DDevice8_SetVertexData2f"
#endif
},
// IDirect3DDevice8::SetVertexData4f (* unchanged since 4627 *)
// IDirect3DDevice8::SetVertexData4f
{
(OOVPA*)&IDirect3DDevice8_SetVertexData4f_1_0_4627,
(OOVPA*)&IDirect3DDevice8_SetVertexData4f_1_0_5849,
XTL::EmuIDirect3DDevice8_SetVertexData4f,
@ -656,6 +722,26 @@ OOVPATable D3D8_1_0_5849[] =
"EmuIDirect3DDevice8_SetVertexData4f"
#endif
},
// IDirect3DDevice8::SetVertexDataColor
{
(OOVPA*)&IDirect3DDevice8_SetVertexDataColor_1_0_5849,
XTL::EmuIDirect3DDevice8_SetVertexDataColor,
#ifdef _DEBUG_TRACE
"EmuIDirect3DDevice8_SetVertexDataColor"
#endif
},
// IDirect3DDevice8::End
{
(OOVPA*)&IDirect3DDevice8_End_1_0_5849,
XTL::EmuIDirect3DDevice8_End,
#ifdef _DEBUG_TRACE
"EmuIDirect3DDevice8_End"
#endif
},
// IDirect3DDevice8::SetTextureState_TexCoordIndex (* unchanged since 4627 *)
{
(OOVPA*)&IDirect3DDevice8_SetTextureState_TexCoordIndex_1_0_4627,