Bläddra i källkod

new opengl binding dev

leonsal 8 år sedan
förälder
incheckning
d117d114b4
5 ändrade filer med 86 tillägg och 24 borttagningar
  1. 6 8
      gls/build.go
  2. 13 0
      gls/doc.go
  3. 56 0
      gls/glapi.c
  4. 4 13
      gls/glapi2go/main.go
  5. 7 3
      gls/gls.go

+ 6 - 8
gls/build.go

@@ -7,12 +7,10 @@ package gls
 //go:generate glapi2go glcorearb.h
 
 // // Platform build flags
-// #cgo freebsd CFLAGS: -DGL_GLEXT_PROTOTYPES
-// #cgo freebsd LDFLAGS: -ldl -lGL
-//
-// #cgo linux CFLAGS: -DGL_GLEXT_PROTOTYPES
-// #cgo linux LDFLAGS: -ldl -lGL
-//
-// #cgo windows CFLAGS: -DGL_GLEXT_PROTOTYPES
-// #cgo windows LDFLAGS: -lopengl32
+// #cgo freebsd CFLAGS:  -DGL_GLEXT_PROTOTYPES
+// #cgo freebsd LDFLAGS: -ldl
+// #cgo linux   CFLAGS:  -DGL_GLEXT_PROTOTYPES
+// #cgo linux   LDFLAGS: -ldl
+// #cgo windows CFLAGS:  -DGL_GLEXT_PROTOTYPES
+// #cgo darwin  LDFLAGS: -framework OpenGL
 import "C"

+ 13 - 0
gls/doc.go

@@ -0,0 +1,13 @@
+// Copyright 2016 The G3N Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package gls implements a loader of OpenGL functions for the platform
+// and a Go binding for selected OpenGL functions. The binding maintains
+// some cached state to minimize the number of C function calls.
+// The OpenGL function loader is generated by the "glapi2go" tool by
+// parsing the OpenGL "glcorearb.h" header file
+//
+// This package also contains abstractions for some OpenGL object such as Program,
+// Uniform, VBO and others.
+package gls

+ 56 - 0
gls/glapi.c

@@ -209,6 +209,7 @@ static PFNGLGETDOUBLEVPROC                            pglGetDoublev;
 static PFNGLGETERRORPROC                              pglGetError;
 static PFNGLGETFLOATVPROC                             pglGetFloatv;
 static PFNGLGETINTEGERVPROC                           pglGetIntegerv;
+static PFNGLGETSTRINGPROC                             pglGetString;
 static PFNGLGETTEXIMAGEPROC                           pglGetTexImage;
 static PFNGLGETTEXPARAMETERFVPROC                     pglGetTexParameterfv;
 static PFNGLGETTEXPARAMETERIVPROC                     pglGetTexParameteriv;
@@ -268,6 +269,7 @@ static PFNGLISBUFFERPROC                              pglIsBuffer;
 static PFNGLBUFFERDATAPROC                            pglBufferData;
 static PFNGLBUFFERSUBDATAPROC                         pglBufferSubData;
 static PFNGLGETBUFFERSUBDATAPROC                      pglGetBufferSubData;
+static PFNGLMAPBUFFERPROC                             pglMapBuffer;
 static PFNGLUNMAPBUFFERPROC                           pglUnmapBuffer;
 static PFNGLGETBUFFERPARAMETERIVPROC                  pglGetBufferParameteriv;
 static PFNGLGETBUFFERPOINTERVPROC                     pglGetBufferPointerv;
@@ -427,6 +429,7 @@ static PFNGLCLEARBUFFERIVPROC                         pglClearBufferiv;
 static PFNGLCLEARBUFFERUIVPROC                        pglClearBufferuiv;
 static PFNGLCLEARBUFFERFVPROC                         pglClearBufferfv;
 static PFNGLCLEARBUFFERFIPROC                         pglClearBufferfi;
+static PFNGLGETSTRINGIPROC                            pglGetStringi;
 static PFNGLISRENDERBUFFERPROC                        pglIsRenderbuffer;
 static PFNGLBINDRENDERBUFFERPROC                      pglBindRenderbuffer;
 static PFNGLDELETERENDERBUFFERSPROC                   pglDeleteRenderbuffers;
@@ -447,6 +450,7 @@ static PFNGLGENERATEMIPMAPPROC                        pglGenerateMipmap;
 static PFNGLBLITFRAMEBUFFERPROC                       pglBlitFramebuffer;
 static PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC        pglRenderbufferStorageMultisample;
 static PFNGLFRAMEBUFFERTEXTURELAYERPROC               pglFramebufferTextureLayer;
+static PFNGLMAPBUFFERRANGEPROC                        pglMapBufferRange;
 static PFNGLFLUSHMAPPEDBUFFERRANGEPROC                pglFlushMappedBufferRange;
 static PFNGLBINDVERTEXARRAYPROC                       pglBindVertexArray;
 static PFNGLDELETEVERTEXARRAYSPROC                    pglDeleteVertexArrays;
@@ -556,6 +560,7 @@ static void load_procs() {
 	pglGetError = (PFNGLGETERRORPROC)get_proc("glGetError"); 
 	pglGetFloatv = (PFNGLGETFLOATVPROC)get_proc("glGetFloatv"); 
 	pglGetIntegerv = (PFNGLGETINTEGERVPROC)get_proc("glGetIntegerv"); 
+	pglGetString = (PFNGLGETSTRINGPROC)get_proc("glGetString"); 
 	pglGetTexImage = (PFNGLGETTEXIMAGEPROC)get_proc("glGetTexImage"); 
 	pglGetTexParameterfv = (PFNGLGETTEXPARAMETERFVPROC)get_proc("glGetTexParameterfv"); 
 	pglGetTexParameteriv = (PFNGLGETTEXPARAMETERIVPROC)get_proc("glGetTexParameteriv"); 
@@ -615,6 +620,7 @@ static void load_procs() {
 	pglBufferData = (PFNGLBUFFERDATAPROC)get_proc("glBufferData"); 
 	pglBufferSubData = (PFNGLBUFFERSUBDATAPROC)get_proc("glBufferSubData"); 
 	pglGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC)get_proc("glGetBufferSubData"); 
+	pglMapBuffer = (PFNGLMAPBUFFERPROC)get_proc("glMapBuffer"); 
 	pglUnmapBuffer = (PFNGLUNMAPBUFFERPROC)get_proc("glUnmapBuffer"); 
 	pglGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC)get_proc("glGetBufferParameteriv"); 
 	pglGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC)get_proc("glGetBufferPointerv"); 
@@ -774,6 +780,7 @@ static void load_procs() {
 	pglClearBufferuiv = (PFNGLCLEARBUFFERUIVPROC)get_proc("glClearBufferuiv"); 
 	pglClearBufferfv = (PFNGLCLEARBUFFERFVPROC)get_proc("glClearBufferfv"); 
 	pglClearBufferfi = (PFNGLCLEARBUFFERFIPROC)get_proc("glClearBufferfi"); 
+	pglGetStringi = (PFNGLGETSTRINGIPROC)get_proc("glGetStringi"); 
 	pglIsRenderbuffer = (PFNGLISRENDERBUFFERPROC)get_proc("glIsRenderbuffer"); 
 	pglBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)get_proc("glBindRenderbuffer"); 
 	pglDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)get_proc("glDeleteRenderbuffers"); 
@@ -794,6 +801,7 @@ static void load_procs() {
 	pglBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)get_proc("glBlitFramebuffer"); 
 	pglRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)get_proc("glRenderbufferStorageMultisample"); 
 	pglFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)get_proc("glFramebufferTextureLayer"); 
+	pglMapBufferRange = (PFNGLMAPBUFFERRANGEPROC)get_proc("glMapBufferRange"); 
 	pglFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC)get_proc("glFlushMappedBufferRange"); 
 	pglBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)get_proc("glBindVertexArray"); 
 	pglDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC)get_proc("glDeleteVertexArrays"); 
@@ -1335,6 +1343,18 @@ void glGetIntegerv (GLenum pname, GLint *data) {
 	
 }
 
+const GLubyte * glGetString (GLenum name) {
+
+	const GLubyte * res = pglGetString(name);
+	if (checkError) {
+		GLenum err = pglGetError();
+		if (err != GL_NO_ERROR) {
+			panic(err, "glGetString");
+		}
+	}
+	return res;
+}
+
 void glGetTexImage (GLenum target, GLint level, GLenum format, GLenum type, void *pixels) {
 
 	pglGetTexImage(target, level, format, type, pixels);
@@ -2043,6 +2063,18 @@ void glGetBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, void *
 	
 }
 
+void * glMapBuffer (GLenum target, GLenum access) {
+
+	void * res = pglMapBuffer(target, access);
+	if (checkError) {
+		GLenum err = pglGetError();
+		if (err != GL_NO_ERROR) {
+			panic(err, "glMapBuffer");
+		}
+	}
+	return res;
+}
+
 GLboolean glUnmapBuffer (GLenum target) {
 
 	GLboolean res = pglUnmapBuffer(target);
@@ -3951,6 +3983,18 @@ void glClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint sten
 	
 }
 
+const GLubyte * glGetStringi (GLenum name, GLuint index) {
+
+	const GLubyte * res = pglGetStringi(name, index);
+	if (checkError) {
+		GLenum err = pglGetError();
+		if (err != GL_NO_ERROR) {
+			panic(err, "glGetStringi");
+		}
+	}
+	return res;
+}
+
 GLboolean glIsRenderbuffer (GLuint renderbuffer) {
 
 	GLboolean res = pglIsRenderbuffer(renderbuffer);
@@ -4191,6 +4235,18 @@ void glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture
 	
 }
 
+void * glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access) {
+
+	void * res = pglMapBufferRange(target, offset, length, access);
+	if (checkError) {
+		GLenum err = pglGetError();
+		if (err != GL_NO_ERROR) {
+			panic(err, "glMapBufferRange");
+		}
+	}
+	return res;
+}
+
 void glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length) {
 
 	pglFlushMappedBufferRange(target, offset, length);

+ 4 - 13
gls/glapi2go/main.go

@@ -19,8 +19,7 @@ const (
 
 // Command line options
 var (
-	oVersion = flag.Bool("version", false, "Show version and exits")
-	oLoader  = flag.String("loader", "loader.c", "Name for the generated C loader file")
+	oGLVersion = flag.String("glversion", "GL_VERSION_3_3", "OpenGL version to use")
 )
 
 const (
@@ -28,7 +27,6 @@ const (
 	fileGLAPIH   = "glapi.h"
 	fileGLPARAMH = "glparam.h"
 	fileCONSTS   = "consts.go"
-	glMaxVersion = "GL_VERSION_3_3"
 )
 
 // Maps OpenGL types to Go
@@ -59,12 +57,6 @@ func main() {
 	flag.Usage = usage
 	flag.Parse()
 
-	// Print version and exits
-	if *oVersion == true {
-		fmt.Fprintf(os.Stderr, "%s v%d.%d\n", PROGNAME, VMAJOR, VMINOR)
-		return
-	}
-
 	// Checks for input header file
 	if len(flag.Args()) == 0 {
 		usage()
@@ -117,7 +109,7 @@ func parser(fheader io.Reader, h *GLHeader) error {
 
 	// Regex to parse function definition line,
 	// capturing return value (1), function name (2) and parameters (3)
-	rexApi := regexp.MustCompile(`GLAPI\s+(\w+)\s+APIENTRY\s+(\w+)\s+\((.*)\)`)
+	rexApi := regexp.MustCompile(`GLAPI\s+(.*)APIENTRY\s+(\w+)\s+\((.*)\)`)
 
 	h.Defines = make([]GLDefine, 0)
 	h.Funcs = make([]GLFunc, 0)
@@ -134,7 +126,7 @@ func parser(fheader io.Reader, h *GLHeader) error {
 		// OpenGL version
 		res := rexEndif.FindStringSubmatch(line)
 		if len(res) > 0 {
-			if res[1] == glMaxVersion {
+			if res[1] == *oGLVersion {
 				break
 			}
 		}
@@ -155,12 +147,11 @@ func parser(fheader io.Reader, h *GLHeader) error {
 		res = rexApi.FindStringSubmatch(line)
 		if len(res) >= 2 {
 			var f GLFunc
-			f.Rtype = res[1]
+			f.Rtype = strings.Trim(res[1], " ")
 			f.Ptype = "PFN" + strings.ToUpper(res[2]) + "PROC"
 			f.Fname = res[2]
 			f.FnameGo = glfname2go(res[2])
 			f.Pname = "p" + f.Fname
-			f.Rtype = res[1]
 			f.CParams = res[3]
 			err := parseParams(res[3], &f)
 			if err != nil {

+ 7 - 3
gls/gls.go

@@ -46,7 +46,9 @@ type GLS struct {
 	cbuf                []byte            // conversion buffer with C memory
 }
 
-// Stats contains several counter
+// Stats contains counters of OpenGL resources being used as well
+// the cummulative numbers of some OpenGL calls activities for performance
+// evaluation.
 type Stats struct {
 	Vaos      int    // Number of Vertex Array Objects
 	Vbos      int    // Number of Vertex Buffer Objects
@@ -85,7 +87,7 @@ func New() (*GLS, error) {
 	if err != 0 {
 		return nil, fmt.Errorf("Error loading OpenGL")
 	}
-	gs.SetDefaultState()
+	gs.setDefaultState()
 	gs.checkErrors = true
 
 	// Preallocates conversion buffers
@@ -140,7 +142,9 @@ func (gs *GLS) reset() {
 	gs.polygonOffsetUnits = -1
 }
 
-func (gs *GLS) SetDefaultState() {
+// setDefaultState is used internally to set the initial state of OpenGL
+// for this context.
+func (gs *GLS) setDefaultState() {
 
 	C.glClearColor(0, 0, 0, 1)
 	C.glClearDepth(1)