Files
dolphin/Source/Core/VideoBackends/Software/SetupUnit.cpp
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

170 lines
3.7 KiB
C++
Raw Normal View History

// Copyright 2009 Dolphin Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
2010-06-09 01:37:08 +00:00
2014-02-17 05:18:15 -05:00
#include "VideoBackends/Software/SetupUnit.h"
2021-12-09 18:22:16 -08:00
#include <cstring>
#include "Common/Logging/Log.h"
2014-02-17 05:18:15 -05:00
#include "VideoBackends/Software/Clipper.h"
2015-10-09 20:50:36 +02:00
#include "VideoCommon/OpcodeDecoding.h"
2010-06-09 01:37:08 +00:00
void SetupUnit::Init(OpcodeDecoder::Primitive primitive_type)
{
m_PrimType = primitive_type;
2010-06-09 01:37:08 +00:00
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];
}
2010-06-09 01:37:08 +00:00
2015-12-05 12:18:31 +01:00
OutputVertexData* SetupUnit::GetVertex()
{
2020-12-16 15:01:20 +01:00
memset(reinterpret_cast<u8*>(m_VertWritePointer), 0, sizeof(*m_VertWritePointer));
2015-12-05 12:18:31 +01:00
return m_VertWritePointer;
}
void SetupUnit::SetupVertex()
{
using OpcodeDecoder::Primitive;
switch (m_PrimType)
{
case Primitive::GX_DRAW_QUADS:
SetupQuad();
break;
case Primitive::GX_DRAW_QUADS_2:
2020-11-09 03:13:59 -05:00
WARN_LOG_FMT(VIDEO, "Non-standard primitive drawing command GL_DRAW_QUADS_2");
SetupQuad();
break;
case Primitive::GX_DRAW_TRIANGLES:
SetupTriangle();
break;
case Primitive::GX_DRAW_TRIANGLE_STRIP:
SetupTriStrip();
break;
case Primitive::GX_DRAW_TRIANGLE_FAN:
SetupTriFan();
break;
case Primitive::GX_DRAW_LINES:
SetupLine();
break;
case Primitive::GX_DRAW_LINE_STRIP:
SetupLineStrip();
break;
case Primitive::GX_DRAW_POINTS:
SetupPoint();
break;
}
}
2010-06-09 01:37:08 +00:00
void SetupUnit::SetupQuad()
{
if (m_VertexCounter < 2)
{
m_VertexCounter++;
m_VertWritePointer = m_VertPointer[m_VertexCounter];
return;
}
2010-06-09 01:37:08 +00:00
Clipper::ProcessTriangle(m_VertPointer[0], m_VertPointer[1], m_VertPointer[2]);
2010-06-09 01:37:08 +00:00
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;
}
2010-06-09 01:37:08 +00:00
void SetupUnit::SetupTriangle()
{
if (m_VertexCounter < 2)
{
m_VertexCounter++;
m_VertWritePointer = m_VertPointer[m_VertexCounter];
return;
}
2010-06-09 01:37:08 +00:00
Clipper::ProcessTriangle(m_VertPointer[0], m_VertPointer[1], m_VertPointer[2]);
2010-06-09 01:37:08 +00:00
m_VertexCounter = 0;
m_VertWritePointer = m_VertPointer[0];
}
2010-06-09 01:37:08 +00:00
void SetupUnit::SetupTriStrip()
{
if (m_VertexCounter < 2)
{
m_VertexCounter++;
m_VertWritePointer = m_VertPointer[m_VertexCounter];
return;
}
2010-06-09 01:37:08 +00:00
Clipper::ProcessTriangle(m_VertPointer[0], m_VertPointer[1], m_VertPointer[2]);
2010-06-09 01:37:08 +00:00
m_VertexCounter++;
m_VertPointer[2 - (m_VertexCounter & 1)] = m_VertPointer[0];
m_VertWritePointer = m_VertPointer[0];
2010-06-09 01:37:08 +00:00
m_VertPointer[0] = &m_Vertices[(m_VertexCounter + 1) % 3];
}
2010-06-09 01:37:08 +00:00
void SetupUnit::SetupTriFan()
{
if (m_VertexCounter < 2)
{
m_VertexCounter++;
m_VertWritePointer = m_VertPointer[m_VertexCounter];
return;
}
2010-06-09 01:37:08 +00:00
Clipper::ProcessTriangle(m_VertPointer[0], m_VertPointer[1], m_VertPointer[2]);
2010-06-09 01:37:08 +00:00
m_VertexCounter++;
m_VertPointer[1] = m_VertPointer[2];
m_VertPointer[2] = &m_Vertices[2 - (m_VertexCounter & 1)];
2010-06-09 01:37:08 +00:00
m_VertWritePointer = m_VertPointer[2];
}
2010-06-09 01:37:08 +00:00
void SetupUnit::SetupLine()
{
if (m_VertexCounter < 1)
{
m_VertexCounter++;
m_VertWritePointer = m_VertPointer[m_VertexCounter];
return;
}
2010-06-09 01:37:08 +00:00
Clipper::ProcessLine(m_VertPointer[0], m_VertPointer[1]);
2010-06-09 01:37:08 +00:00
m_VertexCounter = 0;
m_VertWritePointer = m_VertPointer[0];
}
2010-06-09 01:37:08 +00:00
void SetupUnit::SetupLineStrip()
{
if (m_VertexCounter < 1)
{
m_VertexCounter++;
m_VertWritePointer = m_VertPointer[m_VertexCounter];
return;
}
2010-06-09 01:37:08 +00:00
m_VertexCounter++;
2010-06-09 01:37:08 +00:00
Clipper::ProcessLine(m_VertPointer[0], m_VertPointer[1]);
2010-06-09 01:37:08 +00:00
m_VertWritePointer = m_VertPointer[0];
2010-06-09 01:37:08 +00:00
m_VertPointer[0] = m_VertPointer[1];
m_VertPointer[1] = &m_Vertices[m_VertexCounter & 1];
}
2010-06-09 01:37:08 +00:00
void SetupUnit::SetupPoint()
{
2020-12-22 15:00:40 -08:00
Clipper::ProcessPoint(m_VertPointer[0]);
}