diff options
| author | Ryan Houdek <Sonicadvance1@gmail.com> | 2013-04-14 20:43:42 -0500 |
|---|---|---|
| committer | Ryan Houdek <Sonicadvance1@gmail.com> | 2013-04-14 20:43:42 -0500 |
| commit | 37b67971e7def8dcd0dae3209afc6c69b52d0609 (patch) | |
| tree | 510eccb41b0653225ec3af6bf02b425c72a195e1 /Source/Plugins/Plugin_VideoSoftware/Src/OpcodeDecoder.cpp | |
| parent | bde7ea00ef9fd625a4e453ee9598fc20382a35a5 (diff) | |
| parent | b91930a2d4742ec001d0b1df1abe938da7527d03 (diff) | |
Merge remote-tracking branch 'origin/master' into Android-trash
Conflicts:
Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.cpp
Diffstat (limited to 'Source/Plugins/Plugin_VideoSoftware/Src/OpcodeDecoder.cpp')
| -rw-r--r-- | Source/Plugins/Plugin_VideoSoftware/Src/OpcodeDecoder.cpp | 408 |
1 files changed, 204 insertions, 204 deletions
diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/OpcodeDecoder.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/OpcodeDecoder.cpp index 4848cb4d43..0fe0ac6192 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/OpcodeDecoder.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/OpcodeDecoder.cpp @@ -12,7 +12,7 @@ // A copy of the GPL 2.0 should have been included with the program. // If not, see http://www.gnu.org/licenses/ -// Official SVN repository and contact information can be found at +// Official Git repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ #include "Common.h" @@ -61,258 +61,258 @@ void DoState(PointerWrap &p) void DecodePrimitiveStream(u32 iBufferSize) { - u32 vertexSize = vertexLoader.GetVertexSize(); + u32 vertexSize = vertexLoader.GetVertexSize(); bool skipPrimitives = g_bSkipCurrentFrame || swstats.thisFrame.numDrawnObjects < g_SWVideoConfig.drawStart || swstats.thisFrame.numDrawnObjects >= g_SWVideoConfig.drawEnd; - if (skipPrimitives) - { - while (streamSize > 0 && iBufferSize >= vertexSize) - { - g_pVideoData += vertexSize; - iBufferSize -= vertexSize; - streamSize--; - } - } - else - { - while (streamSize > 0 && iBufferSize >= vertexSize) - { - vertexLoader.LoadVertex(); - iBufferSize -= vertexSize; - streamSize--; - } - } - - if (streamSize == 0) - { - // return to normal command processing - ResetDecoding(); - } + if (skipPrimitives) + { + while (streamSize > 0 && iBufferSize >= vertexSize) + { + g_pVideoData += vertexSize; + iBufferSize -= vertexSize; + streamSize--; + } + } + else + { + while (streamSize > 0 && iBufferSize >= vertexSize) + { + vertexLoader.LoadVertex(); + iBufferSize -= vertexSize; + streamSize--; + } + } + + if (streamSize == 0) + { + // return to normal command processing + ResetDecoding(); + } } void ReadXFData(u32 iBufferSize) { - _assert_msg_(VIDEO, iBufferSize >= (u32)(streamSize * 4), "Underflow during standard opcode decoding"); + _assert_msg_(VIDEO, iBufferSize >= (u32)(streamSize * 4), "Underflow during standard opcode decoding"); - u32 pData[16]; - for (int i = 0; i < streamSize; i++) - pData[i] = DataReadU32(); - SWLoadXFReg(streamSize, streamAddress, pData); + u32 pData[16]; + for (int i = 0; i < streamSize; i++) + pData[i] = DataReadU32(); + SWLoadXFReg(streamSize, streamAddress, pData); - // return to normal command processing - ResetDecoding(); + // return to normal command processing + ResetDecoding(); } void ExecuteDisplayList(u32 addr, u32 count) { - u8 *videoDataSave = g_pVideoData; + u8 *videoDataSave = g_pVideoData; - u8 *dlStart = Memory::GetPointer(addr); + u8 *dlStart = Memory::GetPointer(addr); - g_pVideoData = dlStart; + g_pVideoData = dlStart; - while (OpcodeDecoder::CommandRunnable(count)) - { - OpcodeDecoder::Run(count); + while (OpcodeDecoder::CommandRunnable(count)) + { + OpcodeDecoder::Run(count); - // if data was read by the opcode decoder then the video data pointer changed - u32 readCount = (u32)(g_pVideoData - dlStart); - dlStart = g_pVideoData; + // if data was read by the opcode decoder then the video data pointer changed + u32 readCount = (u32)(g_pVideoData - dlStart); + dlStart = g_pVideoData; - _assert_msg_(VIDEO, count >= readCount, "Display list underrun"); + _assert_msg_(VIDEO, count >= readCount, "Display list underrun"); - count -= readCount; - } + count -= readCount; + } - g_pVideoData = videoDataSave; + g_pVideoData = videoDataSave; } void DecodeStandard(u32 bufferSize) { - _assert_msg_(VIDEO, CommandRunnable(bufferSize), "Underflow during standard opcode decoding"); + _assert_msg_(VIDEO, CommandRunnable(bufferSize), "Underflow during standard opcode decoding"); - int Cmd = DataReadU8(); + int Cmd = DataReadU8(); - if (Cmd == GX_NOP) - return; - // Causes a SIGBUS error on Android - // XXX: Investigate + if (Cmd == GX_NOP) + return; + // Causes a SIGBUS error on Android + // XXX: Investigate #ifndef ANDROID - // check if switching in or out of an object - // only used for debuggging - if (inObjectStream && (Cmd & 0x87) != lastPrimCmd) - { - inObjectStream = false; - DebugUtil::OnObjectEnd(); - } - if (Cmd & 0x80 && !inObjectStream) - { - inObjectStream = true; - lastPrimCmd = Cmd & 0x87; - DebugUtil::OnObjectBegin(); - } + // check if switching in or out of an object + // only used for debuggging + if (inObjectStream && (Cmd & 0x87) != lastPrimCmd) + { + inObjectStream = false; + DebugUtil::OnObjectEnd(); + } + if (Cmd & 0x80 && !inObjectStream) + { + inObjectStream = true; + lastPrimCmd = Cmd & 0x87; + DebugUtil::OnObjectBegin(); + } #endif - switch(Cmd) - { - case GX_NOP: - break; - - case GX_LOAD_CP_REG: //0x08 - { - u32 SubCmd = DataReadU8(); - u32 Value = DataReadU32(); - SWLoadCPReg(SubCmd, Value); - } - break; - - case GX_LOAD_XF_REG: - { - u32 Cmd2 = DataReadU32(); - streamSize = ((Cmd2 >> 16) & 15) + 1; - streamAddress = Cmd2 & 0xFFFF; - currentFunction = ReadXFData; - minCommandSize = streamSize * 4; - readOpcode = false; - } - break; - - case GX_LOAD_INDX_A: //used for position matrices - SWLoadIndexedXF(DataReadU32(), 0xC); - break; - case GX_LOAD_INDX_B: //used for normal matrices - SWLoadIndexedXF(DataReadU32(), 0xD); - break; - case GX_LOAD_INDX_C: //used for postmatrices - SWLoadIndexedXF(DataReadU32(), 0xE); - break; - case GX_LOAD_INDX_D: //used for lights - SWLoadIndexedXF(DataReadU32(), 0xF); - break; - - case GX_CMD_CALL_DL: - { - u32 dwAddr = DataReadU32(); - u32 dwCount = DataReadU32(); - ExecuteDisplayList(dwAddr, dwCount); - } - break; - - case 0x44: - // zelda 4 swords calls it and checks the metrics registers after that - break; - - case GX_CMD_INVL_VC:// Invalidate (vertex cache?) - DEBUG_LOG(VIDEO, "Invalidate (vertex cache?)"); - break; - - case GX_LOAD_BP_REG: //0x61 - { + switch(Cmd) + { + case GX_NOP: + break; + + case GX_LOAD_CP_REG: //0x08 + { + u32 SubCmd = DataReadU8(); + u32 Value = DataReadU32(); + SWLoadCPReg(SubCmd, Value); + } + break; + + case GX_LOAD_XF_REG: + { + u32 Cmd2 = DataReadU32(); + streamSize = ((Cmd2 >> 16) & 15) + 1; + streamAddress = Cmd2 & 0xFFFF; + currentFunction = ReadXFData; + minCommandSize = streamSize * 4; + readOpcode = false; + } + break; + + case GX_LOAD_INDX_A: //used for position matrices + SWLoadIndexedXF(DataReadU32(), 0xC); + break; + case GX_LOAD_INDX_B: //used for normal matrices + SWLoadIndexedXF(DataReadU32(), 0xD); + break; + case GX_LOAD_INDX_C: //used for postmatrices + SWLoadIndexedXF(DataReadU32(), 0xE); + break; + case GX_LOAD_INDX_D: //used for lights + SWLoadIndexedXF(DataReadU32(), 0xF); + break; + + case GX_CMD_CALL_DL: + { + u32 dwAddr = DataReadU32(); + u32 dwCount = DataReadU32(); + ExecuteDisplayList(dwAddr, dwCount); + } + break; + + case 0x44: + // zelda 4 swords calls it and checks the metrics registers after that + break; + + case GX_CMD_INVL_VC:// Invalidate (vertex cache?) + DEBUG_LOG(VIDEO, "Invalidate (vertex cache?)"); + break; + + case GX_LOAD_BP_REG: //0x61 + { u32 cmd = DataReadU32(); - SWLoadBPReg(cmd); - } - break; - - // draw primitives - default: - if (Cmd & 0x80) - { + SWLoadBPReg(cmd); + } + break; + + // draw primitives + default: + if (Cmd & 0x80) + { u8 vatIndex = Cmd & GX_VAT_MASK; - u8 primitiveType = (Cmd & GX_PRIMITIVE_MASK) >> GX_PRIMITIVE_SHIFT; - vertexLoader.SetFormat(vatIndex, primitiveType); - - // switch to primitive processing - streamSize = DataReadU16(); - currentFunction = DecodePrimitiveStream; - minCommandSize = vertexLoader.GetVertexSize(); - readOpcode = false; - - INCSTAT(swstats.thisFrame.numPrimatives); - DEBUG_LOG(VIDEO, "Draw begin"); - } - else - { - PanicAlert("GFX: Unknown Opcode (0x%x).\n", Cmd); - break; - } - break; - } + u8 primitiveType = (Cmd & GX_PRIMITIVE_MASK) >> GX_PRIMITIVE_SHIFT; + vertexLoader.SetFormat(vatIndex, primitiveType); + + // switch to primitive processing + streamSize = DataReadU16(); + currentFunction = DecodePrimitiveStream; + minCommandSize = vertexLoader.GetVertexSize(); + readOpcode = false; + + INCSTAT(swstats.thisFrame.numPrimatives); + DEBUG_LOG(VIDEO, "Draw begin"); + } + else + { + PanicAlert("GFX: Unknown Opcode (0x%x).\n", Cmd); + break; + } + break; + } } void Init() { - inObjectStream = false; - lastPrimCmd = 0; - ResetDecoding(); + inObjectStream = false; + lastPrimCmd = 0; + ResetDecoding(); } void ResetDecoding() { - currentFunction = DecodeStandard; - minCommandSize = 1; - readOpcode = true; + currentFunction = DecodeStandard; + minCommandSize = 1; + readOpcode = true; } bool CommandRunnable(u32 iBufferSize) { - if (iBufferSize < minCommandSize) - return false; - - if (readOpcode) - { - u8 Cmd = DataPeek8(0); - u32 minSize = 1; - - switch(Cmd) - { - case GX_LOAD_CP_REG: //0x08 - minSize = 6; - break; - - case GX_LOAD_XF_REG: - minSize = 5; - break; - - case GX_LOAD_INDX_A: //used for position matrices - minSize = 5; - break; - case GX_LOAD_INDX_B: //used for normal matrices - minSize = 5; - break; - case GX_LOAD_INDX_C: //used for postmatrices - minSize = 5; - break; - case GX_LOAD_INDX_D: //used for lights - minSize = 5; - break; - - case GX_CMD_CALL_DL: - minSize = 9; - break; - - case GX_LOAD_BP_REG: //0x61 - minSize = 5; - break; - - // draw primitives - default: - if (Cmd & 0x80) - minSize = 3; - break; - } - - return (iBufferSize >= minSize); - } - - return true; + if (iBufferSize < minCommandSize) + return false; + + if (readOpcode) + { + u8 Cmd = DataPeek8(0); + u32 minSize = 1; + + switch(Cmd) + { + case GX_LOAD_CP_REG: //0x08 + minSize = 6; + break; + + case GX_LOAD_XF_REG: + minSize = 5; + break; + + case GX_LOAD_INDX_A: //used for position matrices + minSize = 5; + break; + case GX_LOAD_INDX_B: //used for normal matrices + minSize = 5; + break; + case GX_LOAD_INDX_C: //used for postmatrices + minSize = 5; + break; + case GX_LOAD_INDX_D: //used for lights + minSize = 5; + break; + + case GX_CMD_CALL_DL: + minSize = 9; + break; + + case GX_LOAD_BP_REG: //0x61 + minSize = 5; + break; + + // draw primitives + default: + if (Cmd & 0x80) + minSize = 3; + break; + } + + return (iBufferSize >= minSize); + } + + return true; } void Run(u32 iBufferSize) { - currentFunction(iBufferSize); + currentFunction(iBufferSize); } } |
