summary refs log tree commit diff
path: root/third_party/gldc/src/flush.c
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/gldc/src/flush.c')
-rw-r--r--third_party/gldc/src/flush.c66
1 files changed, 66 insertions, 0 deletions
diff --git a/third_party/gldc/src/flush.c b/third_party/gldc/src/flush.c
new file mode 100644
index 0000000..f7328bd
--- /dev/null
+++ b/third_party/gldc/src/flush.c
@@ -0,0 +1,66 @@
+#include <stdbool.h>
+#include "aligned_vector.h"
+#include "private.h"
+
+PolyList OP_LIST;
+PolyList PT_LIST;
+PolyList TR_LIST;
+
+/**
+ *  FAST_MODE will use invW for all Z coordinates sent to the
+ *  GPU.
+ *
+ *  This will break orthographic mode so default is FALSE
+ **/
+
+#define FAST_MODE GL_FALSE
+
+void glKosInit() {
+    TRACE();
+
+    _glInitContext();
+    _glInitTextures();
+
+    OP_LIST.list_type = PVR_LIST_OP_POLY;
+    PT_LIST.list_type = PVR_LIST_PT_POLY;
+    TR_LIST.list_type = PVR_LIST_TR_POLY;
+
+    aligned_vector_init(&OP_LIST.vector);
+    aligned_vector_init(&PT_LIST.vector);
+    aligned_vector_init(&TR_LIST.vector);
+
+    aligned_vector_reserve(&OP_LIST.vector, 1024 * 3);
+    aligned_vector_reserve(&PT_LIST.vector,  512 * 3);
+    aligned_vector_reserve(&TR_LIST.vector, 1024 * 3);
+}
+
+
+void glKosSwapBuffers() {
+    TRACE();
+    
+    pvr_scene_begin();   
+        if(aligned_vector_size(&OP_LIST.vector) > 2) {
+            pvr_list_begin(PVR_LIST_OP_POLY);
+            SceneListSubmit((Vertex*) aligned_vector_front(&OP_LIST.vector), aligned_vector_size(&OP_LIST.vector));
+            pvr_list_finish();
+        }
+
+        if(aligned_vector_size(&PT_LIST.vector) > 2) {
+            pvr_list_begin(PVR_LIST_PT_POLY);
+            SceneListSubmit((Vertex*) aligned_vector_front(&PT_LIST.vector), aligned_vector_size(&PT_LIST.vector));
+            pvr_list_finish();
+        }
+
+        if(aligned_vector_size(&TR_LIST.vector) > 2) {
+            pvr_list_begin(PVR_LIST_TR_POLY);
+            SceneListSubmit((Vertex*) aligned_vector_front(&TR_LIST.vector), aligned_vector_size(&TR_LIST.vector));
+            pvr_list_finish();
+        }        
+    pvr_scene_finish();
+    
+    aligned_vector_clear(&OP_LIST.vector);
+    aligned_vector_clear(&PT_LIST.vector);
+    aligned_vector_clear(&TR_LIST.vector);
+
+    _glApplyScissor(true);
+}