From d4c0d5870916d1022c47b8253493b7c152959a40 Mon Sep 17 00:00:00 2001 From: Aaron Robinson Date: Wed, 28 Jan 2004 01:53:12 +0000 Subject: [PATCH] pushbufferz --- Cxbx.opt | Bin 67072 -> 67072 bytes Source/Win32/CxbxKrnl/EmuD3D8PushBuffer.cpp | 171 ++++++++++++-------- 2 files changed, 101 insertions(+), 70 deletions(-) diff --git a/Cxbx.opt b/Cxbx.opt index 1f7cd7138ebc324d2fa48720d4f372b3ff3c015a..0787cb3ddde28474f07e2904ef2f047ba31605bd 100644 GIT binary patch literal 67072 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 diff --git a/Source/Win32/CxbxKrnl/EmuD3D8PushBuffer.cpp b/Source/Win32/CxbxKrnl/EmuD3D8PushBuffer.cpp index e392393c8..99ed8b786 100644 --- a/Source/Win32/CxbxKrnl/EmuD3D8PushBuffer.cpp +++ b/Source/Win32/CxbxKrnl/EmuD3D8PushBuffer.cpp @@ -66,92 +66,123 @@ void XTL::EmuExecutePushBuffer D3DPRIMITIVETYPE PCPrimitiveType = (D3DPRIMITIVETYPE)-1; X_D3DPRIMITIVETYPE XBPrimitiveType = -1; + // TODO: keep track of which # crashes + //_asm int 3 while((DWORD)pdwPushData < ((DWORD)pPushBuffer->Data + pPushBuffer->Size)) { - // NVPB_DrawVertices - if(*pdwPushData++ == 0x000417FC) + // Interpret GPU Instruction + switch(*pdwPushData++) { - // Render Indexed Vertices - if(*pdwPushData == 0) + // NVPB_Unknown + default: { - pdwPushData++; - - if( (*pdwPushData & 0x40000100) == 0x40000100) - { - DWORD dwSkipBytes = (*pdwPushData & 0x0FFF0000) >> 16; - - // advance to argument - pdwPushData++; - - // argument doesnt matter - pdwPushData++; - - // skip over given data - pdwPushData += dwSkipBytes/4; - } - - LPDIRECT3DINDEXBUFFER8 pIndexBuffer=0; - - HRESULT hRet = g_pD3DDevice8->CreateIndexBuffer(dwBytes, 0, D3DFMT_INDEX16, D3DPOOL_MANAGED, &pIndexBuffer); - - if(FAILED(hRet)) - EmuCleanup("Unable to create index buffer for PushBuffer emulation\n"); - - // copy index data - { - WORD *pData=0; - - pIndexBuffer->Lock(0, dwBytes, (UCHAR**)&pData, NULL); - - memcpy(pData, pIndexData, dwBytes); - - pIndexBuffer->Unlock(); - } - - // render indexed vertices - { - g_pD3DDevice8->SetIndices(pIndexBuffer, 0); - - g_pD3DDevice8->DrawIndexedPrimitive - ( - PCPrimitiveType, 0, dwIndices, 0, EmuD3DVertex2PrimitiveCount(XBPrimitiveType, dwIndices) - ); - } - - // cleanup - pIndexBuffer->Release(); +// return; + EmuCleanup("GPU Instruction Mask 0x%.08X Unhandled", *(pdwPushData-1)); } - // Set Indexed Vertices - else + break; + + // NVPB_Unknown + case 0x00041808: { - XBPrimitiveType = *pdwPushData++; - PCPrimitiveType = EmuPrimitiveType(XBPrimitiveType); + //_asm int 3 + WORD wUnknown = (WORD)*pdwPushData++; - // Parse Index Data - if( (*pdwPushData & 0x40001800) == 0x40001800) + // !? + +// EmuCleanup("GPU Instruction Mask 0x00041808 Unhandled (D3DDevice_DrawIndexedVertices)"); + } + break; + + // NVPB_DrawVertices + case 0x000417FC: + { + // Render Indexed Vertices + if(*pdwPushData == 0) { - dwBytes = ((*pdwPushData & 0x0FFF0000) >> 16) - 4; - - if(PCPrimitiveType == D3DPT_TRIANGLESTRIP) - dwIndices = dwBytes/2; - - // advance to argument pdwPushData++; - // argument doesnt matter - pdwPushData++; + // Null instruction + if( (*pdwPushData) == 0x00000000) + { + pdwPushData++; + } + else + // Skip Bytes + if( (*pdwPushData & 0x40000100) == 0x40000100) + { + DWORD dwSkipBytes = (*pdwPushData & 0x0FFF0000) >> 16; - // assign index data buffer - pIndexData = (PVOID)pdwPushData; + // advance to argument + pdwPushData++; + + // argument doesnt matter + pdwPushData++; + + // skip over given data + pdwPushData += dwSkipBytes/4; + } + + LPDIRECT3DINDEXBUFFER8 pIndexBuffer=0; + + HRESULT hRet = g_pD3DDevice8->CreateIndexBuffer(dwBytes, 0, D3DFMT_INDEX16, D3DPOOL_MANAGED, &pIndexBuffer); + + if(FAILED(hRet)) + EmuCleanup("Unable to create index buffer for PushBuffer emulation\n"); + + // copy index data + { + WORD *pData=0; + + pIndexBuffer->Lock(0, dwBytes, (UCHAR**)&pData, NULL); + + memcpy(pData, pIndexData, dwBytes); + + pIndexBuffer->Unlock(); + } + + // render indexed vertices + { + g_pD3DDevice8->SetIndices(pIndexBuffer, 0); + + g_pD3DDevice8->DrawIndexedPrimitive + ( + PCPrimitiveType, 0, dwIndices, 0, EmuD3DVertex2PrimitiveCount(XBPrimitiveType, dwIndices) + ); + } + + // cleanup + pIndexBuffer->Release(); } + // Set Indexed Vertices else { - EmuCleanup("Error in PushBuffer interpretter"); - } + XBPrimitiveType = *pdwPushData++; + PCPrimitiveType = EmuPrimitiveType(XBPrimitiveType); - // advance past index data - pdwPushData += dwBytes/4; + // Parse Index Data + if( (*pdwPushData & 0x40001800) == 0x40001800) + { + dwBytes = ((*pdwPushData & 0x0FFF0000) >> 16); + + if(PCPrimitiveType == D3DPT_TRIANGLESTRIP) + dwIndices = dwBytes/2; + + // argument doesnt matter + pdwPushData++; + + // assign index data buffer + pIndexData = (PVOID)pdwPushData; + + // advance past index data + pdwPushData += dwBytes/4; + } + else + { + EmuCleanup("Error in PushBuffer interpretter"); + } + } } + break; } } } \ No newline at end of file