aboutsummaryrefslogtreecommitdiff
path: root/src/video_core/primitive_assembly.cpp
diff options
context:
space:
mode:
authorTony Wasserka <neobrainx@gmail.com>2014-08-12 13:55:41 +0200
committerTony Wasserka <neobrainx@gmail.com>2014-08-12 13:55:41 +0200
commit36cabe35cc15a6590f5d18be695ae505a946cb06 (patch)
tree241e6d8b36e6ab9921ef7afb71e7350e52862e2a /src/video_core/primitive_assembly.cpp
parenta3e029fad0610d9e045b79cdc545dec3e7327ff7 (diff)
parent94d742fe172ba933af321bfb0e02889b40d0c179 (diff)
Merge pull request #37 from neobrain/pica
Initial work on Pica rendering.
Diffstat (limited to 'src/video_core/primitive_assembly.cpp')
-rw-r--r--src/video_core/primitive_assembly.cpp51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/video_core/primitive_assembly.cpp b/src/video_core/primitive_assembly.cpp
new file mode 100644
index 000000000..2354ffb99
--- /dev/null
+++ b/src/video_core/primitive_assembly.cpp
@@ -0,0 +1,51 @@
+// Copyright 2014 Citra Emulator Project
+// Licensed under GPLv2
+// Refer to the license.txt file included.
+
+#include "clipper.h"
+#include "pica.h"
+#include "primitive_assembly.h"
+#include "vertex_shader.h"
+
+namespace Pica {
+
+namespace PrimitiveAssembly {
+
+static OutputVertex buffer[2];
+static int buffer_index = 0; // TODO: reset this on emulation restart
+
+void SubmitVertex(OutputVertex& vtx)
+{
+ switch (registers.triangle_topology) {
+ case Regs::TriangleTopology::List:
+ case Regs::TriangleTopology::ListIndexed:
+ if (buffer_index < 2) {
+ buffer[buffer_index++] = vtx;
+ } else {
+ buffer_index = 0;
+
+ Clipper::ProcessTriangle(buffer[0], buffer[1], vtx);
+ }
+ break;
+
+ case Regs::TriangleTopology::Fan:
+ if (buffer_index == 2) {
+ buffer_index = 0;
+
+ Clipper::ProcessTriangle(buffer[0], buffer[1], vtx);
+
+ buffer[1] = vtx;
+ } else {
+ buffer[buffer_index++] = vtx;
+ }
+ break;
+
+ default:
+ ERROR_LOG(GPU, "Unknown triangle mode %x:", (int)registers.triangle_topology.Value());
+ break;
+ }
+}
+
+} // namespace
+
+} // namespace