Commit 9449827c authored by Eric Anholt's avatar Eric Anholt

New test: texturing/gen-texsubimage

Tests that SGIS_generate_mipmap occurs after TexSubImage.  Catches bug #17077.
parent d62c5606
......@@ -86,6 +86,7 @@ bugs['tex1d-2dborder'] = PlainExecTest([testBinDir + 'tex1d-2dborder', '-auto'])
texturing = Group()
texturing['copytexsubimage'] = PlainExecTest([testBinDir + 'copytexsubimage', '-auto'])
texturing['cubemap'] = PlainExecTest([testBinDir + 'cubemap', '-auto'])
texturing['gen-texsubimage'] = PlainExecTest([testBinDir + 'gen-texsubimage', '-auto'])
texturing['lodbias'] = PlainExecTest([testBinDir + 'lodbias', '-auto'])
texturing['tex3d'] = PlainExecTest([testBinDir + 'tex3d'])
texturing['texdepth'] = PlainExecTest([testBinDir + 'texdepth', '-auto'])
......
......@@ -20,6 +20,7 @@ link_libraries (
add_executable (copytexsubimage copytexsubimage.c)
add_executable (cubemap cubemap.c)
add_executable (gen-texsubimage gen-texsubimage.c)
add_executable (lodbias lodbias.c)
add_executable (tex3d tex3d.c)
add_executable (texdepth texdepth.c)
......
/*
* Copyright © 2008 Intel Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*
* Authors:
* Chris Lord <chris@openedhand.com>
* Eric Anholt <eric@anholt.net>
*
*/
/** @file gen-texsubimage.c
*
* Tests that the full mipmap tree is correctly updated after calling
* glTexSubImage() when GL_GENERATE_MIPMAP is enabled. Based on a test
* in bug #17077.
*/
#include "GL/glut.h"
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <math.h>
#include "piglit-util.h"
#define WIN_WIDTH 512
#define WIN_HEIGHT 512
static GLboolean Automatic = GL_FALSE;
static void display_mipmaps(int start_x, int start_y)
{
int i;
/* Disply all the mipmap levels */
for (i = 256; i > 0; i /= 2) {
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0); glVertex2f(start_x + 0, start_y + 0);
glTexCoord2f(1.0, 0.0); glVertex2f(start_x + i, start_y + 0);
glTexCoord2f(1.0, 1.0); glVertex2f(start_x + i, start_y + i);
glTexCoord2f(0.0, 1.0); glVertex2f(start_x + 0, start_y + i);
glEnd();
start_x += i;
}
}
/**
* Returns whether the pixel at the coordinates matches the referenced color.
*
* Only the RGB channels are considered.
*/
static GLboolean
probe_pixel(int x, int y, const GLfloat *color)
{
GLfloat probe[4], delta[3];
GLfloat dmax = 0;
int i;
glReadPixels(x, y, 1, 1, GL_RGBA, GL_FLOAT, probe);
for (i = 0; i < 3; i++) {
delta[i] = probe[i] - color[i];
if (dmax < fabs(delta[i]))
dmax = fabs(delta[i]);
}
if (dmax > .02) {
printf("Expected at (%d,%d): %f,%f,%f\n",
x, y, color[0], color[1], color[2]);
printf("Probed at (%d,%d): %f,%f,%f\n",
x, y, probe[0], probe[1], probe[2]);
return GL_FALSE;
}
return GL_TRUE;
}
static GLboolean check_resulting_mipmaps(int x, int y, const GLfloat *color)
{
GLboolean pass = GL_TRUE;
int i;
for (i = 256; i > 4; i /= 2) {
pass = pass && probe_pixel(x + i / 2, y + i / 2, color);
x += i;
}
return pass;
}
static void display()
{
GLfloat *data;
const GLfloat red[4] = {1.0, 0.0, 0.0, 0.0};
const GLfloat blue[4] = {0.0, 0.0, 1.0, 0.0};
GLint texture;
int i;
glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT);
/* Set up texture object with mipmap generation */
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR_MIPMAP_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
data = malloc(256 * 256 * 4 * sizeof(GLfloat));
for (i = 0; i < 4 * 256 * 256; i += 4) {
data[i + 0] = blue[0];
data[i + 1] = blue[1];
data[i + 2] = blue[2];
data[i + 3] = blue[3];
}
/* Initialize the texture to blue */
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0,
GL_RGBA, GL_FLOAT, data);
free(data);
/* Display the original mipmaps */
display_mipmaps(0, 0);
/* Update a square inside the texture to red */
data = malloc(128 * 128 * 4 * sizeof(GLfloat));
for (i = 0; i < 4 * 128 * 128; i += 4) {
data[i + 0] = red[0];
data[i + 1] = red[1];
data[i + 2] = red[2];
data[i + 3] = red[3];
}
glTexSubImage2D(GL_TEXTURE_2D, 0, 64, 64, 128, 128,
GL_RGBA, GL_FLOAT, data);
free(data);
/* Display the mipmaps after subimage */
display_mipmaps(0, 256);
glDeleteTextures(1, &texture);
glutSwapBuffers();
glFlush();
if (Automatic) {
int dim;
GLboolean pass = GL_TRUE;
pass = pass && check_resulting_mipmaps(0, 0, blue);
pass = pass && check_resulting_mipmaps(0, 256, red);
if (Automatic)
printf("PIGLIT: {'result': '%s' }\n",
pass ? "pass" : "fail");
sleep(5);
exit(pass ? 0 : 1);
}
}
static void init()
{
piglit_require_extension("GL_SGIS_generate_mipmap");
/* Set up projection matrix so we can just draw using window
* coordinates.
*/
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0, WIN_WIDTH, 0, WIN_HEIGHT, -1, 1);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glEnable(GL_TEXTURE_2D);
}
int main(int argc, char**argv)
{
int i;
glutInit(&argc, argv);
for(i = 1; i < argc; ++i) {
if (!strcmp(argv[i], "-auto"))
Automatic = 1;
else
printf("Unknown option: %s\n", argv[i]);
}
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(WIN_WIDTH, WIN_HEIGHT);
glutInitWindowPosition(100, 100);
glutCreateWindow("gen-texsubimage");
init();
glutDisplayFunc(display);
glutMainLoop();
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment