Implements support for FRONT_AND_BACK culling.

TRAC #11331

Author:    Shannon Woods
Signed-off-by: Andrew Lewycky
Signed-off-by: Daniel Koch

git-svn-id: https://angleproject.googlecode.com/svn/trunk@57 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/Context.cpp b/src/libGLESv2/Context.cpp
index df21d7c..c2b0614 100644
--- a/src/libGLESv2/Context.cpp
+++ b/src/libGLESv2/Context.cpp
@@ -1458,9 +1458,12 @@
     applyShaders();
     applyTextures();
 
-    device->BeginScene();
-    device->DrawPrimitive(primitiveType, first, primitiveCount);
-    device->EndScene();
+    if (!cullSkipsDraw(mode))
+    {
+        device->BeginScene();
+        device->DrawPrimitive(primitiveType, first, primitiveCount);
+        device->EndScene();
+    }
 }
 
 void Context::drawElements(GLenum mode, GLsizei count, GLenum type, const void* indices)
@@ -1498,9 +1501,12 @@
     applyShaders();
     applyTextures();
 
-    device->BeginScene();
-    device->DrawIndexedPrimitive(primitiveType, 0, 0, count, startIndex, primitiveCount);
-    device->EndScene();
+    if (!cullSkipsDraw(mode))
+    {
+        device->BeginScene();
+        device->DrawIndexedPrimitive(primitiveType, 0, 0, count, startIndex, primitiveCount);
+        device->EndScene();
+    }
 }
 
 void Context::finish()
@@ -1771,6 +1777,20 @@
 
     return t;
 }
+
+bool Context::cullSkipsDraw(GLenum primitiveType)
+{
+    if (cullFace && cullMode == GL_FRONT_AND_BACK &&
+        (primitiveType == GL_TRIANGLES || primitiveType == GL_TRIANGLE_FAN || primitiveType == GL_TRIANGLE_STRIP))
+    {
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
 }
 
 extern "C"