From 5a77cae2e3434fa5cbb3710f183328e36620fa5f Mon Sep 17 00:00:00 2001 From: Pierre Bourdon Date: Fri, 18 May 2012 23:13:53 +0200 Subject: Check if BP and XF changes actually change values before flushing --- Source/Core/VideoCommon/Src/XFStructs.cpp | 65 +++++++++++++++++++++++-------- 1 file changed, 48 insertions(+), 17 deletions(-) (limited to 'Source/Core/VideoCommon/Src/XFStructs.cpp') diff --git a/Source/Core/VideoCommon/Src/XFStructs.cpp b/Source/Core/VideoCommon/Src/XFStructs.cpp index ec3975cb07..d879c83652 100644 --- a/Source/Core/VideoCommon/Src/XFStructs.cpp +++ b/Source/Core/VideoCommon/Src/XFStructs.cpp @@ -121,12 +121,18 @@ void XFRegWritten(int transferSize, u32 baseAddress, u32 *pData) case XFMEM_SETVIEWPORT+3: case XFMEM_SETVIEWPORT+4: case XFMEM_SETVIEWPORT+5: - VertexManager::Flush(); - VertexShaderManager::SetViewportChanged(); - PixelShaderManager::SetViewportChanged(); + { + u8 size = std::min(transferSize, 6 * 4); + if (memcmp((u32*)&xfregs + (address - 0x1000), pData + dataIndex, size)) + { + VertexManager::Flush(); + VertexShaderManager::SetViewportChanged(); + PixelShaderManager::SetViewportChanged(); + } - nextAddress = XFMEM_SETVIEWPORT + 6; - break; + nextAddress = XFMEM_SETVIEWPORT + 6; + break; + } case XFMEM_SETPROJECTION: case XFMEM_SETPROJECTION+1: @@ -135,11 +141,17 @@ void XFRegWritten(int transferSize, u32 baseAddress, u32 *pData) case XFMEM_SETPROJECTION+4: case XFMEM_SETPROJECTION+5: case XFMEM_SETPROJECTION+6: - VertexManager::Flush(); - VertexShaderManager::SetProjectionChanged(); + { + u8 size = std::min(transferSize, 7 * 4); + if (memcmp((u32*)&xfregs + (address - 0x1000), pData + dataIndex, size)) + { + VertexManager::Flush(); + VertexShaderManager::SetProjectionChanged(); + } - nextAddress = XFMEM_SETPROJECTION + 7; - break; + nextAddress = XFMEM_SETPROJECTION + 7; + break; + } case XFMEM_SETNUMTEXGENS: // GXSetNumTexGens if (xfregs.numTexGen.numTexGens != (newValue & 15)) @@ -154,10 +166,16 @@ void XFRegWritten(int transferSize, u32 baseAddress, u32 *pData) case XFMEM_SETTEXMTXINFO+5: case XFMEM_SETTEXMTXINFO+6: case XFMEM_SETTEXMTXINFO+7: - VertexManager::Flush(); + { + u8 size = std::min(transferSize, 8 * 4); + if (memcmp((u32*)&xfregs + (address - 0x1000), pData + dataIndex, size)) + { + VertexManager::Flush(); + } - nextAddress = XFMEM_SETTEXMTXINFO + 8; - break; + nextAddress = XFMEM_SETTEXMTXINFO + 8; + break; + } case XFMEM_SETPOSMTXINFO: case XFMEM_SETPOSMTXINFO+1: @@ -167,10 +185,16 @@ void XFRegWritten(int transferSize, u32 baseAddress, u32 *pData) case XFMEM_SETPOSMTXINFO+5: case XFMEM_SETPOSMTXINFO+6: case XFMEM_SETPOSMTXINFO+7: - VertexManager::Flush(); + { + u8 size = std::min(transferSize, 8 * 4); + if (memcmp((u32*)&xfregs + (address - 0x1000), pData + dataIndex, size)) + { + VertexManager::Flush(); + } - nextAddress = XFMEM_SETPOSMTXINFO + 8; - break; + nextAddress = XFMEM_SETPOSMTXINFO + 8; + break; + } // -------------- // Unknown Regs @@ -240,8 +264,15 @@ void LoadXFReg(u32 transferSize, u32 baseAddress, u32 *pData) transferSize = 0; } - XFMemWritten(xfMemTransferSize, xfMemBase); - memcpy_gc(&xfmem[xfMemBase], pData, xfMemTransferSize * 4); + for (u32 i = 0; i < xfMemTransferSize; ++i) + { + if (((u32*)&xfmem[xfMemBase])[i] != pData[i]) + { + XFMemWritten(xfMemTransferSize, xfMemBase); + memcpy_gc(&xfmem[xfMemBase], pData, xfMemTransferSize * 4); + break; + } + } pData += xfMemTransferSize; } -- cgit v1.2.3 From b8d4d013f6aa641d823a4a33e1cb09deb06f7f7a Mon Sep 17 00:00:00 2001 From: Pierre Bourdon Date: Fri, 18 May 2012 23:27:02 +0200 Subject: Compute the comparison size properly (transferSize is in u32, not in u8) --- Source/Core/VideoCommon/Src/XFStructs.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'Source/Core/VideoCommon/Src/XFStructs.cpp') diff --git a/Source/Core/VideoCommon/Src/XFStructs.cpp b/Source/Core/VideoCommon/Src/XFStructs.cpp index d879c83652..b75e7188af 100644 --- a/Source/Core/VideoCommon/Src/XFStructs.cpp +++ b/Source/Core/VideoCommon/Src/XFStructs.cpp @@ -122,7 +122,7 @@ void XFRegWritten(int transferSize, u32 baseAddress, u32 *pData) case XFMEM_SETVIEWPORT+4: case XFMEM_SETVIEWPORT+5: { - u8 size = std::min(transferSize, 6 * 4); + u8 size = std::min(transferSize * 4, 6 * 4); if (memcmp((u32*)&xfregs + (address - 0x1000), pData + dataIndex, size)) { VertexManager::Flush(); @@ -142,7 +142,7 @@ void XFRegWritten(int transferSize, u32 baseAddress, u32 *pData) case XFMEM_SETPROJECTION+5: case XFMEM_SETPROJECTION+6: { - u8 size = std::min(transferSize, 7 * 4); + u8 size = std::min(transferSize * 4, 7 * 4); if (memcmp((u32*)&xfregs + (address - 0x1000), pData + dataIndex, size)) { VertexManager::Flush(); @@ -167,7 +167,7 @@ void XFRegWritten(int transferSize, u32 baseAddress, u32 *pData) case XFMEM_SETTEXMTXINFO+6: case XFMEM_SETTEXMTXINFO+7: { - u8 size = std::min(transferSize, 8 * 4); + u8 size = std::min(transferSize * 4, 8 * 4); if (memcmp((u32*)&xfregs + (address - 0x1000), pData + dataIndex, size)) { VertexManager::Flush(); @@ -186,7 +186,7 @@ void XFRegWritten(int transferSize, u32 baseAddress, u32 *pData) case XFMEM_SETPOSMTXINFO+6: case XFMEM_SETPOSMTXINFO+7: { - u8 size = std::min(transferSize, 8 * 4); + u8 size = std::min(transferSize * 4, 8 * 4); if (memcmp((u32*)&xfregs + (address - 0x1000), pData + dataIndex, size)) { VertexManager::Flush(); -- cgit v1.2.3 From 7cccb4baa724188ac4af546e2109e988713893aa Mon Sep 17 00:00:00 2001 From: Pierre Bourdon Date: Sat, 19 May 2012 10:54:40 +0200 Subject: Check if data was modified in LoadIndexedXF too --- Source/Core/VideoCommon/Src/XFStructs.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) (limited to 'Source/Core/VideoCommon/Src/XFStructs.cpp') diff --git a/Source/Core/VideoCommon/Src/XFStructs.cpp b/Source/Core/VideoCommon/Src/XFStructs.cpp index b75e7188af..cd97271526 100644 --- a/Source/Core/VideoCommon/Src/XFStructs.cpp +++ b/Source/Core/VideoCommon/Src/XFStructs.cpp @@ -288,13 +288,15 @@ void LoadXFReg(u32 transferSize, u32 baseAddress, u32 *pData) // TODO - verify that it is correct. Seems to work, though. void LoadIndexedXF(u32 val, int refarray) { - int index = val >> 16; - int address = val & 0xFFF; // check mask - int size = ((val >> 12) & 0xF) + 1; - //load stuff from array to address in xf mem + int index = val >> 16; + int address = val & 0xFFF; // check mask + int size = ((val >> 12) & 0xF) + 1; + //load stuff from array to address in xf mem - XFMemWritten(size, address); - - for (int i = 0; i < size; i++) - xfmem[address + i] = Memory::Read_U32(arraybases[refarray] + arraystrides[refarray] * index + i * 4); + u32* newData = (u32*)Memory::GetPointer(arraybases[refarray] + arraystrides[refarray] * index); + if (memcmp(xfmem + address, newData, size * 4)) + { + XFMemWritten(size, address); + memcpy_gc(xfmem + address, newData, size * 4); + } } -- cgit v1.2.3 From fee2d83f68d92a6f3b7461b06f4dce2dbd6f1c07 Mon Sep 17 00:00:00 2001 From: Pierre Bourdon Date: Sun, 20 May 2012 22:16:21 +0200 Subject: Fix a data endianness problem introduced by r7cccb4baa724. --- Source/Core/VideoCommon/Src/XFStructs.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) (limited to 'Source/Core/VideoCommon/Src/XFStructs.cpp') diff --git a/Source/Core/VideoCommon/Src/XFStructs.cpp b/Source/Core/VideoCommon/Src/XFStructs.cpp index cd97271526..f8330604ad 100644 --- a/Source/Core/VideoCommon/Src/XFStructs.cpp +++ b/Source/Core/VideoCommon/Src/XFStructs.cpp @@ -293,10 +293,21 @@ void LoadIndexedXF(u32 val, int refarray) int size = ((val >> 12) & 0xF) + 1; //load stuff from array to address in xf mem + u32* currData = (u32*)(xfmem + address); u32* newData = (u32*)Memory::GetPointer(arraybases[refarray] + arraystrides[refarray] * index); - if (memcmp(xfmem + address, newData, size * 4)) + bool changed = false; + for (int i = 0; i < size; ++i) { - XFMemWritten(size, address); - memcpy_gc(xfmem + address, newData, size * 4); + if (currData[i] != Common::swap32(newData[i])) + { + changed = true; + XFMemWritten(size, address); + break; + } + } + if (changed) + { + for (int i = 0; i < size; ++i) + currData[i] = Common::swap32(newData[i]); } } -- cgit v1.2.3 From 4f652c40861b80cddba341fc699f9bbb04a79565 Mon Sep 17 00:00:00 2001 From: NeoBrainX Date: Mon, 19 Nov 2012 21:09:31 +0100 Subject: Partially revert "Check if BP and XF changes actually change values before flushing". Dolphin code sucks too much to get optimizations. This reverts commit 5a77cae2e3434fa5cbb3710f183328e36620fa5f. Fixes issue 5459. Fixes issue 5606. --- Source/Core/VideoCommon/Src/XFStructs.cpp | 67 +++++++++---------------------- 1 file changed, 18 insertions(+), 49 deletions(-) (limited to 'Source/Core/VideoCommon/Src/XFStructs.cpp') diff --git a/Source/Core/VideoCommon/Src/XFStructs.cpp b/Source/Core/VideoCommon/Src/XFStructs.cpp index f8330604ad..9f395bfecf 100644 --- a/Source/Core/VideoCommon/Src/XFStructs.cpp +++ b/Source/Core/VideoCommon/Src/XFStructs.cpp @@ -121,18 +121,12 @@ void XFRegWritten(int transferSize, u32 baseAddress, u32 *pData) case XFMEM_SETVIEWPORT+3: case XFMEM_SETVIEWPORT+4: case XFMEM_SETVIEWPORT+5: - { - u8 size = std::min(transferSize * 4, 6 * 4); - if (memcmp((u32*)&xfregs + (address - 0x1000), pData + dataIndex, size)) - { - VertexManager::Flush(); - VertexShaderManager::SetViewportChanged(); - PixelShaderManager::SetViewportChanged(); - } + VertexManager::Flush(); + VertexShaderManager::SetViewportChanged(); + PixelShaderManager::SetViewportChanged(); - nextAddress = XFMEM_SETVIEWPORT + 6; - break; - } + nextAddress = XFMEM_SETVIEWPORT + 6; + break; case XFMEM_SETPROJECTION: case XFMEM_SETPROJECTION+1: @@ -141,21 +135,15 @@ void XFRegWritten(int transferSize, u32 baseAddress, u32 *pData) case XFMEM_SETPROJECTION+4: case XFMEM_SETPROJECTION+5: case XFMEM_SETPROJECTION+6: - { - u8 size = std::min(transferSize * 4, 7 * 4); - if (memcmp((u32*)&xfregs + (address - 0x1000), pData + dataIndex, size)) - { - VertexManager::Flush(); - VertexShaderManager::SetProjectionChanged(); - } + VertexManager::Flush(); + VertexShaderManager::SetProjectionChanged(); - nextAddress = XFMEM_SETPROJECTION + 7; - break; - } + nextAddress = XFMEM_SETPROJECTION + 7; + break; case XFMEM_SETNUMTEXGENS: // GXSetNumTexGens if (xfregs.numTexGen.numTexGens != (newValue & 15)) - VertexManager::Flush(); + VertexManager::Flush(); break; case XFMEM_SETTEXMTXINFO: @@ -166,16 +154,10 @@ void XFRegWritten(int transferSize, u32 baseAddress, u32 *pData) case XFMEM_SETTEXMTXINFO+5: case XFMEM_SETTEXMTXINFO+6: case XFMEM_SETTEXMTXINFO+7: - { - u8 size = std::min(transferSize * 4, 8 * 4); - if (memcmp((u32*)&xfregs + (address - 0x1000), pData + dataIndex, size)) - { - VertexManager::Flush(); - } + VertexManager::Flush(); - nextAddress = XFMEM_SETTEXMTXINFO + 8; - break; - } + nextAddress = XFMEM_SETTEXMTXINFO + 8; + break; case XFMEM_SETPOSMTXINFO: case XFMEM_SETPOSMTXINFO+1: @@ -185,16 +167,10 @@ void XFRegWritten(int transferSize, u32 baseAddress, u32 *pData) case XFMEM_SETPOSMTXINFO+5: case XFMEM_SETPOSMTXINFO+6: case XFMEM_SETPOSMTXINFO+7: - { - u8 size = std::min(transferSize * 4, 8 * 4); - if (memcmp((u32*)&xfregs + (address - 0x1000), pData + dataIndex, size)) - { - VertexManager::Flush(); - } + VertexManager::Flush(); - nextAddress = XFMEM_SETPOSMTXINFO + 8; - break; - } + nextAddress = XFMEM_SETPOSMTXINFO + 8; + break; // -------------- // Unknown Regs @@ -264,15 +240,8 @@ void LoadXFReg(u32 transferSize, u32 baseAddress, u32 *pData) transferSize = 0; } - for (u32 i = 0; i < xfMemTransferSize; ++i) - { - if (((u32*)&xfmem[xfMemBase])[i] != pData[i]) - { - XFMemWritten(xfMemTransferSize, xfMemBase); - memcpy_gc(&xfmem[xfMemBase], pData, xfMemTransferSize * 4); - break; - } - } + XFMemWritten(xfMemTransferSize, xfMemBase); + memcpy_gc(&xfmem[xfMemBase], pData, xfMemTransferSize * 4); pData += xfMemTransferSize; } -- cgit v1.2.3