diff --git a/GL/state.c b/GL/state.c
index d7df94c..f43a143 100644
--- a/GL/state.c
+++ b/GL/state.c
@@ -58,17 +58,17 @@ static int _calc_pvr_depth_test() {
         case GL_NEVER:
             return PVR_DEPTHCMP_NEVER;
         case GL_LESS:
-            return PVR_DEPTHCMP_GEQUAL;
+            return PVR_DEPTHCMP_GREATER;
         case GL_EQUAL:
             return PVR_DEPTHCMP_EQUAL;
         case GL_LEQUAL:
-            return PVR_DEPTHCMP_GREATER;
+            return PVR_DEPTHCMP_GEQUAL;
         case GL_GREATER:
-            return PVR_DEPTHCMP_LEQUAL;
+            return PVR_DEPTHCMP_LESS;
         case GL_NOTEQUAL:
             return PVR_DEPTHCMP_NOTEQUAL;
         case GL_GEQUAL:
-            return PVR_DEPTHCMP_LESS;
+            return PVR_DEPTHCMP_LEQUAL;
         break;
         case GL_ALWAYS:
         default:
diff --git a/GL/texture.c b/GL/texture.c
index 9de6452..dafb478 100644
--- a/GL/texture.c
+++ b/GL/texture.c
@@ -29,7 +29,6 @@ void _glApplyColorTable() {
      * FIXME:
      *
      * - Different palette formats (GL_RGB -> PVR_PAL_RGB565)
-     * - Store the active palette, don't resubmit eah time
      */
 
     static TexturePalette* last_bound = NULL;
@@ -776,6 +775,8 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat,
 
     TextureObject* active = TEXTURE_UNITS[ACTIVE_TEXTURE];
 
+    assert(active);
+
     if(active->data) {
         /* pre-existing texture - check if changed */
         if(active->width != width ||
@@ -854,6 +855,10 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat,
         /* No data? Do nothing! */
         return;
     } else if(!needsConversion) {
+        assert(targetData);
+        assert(data);
+        assert(bytes);
+
         /* No conversion? Just copy the data, and the pvr_format is correct */
         sq_cpy(targetData, data, bytes);
         return;
@@ -872,7 +877,11 @@ void APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalFormat,
         GLubyte* dest = (GLubyte*) targetData;
         const GLubyte* source = data;
 
+        assert(dest);
+        assert(source);
+
         GLint stride = _determineStride(format, type);
+        assert(stride > -1);
 
         if(stride == -1) {
             _glKosThrowError(GL_INVALID_OPERATION, "glTexImage2D-stride");
@@ -993,7 +1002,9 @@ GLAPI void APIENTRY glColorTableEXT(GLenum target, GLenum internalFormat, GLsize
         return;
     }
 
-    GLuint sourceStride = _determineStride(format, type);
+    GLint sourceStride = _determineStride(format, type);
+
+    assert(sourceStride > -1);
 
     TextureConversionFunc convert = _determineConversion(
         GL_RGBA8,  /* We always store palettes in this format */
@@ -1020,6 +1031,8 @@ GLAPI void APIENTRY glColorTableEXT(GLenum target, GLenum internalFormat, GLsize
         palette = active->palette;
     }
 
+    assert(palette);
+
     if(target) {
         pvr_mem_free(palette->data);
         palette->data = NULL;
@@ -1032,6 +1045,9 @@ GLAPI void APIENTRY glColorTableEXT(GLenum target, GLenum internalFormat, GLsize
     GLubyte* src = (GLubyte*) data;
     GLubyte* dst = (GLubyte*) palette->data;
 
+    assert(src);
+    assert(dst);
+
     /* Transform and copy the source palette to the texture */
     GLushort i = 0;
     for(; i < width; ++i) {
diff --git a/samples/Makefile b/samples/Makefile
index f1ae938..5c44e34 100644
--- a/samples/Makefile
+++ b/samples/Makefile
@@ -23,3 +23,4 @@ all:
 	$(KOS_MAKE) -C trimark all
 	$(KOS_MAKE) -C multitexture_arrays all
 	$(KOS_MAKE) -C paletted all
+	$(KOS_MAKE) -C depth_funcs all
diff --git a/samples/depth_funcs/Makefile b/samples/depth_funcs/Makefile
new file mode 100644
index 0000000..189a9f7
--- /dev/null
+++ b/samples/depth_funcs/Makefile
@@ -0,0 +1,29 @@
+TARGET = depth_funcs.elf
+OBJS = main.o
+
+all: rm-elf $(TARGET)
+
+include $(KOS_BASE)/Makefile.rules
+
+clean:
+	-rm -f $(TARGET) $(OBJS) romdisk.*
+
+rm-elf:
+	-rm -f $(TARGET) romdisk.*
+
+$(TARGET): $(OBJS) romdisk.o
+	$(KOS_CC) $(KOS_CFLAGS) $(KOS_LDFLAGS) -o $(TARGET) $(KOS_START) \
+		$(OBJS) romdisk.o $(OBJEXTRA) -lm -lkosutils $(KOS_LIBS)
+
+romdisk.img:
+	$(KOS_GENROMFS) -f romdisk.img -d romdisk -v
+
+romdisk.o: romdisk.img
+	$(KOS_BASE)/utils/bin2o/bin2o romdisk.img romdisk romdisk.o
+
+run: $(TARGET)
+	$(KOS_LOADER) $(TARGET)
+
+dist:
+	rm -f $(OBJS) romdisk.o romdisk.img
+	$(KOS_STRIP) $(TARGET)
diff --git a/samples/depth_funcs/main.c b/samples/depth_funcs/main.c
new file mode 100644
index 0000000..acf1952
--- /dev/null
+++ b/samples/depth_funcs/main.c
@@ -0,0 +1,95 @@
+#include "gl.h"
+#include "glu.h"
+#include "glkos.h"
+
+/* A general OpenGL initialization function.  Sets all of the initial parameters. */
+void InitGL(int Width, int Height)	        // We call this right after our OpenGL window is created.
+{
+    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);		// This Will Clear The Background Color To Black
+    glClearDepth(1.0);				// Enables Clearing Of The Depth Buffer
+    glDepthFunc(GL_LESS);				// The Type Of Depth Test To Do
+    glEnable(GL_DEPTH_TEST);			// Enables Depth Testing
+    glShadeModel(GL_SMOOTH);			// Enables Smooth Color Shading
+
+    glMatrixMode(GL_PROJECTION);
+    glLoadIdentity();				// Reset The Projection Matrix
+
+    gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);	// Calculate The Aspect Ratio Of The Window
+
+    glMatrixMode(GL_MODELVIEW);
+}
+
+/* The function called when our window is resized (which shouldn't happen, because we're fullscreen) */
+void ReSizeGLScene(int Width, int Height)
+{
+    if (Height == 0)				// Prevent A Divide By Zero If The Window Is Too Small
+        Height = 1;
+
+    glViewport(0, 0, Width, Height);		// Reset The Current Viewport And Perspective Transformation
+
+    glMatrixMode(GL_PROJECTION);
+    glLoadIdentity();
+
+    gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);
+    glMatrixMode(GL_MODELVIEW);
+}
+
+
+void DrawSquare(float width, float r, float g, float b, float z) {
+    width /= 2;
+
+    glColor3f(r, g, b);
+    glBegin(GL_QUADS);				// start drawing a polygon (4 sided)
+    glVertex3f(-width, width, z);		// Top Left
+    glVertex3f( width, width, z);		// Top Right
+    glVertex3f( width,-width, z);		// Bottom Right
+    glVertex3f(-width,-width, z);		// Bottom Left
+    glEnd();					// done with the polygon
+}
+
+/* The main drawing function. */
+void DrawGLScene()
+{
+    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);		// Clear The Screen And The Depth Buffer
+    glLoadIdentity();				// Reset The View
+
+    glDepthFunc(GL_ALWAYS);
+    DrawSquare(100, 1, 1, 1, -5.0f);
+
+    glTranslatef(-2.0, 1.5, 0.0f);
+    glDepthFunc(GL_LEQUAL);
+    DrawSquare(1.0, 1, 0, 0, -5.0f);
+
+    glTranslatef(1.1, 0, 0);
+    glDepthFunc(GL_EQUAL);
+    DrawSquare(1.0, 1, 0, 0, -5.0f);
+
+    glTranslatef(1.1, 0, 0);
+    glDepthFunc(GL_GEQUAL);
+    DrawSquare(1.0, 1, 0, 0, -5.0f);
+
+    glTranslatef(1.1, 0, 0);
+    glDepthFunc(GL_LESS);
+    DrawSquare(1.0, 1, 0, 0, -4.9f);
+
+    glTranslatef(1.1, 0, 0);
+    glDepthFunc(GL_GREATER);
+    DrawSquare(1.0, 1, 0, 0, -5.1f);
+
+    // swap buffers to display, since we're double buffered.
+    glKosSwapBuffers();
+}
+
+int main(int argc, char **argv)
+{
+    glKosInit();
+
+    InitGL(640, 480);
+    ReSizeGLScene(640, 480);
+
+    while(1) {
+        DrawGLScene();
+    }
+
+    return 0;
+}
diff --git a/samples/depth_funcs/romdisk/PLACEHOLDER b/samples/depth_funcs/romdisk/PLACEHOLDER
new file mode 100644
index 0000000..e69de29