132001f49Smrg/*
232001f49Smrg * (C) Copyright IBM Corporation 2006
332001f49Smrg * All Rights Reserved.
432001f49Smrg *
532001f49Smrg * Permission is hereby granted, free of charge, to any person obtaining a
632001f49Smrg * copy of this software and associated documentation files (the "Software"),
732001f49Smrg * to deal in the Software without restriction, including without limitation
832001f49Smrg * on the rights to use, copy, modify, merge, publish, distribute, sub
932001f49Smrg * license, and/or sell copies of the Software, and to permit persons to whom
1032001f49Smrg * the Software is furnished to do so, subject to the following conditions:
1132001f49Smrg *
1232001f49Smrg * The above copyright notice and this permission notice (including the next
1332001f49Smrg * paragraph) shall be included in all copies or substantial portions of the
1432001f49Smrg * Software.
1532001f49Smrg *
1632001f49Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1732001f49Smrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1832001f49Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
1932001f49Smrg * VA LINUX SYSTEM, IBM AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
2032001f49Smrg * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
2132001f49Smrg * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
2232001f49Smrg * USE OR OTHER DEALINGS IN THE SOFTWARE.
2332001f49Smrg */
2432001f49Smrg
2532001f49Smrg/**
2632001f49Smrg * \file bug_3050.c
2732001f49Smrg *
2832001f49Smrg * Simple regression test for bug #3050.  Create a texture and make a few
2932001f49Smrg * calls to \c glGetTexLevelParameteriv.  If the bug still exists, trying
3032001f49Smrg * to get \c GL_TEXTURE_WITDH will cause a protocol error.
3132001f49Smrg *
3232001f49Smrg * This test \b only applies to indirect-rendering.  This may mean that the
3332001f49Smrg * test needs to be run with the environment variable \c LIBGL_ALWAYS_INDIRECT
3432001f49Smrg * set to a non-zero value.
3532001f49Smrg *
3632001f49Smrg * \author Ian Romanick <idr@us.ibm.com>
3732001f49Smrg */
3832001f49Smrg
3932001f49Smrg#include <stdio.h>
4032001f49Smrg#include <stdlib.h>
4132001f49Smrg#include <string.h>
4232001f49Smrg#include <GL/glew.h>
4332001f49Smrg#include "glut_wrap.h"
4432001f49Smrg
4532001f49Smrgstatic int Width = 400;
4632001f49Smrgstatic int Height = 200;
4732001f49Smrgstatic const GLfloat Near = 5.0, Far = 25.0;
4832001f49Smrg
4932001f49Smrg
5032001f49Smrgstatic void Display( void )
5132001f49Smrg{
5232001f49Smrg}
5332001f49Smrg
5432001f49Smrg
5532001f49Smrgstatic void Reshape( int width, int height )
5632001f49Smrg{
5732001f49Smrg}
5832001f49Smrg
5932001f49Smrg
6032001f49Smrgstatic void Key( unsigned char key, int x, int y )
6132001f49Smrg{
6232001f49Smrg   (void) x;
6332001f49Smrg   (void) y;
6432001f49Smrg   switch (key) {
6532001f49Smrg      case 27:
6632001f49Smrg         exit(0);
6732001f49Smrg         break;
6832001f49Smrg   }
6932001f49Smrg   glutPostRedisplay();
7032001f49Smrg}
7132001f49Smrg
7232001f49Smrg
7332001f49Smrgstatic void Init( void )
7432001f49Smrg{
7532001f49Smrg   unsigned i;
7632001f49Smrg   static const GLenum pnames[] = {
7732001f49Smrg      GL_TEXTURE_RED_SIZE,
7832001f49Smrg      GL_TEXTURE_GREEN_SIZE,
7932001f49Smrg      GL_TEXTURE_BLUE_SIZE,
8032001f49Smrg      GL_TEXTURE_ALPHA_SIZE,
8132001f49Smrg      GL_TEXTURE_LUMINANCE_SIZE,
8232001f49Smrg      GL_TEXTURE_INTENSITY_SIZE,
8332001f49Smrg      GL_TEXTURE_BORDER,
8432001f49Smrg      GL_TEXTURE_INTERNAL_FORMAT,
8532001f49Smrg      GL_TEXTURE_WIDTH,
8632001f49Smrg      GL_TEXTURE_HEIGHT,
8732001f49Smrg      GL_TEXTURE_DEPTH,
8832001f49Smrg      ~0
8932001f49Smrg   };
9032001f49Smrg
9132001f49Smrg
9232001f49Smrg   printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
9332001f49Smrg   printf("GL_VERSION = %s\n", (char *) glGetString(GL_VERSION));
9432001f49Smrg
9532001f49Smrg   printf("\nThis program should log some data about a texture and exit.\n");
9632001f49Smrg   printf("This is a regression test for bug #3050.  If the bug still\n");
9732001f49Smrg   printf("exists, a GLX protocol error will be generated.\n");
9832001f49Smrg   printf("https://bugs.freedesktop.org/show_bug.cgi?id=3050\n\n");
9932001f49Smrg
10032001f49Smrg
10132001f49Smrg   if ( ! glutExtensionSupported( "GL_NV_texture_rectangle" )
10232001f49Smrg	&& ! glutExtensionSupported( "GL_EXT_texture_rectangle" )
10332001f49Smrg	&& ! glutExtensionSupported( "GL_ARB_texture_rectangle" ) ) {
10432001f49Smrg      printf( "This test requires one of GL_ARB_texture_rectangle, GL_EXT_texture_rectangle,\n"
10532001f49Smrg	      "or GL_NV_texture_rectangle be supported\n." );
10632001f49Smrg      exit( 1 );
10732001f49Smrg   }
10832001f49Smrg
10932001f49Smrg
11032001f49Smrg   glBindTexture( GL_TEXTURE_RECTANGLE_NV, 1 );
11132001f49Smrg   glTexImage2D( GL_PROXY_TEXTURE_RECTANGLE_NV, 0, GL_RGBA, 8, 8, 0,
11232001f49Smrg		 GL_RGBA, GL_UNSIGNED_BYTE, NULL );
11332001f49Smrg
11432001f49Smrg   for ( i = 0 ; pnames[i] != ~0 ; i++ ) {
11532001f49Smrg      GLint param_i;
11632001f49Smrg      GLfloat param_f;
11732001f49Smrg      GLenum err;
11832001f49Smrg
11932001f49Smrg      glGetTexLevelParameteriv( GL_PROXY_TEXTURE_RECTANGLE_NV, 0, pnames[i], & param_i );
12032001f49Smrg      err = glGetError();
12132001f49Smrg
12232001f49Smrg      if ( err ) {
12332001f49Smrg	 printf("glGetTexLevelParameteriv(GL_PROXY_TEXTURE_RECTANGLE_NV, 0, 0x%04x, & param) generated a GL\n"
12432001f49Smrg		"error of 0x%04x!",
12532001f49Smrg		pnames[i], err );
12632001f49Smrg	 exit( 1 );
12732001f49Smrg      }
12832001f49Smrg      else {
12932001f49Smrg	 printf("glGetTexLevelParameteriv(GL_PROXY_TEXTURE_RECTANGLE_NV, 0, 0x%04x, & param) = 0x%04x\n",
13032001f49Smrg		pnames[i], param_i );
13132001f49Smrg      }
13232001f49Smrg
13332001f49Smrg
13432001f49Smrg      glGetTexLevelParameterfv( GL_PROXY_TEXTURE_RECTANGLE_NV, 0, pnames[i], & param_f );
13532001f49Smrg      err = glGetError();
13632001f49Smrg
13732001f49Smrg      if ( err ) {
13832001f49Smrg	 printf("glGetTexLevelParameterfv(GL_PROXY_TEXTURE_RECTANGLE_NV, 0, 0x%04x, & param) generated a GL\n"
13932001f49Smrg		"error of 0x%04x!\n",
14032001f49Smrg		pnames[i], err );
14132001f49Smrg	 exit( 1 );
14232001f49Smrg      }
14332001f49Smrg      else {
14432001f49Smrg	 printf("glGetTexLevelParameterfv(GL_PROXY_TEXTURE_RECTANGLE_NV, 0, 0x%04x, & param) = %.1f (0x%04x)\n",
14532001f49Smrg		pnames[i], param_f, (GLint) param_f );
14632001f49Smrg      }
14732001f49Smrg   }
14832001f49Smrg}
14932001f49Smrg
15032001f49Smrg
15132001f49Smrgint main( int argc, char *argv[] )
15232001f49Smrg{
15332001f49Smrg   glutInit( &argc, argv );
15432001f49Smrg   glutInitWindowPosition( 0, 0 );
15532001f49Smrg   glutInitWindowSize( Width, Height );
15632001f49Smrg   glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE );
15732001f49Smrg   glutCreateWindow( "Bug #3050 Test" );
15832001f49Smrg   glewInit();
15932001f49Smrg   glutReshapeFunc( Reshape );
16032001f49Smrg   glutKeyboardFunc( Key );
16132001f49Smrg   glutDisplayFunc( Display );
16232001f49Smrg   Init();
16332001f49Smrg   return 0;
16432001f49Smrg}
165