Commit d06c7853 authored by Brian Paul's avatar Brian Paul

proxy-texture: test proxy texture error checking

When a glTexImage(GL_PROXY_TEXTURE_x) call generates an error there are
two possible outcomes:
1. Generate a regular GL error.
2. Don't generate a GL error.  Instead, zero-out the texture image's
   width, height, depth and format.

The spec isn't totally explicit about all this but in general the second
case happens when we exceed texture size/memory limits (that's the point
of proxy textures afterall).

Test passes with NVIDIA's driver.  Untested with AMD.  Mesa fixes/patches
are pending.
parent b869e34a
......@@ -733,6 +733,7 @@ add_plain_test(texturing, 'lodclamp-between')
add_plain_test(texturing, 'lodclamp-between-max')
add_plain_test(texturing, 'mipmap-setup')
add_plain_test(texturing, 'max-texture-size')
add_concurrent_test(texturing, 'proxy-texture')
add_plain_test(texturing, 'rg-draw-pixels')
add_plain_test(texturing, 'rg-teximage-01')
add_plain_test(texturing, 'rg-teximage-02')
......
......@@ -45,6 +45,7 @@ piglit_add_executable (lodclamp-between lodclamp-between.c)
piglit_add_executable (lodclamp-between-max lodclamp-between-max.c)
piglit_add_executable (max-texture-size max-texture-size.c)
piglit_add_executable (mipmap-setup mipmap-setup.c)
piglit_add_executable (proxy-texture proxy-texture.c)
piglit_add_executable (rg-draw-pixels rg-draw-pixels.c)
piglit_add_executable (rg-teximage-01 rg-teximage-01.c rg-teximage-common.c)
piglit_add_executable (rg-teximage-02 rg-teximage-02.c rg-teximage-common.c)
......
/*
* Copyright (c) 2012 VMware, Inc.
*
* 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
* on the rights to use, copy, modify, merge, publish, distribute, sub
* license, 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
* NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS AND/OR THEIR
* SUPPLIERS 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.
*/
/**
* Tests proxy texture error handling.
* \author Brian Paul
*/
#include "piglit-util-gl-common.h"
PIGLIT_GL_TEST_MAIN(
128 /*window_width*/,
128 /*window_height*/,
GLUT_RGB)
static void
init_proxy_texture(void)
{
/* Create good 8x8 proxy texture image */
glTexImage2D(GL_PROXY_TEXTURE_2D, 0, GL_RGBA, 8, 8, 0,
GL_RGBA, GL_FLOAT, NULL);
piglit_check_gl_error(GL_NO_ERROR);
}
static bool
check_no_proxy_change_(int line)
{
GLint w;
glGetTexLevelParameteriv(GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w);
/* The proxy texture image width should be 8 */
if (w != 8) {
printf("Proxy texture was mistakenly changed!");
return false;
}
return true;
}
#define check_no_proxy_change() check_no_proxy_change_(__LINE__)
/**
* Check that the proxy texture width and height are zero.
*/
static bool
check_proxy_zeroed(void)
{
GLint w, h;
glGetTexLevelParameteriv(GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w);
glGetTexLevelParameteriv(GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &h);
/* The proxy texture image width should not be zero, not 8 */
if (w != 0 || h != 0) {
printf("Proxy texture size wasn't zero-ed out!");
return false;
}
return true;
}
static bool
do_proxy_tests(void)
{
bool pass = true;
GLint maxSize;
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxSize);
init_proxy_texture();
/* bad level => GL_INVALID_VALUE */
glTexImage2D(GL_PROXY_TEXTURE_2D, 5555, GL_RGBA, 8, 8, 0,
GL_RGBA, GL_FLOAT, NULL);
pass = piglit_check_gl_error(GL_INVALID_VALUE) && pass;
pass = check_no_proxy_change() && pass;
/* bad width => GL_INVALID_VALUE */
glTexImage2D(GL_PROXY_TEXTURE_2D, 0, GL_RGBA, -8, 8, 0,
GL_RGBA, GL_FLOAT, NULL);
pass = piglit_check_gl_error(GL_INVALID_VALUE) && pass;
pass = check_no_proxy_change() && pass;
/* bad border => GL_INVALID_VALUE */
glTexImage2D(GL_PROXY_TEXTURE_2D, 0, GL_RGBA, 8, 8, 2,
GL_RGBA, GL_FLOAT, NULL);
pass = piglit_check_gl_error(GL_INVALID_VALUE) && pass;
pass = check_no_proxy_change() && pass;
/* bad format+type => GL_INVALID_OPERATION */
glTexImage2D(GL_PROXY_TEXTURE_2D, 0, GL_RGBA, 8, 8, 0,
GL_DEPTH_COMPONENT, GL_UNSIGNED_INT_8_8_8_8, NULL);
pass = piglit_check_gl_error(GL_INVALID_OPERATION) && pass;
pass = check_no_proxy_change() && pass;
/* Test real proxy behaviour here. Use too big width, height.
* This should not generate a GL error but it should zero-out the
* proxy image dims.
*/
glTexImage2D(GL_PROXY_TEXTURE_2D, 0, GL_RGBA, maxSize*2, maxSize*2, 0,
GL_RGBA, GL_FLOAT, NULL);
pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
pass = check_proxy_zeroed() && pass;
return pass;
}
enum piglit_result
piglit_display(void)
{
/* nothing */
return PIGLIT_PASS;
}
void
piglit_init(int argc, char **argv)
{
if (do_proxy_tests())
piglit_report_result(PIGLIT_PASS);
else
piglit_report_result(PIGLIT_FAIL);
}
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