2
* (C) Copyright IBM Corporation 2006
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:
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
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.
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
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.
36
* \author Ian Romanick <idr@us.ibm.com>
44
#include <GLUT/glut.h>
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);
55
static PFNGLBINDVERTEXARRAYAPPLEPROC bind_vertex_array = NULL;
56
static PFNGLGENVERTEXARRAYSAPPLEPROC gen_vertex_arrays = NULL;
57
static PFNGLDELETEVERTEXARRAYSAPPLEPROC delete_vertex_arrays = NULL;
58
static PFNGLISVERTEXARRAYAPPLEPROC is_vertex_array = NULL;
60
static int Width = 400;
61
static int Height = 200;
62
static const GLfloat Near = 5.0, Far = 25.0;
65
static void Display( void )
70
static void Idle( void )
75
static void Visible( int vis )
77
if ( vis == GLUT_VISIBLE ) {
84
static void Reshape( int width, int height )
86
GLfloat ar = (float) width / (float) height;
89
glViewport( 0, 0, width, height );
90
glMatrixMode( GL_PROJECTION );
92
glFrustum( -ar, ar, -1.0, 1.0, Near, Far );
96
static void Key( unsigned char key, int x, int y )
109
static void Init( void )
111
const char * const ver_string = (const char * const)
112
glGetString( GL_VERSION );
119
printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
120
printf("GL_VERSION = %s\n\n", ver_string);
122
if ( !glutExtensionSupported("GL_APPLE_vertex_array_object") ) {
123
printf("Sorry, this program requires GL_APPLE_vertex_array_object\n");
127
bind_vertex_array = glutGetProcAddress( "glBindVertexArrayAPPLE" );
128
gen_vertex_arrays = glutGetProcAddress( "glGenVertexArraysAPPLE" );
129
delete_vertex_arrays = glutGetProcAddress( "glDeleteVertexArraysAPPLE" );
130
is_vertex_array = glutGetProcAddress( "glIsVertexArrayAPPLE" );
133
(*gen_vertex_arrays)( 1, & obj );
134
(*bind_vertex_array)( obj );
135
glVertexPointer( 4, GL_FLOAT, sizeof(GLfloat) * 4, (void *) 0xDEADBEEF);
136
glEnableClientState( GL_VERTEX_ARRAY );
138
glPushClientAttrib( GL_CLIENT_VERTEX_ARRAY_BIT );
140
(*delete_vertex_arrays)( 1, & obj );
144
printf( "glGetError incorrectly returned 0x%04x.\n", err );
148
if ( (*is_vertex_array)( obj ) ) {
149
printf( "Array object is incorrectly still valid.\n" );
155
printf( "glGetError incorrectly returned 0x%04x.\n", err );
163
printf( "glGetError incorrectly returned 0x%04x.\n", err );
167
if ( ! (*is_vertex_array)( obj ) ) {
168
printf( "Array object is incorrectly invalid.\n" );
172
if ( ! glIsEnabled( GL_VERTEX_ARRAY ) ) {
173
printf( "Array state is incorrectly disabled.\n" );
177
glGetPointerv( GL_VERTEX_ARRAY_POINTER, & ptr );
178
if ( ptr != (void *) 0xDEADBEEF ) {
179
printf( "Array pointer is incorrectly set to 0x%p.\n", ptr );
190
int main( int argc, char *argv[] )
192
glutInit( &argc, argv );
193
glutInitWindowPosition( 0, 0 );
194
glutInitWindowSize( Width, Height );
195
glutInitDisplayMode( GLUT_RGB );
196
glutCreateWindow( "GL_APPLE_vertex_array_object demo" );
197
glutReshapeFunc( Reshape );
198
glutKeyboardFunc( Key );
199
glutDisplayFunc( Display );
200
glutVisibilityFunc( Visible );