gl: a few more ES 3.0 functions

Nothing exciting, just exercising the layout of the functions.

Change-Id: I460fdc1c9596968bbdfdafe7d068ea393e0029ed
Reviewed-on: https://go-review.googlesource.com/24051
Reviewed-by: Nigel Tao <nigeltao@golang.org>
diff --git a/gl/fn.go b/gl/fn.go
index a3fe0a6..35c52c8 100644
--- a/gl/fn.go
+++ b/gl/fn.go
@@ -43,7 +43,6 @@
 	glfnBlendEquationSeparate
 	glfnBlendFunc
 	glfnBlendFuncSeparate
-	glfnBlitFramebuffer
 	glfnBufferData
 	glfnBufferSubData
 	glfnCheckFramebufferStatus
@@ -172,6 +171,23 @@
 	glfnVertexAttrib4fv
 	glfnVertexAttribPointer
 	glfnViewport
+
+	// ES 3.0 functions
+	glfnUniformMatrix2x3fv
+	glfnUniformMatrix3x2fv
+	glfnUniformMatrix2x4fv
+	glfnUniformMatrix4x2fv
+	glfnUniformMatrix3x4fv
+	glfnUniformMatrix4x3fv
+	glfnBlitFramebuffer
+	glfnUniform1ui
+	glfnUniform2ui
+	glfnUniform3ui
+	glfnUniform4ui
+	glfnUniform1uiv
+	glfnUniform2uiv
+	glfnUniform3uiv
+	glfnUniform4uiv
 )
 
 func goString(buf []byte) string {
diff --git a/gl/gl.go b/gl/gl.go
index d9d0184..b4215de 100644
--- a/gl/gl.go
+++ b/gl/gl.go
@@ -1680,6 +1680,78 @@
 	})
 }
 
+func (ctx context3) UniformMatrix2x3fv(dst Uniform, src []float32) {
+	ctx.enqueue(call{
+		args: fnargs{
+			fn: glfnUniformMatrix2x3fv,
+			a0: dst.c(),
+			a1: uintptr(len(src) / 6),
+		},
+		parg:     unsafe.Pointer(&src[0]),
+		blocking: true,
+	})
+}
+
+func (ctx context3) UniformMatrix3x2fv(dst Uniform, src []float32) {
+	ctx.enqueue(call{
+		args: fnargs{
+			fn: glfnUniformMatrix3x2fv,
+			a0: dst.c(),
+			a1: uintptr(len(src) / 6),
+		},
+		parg:     unsafe.Pointer(&src[0]),
+		blocking: true,
+	})
+}
+
+func (ctx context3) UniformMatrix2x4fv(dst Uniform, src []float32) {
+	ctx.enqueue(call{
+		args: fnargs{
+			fn: glfnUniformMatrix2x4fv,
+			a0: dst.c(),
+			a1: uintptr(len(src) / 8),
+		},
+		parg:     unsafe.Pointer(&src[0]),
+		blocking: true,
+	})
+}
+
+func (ctx context3) UniformMatrix4x2fv(dst Uniform, src []float32) {
+	ctx.enqueue(call{
+		args: fnargs{
+			fn: glfnUniformMatrix4x2fv,
+			a0: dst.c(),
+			a1: uintptr(len(src) / 8),
+		},
+		parg:     unsafe.Pointer(&src[0]),
+		blocking: true,
+	})
+}
+
+func (ctx context3) UniformMatrix3x4fv(dst Uniform, src []float32) {
+	ctx.enqueue(call{
+		args: fnargs{
+			fn: glfnUniformMatrix3x4fv,
+			a0: dst.c(),
+			a1: uintptr(len(src) / 12),
+		},
+		parg:     unsafe.Pointer(&src[0]),
+		blocking: true,
+	})
+}
+
+func (ctx context3) UniformMatrix4x3fv(dst Uniform, src []float32) {
+	ctx.enqueue(call{
+		args: fnargs{
+			fn: glfnUniformMatrix4x3fv,
+			a0: dst.c(),
+			a1: uintptr(len(src) / 12),
+		},
+		parg:     unsafe.Pointer(&src[0]),
+		blocking: true,
+	})
+}
+
 func (ctx context3) BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1 int, mask uint, filter Enum) {
 	ctx.enqueue(call{
 		args: fnargs{
@@ -1697,3 +1769,49 @@
 		},
 	})
 }
+
+func (ctx context3) Uniform1ui(dst Uniform, v uint32) {
+	ctx.enqueue(call{
+		args: fnargs{
+			fn: glfnUniform1ui,
+			a0: dst.c(),
+			a1: uintptr(v),
+		},
+	})
+}
+
+func (ctx context3) Uniform2ui(dst Uniform, v0, v1 uint32) {
+	ctx.enqueue(call{
+		args: fnargs{
+			fn: glfnUniform2ui,
+			a0: dst.c(),
+			a1: uintptr(v0),
+			a2: uintptr(v1),
+		},
+	})
+}
+
+func (ctx context3) Uniform3ui(dst Uniform, v0, v1, v2 uint) {
+	ctx.enqueue(call{
+		args: fnargs{
+			fn: glfnUniform3ui,
+			a0: dst.c(),
+			a1: uintptr(v0),
+			a2: uintptr(v1),
+			a3: uintptr(v2),
+		},
+	})
+}
+
+func (ctx context3) Uniform4ui(dst Uniform, v0, v1, v2, v3 uint32) {
+	ctx.enqueue(call{
+		args: fnargs{
+			fn: glfnUniform4ui,
+			a0: dst.c(),
+			a1: uintptr(v0),
+			a2: uintptr(v1),
+			a3: uintptr(v2),
+			a4: uintptr(v3),
+		},
+	})
+}
diff --git a/gl/gldebug.go b/gl/gldebug.go
index b2f6133..6cb6fba 100644
--- a/gl/gldebug.go
+++ b/gl/gldebug.go
@@ -3455,6 +3455,102 @@
 		blocking: true})
 }
 
+func (ctx context3) UniformMatrix2x3fv(dst Uniform, src []float32) {
+	defer func() {
+		errstr := ctx.errDrain()
+		log.Printf("gl.UniformMatrix2x3fv(%v, len(%d)) %v", dst, len(src), errstr)
+	}()
+	ctx.enqueueDebug(call{
+		args: fnargs{
+			fn: glfnUniformMatrix2x3fv,
+			a0: dst.c(),
+			a1: uintptr(len(src) / 6),
+		},
+		parg:     unsafe.Pointer(&src[0]),
+		blocking: true,
+	})
+}
+
+func (ctx context3) UniformMatrix3x2fv(dst Uniform, src []float32) {
+	defer func() {
+		errstr := ctx.errDrain()
+		log.Printf("gl.UniformMatrix3x2fv(%v, len(%d)) %v", dst, len(src), errstr)
+	}()
+	ctx.enqueueDebug(call{
+		args: fnargs{
+			fn: glfnUniformMatrix3x2fv,
+			a0: dst.c(),
+			a1: uintptr(len(src) / 6),
+		},
+		parg:     unsafe.Pointer(&src[0]),
+		blocking: true,
+	})
+}
+
+func (ctx context3) UniformMatrix2x4fv(dst Uniform, src []float32) {
+	defer func() {
+		errstr := ctx.errDrain()
+		log.Printf("gl.UniformMatrix2x4fv(%v, len(%d)) %v", dst, len(src), errstr)
+	}()
+	ctx.enqueueDebug(call{
+		args: fnargs{
+			fn: glfnUniformMatrix2x4fv,
+			a0: dst.c(),
+			a1: uintptr(len(src) / 8),
+		},
+		parg:     unsafe.Pointer(&src[0]),
+		blocking: true,
+	})
+}
+
+func (ctx context3) UniformMatrix4x2fv(dst Uniform, src []float32) {
+	defer func() {
+		errstr := ctx.errDrain()
+		log.Printf("gl.UniformMatrix4x2fv(%v, len(%d)) %v", dst, len(src), errstr)
+	}()
+	ctx.enqueueDebug(call{
+		args: fnargs{
+			fn: glfnUniformMatrix4x2fv,
+			a0: dst.c(),
+			a1: uintptr(len(src) / 8),
+		},
+		parg:     unsafe.Pointer(&src[0]),
+		blocking: true,
+	})
+}
+
+func (ctx context3) UniformMatrix3x4fv(dst Uniform, src []float32) {
+	defer func() {
+		errstr := ctx.errDrain()
+		log.Printf("gl.UniformMatrix3x4fv(%v, len(%d)) %v", dst, len(src), errstr)
+	}()
+	ctx.enqueueDebug(call{
+		args: fnargs{
+			fn: glfnUniformMatrix3x4fv,
+			a0: dst.c(),
+			a1: uintptr(len(src) / 12),
+		},
+		parg:     unsafe.Pointer(&src[0]),
+		blocking: true,
+	})
+}
+
+func (ctx context3) UniformMatrix4x3fv(dst Uniform, src []float32) {
+	defer func() {
+		errstr := ctx.errDrain()
+		log.Printf("gl.UniformMatrix4x3fv(%v, len(%d)) %v", dst, len(src), errstr)
+	}()
+	ctx.enqueueDebug(call{
+		args: fnargs{
+			fn: glfnUniformMatrix4x3fv,
+			a0: dst.c(),
+			a1: uintptr(len(src) / 12),
+		},
+		parg:     unsafe.Pointer(&src[0]),
+		blocking: true,
+	})
+}
+
 func (ctx context3) BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1 int, mask uint, filter Enum) {
 	defer func() {
 		errstr := ctx.errDrain()
@@ -3476,3 +3572,65 @@
 		},
 		blocking: true})
 }
+
+func (ctx context3) Uniform1ui(dst Uniform, v uint32) {
+	defer func() {
+		errstr := ctx.errDrain()
+		log.Printf("gl.Uniform1ui(%v, %v) %v", dst, v, errstr)
+	}()
+	ctx.enqueueDebug(call{
+		args: fnargs{
+			fn: glfnUniform1ui,
+			a0: dst.c(),
+			a1: uintptr(v),
+		},
+		blocking: true})
+}
+
+func (ctx context3) Uniform2ui(dst Uniform, v0, v1 uint32) {
+	defer func() {
+		errstr := ctx.errDrain()
+		log.Printf("gl.Uniform2ui(%v, %v, %v) %v", dst, v0, v1, errstr)
+	}()
+	ctx.enqueueDebug(call{
+		args: fnargs{
+			fn: glfnUniform2ui,
+			a0: dst.c(),
+			a1: uintptr(v0),
+			a2: uintptr(v1),
+		},
+		blocking: true})
+}
+
+func (ctx context3) Uniform3ui(dst Uniform, v0, v1, v2 uint) {
+	defer func() {
+		errstr := ctx.errDrain()
+		log.Printf("gl.Uniform3ui(%v, %v, %v, %v) %v", dst, v0, v1, v2, errstr)
+	}()
+	ctx.enqueueDebug(call{
+		args: fnargs{
+			fn: glfnUniform3ui,
+			a0: dst.c(),
+			a1: uintptr(v0),
+			a2: uintptr(v1),
+			a3: uintptr(v2),
+		},
+		blocking: true})
+}
+
+func (ctx context3) Uniform4ui(dst Uniform, v0, v1, v2, v3 uint32) {
+	defer func() {
+		errstr := ctx.errDrain()
+		log.Printf("gl.Uniform4ui(%v, %v, %v, %v, %v) %v", dst, v0, v1, v2, v3, errstr)
+	}()
+	ctx.enqueueDebug(call{
+		args: fnargs{
+			fn: glfnUniform4ui,
+			a0: dst.c(),
+			a1: uintptr(v0),
+			a2: uintptr(v1),
+			a3: uintptr(v2),
+			a4: uintptr(v3),
+		},
+		blocking: true})
+}
diff --git a/gl/work.c b/gl/work.c
index 8f259f7..75e6a71 100644
--- a/gl/work.c
+++ b/gl/work.c
@@ -11,10 +11,25 @@
 #if defined(GL_ES_VERSION_3_0) && GL_ES_VERSION_3_0
 #else
 #include <stdio.h>
-void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) {
+static void gles3missing() {
 	printf("GLES3 function is missing\n");
 	exit(2);
 }
+static void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { gles3missing(); }
+static void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { gles3missing(); }
+static void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { gles3missing(); }
+static void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { gles3missing(); }
+static void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { gles3missing(); }
+static void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { gles3missing(); }
+static void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) { gles3missing(); }
+static void glUniform1ui(GLint location, GLuint v0) { gles3missing(); }
+static void glUniform2ui(GLint location, GLuint v0, GLuint v1) { gles3missing(); }
+static void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2) { gles3missing(); }
+static void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) { gles3missing(); }
+static void glUniform1uiv(GLint location, GLsizei count, const GLuint *value) { gles3missing(); }
+static void glUniform2uiv(GLint location, GLsizei count, const GLuint *value) { gles3missing(); }
+static void glUniform3uiv(GLint location, GLsizei count, const GLuint *value) { gles3missing(); }
+static void glUniform4uiv(GLint location, GLsizei count, const GLuint *value) { gles3missing(); }
 #endif
 
 uintptr_t processFn(struct fnargs* args, char* parg) {
@@ -398,6 +413,9 @@
 	case glfnUniform1i:
 		glUniform1i((GLint)args->a0, (GLint)args->a1);
 		break;
+	case glfnUniform1ui:
+		glUniform1ui((GLint)args->a0, (GLuint)args->a1);
+		break;
 	case glfnUniform1iv:
 		glUniform1iv((GLint)args->a0, (GLsizeiptr)args->a1, (GLvoid*)parg);
 		break;
@@ -410,6 +428,9 @@
 	case glfnUniform2i:
 		glUniform2i((GLint)args->a0, (GLint)args->a1, (GLint)args->a2);
 		break;
+	case glfnUniform2ui:
+		glUniform2ui((GLint)args->a0, (GLuint)args->a1, (GLuint)args->a2);
+		break;
 	case glfnUniform2iv:
 		glUniform2iv((GLint)args->a0, (GLsizeiptr)args->a1, (GLvoid*)parg);
 		break;
@@ -422,6 +443,9 @@
 	case glfnUniform3i:
 		glUniform3i((GLint)args->a0, (GLint)args->a1, (GLint)args->a2, (GLint)args->a3);
 		break;
+	case glfnUniform3ui:
+		glUniform3ui((GLint)args->a0, (GLuint)args->a1, (GLuint)args->a2, (GLuint)args->a3);
+		break;
 	case glfnUniform3iv:
 		glUniform3iv((GLint)args->a0, (GLsizeiptr)args->a1, (GLvoid*)parg);
 		break;
@@ -434,6 +458,9 @@
 	case glfnUniform4i:
 		glUniform4i((GLint)args->a0, (GLint)args->a1, (GLint)args->a2, (GLint)args->a3, (GLint)args->a4);
 		break;
+	case glfnUniform4ui:
+		glUniform4ui((GLint)args->a0, (GLuint)args->a1, (GLuint)args->a2, (GLuint)args->a3, (GLuint)args->a4);
+		break;
 	case glfnUniform4iv:
 		glUniform4iv((GLint)args->a0, (GLsizeiptr)args->a1, (GLvoid*)parg);
 		break;
@@ -446,6 +473,24 @@
 	case glfnUniformMatrix4fv:
 		glUniformMatrix4fv((GLint)args->a0, (GLsizeiptr)args->a1, 0, (GLvoid*)parg);
 		break;
+	case glfnUniformMatrix2x3fv:
+		glUniformMatrix2x3fv((GLint)args->a0, (GLsizeiptr)args->a1, 0, (GLvoid*)parg);
+		break;
+	case glfnUniformMatrix3x2fv:
+		glUniformMatrix3x2fv((GLint)args->a0, (GLsizeiptr)args->a1, 0, (GLvoid*)parg);
+		break;
+	case glfnUniformMatrix2x4fv:
+		glUniformMatrix2x4fv((GLint)args->a0, (GLsizeiptr)args->a1, 0, (GLvoid*)parg);
+		break;
+	case glfnUniformMatrix4x2fv:
+		glUniformMatrix4x2fv((GLint)args->a0, (GLsizeiptr)args->a1, 0, (GLvoid*)parg);
+		break;
+	case glfnUniformMatrix3x4fv:
+		glUniformMatrix3x4fv((GLint)args->a0, (GLsizeiptr)args->a1, 0, (GLvoid*)parg);
+		break;
+	case glfnUniformMatrix4x3fv:
+		glUniformMatrix4x3fv((GLint)args->a0, (GLsizeiptr)args->a1, 0, (GLvoid*)parg);
+		break;
 	case glfnUseProgram:
 		glUseProgram((GLint)args->a0);
 		break;
diff --git a/gl/work.h b/gl/work.h
index 3d9a81b..dc494ba 100644
--- a/gl/work.h
+++ b/gl/work.h
@@ -45,7 +45,6 @@
 	glfnBlendEquationSeparate,
 	glfnBlendFunc,
 	glfnBlendFuncSeparate,
-	glfnBlitFramebuffer,
 	glfnBufferData,
 	glfnBufferSubData,
 	glfnCheckFramebufferStatus,
@@ -174,6 +173,23 @@
 	glfnVertexAttrib4fv,
 	glfnVertexAttribPointer,
 	glfnViewport,
+
+	// ES 3.0 functions
+	glfnUniformMatrix2x3fv,
+	glfnUniformMatrix3x2fv,
+	glfnUniformMatrix2x4fv,
+	glfnUniformMatrix4x2fv,
+	glfnUniformMatrix3x4fv,
+	glfnUniformMatrix4x3fv,
+	glfnBlitFramebuffer,
+	glfnUniform1ui,
+	glfnUniform2ui,
+	glfnUniform3ui,
+	glfnUniform4ui,
+	glfnUniform1uiv,
+	glfnUniform2uiv,
+	glfnUniform3uiv,
+	glfnUniform4uiv,
 } glfn;
 
 // TODO: generate this type from fn.go.