mesa/progs/tests/floattex.c

170 lines
4.2 KiB
C

/*
* Test floating point textures.
* No actual rendering, yet.
*/
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <GL/glut.h>
/* XXX - temporary */
#ifndef GL_ARB_texture_float
#define GL_ARB_texture_float 1
#define GL_TEXTURE_RED_TYPE_ARB 0x9000
#define GL_TEXTURE_GREEN_TYPE_ARB 0x9001
#define GL_TEXTURE_BLUE_TYPE_ARB 0x9002
#define GL_TEXTURE_ALPHA_TYPE_ARB 0x9003
#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x9004
#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x9005
#define GL_TEXTURE_DEPTH_TYPE_ARB 0x9006
#define GL_UNSIGNED_NORMALIZED_ARB 0x9007
#define GL_RGBA32F_ARB 0x8814
#define GL_RGB32F_ARB 0x8815
#define GL_ALPHA32F_ARB 0x8816
#define GL_INTENSITY32F_ARB 0x8817
#define GL_LUMINANCE32F_ARB 0x8818
#define GL_LUMINANCE_ALPHA32F_ARB 0x8819
#define GL_RGBA16F_ARB 0x881A
#define GL_RGB16F_ARB 0x881B
#define GL_ALPHA16F_ARB 0x881C
#define GL_INTENSITY16F_ARB 0x881D
#define GL_LUMINANCE16F_ARB 0x881E
#define GL_LUMINANCE_ALPHA16F_ARB 0x881F
#endif
static GLboolean
CheckError( int line )
{
GLenum error = glGetError();
if (error) {
char *err = (char *) gluErrorString( error );
fprintf( stderr, "GL Error: %s at line %d\n", err, line );
return GL_TRUE;
}
return GL_FALSE;
}
static void
Draw(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
Init(void)
{
GLfloat tex[16][16][4];
GLfloat tex2[16][16][4];
GLint i, j, t;
if (!glutExtensionSupported("GL_MESAX_texture_float")) {
printf("Sorry, this test requires GL_MESAX_texture_float\n");
exit(1);
}
for (i = 0; i < 16; i++) {
for (j = 0; j < 16; j++) {
GLfloat s = i / 15.0;
tex[i][j][0] = s;
tex[i][j][1] = 2.0 * s;
tex[i][j][2] = -3.0 * s;
tex[i][j][3] = 4.0 * s;
}
}
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F_ARB, 16, 16, 0, GL_RGBA,
GL_FLOAT, tex);
CheckError(__LINE__);
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_RED_TYPE_ARB, &t);
assert(t == GL_FLOAT);
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_GREEN_TYPE_ARB, &t);
assert(t == GL_FLOAT);
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_BLUE_TYPE_ARB, &t);
assert(t == GL_FLOAT);
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_ALPHA_TYPE_ARB, &t);
assert(t == GL_FLOAT);
CheckError(__LINE__);
/* read back the texture and make sure values are correct */
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_FLOAT, tex2);
CheckError(__LINE__);
for (i = 0; i < 16; i++) {
for (j = 0; j < 16; j++) {
if (tex[i][j][0] != tex2[i][j][0] ||
tex[i][j][1] != tex2[i][j][1] ||
tex[i][j][2] != tex2[i][j][2] ||
tex[i][j][3] != tex2[i][j][3]) {
printf("tex[%d][%d] %g %g %g %g != tex2[%d][%d] %g %g %g %g\n",
i, j,
tex[i][j][0], tex[i][j][1], tex[i][j][2], tex[i][j][3],
i, j,
tex2[i][j][0], tex2[i][j][1], tex2[i][j][2], tex2[i][j][3]);
}
}
}
}
int
main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitWindowPosition(0, 0);
glutInitWindowSize(400, 400);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow(argv[0]);
glutReshapeFunc(Reshape);
glutKeyboardFunc(Key);
glutDisplayFunc(Draw);
Init();
glutMainLoop();
return 0;
}