Implement glFrustum() for OpenGL ES 1.1.

Change-Id: Iedf1f5d64a3346a0b4cf081cfcd383c8dc67b775
Reviewed-on: https://swiftshader-review.googlesource.com/2590
Reviewed-by: Maxime Grégoire <mgregoire@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/libGL/libGL.cpp b/src/OpenGL/libGL/libGL.cpp
index 1cb1e55..87ccee6 100644
--- a/src/OpenGL/libGL/libGL.cpp
+++ b/src/OpenGL/libGL/libGL.cpp
@@ -6239,7 +6239,7 @@
 

 void APIENTRY glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)

 {

-	TRACE("(*)");

+	TRACE("(GLdouble left = %f, GLdouble right = %f, GLdouble bottom = %f, GLdouble top = %f, GLdouble zNear = %f, GLdouble zFar = %f)", left, right, bottom, top, zNear, zFar);

 

 	gl::Context *context = gl::getContext();

 

diff --git a/src/OpenGL/libGLES_CM/Context.cpp b/src/OpenGL/libGLES_CM/Context.cpp
index fbbe989..152fd3e 100644
--- a/src/OpenGL/libGLES_CM/Context.cpp
+++ b/src/OpenGL/libGLES_CM/Context.cpp
@@ -2646,6 +2646,11 @@
     currentMatrixStack().multiply(m);

 }

 

+void Context::frustum(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)

+{

+	currentMatrixStack().frustum(left, right, bottom, top, zNear, zFar);

+}

+

 void Context::ortho(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)

 {

 	currentMatrixStack().ortho(left, right, bottom, top, zNear, zFar);

diff --git a/src/OpenGL/libGLES_CM/Context.h b/src/OpenGL/libGLES_CM/Context.h
index 101b2f9..614330b 100644
--- a/src/OpenGL/libGLES_CM/Context.h
+++ b/src/OpenGL/libGLES_CM/Context.h
@@ -445,6 +445,7 @@
     void translate(GLfloat x, GLfloat y, GLfloat z);

 	void scale(GLfloat x, GLfloat y, GLfloat z);

     void multiply(const GLfloat *m);

+	void frustum(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);

     void ortho(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);

 

 private:

diff --git a/src/OpenGL/libGLES_CM/MatrixStack.cpp b/src/OpenGL/libGLES_CM/MatrixStack.cpp
index c91e152..8d6c3b4 100644
--- a/src/OpenGL/libGLES_CM/MatrixStack.cpp
+++ b/src/OpenGL/libGLES_CM/MatrixStack.cpp
@@ -113,8 +113,8 @@
 

 		float A = (r + l) / (r - l);

 		float B = (t + b) / (t - b);

-		float C = -(f + n) / (r - n);

-		float D = -2 * r * n / (f - n);

+		float C = -(f + n) / (f - n);

+		float D = -2 * f * n / (f - n);

 

 		Matrix frustum(2 * n / (r - l), 0,               A,  0,

 		               0,               2 * n / (t - b), B,  0,

diff --git a/src/OpenGL/libGLES_CM/libGLES_CM.cpp b/src/OpenGL/libGLES_CM/libGLES_CM.cpp
index 2c2ac60..ccf5e1d 100644
--- a/src/OpenGL/libGLES_CM/libGLES_CM.cpp
+++ b/src/OpenGL/libGLES_CM/libGLES_CM.cpp
@@ -1868,7 +1868,14 @@
 

 void GL_APIENTRY glFrustumf(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)

 {

-	UNIMPLEMENTED();

+	TRACE("(GLfloat left = %f, GLfloat right = %f, GLfloat bottom = %f, GLfloat top = %f, GLfloat zNear = %f, GLfloat zFar = %f)", left, right, bottom, top, zNear, zFar);

+

+	es1::Context *context = es1::getContext();

+

+	if(context)

+	{

+		context->frustum(left, right, bottom, top, zNear, zFar);

+	}

 }

 

 void GL_APIENTRY glFrustumx(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar)

@@ -2874,7 +2881,7 @@
 {

 	TRACE("(GLenum type = 0x%X, GLsizei stride = %d, const GLvoid *pointer = 0x%0.8p)", type, stride, pointer);

 

-glVertexAttribPointer(sw::Normal, 3, type, false, stride, pointer);

+	glVertexAttribPointer(sw::Normal, 3, type, false, stride, pointer);

 }

 

 void GL_APIENTRY glOrthof(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)

diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index 6957b05..1104525 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -1553,19 +1553,19 @@
 		UNIMPLEMENTED();

 		*params = GL_BACK;

 		break;

-	case GL_DRAW_BUFFER1: // symbolic constant, initial value is GL_NONE
-	case GL_DRAW_BUFFER2:
-	case GL_DRAW_BUFFER3:
-	case GL_DRAW_BUFFER4:
-	case GL_DRAW_BUFFER5:
-	case GL_DRAW_BUFFER6:
-	case GL_DRAW_BUFFER7:
-	case GL_DRAW_BUFFER8:
-	case GL_DRAW_BUFFER9:
-	case GL_DRAW_BUFFER10:
-	case GL_DRAW_BUFFER11:
-	case GL_DRAW_BUFFER12:
-	case GL_DRAW_BUFFER13:
+	case GL_DRAW_BUFFER1: // symbolic constant, initial value is GL_NONE

+	case GL_DRAW_BUFFER2:

+	case GL_DRAW_BUFFER3:

+	case GL_DRAW_BUFFER4:

+	case GL_DRAW_BUFFER5:

+	case GL_DRAW_BUFFER6:

+	case GL_DRAW_BUFFER7:

+	case GL_DRAW_BUFFER8:

+	case GL_DRAW_BUFFER9:

+	case GL_DRAW_BUFFER10:

+	case GL_DRAW_BUFFER11:

+	case GL_DRAW_BUFFER12:

+	case GL_DRAW_BUFFER13:

 	case GL_DRAW_BUFFER14:

 	case GL_DRAW_BUFFER15:

 		UNIMPLEMENTED();

@@ -1887,19 +1887,19 @@
       case GL_TEXTURE_BINDING_3D_OES:

       case GL_COPY_READ_BUFFER_BINDING:

       case GL_COPY_WRITE_BUFFER_BINDING:

-      case GL_DRAW_BUFFER0:
-      case GL_DRAW_BUFFER1:
-      case GL_DRAW_BUFFER2:
-      case GL_DRAW_BUFFER3:
-      case GL_DRAW_BUFFER4:
-      case GL_DRAW_BUFFER5:
-      case GL_DRAW_BUFFER6:
-      case GL_DRAW_BUFFER7:
-      case GL_DRAW_BUFFER8:
-      case GL_DRAW_BUFFER9:
-      case GL_DRAW_BUFFER10:
-      case GL_DRAW_BUFFER11:
-      case GL_DRAW_BUFFER12:
+      case GL_DRAW_BUFFER0:

+      case GL_DRAW_BUFFER1:

+      case GL_DRAW_BUFFER2:

+      case GL_DRAW_BUFFER3:

+      case GL_DRAW_BUFFER4:

+      case GL_DRAW_BUFFER5:

+      case GL_DRAW_BUFFER6:

+      case GL_DRAW_BUFFER7:

+      case GL_DRAW_BUFFER8:

+      case GL_DRAW_BUFFER9:

+      case GL_DRAW_BUFFER10:

+      case GL_DRAW_BUFFER11:

+      case GL_DRAW_BUFFER12:

       case GL_DRAW_BUFFER13:

       case GL_DRAW_BUFFER14:

       case GL_DRAW_BUFFER15: