radeon: drop unused members of radeon_state.
[mesa.git] / progs / samples / blendeq.c
index 12107f5a6d5d624a636e671428f2dcd0eab4e92c..037d06fa5285f88dc4ba49fe63f2442b81be5e6e 100644 (file)
 #include <string.h>
 #include <stdlib.h>
 #include <stdio.h>
-#ifdef _WIN32
-#include <windows.h>
-#endif
-#define GL_GLEXT_LEGACY
+#include <GL/glew.h>
 #include <GL/glut.h>
 
-
 GLenum doubleBuffer;
 static int dithering = 0;
+int use11ops = 0;
+int supportlogops = 0;
 static int doPrint = 1;
 static int deltaY;
 GLint windW, windH;
 
+static const struct {
+   GLenum mode;
+   const char *name;
+} LogicOpModes[] = {
+   { GL_SET, "GL_SET" },
+   { GL_COPY, "GL_COPY" },
+   { GL_NOOP, "GL_NOOP" },
+   { GL_AND, "GL_AND" },
+   { GL_INVERT, "GL_INVERT" },
+   { GL_OR, "GL_OR" },
+   { GL_XOR, "GL_XOR" },
+   { GL_NOR, "GL_NOR" },
+   { GL_NAND, "GL_NAND" },
+   { GL_OR_REVERSE, "GL_OR_REVERSE" },
+   { GL_OR_INVERTED, "GL_OR_INVERTED" },
+   { GL_AND_INVERTED, "GL_AND_INVERTED" },
+   { 0, NULL }
+};
+
+
+
 static void DrawString(const char *string)
 {
     int i;
@@ -46,7 +65,7 @@ static void Reshape(int width, int height)
     windH = (GLint)height;
 
     glViewport(0, 0, (GLint)width, (GLint)height);
-    deltaY = windH /16;
+    deltaY = windH /20;
 
     glMatrixMode(GL_PROJECTION);
     glLoadIdentity();
@@ -63,6 +82,13 @@ static void Key(unsigned char key, int x, int y)
       case 'd':
        dithering = !dithering;
        break;
+      case 'l':
+        if (supportlogops == 3)
+           use11ops = (!use11ops);
+        if (use11ops)
+           printf("Using GL 1.1 color logic ops.\n");
+        else printf("Using GL_EXT_blend_logic_op.\n");
+        break;
       default:
        return;
     }
@@ -74,7 +100,7 @@ static void PrintColorStrings( void )
 {
     GLubyte ubbuf[3];
     int i, xleft, xright;
-    char colorString[18];
+    char colorString[100];
 
     xleft = 5 + windW/4;
     xright = 5 + windW/2;
@@ -97,10 +123,12 @@ static void Draw(void)
 {
     int stringOffset = 5, stringx = 8;
     int x1, x2, xleft, xright;
-    int i;
+    int i, k;
 
     (dithering) ? glEnable(GL_DITHER) : glDisable(GL_DITHER);
     glDisable(GL_BLEND);
+    if (supportlogops & 2)
+       glDisable(GL_COLOR_LOGIC_OP);
 
     glClearColor(0.5, 0.6, 0.1, 1.0);
     glClear(GL_COLOR_BUFFER_BIT);
@@ -112,6 +140,7 @@ static void Draw(void)
     /* Draw labels */
     glColor3f(0.8, 0.8, 0.0);
     i = windH - deltaY + stringOffset;
+
     glRasterPos2f(stringx, i); i -= deltaY;
     DrawString("SOURCE");
     glRasterPos2f(stringx, i); i -= deltaY;
@@ -126,21 +155,12 @@ static void Draw(void)
     DrawString("reverse_subtract");
     glRasterPos2f(stringx, i); i -= deltaY;
     DrawString("clear");
-    glRasterPos2f(stringx, i); i -= deltaY;
-    DrawString("set");
-    glRasterPos2f(stringx, i); i -= deltaY;
-    DrawString("copy");
-    glRasterPos2f(stringx, i); i -= deltaY;
-    DrawString("noop");
-    glRasterPos2f(stringx, i); i -= deltaY;
-    DrawString("and");
-    glRasterPos2f(stringx, i); i -= deltaY;
-    DrawString("invert");
-    glRasterPos2f(stringx, i); i -= deltaY;
-    DrawString("or");
-    glRasterPos2f(stringx, i); i -= deltaY;
-    DrawString("xor");
 
+    for (k = 0; LogicOpModes[k].name; k++) {
+       glRasterPos2f(stringx, i);
+       i -= deltaY;
+       DrawString(LogicOpModes[k].name);
+    }
 
     i = windH - deltaY;
     x1 = windW/4;
@@ -176,52 +196,30 @@ static void Draw(void)
 
     glBlendFunc(GL_ONE, GL_ZERO);
     i -= deltaY;
-    glBlendEquationEXT(GL_LOGIC_OP);
+    if (!use11ops)
+       glBlendEquationEXT(GL_LOGIC_OP);
+    else
+       glEnable(GL_COLOR_LOGIC_OP);
     glLogicOp(GL_CLEAR);
     glRectf(x1, i, x2, i+deltaY);
 
-    i -= deltaY;
-    glBlendEquationEXT(GL_LOGIC_OP);
-    glLogicOp(GL_SET);
-    glRectf(x1, i, x2, i+deltaY);
-
-    i -= deltaY;
-    glBlendEquationEXT(GL_LOGIC_OP);
-    glLogicOp(GL_COPY);
-    glRectf(x1, i, x2, i+deltaY);
-
-    i -= deltaY;
-    glBlendEquationEXT(GL_LOGIC_OP);
-    glLogicOp(GL_NOOP);
-    glRectf(x1, i, x2, i+deltaY);
-
-    i -= deltaY;
-    glBlendEquationEXT(GL_LOGIC_OP);
-    glLogicOp(GL_AND);
-    glRectf(x1, i, x2, i+deltaY);
-
-    i -= deltaY;
-    glBlendEquationEXT(GL_LOGIC_OP);
-    glLogicOp(GL_INVERT);
-    glRectf(x1, i, x2, i+deltaY);
-
-    i -= deltaY;
-    glBlendEquationEXT(GL_LOGIC_OP);
-    glLogicOp(GL_OR);
-    glRectf(x1, i, x2, i+deltaY);
-
-    i -= deltaY;
-    glBlendEquationEXT(GL_LOGIC_OP);
-    glLogicOp(GL_XOR);
-    glRectf(x1, i, x2, i+deltaY);
-    glRectf(x1, i+10, x2, i+5);
+    for (k = 0; LogicOpModes[k].name; k++) {
+       i -= deltaY;
+       glLogicOp(LogicOpModes[k].mode);
+       glRectf(x1, i, x2, i+deltaY);
+       if (LogicOpModes[k].mode == GL_XOR) {
+          glRectf(x1, i+10, x2, i+5);
+       }
+    }
 
-  if (doPrint) {
-      glDisable(GL_BLEND);
-      glColor3f(1.0, 1.0, 1.0);
-      PrintColorStrings();
-  }
-  glFlush();
+    if (doPrint) {
+       glDisable(GL_BLEND);
+       if (supportlogops & 2)
+          glDisable(GL_COLOR_LOGIC_OP);
+       glColor3f(1.0, 1.0, 1.0);
+       PrintColorStrings();
+    }
+    glFlush();
 
     if (doubleBuffer) {
        glutSwapBuffers();
@@ -255,6 +253,7 @@ int main(int argc, char **argv)
     char *extName1 = "GL_EXT_blend_logic_op";
     char *extName2 = "GL_EXT_blend_minmax";
     char *extName3 = "GL_EXT_blend_subtract";
+    char *version;
 
     glutInit(&argc, argv);
 
@@ -262,7 +261,7 @@ int main(int argc, char **argv)
        exit(1);
     }
 
-    glutInitWindowPosition(0, 0); glutInitWindowSize( 800, 400);
+    glutInitWindowPosition(0, 0); glutInitWindowSize( 800, 520);
 
     type = GLUT_RGB;
     type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
@@ -272,12 +271,25 @@ int main(int argc, char **argv)
        exit(1);
     }
 
+    glewInit();
+
     /* Make sure blend_logic_op extension is there. */
     s = (char *) glGetString(GL_EXTENSIONS);
+    version = (char*) glGetString(GL_VERSION);
     if (!s)
        exit(1);
-    if (strstr(s,extName1) == 0) {
-       printf("Blend_logic_op extension is not present.\n");
+    if (strstr(s,extName1)) {
+       supportlogops = 1;
+        use11ops = 0;
+        printf("blend_logic_op extension available.\n");
+    }
+    if (strncmp(version,"1.1",3)>=0) {
+       supportlogops += 2;
+        use11ops = 1;
+       printf("1.1 color logic ops available.\n");
+    }
+    if (supportlogops == 0) {
+       printf("Blend_logic_op extension and GL 1.1 not present.\n");
        exit(1);
     }
     if (strstr(s,extName2) == 0) {