diff --git a/Cxbx.opt b/Cxbx.opt index f8047411a..f8585a622 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 9834353ff..565b676de 100644 --- a/Include/Win32/CxbxKrnl/EmuD3D8/VertexBuffer.h +++ b/Include/Win32/CxbxKrnl/EmuD3D8/VertexBuffer.h @@ -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 diff --git a/Source/Win32/CxbxKrnl/EmuD3D8.cpp b/Source/Win32/CxbxKrnl/EmuD3D8.cpp index 7f7ca7fa5..5000f545c 100644 --- a/Source/Win32/CxbxKrnl/EmuD3D8.cpp +++ b/Source/Win32/CxbxKrnl/EmuD3D8.cpp @@ -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 // ****************************************************************** diff --git a/Source/Win32/CxbxKrnl/EmuD3D8/PushBuffer.cpp b/Source/Win32/CxbxKrnl/EmuD3D8/PushBuffer.cpp index c115c48ba..3e4ad33e3 100644 --- a/Source/Win32/CxbxKrnl/EmuD3D8/PushBuffer.cpp +++ b/Source/Win32/CxbxKrnl/EmuD3D8/PushBuffer.cpp @@ -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 diff --git a/Source/Win32/CxbxKrnl/EmuD3D8/VertexBuffer.cpp b/Source/Win32/CxbxKrnl/EmuD3D8/VertexBuffer.cpp index 54776e016..38722c23f 100644 --- a/Source/Win32/CxbxKrnl/EmuD3D8/VertexBuffer.cpp +++ b/Source/Win32/CxbxKrnl/EmuD3D8/VertexBuffer.cpp @@ -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; } diff --git a/Source/Win32/CxbxKrnl/EmuXapi.cpp b/Source/Win32/CxbxKrnl/EmuXapi.cpp index 13264735a..85bf25d98 100644 --- a/Source/Win32/CxbxKrnl/EmuXapi.cpp +++ b/Source/Win32/CxbxKrnl/EmuXapi.cpp @@ -726,6 +726,9 @@ BOOL WINAPI XTL::EmuSetThreadPriority if(bRet == FALSE) EmuWarning("SetThreadPriority Failed!"); + // HACK! + Sleep(10); + EmuSwapFS(); // XBox FS return bRet; diff --git a/Source/Win32/CxbxKrnl/HLEDataBase/D3D8.1.0.4627.inl b/Source/Win32/CxbxKrnl/HLEDataBase/D3D8.1.0.4627.inl index 4de0ceafa..ea2b38a5b 100644 --- a/Source/Win32/CxbxKrnl/HLEDataBase/D3D8.1.0.4627.inl +++ b/Source/Win32/CxbxKrnl/HLEDataBase/D3D8.1.0.4627.inl @@ -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, diff --git a/Source/Win32/CxbxKrnl/HLEDataBase/D3D8.1.0.5849.inl b/Source/Win32/CxbxKrnl/HLEDataBase/D3D8.1.0.5849.inl index 059570b63..cbdb75920 100644 --- a/Source/Win32/CxbxKrnl/HLEDataBase/D3D8.1.0.5849.inl +++ b/Source/Win32/CxbxKrnl/HLEDataBase/D3D8.1.0.5849.inl @@ -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,