progs/tests: compile with SCons and glew
[platform/upstream/mesa.git] / progs / tests / vao-02.c
1 /*
2  * (C) Copyright IBM Corporation 2006
3  * All Rights Reserved.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * on the rights to use, copy, modify, merge, publish, distribute, sub
9  * license, and/or sell copies of the Software, and to permit persons to whom
10  * the Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice (including the next
13  * paragraph) shall be included in all copies or substantial portions of the
14  * Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
19  * IBM AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22  * DEALINGS IN THE SOFTWARE.
23  */
24
25 /**
26  * \file vao-02.c
27  *
28  * Simple test of APPLE_vertex_array_object functionality.  This test creates
29  * a VAO, pushed it (via \c glPushClientAttrib), deletes the VAO, then pops
30  * it (via \c glPopClientAttrib).  After popping, the state of the VAO is
31  * examined.
32  * 
33  * According the the APPLE_vertex_array_object spec, the contents of the VAO
34  * should be restored to the values that they had when pushed.
35  * 
36  * \author Ian Romanick <idr@us.ibm.com>
37  */
38
39 #include <stdio.h>
40 #include <stdlib.h>
41 #include <math.h>
42
43 #ifdef __darwin__
44 #include <GLUT/glut.h>
45
46 typedef void (* PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array);
47 typedef void (* PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays);
48 typedef void (* PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, GLuint *arrays);
49 typedef GLboolean (* PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array);
50
51 #else
52 #include <GL/glew.h>
53 #include <GL/glut.h>
54 #endif
55
56 static PFNGLBINDVERTEXARRAYAPPLEPROC bind_vertex_array = NULL;
57 static PFNGLGENVERTEXARRAYSAPPLEPROC gen_vertex_arrays = NULL;
58 static PFNGLDELETEVERTEXARRAYSAPPLEPROC delete_vertex_arrays = NULL;
59 static PFNGLISVERTEXARRAYAPPLEPROC is_vertex_array = NULL;
60
61 static int Width = 400;
62 static int Height = 200;
63 static const GLfloat Near = 5.0, Far = 25.0;
64
65
66 static void Display( void )
67 {
68 }
69
70
71 static void Idle( void )
72 {
73 }
74
75
76 static void Visible( int vis )
77 {
78    if ( vis == GLUT_VISIBLE ) {
79       glutIdleFunc( Idle );
80    }
81    else {
82       glutIdleFunc( NULL );
83    }
84 }
85 static void Reshape( int width, int height )
86 {
87    GLfloat ar = (float) width / (float) height;
88    Width = width;
89    Height = height;
90    glViewport( 0, 0, width, height );
91    glMatrixMode( GL_PROJECTION );
92    glLoadIdentity();
93    glFrustum( -ar, ar, -1.0, 1.0, Near, Far );
94 }
95
96
97 static void Key( unsigned char key, int x, int y )
98 {
99    (void) x;
100    (void) y;
101    switch (key) {
102       case 27:
103          exit(0);
104          break;
105    }
106    glutPostRedisplay();
107 }
108
109
110 static void Init( void )
111 {
112    const char * const ver_string = (const char * const)
113        glGetString( GL_VERSION );
114    GLuint obj;
115    int pass = 1;
116    void * ptr;
117    GLenum err;
118
119
120    printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
121    printf("GL_VERSION = %s\n\n", ver_string);
122
123    if ( !glutExtensionSupported("GL_APPLE_vertex_array_object") ) {
124       printf("Sorry, this program requires GL_APPLE_vertex_array_object\n");
125       exit(2);
126    }
127
128    bind_vertex_array = glutGetProcAddress( "glBindVertexArrayAPPLE" );
129    gen_vertex_arrays = glutGetProcAddress( "glGenVertexArraysAPPLE" );
130    delete_vertex_arrays = glutGetProcAddress( "glDeleteVertexArraysAPPLE" );
131    is_vertex_array = glutGetProcAddress( "glIsVertexArrayAPPLE" );
132
133
134    (*gen_vertex_arrays)( 1, & obj );
135    (*bind_vertex_array)( obj );
136    glVertexPointer( 4, GL_FLOAT, sizeof(GLfloat) * 4, (void *) 0xDEADBEEF);
137    glEnableClientState( GL_VERTEX_ARRAY );
138
139    glPushClientAttrib( GL_CLIENT_VERTEX_ARRAY_BIT );
140
141    (*delete_vertex_arrays)( 1, & obj );
142    
143    err = glGetError();
144    if (err) {
145       printf( "glGetError incorrectly returned 0x%04x.\n", err );
146       pass = 0;
147    }
148
149    if ( (*is_vertex_array)( obj ) ) {
150       printf( "Array object is incorrectly still valid.\n" );
151       pass = 0;
152    }
153
154    err = glGetError();
155    if (err) {
156       printf( "glGetError incorrectly returned 0x%04x.\n", err );
157       pass = 0;
158    }
159
160    glPopClientAttrib();
161
162    err = glGetError();
163    if (err) {
164       printf( "glGetError incorrectly returned 0x%04x.\n", err );
165       pass = 0;
166    }
167
168    if ( ! (*is_vertex_array)( obj ) ) {
169       printf( "Array object is incorrectly invalid.\n" );
170       pass = 0;
171    }
172
173    if ( ! glIsEnabled( GL_VERTEX_ARRAY ) ) {
174       printf( "Array state is incorrectly disabled.\n" );
175       pass = 0;
176    }
177
178    glGetPointerv( GL_VERTEX_ARRAY_POINTER, & ptr );
179    if ( ptr != (void *) 0xDEADBEEF ) {
180       printf( "Array pointer is incorrectly set to 0x%p.\n", ptr );
181       pass = 0;
182    }
183
184    if ( ! pass ) {
185       printf( "FAIL!\n" );
186       exit(1);
187    }
188 }
189
190
191 int main( int argc, char *argv[] )
192 {
193    glutInit( &argc, argv );
194    glutInitWindowPosition( 0, 0 );
195    glutInitWindowSize( Width, Height );
196    glutInitDisplayMode( GLUT_RGB );
197    glutCreateWindow( "GL_APPLE_vertex_array_object demo" );
198    glewInit();
199    glutReshapeFunc( Reshape );
200    glutKeyboardFunc( Key );
201    glutDisplayFunc( Display );
202    glutVisibilityFunc( Visible );
203
204    Init();
205
206    return 0;
207 }