GLES2N64 (from mupen64plus-ae) plugin. Compile and run on the OpenPandora
[mupen64plus-pandora.git] / source / gles2n64 / src / DepthBuffer.cpp
diff --git a/source/gles2n64/src/DepthBuffer.cpp b/source/gles2n64/src/DepthBuffer.cpp
new file mode 100644 (file)
index 0000000..8f2ebc1
--- /dev/null
@@ -0,0 +1,165 @@
+#include <stdlib.h>
+#include "DepthBuffer.h"
+#include "Types.h"
+
+DepthBufferInfo depthBuffer;
+
+void DepthBuffer_Init()
+{
+    depthBuffer.current = NULL;
+    depthBuffer.top = NULL;
+    depthBuffer.bottom = NULL;
+    depthBuffer.numBuffers = 0;
+}
+
+void DepthBuffer_RemoveBottom()
+{
+    DepthBuffer *newBottom = depthBuffer.bottom->higher;
+
+    if (depthBuffer.bottom == depthBuffer.top)
+        depthBuffer.top = NULL;
+
+    free( depthBuffer.bottom );
+
+    depthBuffer.bottom = newBottom;
+
+    if (depthBuffer.bottom != NULL)
+        depthBuffer.bottom->lower = NULL;
+
+    depthBuffer.numBuffers--;
+}
+
+void DepthBuffer_Remove( DepthBuffer *buffer )
+{
+    if ((buffer == depthBuffer.bottom) &&
+        (buffer == depthBuffer.top))
+    {
+        depthBuffer.top = NULL;
+        depthBuffer.bottom = NULL;
+    }
+    else if (buffer == depthBuffer.bottom)
+    {
+        depthBuffer.bottom = buffer->higher;
+
+        if (depthBuffer.bottom)
+            depthBuffer.bottom->lower = NULL;
+    }
+    else if (buffer == depthBuffer.top)
+    {
+        depthBuffer.top = buffer->lower;
+
+        if (depthBuffer.top)
+            depthBuffer.top->higher = NULL;
+    }
+    else
+    {
+        buffer->higher->lower = buffer->lower;
+        buffer->lower->higher = buffer->higher;
+    }
+
+    free( buffer );
+    depthBuffer.numBuffers--;
+}
+
+void DepthBuffer_RemoveBuffer( u32 address )
+{
+    DepthBuffer *current = depthBuffer.bottom;
+    while (current != NULL)
+    {
+        if (current->address == address)
+        {
+            DepthBuffer_Remove( current );
+            return;
+        }
+        current = current->higher;
+    }
+}
+
+DepthBuffer *DepthBuffer_AddTop()
+{
+    DepthBuffer *newtop = (DepthBuffer*)malloc( sizeof( DepthBuffer ) );
+
+    newtop->lower = depthBuffer.top;
+    newtop->higher = NULL;
+
+    if (depthBuffer.top)
+        depthBuffer.top->higher = newtop;
+
+    if (!depthBuffer.bottom)
+        depthBuffer.bottom = newtop;
+
+    depthBuffer.top = newtop;
+
+    depthBuffer.numBuffers++;
+
+    return newtop;
+}
+
+void DepthBuffer_MoveToTop( DepthBuffer *newtop )
+{
+    if (newtop == depthBuffer.top)
+        return;
+
+    if (newtop == depthBuffer.bottom)
+    {
+        depthBuffer.bottom = newtop->higher;
+        depthBuffer.bottom->lower = NULL;
+    }
+    else
+    {
+        newtop->higher->lower = newtop->lower;
+        newtop->lower->higher = newtop->higher;
+    }
+
+    newtop->higher = NULL;
+    newtop->lower = depthBuffer.top;
+    depthBuffer.top->higher = newtop;
+    depthBuffer.top = newtop;
+}
+
+void DepthBuffer_Destroy()
+{
+    while (depthBuffer.bottom)
+        DepthBuffer_RemoveBottom();
+
+    depthBuffer.top = NULL;
+}
+
+void DepthBuffer_SetBuffer( u32 address )
+{
+    DepthBuffer *current = depthBuffer.top;
+
+    // Search through saved depth buffers
+    while (current != NULL)
+    {
+        if (current->address == address)
+        {
+            DepthBuffer_MoveToTop( current );
+            depthBuffer.current = current;
+            return;
+        }
+        current = current->lower;
+    }
+
+    current = DepthBuffer_AddTop();
+
+    current->address = address;
+    current->cleared = TRUE;
+
+    depthBuffer.current = current;
+}
+
+DepthBuffer *DepthBuffer_FindBuffer( u32 address )
+{
+    DepthBuffer *current = depthBuffer.top;
+
+    while (current)
+    {
+        if (current->address == address)
+            return current;
+        current = current->lower;
+    }
+
+    return NULL;
+}
+