diff options
| author | Keith Whitwell <keith@tungstengraphics.com> | 2008-10-15 17:20:30 +0100 | 
|---|---|---|
| committer | Keith Whitwell <keith@tungstengraphics.com> | 2008-10-15 17:20:30 +0100 | 
| commit | cf85e413ad7672c1cef73215222ca1caa8e48b30 (patch) | |
| tree | f6c22fe6664f2512a06653768ca27b17d2294134 | |
| parent | d533a5d00ae2d0669e9da41718ee847de0c343aa (diff) | |
| parent | 055d986efefa310d6ffd1106e565ca2f5964159a (diff) | |
Merge commit 'origin/gallium-0.1' into gallium-0.2
Conflicts:
	src/mesa/main/context.c
| -rw-r--r-- | progs/trivial/Makefile | 4 | ||||
| -rw-r--r-- | progs/trivial/tri-tex.c | 168 | ||||
| -rw-r--r-- | progs/trivial/vp-tri-cb-pos.c | 156 | ||||
| -rw-r--r-- | progs/trivial/vp-tri-cb-tex.c | 189 | ||||
| -rw-r--r-- | progs/trivial/vp-tri-tex.c | 137 | ||||
| -rw-r--r-- | progs/vp/vp-tris.c | 11 | ||||
| -rw-r--r-- | progs/vp/xform.txt | 11 | ||||
| -rw-r--r-- | src/mesa/main/context.c | 1 | ||||
| -rw-r--r-- | src/mesa/main/ffvertex_prog.c | 70 | ||||
| -rw-r--r-- | src/mesa/main/mtypes.h | 2 | ||||
| -rw-r--r-- | src/mesa/main/state.c | 29 | ||||
| -rw-r--r-- | src/mesa/main/state.h | 17 | ||||
| -rw-r--r-- | src/mesa/main/texenvprogram.c | 14 | ||||
| -rw-r--r-- | src/mesa/state_tracker/st_cb_drawpixels.c | 6 | 
14 files changed, 774 insertions, 41 deletions
| diff --git a/progs/trivial/Makefile b/progs/trivial/Makefile index a4077bd016..3f26798ca6 100644 --- a/progs/trivial/Makefile +++ b/progs/trivial/Makefile @@ -97,6 +97,7 @@ SOURCES = \  	tri-query.c \  	tri-scissor-tri.c \  	tri-stencil.c \ +	tri-tex.c \  	tri-tex-3d.c \  	tri-tri.c \  	tri-unfilled-edgeflag.c \ @@ -126,8 +127,11 @@ SOURCES = \  	vp-line-clip.c \  	vp-tri.c \  	vp-tri-swap.c \ +	vp-tri-tex.c \  	vp-tri-imm.c \  	vp-tri-cb.c \ +	vp-tri-cb-pos.c \ +	vp-tri-cb-tex.c \  	vp-unfilled.c   PROGS = $(SOURCES:%.c=%) diff --git a/progs/trivial/tri-tex.c b/progs/trivial/tri-tex.c new file mode 100644 index 0000000000..a0d75b4a33 --- /dev/null +++ b/progs/trivial/tri-tex.c @@ -0,0 +1,168 @@ +/* + * 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 <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <GL/glut.h> + + + +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)); + +    glClearColor(0.0, 0.0, 1.0, 0.0); + + +#define SIZE 32 +   { +      GLubyte tex2d[SIZE][SIZE][3]; +      GLint s, t; + +      for (s = 0; s < SIZE; s++) { +	 for (t = 0; t < SIZE; t++) { +#if 0 +	    tex2d[t][s][0] = (s < SIZE/2) ? 0 : 255; +	    tex2d[t][s][1] = (t < SIZE/2) ? 0 : 255; +	    tex2d[t][s][2] = 0; +#else +	    tex2d[t][s][0] = s*255/(SIZE-1); +	    tex2d[t][s][1] = t*255/(SIZE-1); +	    tex2d[t][s][2] = 0; +#endif +	 } +      } + +      glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + +      glTexImage2D(GL_TEXTURE_2D, 0, 3, SIZE, SIZE, 0, +                   GL_RGB, GL_UNSIGNED_BYTE, tex2d); + +      glEnable(GL_TEXTURE_2D); +      glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); +      glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_REPEAT); +      glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); +      glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + +      glPixelStorei(GL_UNPACK_ALIGNMENT, 4); +   } + +} + +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);  + +   glBegin(GL_TRIANGLES); +   glTexCoord2f(1,-1);  +   glVertex3f( 0.9, -0.9, -0.0); +   glTexCoord2f(1,1);  +   glVertex3f( 0.9,  0.9, -0.0); +   glTexCoord2f(-1,0);  +   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("First Tri") == GL_FALSE) { +	exit(1); +    } + +    Init(); + +    glutReshapeFunc(Reshape); +    glutKeyboardFunc(Key); +    glutDisplayFunc(Draw); +    glutMainLoop(); +	return 0; +} diff --git a/progs/trivial/vp-tri-cb-pos.c b/progs/trivial/vp-tri-cb-pos.c new file mode 100644 index 0000000000..eb3aa0a8dc --- /dev/null +++ b/progs/trivial/vp-tri-cb-pos.c @@ -0,0 +1,156 @@ +/* Test glGenProgramsNV(), glIsProgramNV(), glLoadProgramNV() */ + +#include <stdio.h> +#include <assert.h> +#include <string.h> +#include <stdlib.h> +#include <math.h> +#define GL_GLEXT_PROTOTYPES +#include <GL/glut.h> + + + +GLenum doubleBuffer; + +static void Init(void) +{ +   GLint errno; +   GLuint prognum; +    +   static const char *prog1 = +      "!!ARBvp1.0\n" +      "PARAM Emission = state.material.emission; \n" +      "PARAM Ambient = state.material.ambient; \n" +      "PARAM Diffuse = state.material.diffuse; \n" +      "PARAM Specular = state.material.specular; \n" +      "DP4  result.position.x, Ambient, vertex.position;\n" +      "DP4  result.position.y, Diffuse, vertex.position;\n" +      "DP4  result.position.z, Specular, vertex.position;\n" +      "DP4  result.position.w, Emission, vertex.position;\n" +      "MOV  result.color, vertex.color;\n" +      "END\n"; + +   const float Ambient[4] = { 0.0, 1.0, 0.0, 0.0 }; +   const float Diffuse[4] = { 1.0, 0.0, 0.0, 0.0 }; +   const float Specular[4] = { 0.0, 0.0, 1.0, 0.0 }; +   const float Emission[4] = { 0.0, 0.0, 0.0, 1.0 }; +   glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, Ambient); +   glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, Diffuse); +   glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, Specular); +   glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, Emission); + + +   glGenProgramsARB(1, &prognum); + +   glBindProgramARB(GL_VERTEX_PROGRAM_ARB, prognum); +   glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, +		      strlen(prog1), (const GLubyte *) prog1); + +   assert(glIsProgramARB(prognum)); +   errno = glGetError(); +   printf("glGetError = %d\n", errno); +   if (errno != GL_NO_ERROR) +   { +      GLint errorpos; + +      glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errorpos); +      printf("errorpos: %d\n", errorpos); +      printf("%s\n", (char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)); +   } + +   glEnable(GL_VERTEX_PROGRAM_NV); + +} + + +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);  + +   glBegin(GL_TRIANGLES); +   glColor3f(0,0,.7);  +   glVertex3f( 0.9, -0.9, -0.0); +   glColor3f(.8,0,0);  +   glVertex3f( 0.9,  0.9, -0.0); +   glColor3f(0,.9,0);  +   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("First Tri") == GL_FALSE) { +	exit(1); +    } + +    Init(); + +    glutReshapeFunc(Reshape); +    glutKeyboardFunc(Key); +    glutDisplayFunc(Draw); +    glutMainLoop(); +	return 0; +} diff --git a/progs/trivial/vp-tri-cb-tex.c b/progs/trivial/vp-tri-cb-tex.c new file mode 100644 index 0000000000..1e99d5b6ab --- /dev/null +++ b/progs/trivial/vp-tri-cb-tex.c @@ -0,0 +1,189 @@ +/* Test glGenProgramsNV(), glIsProgramNV(), glLoadProgramNV() */ + +#include <stdio.h> +#include <assert.h> +#include <string.h> +#include <stdlib.h> +#include <math.h> +#define GL_GLEXT_PROTOTYPES +#include <GL/glut.h> + + + +GLenum doubleBuffer; + +static void Init(void) +{ +   GLint errno; +   GLuint prognum; +    +   static const char *prog1 = +      "!!ARBvp1.0\n" +      "PARAM Emission = state.material.emission; \n" +      "PARAM Ambient = state.material.ambient; \n" +      "PARAM Diffuse = state.material.diffuse; \n" +      "PARAM Specular = state.material.specular; \n" +      "DP4  result.position.x, Ambient, vertex.position;\n" +      "DP4  result.position.y, Diffuse, vertex.position;\n" +      "DP4  result.position.z, Specular, vertex.position;\n" +      "DP4  result.position.w, Emission, vertex.position;\n" +      "MOV  result.texcoord[0], vertex.texcoord[0];\n" +      "END\n"; + +   const float Ambient[4] = { 0.0, 1.0, 0.0, 0.0 }; +   const float Diffuse[4] = { 1.0, 0.0, 0.0, 0.0 }; +   const float Specular[4] = { 0.0, 0.0, 1.0, 0.0 }; +   const float Emission[4] = { 0.0, 0.0, 0.0, 1.0 }; +   glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, Ambient); +   glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, Diffuse); +   glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, Specular); +   glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, Emission); + + +   glGenProgramsARB(1, &prognum); + +   glBindProgramARB(GL_VERTEX_PROGRAM_ARB, prognum); +   glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, +		      strlen(prog1), (const GLubyte *) prog1); + +   assert(glIsProgramARB(prognum)); +   errno = glGetError(); +   printf("glGetError = %d\n", errno); +   if (errno != GL_NO_ERROR) +   { +      GLint errorpos; + +      glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errorpos); +      printf("errorpos: %d\n", errorpos); +      printf("%s\n", (char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)); +   } + +   glEnable(GL_VERTEX_PROGRAM_NV); + +#define SIZE 32 +   { +      GLubyte tex2d[SIZE][SIZE][3]; +      GLint s, t; + +      for (s = 0; s < SIZE; s++) { +	 for (t = 0; t < SIZE; t++) { +#if 0 +	    tex2d[t][s][0] = (s < SIZE/2) ? 0 : 255; +	    tex2d[t][s][1] = (t < SIZE/2) ? 0 : 255; +	    tex2d[t][s][2] = 0; +#else +	    tex2d[t][s][0] = s*255/(SIZE-1); +	    tex2d[t][s][1] = t*255/(SIZE-1); +	    tex2d[t][s][2] = 0; +#endif +	 } +      } + +      glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + +      glTexImage2D(GL_TEXTURE_2D, 0, 3, SIZE, SIZE, 0, +                   GL_RGB, GL_UNSIGNED_BYTE, tex2d); + +      glEnable(GL_TEXTURE_2D); +      glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); +      glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_REPEAT); +      glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); +      glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + +      glPixelStorei(GL_UNPACK_ALIGNMENT, 4); +   } + +} + + +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);  + +   glBegin(GL_TRIANGLES); +   glTexCoord2f(1,-1);  +   glVertex3f( 0.9, -0.9, -0.0); +   glTexCoord2f(1,1);  +   glVertex3f( 0.9,  0.9, -0.0); +   glTexCoord2f(-1,0);  +   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("First Tri") == GL_FALSE) { +	exit(1); +    } + +    Init(); + +    glutReshapeFunc(Reshape); +    glutKeyboardFunc(Key); +    glutDisplayFunc(Draw); +    glutMainLoop(); +	return 0; +} diff --git a/progs/trivial/vp-tri-tex.c b/progs/trivial/vp-tri-tex.c new file mode 100644 index 0000000000..83ec1ef2e2 --- /dev/null +++ b/progs/trivial/vp-tri-tex.c @@ -0,0 +1,137 @@ +/* Test glGenProgramsNV(), glIsProgramNV(), glLoadProgramNV() */ + +#include <assert.h> +#include <string.h> +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#define GL_GLEXT_PROTOTYPES +#include <GL/glut.h> + +static void Init( void ) +{ +   GLint errno; +   GLuint prognum; +    +   static const char *prog1 = +      "!!ARBvp1.0\n" +      "MOV  result.texcoord[0], vertex.texcoord[0];\n" +      "MOV  result.position, vertex.position;\n" +      "END\n"; + + +   glGenProgramsARB(1, &prognum); + +   glBindProgramARB(GL_VERTEX_PROGRAM_ARB, prognum); +   glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, +		      strlen(prog1), (const GLubyte *) prog1); + +   assert(glIsProgramARB(prognum)); +   errno = glGetError(); +   printf("glGetError = %d\n", errno); +   if (errno != GL_NO_ERROR) +   { +      GLint errorpos; + +      glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errorpos); +      printf("errorpos: %d\n", errorpos); +      printf("%s\n", (char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)); +   } + +#define SIZE 32 +   { +      GLubyte tex2d[SIZE][SIZE][3]; +      GLint s, t; + +      for (s = 0; s < SIZE; s++) { +	 for (t = 0; t < SIZE; t++) { +#if 0 +	    tex2d[t][s][0] = (s < SIZE/2) ? 0 : 255; +	    tex2d[t][s][1] = (t < SIZE/2) ? 0 : 255; +	    tex2d[t][s][2] = 0; +#else +	    tex2d[t][s][0] = s*255/(SIZE-1); +	    tex2d[t][s][1] = t*255/(SIZE-1); +	    tex2d[t][s][2] = 0; +#endif +	 } +      } + +      glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + +      glTexImage2D(GL_TEXTURE_2D, 0, 3, SIZE, SIZE, 0, +                   GL_RGB, GL_UNSIGNED_BYTE, tex2d); + +      glEnable(GL_TEXTURE_2D); +      glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); +      glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_REPEAT); +      glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); +      glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + +      glPixelStorei(GL_UNPACK_ALIGNMENT, 4); +   } + +} + +static void Display( void ) +{ +   glClearColor(0.3, 0.3, 0.3, 1); +   glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); + +   glEnable(GL_VERTEX_PROGRAM_NV); + +   glBegin(GL_TRIANGLES); +   glTexCoord2f(1,-1);  +   glVertex3f( 0.9, -0.9, -0.0); +   glTexCoord2f(1,1);  +   glVertex3f( 0.9,  0.9, -0.0); +   glTexCoord2f(-1,0);  +   glVertex3f(-0.9,  0.0, -0.0); +   glEnd(); + + +   glFlush();  +} + + +static void Reshape( int width, int height ) +{ +   glViewport( 0, 0, width, height ); +   glMatrixMode( GL_PROJECTION ); +   glLoadIdentity(); +   glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0); +   glMatrixMode( GL_MODELVIEW ); +   glLoadIdentity(); +   /*glTranslatef( 0.0, 0.0, -15.0 );*/ +} + + +static void Key( unsigned char key, int x, int y ) +{ +   (void) x; +   (void) y; +   switch (key) { +      case 27: +         exit(0); +         break; +   } +   glutPostRedisplay(); +} + + + + +int main( int argc, char *argv[] ) +{ +   glutInit( &argc, argv ); +   glutInitWindowPosition( 0, 0 ); +   glutInitWindowSize( 250, 250 ); +   glutInitDisplayMode( GLUT_DEPTH | GLUT_RGB | GLUT_SINGLE ); +   glutCreateWindow(argv[0]); +   glutReshapeFunc( Reshape ); +   glutKeyboardFunc( Key ); +   glutDisplayFunc( Display ); +   Init(); +   glutMainLoop(); +   return 0; +} diff --git a/progs/vp/vp-tris.c b/progs/vp/vp-tris.c index 3fe35f7e3e..58014dd48d 100644 --- a/progs/vp/vp-tris.c +++ b/progs/vp/vp-tris.c @@ -155,6 +155,17 @@ static void Init( void )        printf("errorpos: %d\n", errorpos);        printf("%s\n", (char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB));     } + +   { +      const float Ambient[4] = { 0.0, 1.0, 0.0, 0.0 }; +      const float Diffuse[4] = { 1.0, 0.0, 0.0, 0.0 }; +      const float Specular[4] = { 0.0, 0.0, 1.0, 0.0 }; +      const float Emission[4] = { 0.0, 0.0, 0.0, 1.0 }; +      glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, Ambient); +      glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, Diffuse); +      glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, Specular); +      glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, Emission); +   }  } diff --git a/progs/vp/xform.txt b/progs/vp/xform.txt new file mode 100644 index 0000000000..d1548f1f10 --- /dev/null +++ b/progs/vp/xform.txt @@ -0,0 +1,11 @@ +!!ARBvp1.0 +PARAM Emission = state.material.emission;  +PARAM Ambient = state.material.ambient;  +PARAM Diffuse = state.material.diffuse;  +PARAM Specular = state.material.specular;  +DP4  result.position.x, Ambient, vertex.position; +DP4  result.position.y, Diffuse, vertex.position; +DP4  result.position.z, Specular, vertex.position; +DP4  result.position.w, Emission, vertex.position; +MOV  result.color, vertex.color; +END diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index c6ff8c13c6..61c0861cbd 100644 --- a/src/mesa/main/context.c +++ b/src/mesa/main/context.c @@ -1063,6 +1063,7 @@ init_attrib_groups(GLcontext *ctx)     /* Miscellaneous */     ctx->NewState = _NEW_ALL;     ctx->ErrorValue = (GLenum) GL_NO_ERROR; +   ctx->varying_vp_inputs = ~0;     return GL_TRUE;  } diff --git a/src/mesa/main/ffvertex_prog.c b/src/mesa/main/ffvertex_prog.c index 308b4ef711..da2640dd8f 100644 --- a/src/mesa/main/ffvertex_prog.c +++ b/src/mesa/main/ffvertex_prog.c @@ -47,17 +47,17 @@  struct state_key { +   unsigned light_color_material_mask:12; +   unsigned light_material_mask:12;     unsigned light_global_enabled:1;     unsigned light_local_viewer:1;     unsigned light_twoside:1;     unsigned light_color_material:1; -   unsigned light_color_material_mask:12; -   unsigned light_material_mask:12;     unsigned material_shininess_is_zero:1; -     unsigned need_eye_coords:1;     unsigned normalize:1;     unsigned rescale_normals:1; +     unsigned fog_source_is_depth:1;     unsigned tnl_do_vertex_fog:1;     unsigned separate_specular:1; @@ -67,6 +67,8 @@ struct state_key {     unsigned texture_enabled_global:1;     unsigned fragprog_inputs_read:12; +   unsigned varying_vp_inputs; +     struct {        unsigned light_enabled:1;        unsigned light_eyepos3_is_zero:1; @@ -193,6 +195,7 @@ static void make_state_key( GLcontext *ctx, struct state_key *key )     key->need_eye_coords = ctx->_NeedEyeCoords;     key->fragprog_inputs_read = fp->Base.InputsRead; +   key->varying_vp_inputs = ctx->varying_vp_inputs;     if (ctx->RenderMode == GL_FEEDBACK) {        /* make sure the vertprog emits color and tex0 */ @@ -448,14 +451,46 @@ static void release_temps( struct tnl_program *p )  } +static struct ureg register_param5(struct tnl_program *p,  +				   GLint s0, +				   GLint s1, +				   GLint s2, +				   GLint s3, +                                   GLint s4) +{ +   gl_state_index tokens[STATE_LENGTH]; +   GLint idx; +   tokens[0] = s0; +   tokens[1] = s1; +   tokens[2] = s2; +   tokens[3] = s3; +   tokens[4] = s4; +   idx = _mesa_add_state_reference( p->program->Base.Parameters, tokens ); +   return make_ureg(PROGRAM_STATE_VAR, idx); +} + + +#define register_param1(p,s0)          register_param5(p,s0,0,0,0,0) +#define register_param2(p,s0,s1)       register_param5(p,s0,s1,0,0,0) +#define register_param3(p,s0,s1,s2)    register_param5(p,s0,s1,s2,0,0) +#define register_param4(p,s0,s1,s2,s3) register_param5(p,s0,s1,s2,s3,0) + +  /**   * \param input  one of VERT_ATTRIB_x tokens.   */  static struct ureg register_input( struct tnl_program *p, GLuint input )  { -   p->program->Base.InputsRead |= (1<<input); -   return make_ureg(PROGRAM_INPUT, input); +   /* Material attribs are passed here as inputs >= 32 +    */ +   if (input >= 32 || (p->state->varying_vp_inputs & (1<<input))) { +      p->program->Base.InputsRead |= (1<<input); +      return make_ureg(PROGRAM_INPUT, input); +   } +   else { +      return register_param3( p, STATE_INTERNAL, STATE_CURRENT_ATTRIB, input ); +   }  }  /** @@ -504,31 +539,6 @@ static struct ureg get_identity_param( struct tnl_program *p )     return p->identity;  } -static struct ureg register_param5(struct tnl_program *p,  -				   GLint s0, -				   GLint s1, -				   GLint s2, -				   GLint s3, -                                   GLint s4) -{ -   gl_state_index tokens[STATE_LENGTH]; -   GLint idx; -   tokens[0] = s0; -   tokens[1] = s1; -   tokens[2] = s2; -   tokens[3] = s3; -   tokens[4] = s4; -   idx = _mesa_add_state_reference( p->program->Base.Parameters, tokens ); -   return make_ureg(PROGRAM_STATE_VAR, idx); -} - - -#define register_param1(p,s0)          register_param5(p,s0,0,0,0,0) -#define register_param2(p,s0,s1)       register_param5(p,s0,s1,0,0,0) -#define register_param3(p,s0,s1,s2)    register_param5(p,s0,s1,s2,0,0) -#define register_param4(p,s0,s1,s2,s3) register_param5(p,s0,s1,s2,s3,0) - -  static void register_matrix_param5( struct tnl_program *p,  				    GLint s0, /* modelview, projection, etc */  				    GLint s1, /* texture matrix number */ diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 052da2c18e..7ad8cb244d 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -1987,6 +1987,8 @@ struct gl_vertex_program_state     GLboolean CallbackEnabled;     GLuint CurrentPosition;  #endif + +   GLboolean _Overriden;  }; diff --git a/src/mesa/main/state.c b/src/mesa/main/state.c index 2f0e7cc368..5e073a1863 100644 --- a/src/mesa/main/state.c +++ b/src/mesa/main/state.c @@ -1,6 +1,6 @@  /*   * Mesa 3-D graphics library - * Version:  7.1 + * Version:  7.3   *   * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.   * @@ -508,10 +508,12 @@ _mesa_update_state_locked( GLcontext *ctx )     if (ctx->FragmentProgram._MaintainTexEnvProgram) {        prog_flags |= (_NEW_ARRAY | _NEW_TEXTURE_MATRIX | _NEW_LIGHT | +                     _NEW_RENDERMODE |                       _NEW_TEXTURE | _NEW_FOG | _DD_NEW_SEPARATE_SPECULAR);     }     if (ctx->VertexProgram._MaintainTnlProgram) {        prog_flags |= (_NEW_ARRAY | _NEW_TEXTURE | _NEW_TEXTURE_MATRIX | +                     _NEW_RENDERMODE |                       _NEW_TRANSFORM | _NEW_POINT |                       _NEW_FOG | _NEW_LIGHT |                       _MESA_NEW_NEED_EYE_COORDS); @@ -551,7 +553,8 @@ _mesa_update_state( GLcontext *ctx ) -/* Want to figure out which fragment program inputs are actually +/** + * Want to figure out which fragment program inputs are actually   * constant/current values from ctx->Current.  These should be   * referenced as a tracked state variable rather than a fragment   * program input, to save the overhead of putting a constant value in @@ -579,6 +582,26 @@ _mesa_set_varying_vp_inputs( GLcontext *ctx,     if (ctx->varying_vp_inputs != varying_inputs) {        ctx->varying_vp_inputs = varying_inputs;        ctx->NewState |= _NEW_ARRAY; -      //_mesa_printf("%s %x\n", __FUNCTION__, varying_inputs); +      /*_mesa_printf("%s %x\n", __FUNCTION__, varying_inputs);*/ +   } +} + + +/** + * Used by drivers to tell core Mesa that the driver is going to + * install/ use its own vertex program.  In particular, this will + * prevent generated fragment programs from using state vars instead + * of ordinary varyings/inputs. + */ +void +_mesa_set_vp_override(GLcontext *ctx, GLboolean flag) +{ +   if (ctx->VertexProgram._Overriden != flag) { +      ctx->VertexProgram._Overriden = flag; + +      /* Set one of the bits which will trigger fragment program +       * regeneration: +       */ +      ctx->NewState |= _NEW_ARRAY;      }  } diff --git a/src/mesa/main/state.h b/src/mesa/main/state.h index 79f2f6beb0..29db08a0b9 100644 --- a/src/mesa/main/state.h +++ b/src/mesa/main/state.h @@ -1,6 +1,6 @@  /*   * Mesa 3-D graphics library - * Version:  7.1 + * Version:  7.3   *   * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.   * @@ -29,16 +29,21 @@  #include "mtypes.h"  extern void -_mesa_update_state( GLcontext *ctx ); +_mesa_update_state(GLcontext *ctx);  /* As above but can only be called between _mesa_lock_context_textures() and    * _mesa_unlock_context_textures().   */  extern void -_mesa_update_state_locked( GLcontext *ctx ); +_mesa_update_state_locked(GLcontext *ctx); + + +extern void +_mesa_set_varying_vp_inputs(GLcontext *ctx, GLbitfield varying_inputs); + + +extern void +_mesa_set_vp_override(GLcontext *ctx, GLboolean flag); -void -_mesa_set_varying_vp_inputs( GLcontext *ctx, -                             GLbitfield varying_inputs );  #endif diff --git a/src/mesa/main/texenvprogram.c b/src/mesa/main/texenvprogram.c index c23173014d..2c7df7b8d9 100644 --- a/src/mesa/main/texenvprogram.c +++ b/src/mesa/main/texenvprogram.c @@ -217,8 +217,18 @@ static GLbitfield get_fp_input_mask( GLcontext *ctx )  {     GLbitfield fp_inputs = 0x0; -   if (!ctx->VertexProgram._Enabled || -       !ctx->VertexProgram._Current) { +   if (ctx->VertexProgram._Overriden) { +      /* Somebody's messing with the vertex program and we don't have +       * a clue what's happening.  Assume that it could be producing +       * all possible outputs. +       */ +      fp_inputs = ~0; +   } +   else if (ctx->RenderMode == GL_FEEDBACK) { +      fp_inputs = (FRAG_BIT_COL0 | FRAG_BIT_TEX0); +   } +   else if (!ctx->VertexProgram._Enabled || +            !ctx->VertexProgram._Current) {        /* Fixed function logic */        GLbitfield varying_inputs = ctx->varying_vp_inputs; diff --git a/src/mesa/state_tracker/st_cb_drawpixels.c b/src/mesa/state_tracker/st_cb_drawpixels.c index 00bbcae32a..5b24b9f068 100644 --- a/src/mesa/state_tracker/st_cb_drawpixels.c +++ b/src/mesa/state_tracker/st_cb_drawpixels.c @@ -35,6 +35,7 @@  #include "main/bufferobj.h"  #include "main/macros.h"  #include "main/texformat.h" +#include "main/state.h"  #include "shader/program.h"  #include "shader/prog_parameter.h"  #include "shader/prog_print.h" @@ -835,6 +836,9 @@ st_DrawPixels(GLcontext *ctx, GLint x, GLint y, GLsizei width, GLsizei height,        return;     } +   _mesa_set_vp_override( ctx, TRUE ); +   _mesa_update_state( ctx ); +     st_validate_state(st);     if (format == GL_DEPTH_COMPONENT) { @@ -874,6 +878,8 @@ st_DrawPixels(GLcontext *ctx, GLint x, GLint y, GLsizei width, GLsizei height,        /* blit */        draw_blit(st, width, height, format, type, pixels);     } + +   _mesa_set_vp_override( ctx, FALSE );  } | 
