SetupUnit.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. // Copyright 2009 Dolphin Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "VideoBackends/Software/SetupUnit.h"
  4. #include <cstring>
  5. #include "Common/Logging/Log.h"
  6. #include "VideoBackends/Software/Clipper.h"
  7. #include "VideoCommon/OpcodeDecoding.h"
  8. void SetupUnit::Init(OpcodeDecoder::Primitive primitive_type)
  9. {
  10. m_PrimType = primitive_type;
  11. m_VertexCounter = 0;
  12. m_VertPointer[0] = &m_Vertices[0];
  13. m_VertPointer[1] = &m_Vertices[1];
  14. m_VertPointer[2] = &m_Vertices[2];
  15. m_VertWritePointer = m_VertPointer[0];
  16. }
  17. OutputVertexData* SetupUnit::GetVertex()
  18. {
  19. memset(reinterpret_cast<u8*>(m_VertWritePointer), 0, sizeof(*m_VertWritePointer));
  20. return m_VertWritePointer;
  21. }
  22. void SetupUnit::SetupVertex()
  23. {
  24. using OpcodeDecoder::Primitive;
  25. switch (m_PrimType)
  26. {
  27. case Primitive::GX_DRAW_QUADS:
  28. SetupQuad();
  29. break;
  30. case Primitive::GX_DRAW_QUADS_2:
  31. WARN_LOG_FMT(VIDEO, "Non-standard primitive drawing command GL_DRAW_QUADS_2");
  32. SetupQuad();
  33. break;
  34. case Primitive::GX_DRAW_TRIANGLES:
  35. SetupTriangle();
  36. break;
  37. case Primitive::GX_DRAW_TRIANGLE_STRIP:
  38. SetupTriStrip();
  39. break;
  40. case Primitive::GX_DRAW_TRIANGLE_FAN:
  41. SetupTriFan();
  42. break;
  43. case Primitive::GX_DRAW_LINES:
  44. SetupLine();
  45. break;
  46. case Primitive::GX_DRAW_LINE_STRIP:
  47. SetupLineStrip();
  48. break;
  49. case Primitive::GX_DRAW_POINTS:
  50. SetupPoint();
  51. break;
  52. }
  53. }
  54. void SetupUnit::SetupQuad()
  55. {
  56. if (m_VertexCounter < 2)
  57. {
  58. m_VertexCounter++;
  59. m_VertWritePointer = m_VertPointer[m_VertexCounter];
  60. return;
  61. }
  62. Clipper::ProcessTriangle(m_VertPointer[0], m_VertPointer[1], m_VertPointer[2]);
  63. m_VertexCounter++;
  64. m_VertexCounter &= 3;
  65. m_VertWritePointer = &m_Vertices[m_VertexCounter & 1];
  66. OutputVertexData* temp = m_VertPointer[1];
  67. m_VertPointer[1] = m_VertPointer[2];
  68. m_VertPointer[2] = temp;
  69. }
  70. void SetupUnit::SetupTriangle()
  71. {
  72. if (m_VertexCounter < 2)
  73. {
  74. m_VertexCounter++;
  75. m_VertWritePointer = m_VertPointer[m_VertexCounter];
  76. return;
  77. }
  78. Clipper::ProcessTriangle(m_VertPointer[0], m_VertPointer[1], m_VertPointer[2]);
  79. m_VertexCounter = 0;
  80. m_VertWritePointer = m_VertPointer[0];
  81. }
  82. void SetupUnit::SetupTriStrip()
  83. {
  84. if (m_VertexCounter < 2)
  85. {
  86. m_VertexCounter++;
  87. m_VertWritePointer = m_VertPointer[m_VertexCounter];
  88. return;
  89. }
  90. Clipper::ProcessTriangle(m_VertPointer[0], m_VertPointer[1], m_VertPointer[2]);
  91. m_VertexCounter++;
  92. m_VertPointer[2 - (m_VertexCounter & 1)] = m_VertPointer[0];
  93. m_VertWritePointer = m_VertPointer[0];
  94. m_VertPointer[0] = &m_Vertices[(m_VertexCounter + 1) % 3];
  95. }
  96. void SetupUnit::SetupTriFan()
  97. {
  98. if (m_VertexCounter < 2)
  99. {
  100. m_VertexCounter++;
  101. m_VertWritePointer = m_VertPointer[m_VertexCounter];
  102. return;
  103. }
  104. Clipper::ProcessTriangle(m_VertPointer[0], m_VertPointer[1], m_VertPointer[2]);
  105. m_VertexCounter++;
  106. m_VertPointer[1] = m_VertPointer[2];
  107. m_VertPointer[2] = &m_Vertices[2 - (m_VertexCounter & 1)];
  108. m_VertWritePointer = m_VertPointer[2];
  109. }
  110. void SetupUnit::SetupLine()
  111. {
  112. if (m_VertexCounter < 1)
  113. {
  114. m_VertexCounter++;
  115. m_VertWritePointer = m_VertPointer[m_VertexCounter];
  116. return;
  117. }
  118. Clipper::ProcessLine(m_VertPointer[0], m_VertPointer[1]);
  119. m_VertexCounter = 0;
  120. m_VertWritePointer = m_VertPointer[0];
  121. }
  122. void SetupUnit::SetupLineStrip()
  123. {
  124. if (m_VertexCounter < 1)
  125. {
  126. m_VertexCounter++;
  127. m_VertWritePointer = m_VertPointer[m_VertexCounter];
  128. return;
  129. }
  130. m_VertexCounter++;
  131. Clipper::ProcessLine(m_VertPointer[0], m_VertPointer[1]);
  132. m_VertWritePointer = m_VertPointer[0];
  133. m_VertPointer[0] = m_VertPointer[1];
  134. m_VertPointer[1] = &m_Vertices[m_VertexCounter & 1];
  135. }
  136. void SetupUnit::SetupPoint()
  137. {
  138. Clipper::ProcessPoint(m_VertPointer[0]);
  139. }