diff options
| author | Jules Blok <jules.blok@gmail.com> | 2015-06-10 00:00:12 +0200 |
|---|---|---|
| committer | Jules Blok <jules.blok@gmail.com> | 2015-06-10 00:00:12 +0200 |
| commit | 7dfced21a2e5aac7195e0e1ad76468e30306766b (patch) | |
| tree | bd671b639d3d911460b767caabad8fc8a759a6bf /Source/Core/VideoBackends/Software/SetupUnit.cpp | |
| parent | c25be031fc1031d795157d8344b87b7841145197 (diff) | |
| parent | 7b0a65e295c784f9d573f2ef52d4e2a7b9bb2889 (diff) | |
Merge branch 'master' into stable
Diffstat (limited to 'Source/Core/VideoBackends/Software/SetupUnit.cpp')
| -rw-r--r-- | Source/Core/VideoBackends/Software/SetupUnit.cpp | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/Source/Core/VideoBackends/Software/SetupUnit.cpp b/Source/Core/VideoBackends/Software/SetupUnit.cpp new file mode 100644 index 0000000000..e8604d78ee --- /dev/null +++ b/Source/Core/VideoBackends/Software/SetupUnit.cpp @@ -0,0 +1,180 @@ +// Copyright 2009 Dolphin Emulator Project +// Licensed under GPLv2+ +// Refer to the license.txt file included. + +#include "Common/ChunkFile.h" +#include "VideoBackends/Software/Clipper.h" +#include "VideoBackends/Software/CPMemLoader.h" +#include "VideoBackends/Software/OpcodeDecoder.h" +#include "VideoBackends/Software/SetupUnit.h" +#include "VideoBackends/Software/SWStatistics.h" + + +void SetupUnit::Init(u8 primitiveType) +{ + m_PrimType = primitiveType; + + m_VertexCounter = 0; + m_VertPointer[0] = &m_Vertices[0]; + m_VertPointer[1] = &m_Vertices[1]; + m_VertPointer[2] = &m_Vertices[2]; + m_VertWritePointer = m_VertPointer[0]; +} + +void SetupUnit::SetupVertex() +{ + switch (m_PrimType) + { + case GX_DRAW_QUADS: + SetupQuad(); + break; + case GX_DRAW_QUADS_2: + WARN_LOG(VIDEO, "Non-standard primitive drawing command GL_DRAW_QUADS_2"); + SetupQuad(); + break; + case GX_DRAW_TRIANGLES: + SetupTriangle(); + break; + case GX_DRAW_TRIANGLE_STRIP: + SetupTriStrip(); + break; + case GX_DRAW_TRIANGLE_FAN: + SetupTriFan(); + break; + case GX_DRAW_LINES: + SetupLine(); + break; + case GX_DRAW_LINE_STRIP: + SetupLineStrip(); + break; + case GX_DRAW_POINTS: + SetupPoint(); + break; + } +} + + +void SetupUnit::SetupQuad() +{ + if (m_VertexCounter < 2) + { + m_VertexCounter++; + m_VertWritePointer = m_VertPointer[m_VertexCounter]; + return; + } + + Clipper::ProcessTriangle(m_VertPointer[0], m_VertPointer[1], m_VertPointer[2]); + + m_VertexCounter++; + m_VertexCounter &= 3; + m_VertWritePointer = &m_Vertices[m_VertexCounter & 1]; + OutputVertexData* temp = m_VertPointer[1]; + m_VertPointer[1] = m_VertPointer[2]; + m_VertPointer[2] = temp; +} + +void SetupUnit::SetupTriangle() +{ + if (m_VertexCounter < 2) + { + m_VertexCounter++; + m_VertWritePointer = m_VertPointer[m_VertexCounter]; + return; + } + + Clipper::ProcessTriangle(m_VertPointer[0], m_VertPointer[1], m_VertPointer[2]); + + m_VertexCounter = 0; + m_VertWritePointer = m_VertPointer[0]; +} + +void SetupUnit::SetupTriStrip() +{ + if (m_VertexCounter < 2) + { + m_VertexCounter++; + m_VertWritePointer = m_VertPointer[m_VertexCounter]; + return; + } + + Clipper::ProcessTriangle(m_VertPointer[0], m_VertPointer[1], m_VertPointer[2]); + + m_VertexCounter++; + m_VertPointer[2 - (m_VertexCounter & 1)] = m_VertPointer[0]; + m_VertWritePointer = m_VertPointer[0]; + + m_VertPointer[0] = &m_Vertices[(m_VertexCounter + 1) % 3]; +} + +void SetupUnit::SetupTriFan() +{ + if (m_VertexCounter < 2) + { + m_VertexCounter++; + m_VertWritePointer = m_VertPointer[m_VertexCounter]; + return; + } + + Clipper::ProcessTriangle(m_VertPointer[0], m_VertPointer[1], m_VertPointer[2]); + + m_VertexCounter++; + m_VertPointer[1] = m_VertPointer[2]; + m_VertPointer[2] = &m_Vertices[2 - (m_VertexCounter & 1)]; + + m_VertWritePointer = m_VertPointer[2]; +} + +void SetupUnit::SetupLine() +{ + if (m_VertexCounter < 1) + { + m_VertexCounter++; + m_VertWritePointer = m_VertPointer[m_VertexCounter]; + return; + } + + Clipper::ProcessLine(m_VertPointer[0], m_VertPointer[1]); + + m_VertexCounter = 0; + m_VertWritePointer = m_VertPointer[0]; +} + +void SetupUnit::SetupLineStrip() +{ + if (m_VertexCounter < 1) + { + m_VertexCounter++; + m_VertWritePointer = m_VertPointer[m_VertexCounter]; + return; + } + + m_VertexCounter++; + + Clipper::ProcessLine(m_VertPointer[0], m_VertPointer[1]); + + m_VertWritePointer = m_VertPointer[0]; + + m_VertPointer[0] = m_VertPointer[1]; + m_VertPointer[1] = &m_Vertices[m_VertexCounter & 1]; +} + +void SetupUnit::SetupPoint() +{} + +void SetupUnit::DoState(PointerWrap &p) +{ + // TODO: some or all of this is making the save states stop working once Dolphin is closed...sometimes (usually) + // I have no idea what specifically is wrong, or if this is even important. Disabling it doesn't seem to make any noticible difference... +/* p.Do(m_PrimType); + p.Do(m_VertexCounter); + for (int i = 0; i < 3; ++i) + m_Vertices[i].DoState(p); + + if (p.GetMode() == PointerWrap::MODE_READ) + { + m_VertPointer[0] = &m_Vertices[0]; + m_VertPointer[1] = &m_Vertices[1]; + m_VertPointer[2] = &m_Vertices[2]; + m_VertWritePointer = m_VertPointer[0]; + }*/ +} |
