progs/perf: added helpers for creating simple textures and shader programs
authorBrian Paul <brianp@vmware.com>
Mon, 21 Sep 2009 17:58:03 +0000 (11:58 -0600)
committerBrian Paul <brianp@vmware.com>
Mon, 21 Sep 2009 17:58:03 +0000 (11:58 -0600)
progs/perf/glmain.c
progs/perf/glmain.h

index 62d14259f8b3d8b183957b191a44a4b4dc8a3788..83c7b8a79c8dfbc359a442b35ab7aa7910bb0fab 100644 (file)
@@ -26,6 +26,7 @@
  */
 
 
+#include <stdio.h>
 #include "glmain.h"
 #include <GL/glut.h>
 
@@ -50,6 +51,108 @@ PerfSwapBuffers(void)
 }
 
 
+/** make simple checkerboard texture object */
+GLuint
+PerfCheckerTexture(GLsizei width, GLsizei height)
+{
+   const GLenum filter = GL_NEAREST;
+   GLubyte *img = (GLubyte *) malloc(width * height * 4);
+   GLint i, j, k;
+   GLuint obj;
+
+   k = 0;
+   for (i = 0; i < height; i++) {
+      for (j = 0; j < width; j++) {
+         GLubyte color;
+         if (((i / 8) ^ (j / 8)) & 1) {
+            color = 0xff;
+         }
+         else {
+            color = 0x0;
+         }
+         img[k++] = color;
+         img[k++] = color;
+         img[k++] = color;
+         img[k++] = color;
+      }
+   }
+
+   glGenTextures(1, &obj);
+   glBindTexture(GL_TEXTURE_2D, obj);
+   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter);
+   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter);
+   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0,
+                GL_RGBA, GL_UNSIGNED_BYTE, img);
+   free(img);
+
+   return obj;
+}
+
+
+static GLuint
+CompileShader(GLenum type, const char *shader)
+{
+   GLuint sh;
+   GLint stat;
+
+   sh = glCreateShader(type);
+   glShaderSource(sh, 1, (const GLchar **) &shader, NULL);
+
+   glCompileShader(sh);
+      
+   glGetShaderiv(sh, GL_COMPILE_STATUS, &stat);
+   if (!stat) {
+      GLchar log[1000];
+      GLsizei len;
+      glGetShaderInfoLog(sh, 1000, &len, log);
+      fprintf(stderr, "Error: problem compiling shader: %s\n", log);
+      exit(1);
+   }
+
+   return sh;
+}
+
+
+/** Make shader program from given vert/frag shader text */
+GLuint
+PerfShaderProgram(const char *vertShader, const char *fragShader)
+{
+   GLuint prog;
+   GLint stat;
+
+   {
+      const char *version = (const char *) glGetString(GL_VERSION);
+      if (version[0] != '2' || version[1] != '.') {
+         fprintf(stderr, "Error: GL version 2.x required\n");
+         exit(1);
+      }
+   }
+
+   prog = glCreateProgram();
+
+   if (vertShader) {
+      GLuint vs = CompileShader(GL_VERTEX_SHADER, vertShader);
+      glAttachShader(prog, vs);
+   }
+   if (fragShader) {
+      GLuint fs = CompileShader(GL_FRAGMENT_SHADER, fragShader);
+      glAttachShader(prog, fs);
+   }
+
+   glLinkProgram(prog);
+   glGetProgramiv(prog, GL_LINK_STATUS, &stat);
+   if (!stat) {
+      GLchar log[1000];
+      GLsizei len;
+      glGetProgramInfoLog(prog, 1000, &len, log);
+      fprintf(stderr, "Shader link error:\n%s\n", log);
+      exit(1);
+   }
+
+   return prog;
+}
+
+
 static void
 Idle(void)
 {
index fe11d7235e0477dd23b7a7dc49d4805a05aa0d25..91f2eb3e74e540e18cb27c88100ec42c68c8a653 100644 (file)
@@ -40,6 +40,12 @@ PerfGetTime(void);
 extern void
 PerfSwapBuffers(void);
 
+extern GLuint
+PerfCheckerTexture(GLsizei width, GLsizei height);
+
+extern GLuint
+PerfShaderProgram(const char *vertShader, const char *fragShader);
+
 
 /** Test programs must implement these functions **/