diff options
Diffstat (limited to 'progs/tests/vptest2.c')
-rw-r--r-- | progs/tests/vptest2.c | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/progs/tests/vptest2.c b/progs/tests/vptest2.c new file mode 100644 index 00000000000..2158e07f042 --- /dev/null +++ b/progs/tests/vptest2.c @@ -0,0 +1,151 @@ +/* Test vertex state program execution */ + +#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 Display( void ) +{ + glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); + glPushMatrix(); + glutSolidCube(2.0); + glPopMatrix(); + glutSwapBuffers(); +} + + +static void Reshape( int width, int height ) +{ + glViewport( 0, 0, width, height ); + glMatrixMode( GL_PROJECTION ); + glLoadIdentity(); + glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 25.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(); +} + + +static void Test1( void ) +{ + static const GLfloat p[4] = {9, 8, 7, 6}; + GLfloat q[4]; + /* test addition */ + static const char *prog = + "!!VSP1.0\n" + "MOV R0, c[0];\n" + "MOV R1, c[1];\n" + "ADD c[2], R0, R1;\n" + "END\n"; + + glLoadProgramNV(GL_VERTEX_STATE_PROGRAM_NV, 1, + strlen(prog), + (const GLubyte *) prog); + assert(glIsProgramNV(1)); + + glProgramParameter4fNV(GL_VERTEX_PROGRAM_NV, 0, 1, 2, 3, 4); + glProgramParameter4fNV(GL_VERTEX_PROGRAM_NV, 1, 10, 20, 30, 40); + + glExecuteProgramNV(GL_VERTEX_STATE_PROGRAM_NV, 1, p); + + glGetProgramParameterfvNV(GL_VERTEX_PROGRAM_NV, 2, GL_PROGRAM_PARAMETER_NV, q); + printf("Result c[2] = %g %g %g %g (should be 11 22 33 44)\n", + q[0], q[1], q[2], q[3]); +} + + +static void Test2( void ) +{ + static const GLfloat p[4] = {9, 8, 7, 6}; + GLfloat q[4]; + /* test swizzling */ + static const char *prog = + "!!VSP1.0\n" + "MOV R0, c[0].wzyx;\n" + "MOV R1, c[1].wzyx;\n" + "ADD c[2], R0, R1;\n" + "END\n"; + + glLoadProgramNV(GL_VERTEX_STATE_PROGRAM_NV, 1, + strlen(prog), + (const GLubyte *) prog); + assert(glIsProgramNV(1)); + + glProgramParameter4fNV(GL_VERTEX_PROGRAM_NV, 0, 1, 2, 3, 4); + glProgramParameter4fNV(GL_VERTEX_PROGRAM_NV, 1, 10, 20, 30, 40); + + glExecuteProgramNV(GL_VERTEX_STATE_PROGRAM_NV, 1, p); + + glGetProgramParameterfvNV(GL_VERTEX_PROGRAM_NV, 2, GL_PROGRAM_PARAMETER_NV, q); + printf("Result c[2] = %g %g %g %g (should be 44 33 22 11)\n", + q[0], q[1], q[2], q[3]); +} + + +static void Test3( void ) +{ + static const GLfloat p[4] = {0, 0, 0, 0}; + GLfloat q[4]; + /* normalize vector */ + static const char *prog = + "!!VSP1.0\n" + "# c[0] = (nx,ny,nz)\n" + "# R0.xyz = normalize(R1)\n" + "# R0.w = 1/sqrt(nx*nx + ny*ny + nz*nz)\n" + "# c[2] = R0\n" + "DP3 R0.w, c[0], c[0];\n" + "RSQ R0.w, R0.w;\n" + "MUL R0.xyz, c[0], R0.w;\n" + "MOV c[2], R0;\n" + "END\n"; + + glLoadProgramNV(GL_VERTEX_STATE_PROGRAM_NV, 1, + strlen(prog), + (const GLubyte *) prog); + assert(glIsProgramNV(1)); + + glProgramParameter4fNV(GL_VERTEX_PROGRAM_NV, 0, 0, 10, 0, 0); + + glExecuteProgramNV(GL_VERTEX_STATE_PROGRAM_NV, 1, p); + + glGetProgramParameterfvNV(GL_VERTEX_PROGRAM_NV, 2, GL_PROGRAM_PARAMETER_NV, q); + printf("Result c[2] = %g %g %g %g (should be 0, 1, 0, 0.1)\n", + q[0], q[1], q[2], q[3]); +} + + +int main( int argc, char *argv[] ) +{ + glutInit( &argc, argv ); + glutInitWindowPosition( 0, 0 ); + glutInitWindowSize( 50, 50 ); + glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH ); + glutCreateWindow(argv[0]); + glutReshapeFunc( Reshape ); + glutKeyboardFunc( Key ); + glutDisplayFunc( Display ); + Test1(); + Test2(); + Test3(); + glutMainLoop(); + return 0; +} |