From 0495630eb10829d4426b2f2d12ac44873bac8c95 Mon Sep 17 00:00:00 2001 From: Aaron Robinson Date: Thu, 15 Apr 2004 05:49:12 +0000 Subject: [PATCH] vertex buffer glitch fixes --- Cxbx.opt | Bin 61952 -> 64000 bytes Source/Win32/CxbxKrnl/EmuD3D8.cpp | 25 +- Source/Win32/CxbxKrnl/EmuD3D8/PushBuffer.cpp | 315 +++++++++++++++++-- Source/Win32/CxbxKrnl/ResourceTracker.cpp | 2 +- 4 files changed, 297 insertions(+), 45 deletions(-) diff --git a/Cxbx.opt b/Cxbx.opt index 93b51b99a5be4a51d1ae5f373a56d45dc3598672..787b0ad0a5cc86dc55204bd2e36a51470d7ef281 100644 GIT binary patch literal 64000 zcmeHQ3ve6PbzOiU34X+n_!TM1TRXBO%VH>zwkg?`MG}-qi=-%0AKF%9FMuZy;&K;R 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 literal 61952 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 + PVOID pIndexData = 0; + + // cache of last 4 indices + WORD pIBMem[4] = {0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}; D3DPRIMITIVETYPE PCPrimitiveType = (D3DPRIMITIVETYPE)-1; X_D3DPRIMITIVETYPE XBPrimitiveType = X_D3DPT_INVALID; @@ -65,10 +71,6 @@ void XTL::EmuExecutePushBuffer // TODO: This technically should be enabled XTL::EmuUpdateDeferredStates(); -// g_pD3DDevice8->Clear(0, NULL, D3DCLEAR_ZBUFFER, 0, 1.0, NULL); -// g_pD3DDevice8->SetRenderState(D3DRS_ZENABLE, FALSE); -// g_pD3DDevice8->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); - #ifdef _DEBUG_TRACK_PB bool bShowPB = false; @@ -87,7 +89,8 @@ void XTL::EmuExecutePushBuffer } #endif - // NOTE: I believe 0x1808 is actually a seperate command, but I need to verify this. + static LPDIRECT3DINDEXBUFFER8 pIndexBuffer=0; + static uint maxIBSize = 0; while(true) { @@ -129,29 +132,135 @@ void XTL::EmuExecutePushBuffer PCPrimitiveType = EmuPrimitiveType(XBPrimitiveType); } } - else // NVPB_InlineArray + else if(dwMethod == 0x1808) // NVPB_FixLoop { - PVOID pIndexData = 0; - BOOL bInc = *pdwPushData & 0x40000000; - - BOOL bFix = (dwMethod != 0x00001818); - - if(bFix) + #ifdef _DEBUG_TRACK_PB + if(bShowPB) { - if(bInc) - dwCount = ((*pdwPushData - (0x40000000 | 0x00001818)) >> 18); + printf(" NVPB_FixLoop(%d)\n", dwCount); + printf("\n"); + printf(" Index Array Data...\n"); - dwMethod = 0x1818; + WORD *pwVal = (WORD*)(pdwPushData + 1); + + for(uint s=0;s maxIBSize) + { + if(pIndexBuffer != 0) + { + pIndexBuffer->Release(); + } + + hRet = g_pD3DDevice8->CreateIndexBuffer(dwCount*2 + 2*2, 0, D3DFMT_INDEX16, D3DPOOL_MANAGED, &pIndexBuffer); + + maxIBSize = dwCount*2 + 2*2; + } + else + { + hRet = D3D_OK; + } + + if(FAILED(hRet)) + EmuCleanup("Unable to create index buffer for PushBuffer emulation (0x1808, dwCount : %d)", dwCount); + + // copy index data + { + WORD *pData=0; + + pIndexBuffer->Lock(0, dwCount*2 + 2*2, (UCHAR**)&pData, NULL); + + memcpy(pData, pIBMem, dwCount*2 + 2*2); + + pIndexBuffer->Unlock(); + } + + // render indexed vertices + { + UINT PrimitiveCount = EmuD3DVertex2PrimitiveCount(XBPrimitiveType, dwCount + 2); + VertexPatchDesc VPDesc; + + VPDesc.dwVertexCount = dwCount; + VPDesc.PrimitiveType = XBPrimitiveType; + VPDesc.dwPrimitiveCount = PrimitiveCount; + VPDesc.dwOffset = 0; + VPDesc.pVertexStreamZeroData = 0; + VPDesc.uiVertexStreamZeroStride = 0; + // TODO: Set the current shader and let the patcher handle it.. + VPDesc.hVertexShader = g_CurrentVertexShader; + + VertexPatcher VertPatch; + + bool bPatched = VertPatch.Apply(&VPDesc); + + g_pD3DDevice8->SetIndices(pIndexBuffer, 0); + + #ifdef _DEBUG_TRACK_PB + if(!g_PBTrackDisable.exists((PVOID)pPushBuffer->Data)) + { + #endif + + if(!g_bPBSkipPusher) + { + if(IsValidCurrentShader()) + { + g_pD3DDevice8->DrawIndexedPrimitive + ( + PCPrimitiveType, 0, 8*1024*1024, 0, PrimitiveCount +// PCPrimitiveType, 0, dwCount*2, 0, PrimitiveCount + ); + } + } + + #ifdef _DEBUG_TRACK_PB + } + #endif + + VertPatch.Restore(); + + g_pD3DDevice8->SetIndices(0, 0); + } + } + + pdwPushData += dwCount; + } + else if(dwMethod == 0x1800) // NVPB_InlineArray + { + BOOL bInc = *pdwPushData & 0x40000000; + + if(bInc) + { + dwCount = ((*pdwPushData - (0x40000000 | 0x00001818)) >> 18)*2 + 2; + } + + pIndexData = ++pdwPushData; #ifdef _DEBUG_TRACK_PB if(bShowPB) { - printf(" NVPB_InlineArray(0x%.08X)...\n", pIndexData); + printf(" NVPB_InlineArray(0x%.08X, %d)...\n", pIndexData, dwCount); printf("\n"); printf(" Index Array Data...\n"); @@ -198,29 +307,28 @@ void XTL::EmuExecutePushBuffer // release ptr pActiveVB->Unlock(); + + DbgDumpMesh(pIndexData, dwCount); } #endif - - pdwPushData += dwCount - (bInc ? 0 : 1); - + + pdwPushData += (dwCount/2) - (bInc ? 0 : 2); + // perform rendering { - static LPDIRECT3DINDEXBUFFER8 pIndexBuffer=0; - static uint maxSize = 0; - HRESULT hRet; - // TODO: depreciate maxSize after N milliseconds..then N milliseconds later drop down to new highest - if(dwCount*4 > maxSize) + // TODO: depreciate maxIBSize after N milliseconds..then N milliseconds later drop down to new highest + if(dwCount*2 > maxIBSize) { if(pIndexBuffer != 0) { pIndexBuffer->Release(); } - hRet = g_pD3DDevice8->CreateIndexBuffer(dwCount*4, 0, D3DFMT_INDEX16, D3DPOOL_MANAGED, &pIndexBuffer); + hRet = g_pD3DDevice8->CreateIndexBuffer(dwCount*2, 0, D3DFMT_INDEX16, D3DPOOL_MANAGED, &pIndexBuffer); - maxSize = dwCount*4; + maxIBSize = dwCount*2; } else { @@ -234,19 +342,30 @@ void XTL::EmuExecutePushBuffer { WORD *pData=0; - pIndexBuffer->Lock(0, dwCount*4, (UCHAR**)&pData, NULL); + pIndexBuffer->Lock(0, dwCount*2, (UCHAR**)&pData, NULL); - memcpy(pData, pIndexData, dwCount*4); + memcpy(pData, pIndexData, dwCount*2); + + // remember last 2 indices + if(dwCount >= 2) + { + pIBMem[0] = pData[dwCount - 2]; + pIBMem[1] = pData[dwCount - 1]; + } + else + { + pIBMem[0] = 0xFFFF; + } pIndexBuffer->Unlock(); } // render indexed vertices { - UINT PrimitiveCount = EmuD3DVertex2PrimitiveCount(XBPrimitiveType, dwCount * 2); + UINT PrimitiveCount = EmuD3DVertex2PrimitiveCount(XBPrimitiveType, dwCount); VertexPatchDesc VPDesc; - VPDesc.dwVertexCount = dwCount * 2; + VPDesc.dwVertexCount = dwCount; VPDesc.PrimitiveType = XBPrimitiveType; VPDesc.dwPrimitiveCount = PrimitiveCount; VPDesc.dwOffset = 0; @@ -309,6 +428,12 @@ void XTL::EmuExecutePushBuffer g_pD3DDevice8->SetIndices(0, 0); } } + + pdwPushData--; + } + else + { + EmuCleanup("Unknown PushBuffer Operation (0x%.04X, %d)", dwMethod, dwCount); } pdwPushData++; @@ -329,3 +454,129 @@ void XTL::EmuExecutePushBuffer Sleep(500); } } + +#ifdef _DEBUG_TRACK_PB +void DbgDumpMesh(WORD *pIndexData, DWORD dwCount) +{ + if(!XTL::IsValidCurrentShader() || (dwCount == 0)) + return; + + XTL::IDirect3DVertexBuffer8 *pActiveVB = NULL; + + XTL::D3DVERTEXBUFFER_DESC VBDesc; + + BYTE *pVBData = 0; + UINT uiStride; + + // retrieve stream data + g_pD3DDevice8->GetStreamSource(0, &pActiveVB, &uiStride); + + char szFileName[128]; + sprintf(szFileName, "C:\\TurokMesh-0x%.08X.x", pIndexData); + FILE *dbgVertices = fopen(szFileName, "wt"); + + // retrieve stream desc + pActiveVB->GetDesc(&VBDesc); + + // unlock just in case + pActiveVB->Unlock(); + + // grab ptr + pActiveVB->Lock(0, 0, &pVBData, D3DLOCK_READONLY); + + // print out stream data + { + uint32 maxIndex = 0; + + WORD *pwChk = (WORD*)pIndexData; + + for(uint chk=0;chk maxIndex) + maxIndex = x; + } + + if(maxIndex > ((VBDesc.Size/uiStride) - 1)) + maxIndex = (VBDesc.Size / uiStride) - 1; + + fprintf(dbgVertices, "xof 0303txt 0032\n"); + fprintf(dbgVertices, "\n"); + fprintf(dbgVertices, "//\n"); + fprintf(dbgVertices, "// Vertex Stream Data (0x%.08X)...\n", pActiveVB); + fprintf(dbgVertices, "//\n"); + fprintf(dbgVertices, "// Format : %d\n", VBDesc.Format); + fprintf(dbgVertices, "// Size : %d bytes\n", VBDesc.Size); + fprintf(dbgVertices, "// FVF : 0x%.08X\n", VBDesc.FVF); + fprintf(dbgVertices, "// iCount : %d\n", dwCount/2); + fprintf(dbgVertices, "//\n"); + fprintf(dbgVertices, "\n"); + fprintf(dbgVertices, "Frame SCENE_ROOT {\n"); + fprintf(dbgVertices, "\n"); + fprintf(dbgVertices, " FrameTransformMatrix {\n"); + fprintf(dbgVertices, " 1.000000,0.000000,0.000000,0.000000,\n"); + fprintf(dbgVertices, " 0.000000,1.000000,0.000000,0.000000,\n"); + fprintf(dbgVertices, " 0.000000,0.000000,1.000000,0.000000,\n"); + fprintf(dbgVertices, " 0.000000,0.000000,0.000000,1.000000;;\n"); + fprintf(dbgVertices, " }\n"); + fprintf(dbgVertices, "\n"); + fprintf(dbgVertices, " Frame Turok1 {\n"); + fprintf(dbgVertices, "\n"); + fprintf(dbgVertices, " FrameTransformMatrix {\n"); + fprintf(dbgVertices, " 1.000000,0.000000,0.000000,0.000000,\n"); + fprintf(dbgVertices, " 0.000000,1.000000,0.000000,0.000000,\n"); + fprintf(dbgVertices, " 0.000000,0.000000,1.000000,0.000000,\n"); + fprintf(dbgVertices, " 0.000000,0.000000,0.000000,1.000000;;\n"); + fprintf(dbgVertices, " }\n"); + fprintf(dbgVertices, "\n"); + fprintf(dbgVertices, " Mesh {\n"); + fprintf(dbgVertices, " %d;\n", maxIndex+1); + + uint max = maxIndex+1; + for(uint v=0;vUnlock(); +} +#endif diff --git a/Source/Win32/CxbxKrnl/ResourceTracker.cpp b/Source/Win32/CxbxKrnl/ResourceTracker.cpp index 230cf8c85..a18c64de5 100644 --- a/Source/Win32/CxbxKrnl/ResourceTracker.cpp +++ b/Source/Win32/CxbxKrnl/ResourceTracker.cpp @@ -226,4 +226,4 @@ uint32 ResourceTracker::get_count(void) this->Unlock(); return uiCount; -} \ No newline at end of file +}