changeset 20545:ed076b6fca0b draft

-Codechange: [OpenGL] Use generic vertex attributes in the shader program.
author Michael Lutz <michi@icosahedron.de>
date Sun, 02 Jun 2013 00:28:04 +0200
parents ef2b5b14c3bc
children 9b3254738575
files src/table/opengl_shader.h src/video/opengl.cpp
diffstat 2 files changed, 34 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/table/opengl_shader.h
+++ b/src/table/opengl_shader.h
@@ -12,9 +12,11 @@
 /** Vertex shader that just passes colour and tex coords through. */
 static const char *_vertex_shader_direct[] = {
 	"#version 110\n",
+	"attribute vec2 position, colour_uv;",
+	"varying vec2 colour_tex_uv;",
 	"void main() {",
-	"  gl_TexCoord[0] = gl_MultiTexCoord0;",
-	"  gl_Position = gl_Vertex;",
+	"  colour_tex_uv = colour_uv;",
+	"  gl_Position = vec4(position, 0.0, 1.0);",
 	"}",
 };
 
@@ -22,7 +24,8 @@
 static const char *_frag_shader_direct[] = {
 	"#version 110\n",
 	"uniform sampler2D colour_tex;",
+	"varying vec2 colour_tex_uv;",
 	"void main() {",
-	"  gl_FragColor = texture2D(colour_tex, gl_TexCoord[0].st);",
+	"  gl_FragColor = texture2D(colour_tex, colour_tex_uv);",
 	"}",
 };
--- a/src/video/opengl.cpp
+++ b/src/video/opengl.cpp
@@ -64,6 +64,11 @@
 static PFNGLGETUNIFORMLOCATIONPROC _glGetUniformLocation;
 static PFNGLUNIFORM1IPROC _glUniform1i;
 
+static PFNGLGETATTRIBLOCATIONPROC _glGetAttribLocation;
+static PFNGLENABLEVERTEXATTRIBARRAYPROC _glEnableVertexAttribArray;
+static PFNGLDISABLEVERTEXATTRIBARRAYPROC _glDisableVertexAttribArray;
+static PFNGLVERTEXATTRIBPOINTERARBPROC _glVertexAttribPointer;
+
 /** A simple 2D vertex with just position and texture. */
 struct Simple2DVertex {
 	float x, y;
@@ -229,6 +234,11 @@
 		_glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)GetOGLProcAddress("glGetShaderInfoLog");
 		_glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)GetOGLProcAddress("glGetUniformLocation");
 		_glUniform1i = (PFNGLUNIFORM1IPROC)GetOGLProcAddress("glUniform1i");
+
+		_glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)GetOGLProcAddress("glGetAttribLocation");
+		_glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)GetOGLProcAddress("glEnableVertexAttribArray");
+		_glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)GetOGLProcAddress("glDisableVertexAttribArray");
+		_glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERARBPROC)GetOGLProcAddress("glVertexAttribPointer");
 	} else {
 		/* In the ARB extension programs and shaders are in the same object space. */
 		_glCreateProgram = (PFNGLCREATEPROGRAMPROC)GetOGLProcAddress("glCreateProgramObjectARB");
@@ -246,11 +256,17 @@
 		_glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)GetOGLProcAddress("glGetInfoLogARB");
 		_glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)GetOGLProcAddress("glGetUniformLocationARB");
 		_glUniform1i = (PFNGLUNIFORM1IPROC)GetOGLProcAddress("glUniform1iARB");
+
+		_glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)GetOGLProcAddress("glGetAttribLocationARB");
+		_glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)GetOGLProcAddress("glEnableVertexAttribArrayARB");
+		_glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)GetOGLProcAddress("glDisableVertexAttribArrayARB");
+		_glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERARBPROC)GetOGLProcAddress("glVertexAttribPointerARB");
 	}
 
 	return _glCreateProgram != NULL && _glDeleteProgram != NULL && _glLinkProgram != NULL && _glGetProgramiv != NULL && _glGetProgramInfoLog != NULL &&
 		_glCreateShader != NULL && _glDeleteShader != NULL && _glShaderSource != NULL && _glCompileShader != NULL && _glAttachShader != NULL &&
-		_glGetShaderiv != NULL && _glGetShaderInfoLog != NULL && _glGetUniformLocation != NULL && _glUniform1i != NULL;
+		_glGetShaderiv != NULL && _glGetShaderInfoLog != NULL && _glGetUniformLocation != NULL && _glUniform1i != NULL &&
+		_glGetAttribLocation != NULL && _glEnableVertexAttribArray != NULL && _glDisableVertexAttribArray != NULL && _glVertexAttribPointer != NULL;
 }
 
 
@@ -300,7 +316,11 @@
 	if (!IsOpenGLVersionAtLeast(3, 0) && (!IsOpenGLExtensionSupported("GL_ARB_vertex_array_object") || !IsOpenGLExtensionSupported("GL_APPLE_vertex_array_object"))) return "Vertex array objects not supported";
 	if (!BindVBAExtension()) return "Failed to bind VBA extension functions";
 	/* Check for shader objects. */
-	if (!IsOpenGLVersionAtLeast(2, 0) && !IsOpenGLExtensionSupported("GL_ARB_shader_objects")) return "No shader support";
+	if (!IsOpenGLVersionAtLeast(2, 0)) {
+		if (!IsOpenGLExtensionSupported("GL_ARB_shader_objects")) return "No shader support";
+		if (!IsOpenGLExtensionSupported("GL_ARB_vertex_program")) return "Vertex programs not supported";
+		if (!IsOpenGLExtensionSupported("GL_ARB_vertex_shader")) return "Vertex shaders not supported";
+	}
 	if (!BindShaderExtensions()) return "Failed to bind shader extension functions";
 
 	DEBUG(driver, 2, "OpenGL shading language version: %s", (const char *)glGetString(GL_SHADING_LANGUAGE_VERSION));
@@ -349,10 +369,12 @@
 	if (glGetError() != GL_NO_ERROR) return "Can't generate VBO for fullscreen quad";
 
 	/* Set vertex state. */
-	glEnableClientState(GL_VERTEX_ARRAY);
-	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
-	glVertexPointer(2, GL_FLOAT, sizeof(Simple2DVertex), (GLvoid *)offsetof(Simple2DVertex, x));
-	glTexCoordPointer(2, GL_FLOAT, sizeof(Simple2DVertex), (GLvoid *)offsetof(Simple2DVertex, u));
+	GLint loc_position = _glGetAttribLocation(this->vid_program, "position");
+	GLint colour_position = _glGetAttribLocation(this->vid_program, "colour_uv");
+	_glEnableVertexAttribArray(loc_position);
+	_glEnableVertexAttribArray(colour_position);
+	_glVertexAttribPointer(loc_position, 2, GL_FLOAT, GL_FALSE, sizeof(Simple2DVertex), (GLvoid *)offsetof(Simple2DVertex, x));
+	_glVertexAttribPointer(colour_position, 2, GL_FLOAT, GL_FALSE, sizeof(Simple2DVertex), (GLvoid *)offsetof(Simple2DVertex, u));
 	_glBindVertexArray(0);
 
 	glClearColor(0.0f, 0.0f, 0.0f, 1.0f);