From 53f8dccd0c9ab0b55e24dd5d624bbaaf0c8c284b Mon Sep 17 00:00:00 2001 From: Keith Whitwell Date: Tue, 30 Jun 2009 12:20:24 +0100 Subject: progs/trivial: test case for dlist statechange elimination Creates a display list with redundant call to glShadeModel. View dlist contents with MESA_VERBOSE=list --- progs/trivial/Makefile | 1 + 1 file changed, 1 insertion(+) (limited to 'progs/trivial/Makefile') diff --git a/progs/trivial/Makefile b/progs/trivial/Makefile index 22de83fa79..d2a4c0c13d 100644 --- a/progs/trivial/Makefile +++ b/progs/trivial/Makefile @@ -19,6 +19,7 @@ SOURCES = \ clear-random.c \ clear.c \ dlist-dangling.c \ + dlist-tri-flat-tri.c \ dlist-edgeflag-dangling.c \ dlist-edgeflag.c \ dlist-degenerate.c \ -- cgit v1.2.3 From 6af783bea0e171582f86c8456ca521ac242abc39 Mon Sep 17 00:00:00 2001 From: Keith Whitwell Date: Tue, 30 Jun 2009 16:19:23 +0100 Subject: progs/trivial: add test case for lighting plus per-vertex materials Exercise material-within-begin/end case. --- progs/trivial/Makefile | 1 + progs/trivial/tri-lit-material.c | 149 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 150 insertions(+) create mode 100644 progs/trivial/tri-lit-material.c (limited to 'progs/trivial/Makefile') diff --git a/progs/trivial/Makefile b/progs/trivial/Makefile index 22de83fa79..de862b067c 100644 --- a/progs/trivial/Makefile +++ b/progs/trivial/Makefile @@ -105,6 +105,7 @@ SOURCES = \ tri-fp.c \ tri-fp-const-imm.c \ tri-lit.c \ + tri-lit-material.c \ tri-mask-tri.c \ tri-orig.c \ tri-query.c \ diff --git a/progs/trivial/tri-lit-material.c b/progs/trivial/tri-lit-material.c new file mode 100644 index 0000000000..ff9fb2c4dd --- /dev/null +++ b/progs/trivial/tri-lit-material.c @@ -0,0 +1,149 @@ +/* + * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the name of + * Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF + * ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#include +#include +#include +#include + + +#define CI_OFFSET_1 16 +#define CI_OFFSET_2 32 + + +GLenum doubleBuffer; + +static void Init(void) +{ + fprintf(stderr, "GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER)); + fprintf(stderr, "GL_VERSION = %s\n", (char *) glGetString(GL_VERSION)); + fprintf(stderr, "GL_VENDOR = %s\n", (char *) glGetString(GL_VENDOR)); + fflush(stderr); + + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + + glClearColor(0.0, 0.0, 1.0, 0.0); +} + +static void Reshape(int width, int height) +{ + + glViewport(0, 0, (GLint)width, (GLint)height); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); +/* glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0); */ + glMatrixMode(GL_MODELVIEW); +} + +static void Key(unsigned char key, int x, int y) +{ + + switch (key) { + case 27: + exit(1); + default: + return; + } + + glutPostRedisplay(); +} + +static void Draw(void) +{ + static GLfloat red[4] = {0.8, 0.1, 0.0, 1.0}; + static GLfloat green[4] = {0.0, 0.8, 0.2, 1.0}; + static GLfloat blue[4] = {0.2, 0.2, .9, 1.0}; + + glClear(GL_COLOR_BUFFER_BIT); + + glBegin(GL_TRIANGLES); + glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue); + glNormal3f(0,0,.7); + glVertex3f( 0.9, -0.9, -0.0); + + glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green); + glNormal3f(0,0,.8); + glVertex3f( 0.9, 0.9, -0.0); + + glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red); + glNormal3f(0,0,.9); + glVertex3f(-0.9, 0.0, -0.0); + glEnd(); + + glFlush(); + + if (doubleBuffer) { + glutSwapBuffers(); + } +} + +static GLenum Args(int argc, char **argv) +{ + GLint i; + + doubleBuffer = GL_FALSE; + + for (i = 1; i < argc; i++) { + if (strcmp(argv[i], "-sb") == 0) { + doubleBuffer = GL_FALSE; + } else if (strcmp(argv[i], "-db") == 0) { + doubleBuffer = GL_TRUE; + } else { + fprintf(stderr, "%s (Bad option).\n", argv[i]); + return GL_FALSE; + } + } + return GL_TRUE; +} + +int main(int argc, char **argv) +{ + GLenum type; + + glutInit(&argc, argv); + + if (Args(argc, argv) == GL_FALSE) { + exit(1); + } + + glutInitWindowPosition(0, 0); glutInitWindowSize( 250, 250); + + type = GLUT_RGB | GLUT_ALPHA; + type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE; + glutInitDisplayMode(type); + + if (glutCreateWindow(*argv) == GL_FALSE) { + exit(1); + } + + Init(); + + glutReshapeFunc(Reshape); + glutKeyboardFunc(Key); + glutDisplayFunc(Draw); + glutMainLoop(); + return 0; +} -- cgit v1.2.3 From 2e570be85211f603b820dd2c5e9aa2f29a51fc66 Mon Sep 17 00:00:00 2001 From: Keith Whitwell Date: Tue, 30 Jun 2009 17:02:16 +0100 Subject: progs/trivial: add dlist-recursive-call When one display list calls another display list, it is possible that the calling display list makes state-changes or other actions which invalidate any attempt at caching or state-change elimination in the calling list. This test exercises one such case, where the called list consists of just a single glShadeModel() call. --- progs/trivial/Makefile | 1 + progs/trivial/dlist-recursive-call.c | 190 +++++++++++++++++++++++++++++++++++ 2 files changed, 191 insertions(+) create mode 100644 progs/trivial/dlist-recursive-call.c (limited to 'progs/trivial/Makefile') diff --git a/progs/trivial/Makefile b/progs/trivial/Makefile index ec67d11364..0209c50950 100644 --- a/progs/trivial/Makefile +++ b/progs/trivial/Makefile @@ -20,6 +20,7 @@ SOURCES = \ clear.c \ dlist-dangling.c \ dlist-tri-flat-tri.c \ + dlist-recursive-call.c \ dlist-edgeflag-dangling.c \ dlist-edgeflag.c \ dlist-degenerate.c \ diff --git a/progs/trivial/dlist-recursive-call.c b/progs/trivial/dlist-recursive-call.c new file mode 100644 index 0000000000..fe06b2bbd7 --- /dev/null +++ b/progs/trivial/dlist-recursive-call.c @@ -0,0 +1,190 @@ +/* + * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the name of + * Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF + * ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#include +#include +#include +#include + + +#define CI_OFFSET_1 16 +#define CI_OFFSET_2 32 + + +GLenum doubleBuffer; +GLint first_list, list; + +static void Init(void) +{ + fprintf(stderr, "GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER)); + fprintf(stderr, "GL_VERSION = %s\n", (char *) glGetString(GL_VERSION)); + fprintf(stderr, "GL_VENDOR = %s\n", (char *) glGetString(GL_VENDOR)); + fflush(stderr); + + glClearColor(0.0, 0.0, 1.0, 0.0); + + /* First list will disrupt state which might potentially be + * short-circuited in calling list: + */ + first_list = glGenLists(1); + glNewList(first_list, GL_COMPILE); + glShadeModel( GL_SMOOTH ); + glEndList(); + + + /* List that looks like it might have redundant state: + */ + list = glGenLists(1); + glNewList(list, GL_COMPILE); + + glBegin(GL_TRIANGLES); + glColor3f(0,0,.7); + glVertex3f( 0.9, -0.9, -30.0); + glColor3f(.8,0,0); + glVertex3f( 0.9, 0.9, -30.0); + glColor3f(0,.9,0); + glVertex3f(-0.9, 0.0, -30.0); + glEnd(); + + glShadeModel( GL_FLAT ); + glBegin(GL_TRIANGLES); + glColor3f(0,0,.7); + glVertex3f( -0.9, 0.9, -30.0); + glColor3f(0,.9,0); + glVertex3f( -0.9, -0.9, -30.0); + glColor3f(.8,0,0); + glVertex3f( 0.9, 0.0, -30.0); + glEnd(); + + glCallList( first_list ); + + /* Do a quick begin/end to ensure we are not inside a dangling + * primitive from the called list: + */ + glBegin( GL_POINTS ); + glEnd(); + + /* This statechange is NOT redundant: + */ + glShadeModel( GL_FLAT ); + glBegin(GL_TRIANGLES); + glColor3f(1,0,0); + glVertex3f( -0.5, 0.5, -30.0); + glColor3f(0,1,0); + glVertex3f( -0.5, -0.5, -30.0); + glColor3f(0,0,1); + glVertex3f( 0.5, 0.0, -30.0); + glEnd(); + + glEndList(); +} + +static void Reshape(int width, int height) +{ + + glViewport(0, 0, (GLint)width, (GLint)height); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0); + glMatrixMode(GL_MODELVIEW); +} + +static void Key(unsigned char key, int x, int y) +{ + + switch (key) { + case 27: + exit(1); + default: + return; + } + + glutPostRedisplay(); +} + + + + +static void Draw(void) +{ + glClear(GL_COLOR_BUFFER_BIT); + + glShadeModel( GL_SMOOTH ); + glCallList(list); + + glFlush(); + + if (doubleBuffer) { + glutSwapBuffers(); + } +} + +static GLenum Args(int argc, char **argv) +{ + GLint i; + + doubleBuffer = GL_FALSE; + + for (i = 1; i < argc; i++) { + if (strcmp(argv[i], "-sb") == 0) { + doubleBuffer = GL_FALSE; + } else if (strcmp(argv[i], "-db") == 0) { + doubleBuffer = GL_TRUE; + } else { + fprintf(stderr, "%s (Bad option).\n", argv[i]); + return GL_FALSE; + } + } + return GL_TRUE; +} + +int main(int argc, char **argv) +{ + GLenum type; + + glutInit(&argc, argv); + + if (Args(argc, argv) == GL_FALSE) { + exit(1); + } + + glutInitWindowPosition(0, 0); glutInitWindowSize( 250, 250); + + type = GLUT_RGB | GLUT_ALPHA; + type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE; + glutInitDisplayMode(type); + + if (glutCreateWindow(*argv) == GL_FALSE) { + exit(1); + } + + Init(); + + glutReshapeFunc(Reshape); + glutKeyboardFunc(Key); + glutDisplayFunc(Draw); + glutMainLoop(); + return 0; +} -- cgit v1.2.3 From 09a3a28fc8f1ed931304bf27a56fe72768d7861e Mon Sep 17 00:00:00 2001 From: Keith Whitwell Date: Tue, 30 Jun 2009 17:06:50 +0100 Subject: progs/trivial: add dlist-flat-tri.c State-change functions which precede the first call to glEnd() in a compiled list are vulnerable to not being executed when that list is called. In particular this can happen if a list is invoked from within a begin/end pair, as in this example. --- progs/trivial/Makefile | 1 + progs/trivial/dlist-flat-tri.c | 171 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 172 insertions(+) create mode 100644 progs/trivial/dlist-flat-tri.c (limited to 'progs/trivial/Makefile') diff --git a/progs/trivial/Makefile b/progs/trivial/Makefile index 0209c50950..ae750db22a 100644 --- a/progs/trivial/Makefile +++ b/progs/trivial/Makefile @@ -19,6 +19,7 @@ SOURCES = \ clear-random.c \ clear.c \ dlist-dangling.c \ + dlist-flat-tri.c \ dlist-tri-flat-tri.c \ dlist-recursive-call.c \ dlist-edgeflag-dangling.c \ diff --git a/progs/trivial/dlist-flat-tri.c b/progs/trivial/dlist-flat-tri.c new file mode 100644 index 0000000000..c3dd7921e3 --- /dev/null +++ b/progs/trivial/dlist-flat-tri.c @@ -0,0 +1,171 @@ +/* + * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the name of + * Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF + * ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#include +#include +#include +#include + + +#define CI_OFFSET_1 16 +#define CI_OFFSET_2 32 + + +GLenum doubleBuffer; +GLint list; + +static void Init(void) +{ + fprintf(stderr, "GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER)); + fprintf(stderr, "GL_VERSION = %s\n", (char *) glGetString(GL_VERSION)); + fprintf(stderr, "GL_VENDOR = %s\n", (char *) glGetString(GL_VENDOR)); + fflush(stderr); + + glClearColor(0.0, 0.0, 1.0, 0.0); + + list = glGenLists(1); + glNewList(list, GL_COMPILE); + + /* XXX: this state-change will only be executed if list is called + * from outside a begin/end pair: + */ + glShadeModel( GL_FLAT ); + glBegin(GL_TRIANGLES); + glColor3f(0,0,.7); + glVertex3f( -0.9, 0.9, -30.0); + glColor3f(0,.9,0); + glVertex3f( -0.9, -0.9, -30.0); + glColor3f(.8,0,0); + glVertex3f( 0.9, 0.0, -30.0); + glEnd(); + + /* This statechange is potentially NOT redundant: + */ + glShadeModel( GL_FLAT ); + glBegin(GL_TRIANGLES); + glColor3f(0,1,0); + glVertex3f( -0.5, 0.5, -30.0); + glColor3f(0,0,1); + glVertex3f( -0.5, -0.5, -30.0); + glColor3f(1,0,0); + glVertex3f( 0.5, 0.0, -30.0); + glEnd(); + + glEndList(); +} + +static void Reshape(int width, int height) +{ + + glViewport(0, 0, (GLint)width, (GLint)height); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0); + glMatrixMode(GL_MODELVIEW); +} + +static void Key(unsigned char key, int x, int y) +{ + + switch (key) { + case 27: + exit(1); + default: + return; + } + + glutPostRedisplay(); +} + + + + +static void Draw(void) +{ + glClear(GL_COLOR_BUFFER_BIT); + + glShadeModel( GL_SMOOTH ); + + glBegin(GL_TRIANGLES); + + /* Note: call the list from inside a begin/end pair. The end is + * provided by the display list... + */ + glCallList(list); + + glFlush(); + + if (doubleBuffer) { + glutSwapBuffers(); + } +} + +static GLenum Args(int argc, char **argv) +{ + GLint i; + + doubleBuffer = GL_FALSE; + + for (i = 1; i < argc; i++) { + if (strcmp(argv[i], "-sb") == 0) { + doubleBuffer = GL_FALSE; + } else if (strcmp(argv[i], "-db") == 0) { + doubleBuffer = GL_TRUE; + } else { + fprintf(stderr, "%s (Bad option).\n", argv[i]); + return GL_FALSE; + } + } + return GL_TRUE; +} + +int main(int argc, char **argv) +{ + GLenum type; + + glutInit(&argc, argv); + + if (Args(argc, argv) == GL_FALSE) { + exit(1); + } + + glutInitWindowPosition(0, 0); glutInitWindowSize( 250, 250); + + type = GLUT_RGB | GLUT_ALPHA; + type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE; + glutInitDisplayMode(type); + + if (glutCreateWindow(*argv) == GL_FALSE) { + exit(1); + } + + Init(); + + glutReshapeFunc(Reshape); + glutKeyboardFunc(Key); + glutDisplayFunc(Draw); + glutMainLoop(); + return 0; +} -- cgit v1.2.3 From 1ca836f0de7ac23a3d66e109eeda3c2e29b9b17c Mon Sep 17 00:00:00 2001 From: Keith Whitwell Date: Tue, 30 Jun 2009 18:17:39 +0100 Subject: progs/trivial: add test case for short-circuiting material changes Similar to dlist-tri-flat-tri, but using glMaterial calls, which have the extra property of being legal within Begin/End calls. --- progs/trivial/Makefile | 1 + progs/trivial/dlist-tri-mat-tri.c | 174 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 175 insertions(+) create mode 100644 progs/trivial/dlist-tri-mat-tri.c (limited to 'progs/trivial/Makefile') diff --git a/progs/trivial/Makefile b/progs/trivial/Makefile index ae750db22a..a120270a9a 100644 --- a/progs/trivial/Makefile +++ b/progs/trivial/Makefile @@ -21,6 +21,7 @@ SOURCES = \ dlist-dangling.c \ dlist-flat-tri.c \ dlist-tri-flat-tri.c \ + dlist-tri-mat-tri.c \ dlist-recursive-call.c \ dlist-edgeflag-dangling.c \ dlist-edgeflag.c \ diff --git a/progs/trivial/dlist-tri-mat-tri.c b/progs/trivial/dlist-tri-mat-tri.c new file mode 100644 index 0000000000..f69854ae58 --- /dev/null +++ b/progs/trivial/dlist-tri-mat-tri.c @@ -0,0 +1,174 @@ +/* + * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the name of + * Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF + * ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#include +#include +#include +#include + + +#define CI_OFFSET_1 16 +#define CI_OFFSET_2 32 + + +GLenum doubleBuffer; +GLint list; + +static GLfloat red[4] = {0.8, 0.1, 0.0, 1.0}; +static GLfloat green[4] = {0.0, 0.8, 0.2, 1.0}; +static GLfloat blue[4] = {0.2, 0.2, .9, 1.0}; + +static void Init(void) +{ + fprintf(stderr, "GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER)); + fprintf(stderr, "GL_VERSION = %s\n", (char *) glGetString(GL_VERSION)); + fprintf(stderr, "GL_VENDOR = %s\n", (char *) glGetString(GL_VENDOR)); + fflush(stderr); + + glClear(GL_COLOR_BUFFER_BIT); + + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + + glClearColor(0.0, 0.0, 1.0, 0.0); + + list = glGenLists(1); + glNewList(list, GL_COMPILE); + + glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green); + + glBegin(GL_TRIANGLES); + glNormal3f(0,0,.7); + glVertex3f( 0.9, -0.9, -30.0); + glVertex3f( 0.9, 0.9, -30.0); + glVertex3f(-0.9, 0.0, -30.0); + glEnd(); + + glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue); + + glBegin(GL_TRIANGLES); + glVertex3f( -0.9, 0.9, -30.0); + glVertex3f( -0.9, -0.9, -30.0); + glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red); + glVertex3f( 0.9, 0.0, -30.0); + glEnd(); + + glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue); + glBegin(GL_TRIANGLES); + glVertex3f( -0.5, 0.5, -30.0); + glVertex3f( -0.5, -0.5, -30.0); + glVertex3f( 0.5, 0.0, -30.0); + glEnd(); + + glEndList(); +} + +static void Reshape(int width, int height) +{ + + glViewport(0, 0, (GLint)width, (GLint)height); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0); + glMatrixMode(GL_MODELVIEW); +} + +static void Key(unsigned char key, int x, int y) +{ + + switch (key) { + case 27: + exit(1); + default: + return; + } + + glutPostRedisplay(); +} + + + + +static void Draw(void) +{ + glClear(GL_COLOR_BUFFER_BIT); + + glShadeModel( GL_SMOOTH ); + glCallList(list); + + glFlush(); + + if (doubleBuffer) { + glutSwapBuffers(); + } +} + +static GLenum Args(int argc, char **argv) +{ + GLint i; + + doubleBuffer = GL_FALSE; + + for (i = 1; i < argc; i++) { + if (strcmp(argv[i], "-sb") == 0) { + doubleBuffer = GL_FALSE; + } else if (strcmp(argv[i], "-db") == 0) { + doubleBuffer = GL_TRUE; + } else { + fprintf(stderr, "%s (Bad option).\n", argv[i]); + return GL_FALSE; + } + } + return GL_TRUE; +} + +int main(int argc, char **argv) +{ + GLenum type; + + glutInit(&argc, argv); + + if (Args(argc, argv) == GL_FALSE) { + exit(1); + } + + glutInitWindowPosition(0, 0); glutInitWindowSize( 250, 250); + + type = GLUT_RGB | GLUT_ALPHA; + type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE; + glutInitDisplayMode(type); + + if (glutCreateWindow(*argv) == GL_FALSE) { + exit(1); + } + + Init(); + + glutReshapeFunc(Reshape); + glutKeyboardFunc(Key); + glutDisplayFunc(Draw); + glutMainLoop(); + return 0; +} -- cgit v1.2.3 From c48c01c9e7d6d0a43883b7b3333ad42208ea9d44 Mon Sep 17 00:00:00 2001 From: Keith Whitwell Date: Tue, 30 Jun 2009 18:35:17 +0100 Subject: progs/trivial: add dlist-mat-tri.c --- progs/trivial/Makefile | 1 + progs/trivial/dlist-mat-tri.c | 182 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 183 insertions(+) create mode 100644 progs/trivial/dlist-mat-tri.c (limited to 'progs/trivial/Makefile') diff --git a/progs/trivial/Makefile b/progs/trivial/Makefile index a120270a9a..bef1a57cd2 100644 --- a/progs/trivial/Makefile +++ b/progs/trivial/Makefile @@ -20,6 +20,7 @@ SOURCES = \ clear.c \ dlist-dangling.c \ dlist-flat-tri.c \ + dlist-mat-tri.c \ dlist-tri-flat-tri.c \ dlist-tri-mat-tri.c \ dlist-recursive-call.c \ diff --git a/progs/trivial/dlist-mat-tri.c b/progs/trivial/dlist-mat-tri.c new file mode 100644 index 0000000000..ed3a4c5981 --- /dev/null +++ b/progs/trivial/dlist-mat-tri.c @@ -0,0 +1,182 @@ +/* + * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the name of + * Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF + * ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#include +#include +#include +#include + + +#define CI_OFFSET_1 16 +#define CI_OFFSET_2 32 + + +GLenum doubleBuffer; +GLint list; + +static GLfloat red[4] = {0.8, 0.1, 0.0, 1.0}; +static GLfloat green[4] = {0.0, 0.8, 0.2, 1.0}; +/*static GLfloat blue[4] = {0.2, 0.2, .7, 1.0};*/ + +static void Init(void) +{ + fprintf(stderr, "GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER)); + fprintf(stderr, "GL_VERSION = %s\n", (char *) glGetString(GL_VERSION)); + fprintf(stderr, "GL_VENDOR = %s\n", (char *) glGetString(GL_VENDOR)); + fflush(stderr); + + glClear(GL_COLOR_BUFFER_BIT); + + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + + glClearColor(0.0, 0.0, 1.0, 0.0); + + list = glGenLists(1); + glNewList(list, GL_COMPILE); + + /* XXX: this state-change will be executed regardless of whether + * the list is called from outside a begin/end pair: + */ + glMaterialfv(GL_FRONT, GL_AMBIENT, red); + glBegin(GL_TRIANGLES); + glVertex3f( -0.9, 0.9, -30.0); + glVertex3f( -0.9, -0.9, -30.0); + glVertex3f( 0.9, 0.0, -30.0); + glEnd(); + + glMaterialfv(GL_FRONT, GL_DIFFUSE, red); + glBegin(GL_TRIANGLES); + glVertex3f( -0.7, 0.7, -30.0); + glVertex3f( -0.7, -0.7, -30.0); + glVertex3f( 0.7, 0.0, -30.0); + glEnd(); + + /* This statechange is redundant: + */ + glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red); + glBegin(GL_TRIANGLES); + glVertex3f( -0.5, 0.5, -30.0); + glVertex3f( -0.5, -0.5, -30.0); + glVertex3f( 0.5, 0.0, -30.0); + glEnd(); + + glEndList(); +} + +static void Reshape(int width, int height) +{ + + glViewport(0, 0, (GLint)width, (GLint)height); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0); + glMatrixMode(GL_MODELVIEW); +} + +static void Key(unsigned char key, int x, int y) +{ + + switch (key) { + case 27: + exit(1); + default: + return; + } + + glutPostRedisplay(); +} + + + + +static void Draw(void) +{ + glClear(GL_COLOR_BUFFER_BIT); + + glShadeModel( GL_SMOOTH ); + glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green); + + glBegin(GL_TRIANGLES); + + /* Note: call the list from inside a begin/end pair. The end is + * provided by the display list... + */ + glCallList(list); + + glFlush(); + + if (doubleBuffer) { + glutSwapBuffers(); + } +} + +static GLenum Args(int argc, char **argv) +{ + GLint i; + + doubleBuffer = GL_FALSE; + + for (i = 1; i < argc; i++) { + if (strcmp(argv[i], "-sb") == 0) { + doubleBuffer = GL_FALSE; + } else if (strcmp(argv[i], "-db") == 0) { + doubleBuffer = GL_TRUE; + } else { + fprintf(stderr, "%s (Bad option).\n", argv[i]); + return GL_FALSE; + } + } + return GL_TRUE; +} + +int main(int argc, char **argv) +{ + GLenum type; + + glutInit(&argc, argv); + + if (Args(argc, argv) == GL_FALSE) { + exit(1); + } + + glutInitWindowPosition(0, 0); glutInitWindowSize( 250, 250); + + type = GLUT_RGB | GLUT_ALPHA; + type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE; + glutInitDisplayMode(type); + + if (glutCreateWindow(*argv) == GL_FALSE) { + exit(1); + } + + Init(); + + glutReshapeFunc(Reshape); + glutKeyboardFunc(Key); + glutDisplayFunc(Draw); + glutMainLoop(); + return 0; +} -- cgit v1.2.3 From 1fa4cde757cc94c0afa40d855309911247974e98 Mon Sep 17 00:00:00 2001 From: Keith Whitwell Date: Tue, 30 Jun 2009 19:52:44 +0100 Subject: mesa/vbo: fix compile and replay of nodes ending in a FALLBACK Where vbo save nodes are terminated with a call to DO_FALLBACK(), as in the case of a recursive CallList which is itself within a Begin/End pair, there two problems: 1) The display list node's primitive information was incorrect, stating the cut-off prim had zero vertices 2) On replay, we would get confused by a primitive that started in a node, but was terminated by individual opcodes. This change fixes the first problem by correctly terminating the last primitive on fallback, and the second by forcing the display list to use the Loopback path, converting all nodes into immediate-mode rendering. The loopback fix is a performance hit, but avoiding this would require a fairly large rework of this code. --- progs/trivial/Makefile | 1 + progs/trivial/dlist-begin-call-end.c | 159 +++++++++++++++++++++++++++++++++++ src/mesa/vbo/vbo_save_api.c | 40 ++++++--- 3 files changed, 187 insertions(+), 13 deletions(-) create mode 100644 progs/trivial/dlist-begin-call-end.c (limited to 'progs/trivial/Makefile') diff --git a/progs/trivial/Makefile b/progs/trivial/Makefile index bef1a57cd2..3bd8faff99 100644 --- a/progs/trivial/Makefile +++ b/progs/trivial/Makefile @@ -24,6 +24,7 @@ SOURCES = \ dlist-tri-flat-tri.c \ dlist-tri-mat-tri.c \ dlist-recursive-call.c \ + dlist-begin-call-end.c \ dlist-edgeflag-dangling.c \ dlist-edgeflag.c \ dlist-degenerate.c \ diff --git a/progs/trivial/dlist-begin-call-end.c b/progs/trivial/dlist-begin-call-end.c new file mode 100644 index 0000000000..0d0aed7c72 --- /dev/null +++ b/progs/trivial/dlist-begin-call-end.c @@ -0,0 +1,159 @@ +/* + * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the name of + * Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF + * ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#include +#include +#include +#include + + +#define CI_OFFSET_1 16 +#define CI_OFFSET_2 32 + + +GLenum doubleBuffer; +GLint first_list, list; + +static void Init(void) +{ + fprintf(stderr, "GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER)); + fprintf(stderr, "GL_VERSION = %s\n", (char *) glGetString(GL_VERSION)); + fprintf(stderr, "GL_VENDOR = %s\n", (char *) glGetString(GL_VENDOR)); + fflush(stderr); + + glClearColor(0.0, 0.0, 1.0, 0.0); + + /* First list will disrupt state which might potentially be + * short-circuited in calling list: + */ + first_list = glGenLists(1); + glNewList(first_list, GL_COMPILE); +// glColor3f(0,1,0); + glEndList(); + + + /* List that looks like it might have redundant state: + */ + list = glGenLists(1); + glNewList(list, GL_COMPILE); + + glShadeModel(GL_FLAT); + glBegin(GL_TRIANGLES); + glColor3f(1,0,0); + glVertex3f( -0.9, 0.9, -30.0); + glVertex3f( -0.9, -0.9, -30.0); + glCallList( first_list ); + glVertex3f( 0.9, 0.0, -30.0); + glEnd(); + glEndList(); +} + +static void Reshape(int width, int height) +{ + + glViewport(0, 0, (GLint)width, (GLint)height); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0); + glMatrixMode(GL_MODELVIEW); +} + +static void Key(unsigned char key, int x, int y) +{ + + switch (key) { + case 27: + exit(1); + default: + return; + } + + glutPostRedisplay(); +} + + + + +static void Draw(void) +{ + glClear(GL_COLOR_BUFFER_BIT); + + glShadeModel( GL_SMOOTH ); + glCallList(list); + + glFlush(); + + if (doubleBuffer) { + glutSwapBuffers(); + } +} + +static GLenum Args(int argc, char **argv) +{ + GLint i; + + doubleBuffer = GL_FALSE; + + for (i = 1; i < argc; i++) { + if (strcmp(argv[i], "-sb") == 0) { + doubleBuffer = GL_FALSE; + } else if (strcmp(argv[i], "-db") == 0) { + doubleBuffer = GL_TRUE; + } else { + fprintf(stderr, "%s (Bad option).\n", argv[i]); + return GL_FALSE; + } + } + return GL_TRUE; +} + +int main(int argc, char **argv) +{ + GLenum type; + + glutInit(&argc, argv); + + if (Args(argc, argv) == GL_FALSE) { + exit(1); + } + + glutInitWindowPosition(0, 0); glutInitWindowSize( 250, 250); + + type = GLUT_RGB | GLUT_ALPHA; + type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE; + glutInitDisplayMode(type); + + if (glutCreateWindow(*argv) == GL_FALSE) { + exit(1); + } + + Init(); + + glutReshapeFunc(Reshape); + glutKeyboardFunc(Key); + glutDisplayFunc(Draw); + glutMainLoop(); + return 0; +} diff --git a/src/mesa/vbo/vbo_save_api.c b/src/mesa/vbo/vbo_save_api.c index 971a338af4..85cb79c71c 100644 --- a/src/mesa/vbo/vbo_save_api.c +++ b/src/mesa/vbo/vbo_save_api.c @@ -667,19 +667,33 @@ do { \ * -- Flush current buffer * -- Fallback to opcodes for the rest of the begin/end object. */ -#define DO_FALLBACK(ctx) \ -do { \ - struct vbo_save_context *save = &vbo_context(ctx)->save; \ - \ - if (save->vert_count || save->prim_count) \ - _save_compile_vertex_list( ctx ); \ - \ - _save_copy_to_current( ctx ); \ - _save_reset_vertex( ctx ); \ - _save_reset_counters( ctx ); \ - _mesa_install_save_vtxfmt( ctx, &ctx->ListState.ListVtxfmt ); \ - ctx->Driver.SaveNeedFlush = 0; \ -} while (0) +static void DO_FALLBACK( GLcontext *ctx ) +{ + struct vbo_save_context *save = &vbo_context(ctx)->save; + + if (save->vert_count || save->prim_count) { + GLint i = save->prim_count - 1; + + /* Close off in-progress primitive. + */ + save->prim[i].count = (save->vert_count - + save->prim[i].start); + + /* Need to replay this display list with loopback, + * unfortunately, otherwise this primitive won't be handled + * properly: + */ + save->dangling_attr_ref = 1; + + _save_compile_vertex_list( ctx ); + } + + _save_copy_to_current( ctx ); + _save_reset_vertex( ctx ); + _save_reset_counters( ctx ); + _mesa_install_save_vtxfmt( ctx, &ctx->ListState.ListVtxfmt ); + ctx->Driver.SaveNeedFlush = 0; +} static void GLAPIENTRY _save_EvalCoord1f( GLfloat u ) { -- cgit v1.2.3