--- /dev/null
+#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;
+}
+