summaryrefslogtreecommitdiff
path: root/src/video_core/primitive_assembly.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/video_core/primitive_assembly.cpp')
-rw-r--r--src/video_core/primitive_assembly.cpp67
1 files changed, 32 insertions, 35 deletions
diff --git a/src/video_core/primitive_assembly.cpp b/src/video_core/primitive_assembly.cpp
index 68ea3c08a..be7377290 100644
--- a/src/video_core/primitive_assembly.cpp
+++ b/src/video_core/primitive_assembly.cpp
@@ -3,69 +3,66 @@
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include "common/logging/log.h" 5#include "common/logging/log.h"
6
7#include "video_core/pica.h" 6#include "video_core/pica.h"
8#include "video_core/primitive_assembly.h" 7#include "video_core/primitive_assembly.h"
9#include "video_core/shader/shader.h" 8#include "video_core/shader/shader.h"
10 9
11namespace Pica { 10namespace Pica {
12 11
13template<typename VertexType> 12template <typename VertexType>
14PrimitiveAssembler<VertexType>::PrimitiveAssembler(Regs::TriangleTopology topology) 13PrimitiveAssembler<VertexType>::PrimitiveAssembler(Regs::TriangleTopology topology)
15 : topology(topology), buffer_index(0) { 14 : topology(topology), buffer_index(0) {}
16}
17 15
18template<typename VertexType> 16template <typename VertexType>
19void PrimitiveAssembler<VertexType>::SubmitVertex(VertexType& vtx, TriangleHandler triangle_handler) 17void PrimitiveAssembler<VertexType>::SubmitVertex(VertexType& vtx,
20{ 18 TriangleHandler triangle_handler) {
21 switch (topology) { 19 switch (topology) {
22 // TODO: Figure out what's different with TriangleTopology::Shader. 20 // TODO: Figure out what's different with TriangleTopology::Shader.
23 case Regs::TriangleTopology::List: 21 case Regs::TriangleTopology::List:
24 case Regs::TriangleTopology::Shader: 22 case Regs::TriangleTopology::Shader:
25 if (buffer_index < 2) { 23 if (buffer_index < 2) {
26 buffer[buffer_index++] = vtx; 24 buffer[buffer_index++] = vtx;
27 } else { 25 } else {
28 buffer_index = 0; 26 buffer_index = 0;
29 27
30 triangle_handler(buffer[0], buffer[1], vtx); 28 triangle_handler(buffer[0], buffer[1], vtx);
31 } 29 }
32 break; 30 break;
33 31
34 case Regs::TriangleTopology::Strip: 32 case Regs::TriangleTopology::Strip:
35 case Regs::TriangleTopology::Fan: 33 case Regs::TriangleTopology::Fan:
36 if (strip_ready) 34 if (strip_ready)
37 triangle_handler(buffer[0], buffer[1], vtx); 35 triangle_handler(buffer[0], buffer[1], vtx);
38 36
39 buffer[buffer_index] = vtx; 37 buffer[buffer_index] = vtx;
40 38
41 strip_ready |= (buffer_index == 1); 39 strip_ready |= (buffer_index == 1);
42 40
43 if (topology == Regs::TriangleTopology::Strip) 41 if (topology == Regs::TriangleTopology::Strip)
44 buffer_index = !buffer_index; 42 buffer_index = !buffer_index;
45 else if (topology == Regs::TriangleTopology::Fan) 43 else if (topology == Regs::TriangleTopology::Fan)
46 buffer_index = 1; 44 buffer_index = 1;
47 break; 45 break;
48 46
49 default: 47 default:
50 LOG_ERROR(HW_GPU, "Unknown triangle topology %x:", (int)topology); 48 LOG_ERROR(HW_GPU, "Unknown triangle topology %x:", (int)topology);
51 break; 49 break;
52 } 50 }
53} 51}
54 52
55template<typename VertexType> 53template <typename VertexType>
56void PrimitiveAssembler<VertexType>::Reset() { 54void PrimitiveAssembler<VertexType>::Reset() {
57 buffer_index = 0; 55 buffer_index = 0;
58 strip_ready = false; 56 strip_ready = false;
59} 57}
60 58
61template<typename VertexType> 59template <typename VertexType>
62void PrimitiveAssembler<VertexType>::Reconfigure(Regs::TriangleTopology topology) { 60void PrimitiveAssembler<VertexType>::Reconfigure(Regs::TriangleTopology topology) {
63 Reset(); 61 Reset();
64 this->topology = topology; 62 this->topology = topology;
65} 63}
66 64
67// explicitly instantiate use cases 65// explicitly instantiate use cases
68template 66template struct PrimitiveAssembler<Shader::OutputVertex>;
69struct PrimitiveAssembler<Shader::OutputVertex>;
70 67
71} // namespace 68} // namespace