ext_texture_array: add simple API errors test

Submitted by Brian Paul on Dec. 2, 2014, 4:43 p.m.

Details

Message ID 1417538588-25297-1-git-send-email-brianp@vmware.com
State New
Headers show

Not browsing as part of any series.

Commit Message

Brian Paul Dec. 2, 2014, 4:43 p.m.
---
 tests/all.py                                   |   1 +
 tests/spec/ext_texture_array/CMakeLists.gl.txt |   1 +
 tests/spec/ext_texture_array/errors.c          | 170 +++++++++++++++++++++++++
 3 files changed, 172 insertions(+)
 create mode 100644 tests/spec/ext_texture_array/errors.c

Patch hide | download patch | download mbox

diff --git a/tests/all.py b/tests/all.py
index b193bdf..de15224 100644
--- a/tests/all.py
+++ b/tests/all.py
@@ -2861,6 +2861,7 @@  for test in ('depth-clear', 'depth-layered-clear', 'depth-draw', 'fs-writes-dept
              'stencil-clear', 'stencil-layered-clear', 'stencil-draw', 'fs-writes-stencil'):
     add_concurrent_test(ext_texture_array, 'fbo-depth-array ' + test)
 add_plain_test(ext_texture_array, 'array-texture')
+add_concurrent_test(ext_texture_array, 'ext_texture_array-errors')
 add_concurrent_test(ext_texture_array, 'getteximage-targets 1D_ARRAY')
 add_concurrent_test(ext_texture_array, 'getteximage-targets 2D_ARRAY')
 for test_mode in ['teximage', 'texsubimage']:
diff --git a/tests/spec/ext_texture_array/CMakeLists.gl.txt b/tests/spec/ext_texture_array/CMakeLists.gl.txt
index 048e0d3..3ec3ec4 100644
--- a/tests/spec/ext_texture_array/CMakeLists.gl.txt
+++ b/tests/spec/ext_texture_array/CMakeLists.gl.txt
@@ -9,6 +9,7 @@  link_libraries (
 	${OPENGL_glu_LIBRARY}
 )
 
+piglit_add_executable (ext_texture_array-errors errors.c)
 piglit_add_executable (ext_texture_array-maxlayers maxlayers.c)
 piglit_add_executable (ext_texture_array-compressed compressed.c)
 piglit_add_executable (ext_texture_array-gen-mipmap gen-mipmap.c)
diff --git a/tests/spec/ext_texture_array/errors.c b/tests/spec/ext_texture_array/errors.c
new file mode 100644
index 0000000..c417762
--- /dev/null
+++ b/tests/spec/ext_texture_array/errors.c
@@ -0,0 +1,170 @@ 
+/*
+ * Copyright 2014 VMware, Inc.
+ *
+ * Permission is hereby , 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.
+ */
+
+/**
+ * Basic API error tests for GL_EXT_texture_array.
+ */
+
+#include "piglit-util-gl.h"
+
+PIGLIT_GL_TEST_CONFIG_BEGIN
+	config.supports_gl_compat_version = 10;
+	config.window_visual = PIGLIT_GL_VISUAL_DOUBLE | PIGLIT_GL_VISUAL_RGBA;
+PIGLIT_GL_TEST_CONFIG_END
+
+
+static GLint MaxLayers;
+
+
+static bool
+test_1d_dimensions(void)
+{
+	bool pass = true;
+	GLuint tex;
+
+	glGenTextures(1, &tex);
+	glBindTexture(GL_TEXTURE_1D_ARRAY, tex);
+
+	/*
+	 * zero dimensions should be OK
+	 */
+	glTexImage2D(GL_TEXTURE_1D_ARRAY, 0, GL_RGBA,
+		     0, 0, /* w, h */
+		     0, /* border */
+		     GL_RGBA, GL_FLOAT, NULL);
+	if (!piglit_check_gl_error(GL_NO_ERROR))
+		pass = false;
+
+	glTexImage2D(GL_TEXTURE_1D_ARRAY, 0, GL_RGBA,
+		     1, 0, /* w, h */
+		     0, /* border */
+		     GL_RGBA, GL_FLOAT, NULL);
+	if (!piglit_check_gl_error(GL_NO_ERROR))
+		pass = false;
+
+	glTexImage2D(GL_TEXTURE_1D_ARRAY, 0, GL_RGBA,
+		     0, 1, /* w, h */
+		     0, /* border */
+		     GL_RGBA, GL_FLOAT, NULL);
+	if (!piglit_check_gl_error(GL_NO_ERROR))
+		pass = false;
+
+	/* Test too many layers */
+	glTexImage2D(GL_TEXTURE_1D_ARRAY, 0, GL_RGBA,
+		     32, MaxLayers + 1, /* w, h */
+		     0, /* border */
+		     GL_RGBA, GL_FLOAT, NULL);
+	if (!piglit_check_gl_error(GL_INVALID_VALUE))
+		pass = false;
+
+	/* Test invalid target */
+	glTexImage2D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA,
+		     32, 2, /* w, h */
+		     0, /* border */
+		     GL_RGBA, GL_FLOAT, NULL);
+	if (!piglit_check_gl_error(GL_INVALID_ENUM))
+		pass = false;
+
+	return pass;
+}
+
+
+static bool
+test_2d_dimensions(void)
+{
+	bool pass = true;
+	GLuint tex;
+
+	glGenTextures(1, &tex);
+	glBindTexture(GL_TEXTURE_1D_ARRAY, tex);
+
+	/*
+	 * zero dimensions should be OK
+	 */
+	glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA,
+		     0, 0, 0, /* w, h, d */
+		     0, /* border */
+		     GL_RGBA, GL_FLOAT, NULL);
+	if (!piglit_check_gl_error(GL_NO_ERROR))
+		pass = false;
+
+	glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA,
+		     1, 0, 0, /* w, h, d */
+		     0, /* border */
+		     GL_RGBA, GL_FLOAT, NULL);
+	if (!piglit_check_gl_error(GL_NO_ERROR))
+		pass = false;
+
+	glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA,
+		     1, 1, 0, /* w, h, d */
+		     0, /* border */
+		     GL_RGBA, GL_FLOAT, NULL);
+	if (!piglit_check_gl_error(GL_NO_ERROR))
+		pass = false;
+
+	glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA,
+		     1, 0, 1, /* w, h, d */
+		     0, /* border */
+		     GL_RGBA, GL_FLOAT, NULL);
+	if (!piglit_check_gl_error(GL_NO_ERROR))
+		pass = false;
+
+	/* Test too many layers */
+	glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA,
+		     32, 32, MaxLayers + 1, /* w, h, d */
+		     0, /* border */
+		     GL_RGBA, GL_FLOAT, NULL);
+	if (!piglit_check_gl_error(GL_INVALID_VALUE))
+		pass = false;
+
+	/* Test invalid target */
+	glTexImage3D(GL_TEXTURE_1D_ARRAY, 0, GL_RGBA,
+		     32, 32, 2, /* w, h, d */
+		     0, /* border */
+		     GL_RGBA, GL_FLOAT, NULL);
+	if (!piglit_check_gl_error(GL_INVALID_ENUM))
+		pass = false;
+
+	return pass;
+}
+
+
+enum piglit_result
+piglit_display(void)
+{
+	bool pass;
+
+	pass = test_1d_dimensions();
+	pass = test_2d_dimensions() && pass;
+
+	return pass ? PIGLIT_PASS : PIGLIT_FAIL;
+}
+
+
+void
+piglit_init(int argc, char **argv)
+{
+	piglit_require_extension("GL_EXT_texture_array");
+
+	glGetIntegerv(GL_MAX_ARRAY_TEXTURE_LAYERS_EXT, &MaxLayers);
+}

Comments

On 12/02/2014 06:43 PM, Brian Paul wrote:
> ---
>   tests/all.py                                   |   1 +
>   tests/spec/ext_texture_array/CMakeLists.gl.txt |   1 +
>   tests/spec/ext_texture_array/errors.c          | 170 +++++++++++++++++++++++++
>   3 files changed, 172 insertions(+)
>   create mode 100644 tests/spec/ext_texture_array/errors.c

8<

> +static bool
> +test_2d_dimensions(void)
> +{
> +	bool pass = true;
> +	GLuint tex;
> +
> +	glGenTextures(1, &tex);
> +	glBindTexture(GL_TEXTURE_1D_ARRAY, tex);
> +
> +	/*
> +	 * zero dimensions should be OK
> +	 */
> +	glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA,


You are binding texture as GL_TEXTURE_1D_ARRAY but then setting target 
for glTexImage3D as GL_TEXTURE_2D_ARRAY. Should this fail? Why is the 
last case invalid if texture is bound as GL_TEXTURE_1D_ARRAY?


> +		     0, 0, 0, /* w, h, d */
> +		     0, /* border */
> +		     GL_RGBA, GL_FLOAT, NULL);
> +	if (!piglit_check_gl_error(GL_NO_ERROR))
> +		pass = false;
> +
> +	glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA,
> +		     1, 0, 0, /* w, h, d */
> +		     0, /* border */
> +		     GL_RGBA, GL_FLOAT, NULL);
> +	if (!piglit_check_gl_error(GL_NO_ERROR))
> +		pass = false;
> +
> +	glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA,
> +		     1, 1, 0, /* w, h, d */
> +		     0, /* border */
> +		     GL_RGBA, GL_FLOAT, NULL);
> +	if (!piglit_check_gl_error(GL_NO_ERROR))
> +		pass = false;
> +
> +	glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA,
> +		     1, 0, 1, /* w, h, d */
> +		     0, /* border */
> +		     GL_RGBA, GL_FLOAT, NULL);
> +	if (!piglit_check_gl_error(GL_NO_ERROR))
> +		pass = false;
> +
> +	/* Test too many layers */
> +	glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA,
> +		     32, 32, MaxLayers + 1, /* w, h, d */
> +		     0, /* border */
> +		     GL_RGBA, GL_FLOAT, NULL);
> +	if (!piglit_check_gl_error(GL_INVALID_VALUE))
> +		pass = false;
> +
> +	/* Test invalid target */
> +	glTexImage3D(GL_TEXTURE_1D_ARRAY, 0, GL_RGBA,
> +		     32, 32, 2, /* w, h, d */
> +		     0, /* border */
> +		     GL_RGBA, GL_FLOAT, NULL);
> +	if (!piglit_check_gl_error(GL_INVALID_ENUM))
> +		pass = false;
> +
> +	return pass;
> +}
> +
> +
> +enum piglit_result
> +piglit_display(void)
> +{
> +	bool pass;
> +
> +	pass = test_1d_dimensions();
> +	pass = test_2d_dimensions() && pass;
> +
> +	return pass ? PIGLIT_PASS : PIGLIT_FAIL;
> +}
> +
> +
> +void
> +piglit_init(int argc, char **argv)
> +{
> +	piglit_require_extension("GL_EXT_texture_array");
> +
> +	glGetIntegerv(GL_MAX_ARRAY_TEXTURE_LAYERS_EXT, &MaxLayers);
> +}
>
On 12/03/2014 12:47 AM, Tapani Pälli wrote:
>
>
> On 12/02/2014 06:43 PM, Brian Paul wrote:
>> ---
>>   tests/all.py                                   |   1 +
>>   tests/spec/ext_texture_array/CMakeLists.gl.txt |   1 +
>>   tests/spec/ext_texture_array/errors.c          | 170
>> +++++++++++++++++++++++++
>>   3 files changed, 172 insertions(+)
>>   create mode 100644 tests/spec/ext_texture_array/errors.c
>
> 8<
>
>> +static bool
>> +test_2d_dimensions(void)
>> +{
>> +    bool pass = true;
>> +    GLuint tex;
>> +
>> +    glGenTextures(1, &tex);
>> +    glBindTexture(GL_TEXTURE_1D_ARRAY, tex);
>> +
>> +    /*
>> +     * zero dimensions should be OK
>> +     */
>> +    glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA,
>
>
> You are binding texture as GL_TEXTURE_1D_ARRAY but then setting target
> for glTexImage3D as GL_TEXTURE_2D_ARRAY.

Copy and paste fail.


> Should this fail?

No, because the glTexImage3D call at that point will address the default 
texture object for the GL_TEXTURE_2D_ARRAY target.


> Why is the
> last case invalid if texture is bound as GL_TEXTURE_1D_ARRAY?

Because GL_TEXTURE_1D_ARRAY is not a legal target for glTexImage3D().


I'll fix the copy&paste mistake before pushing.

-Brian



>
>
>> +             0, 0, 0, /* w, h, d */
>> +             0, /* border */
>> +             GL_RGBA, GL_FLOAT, NULL);
>> +    if (!piglit_check_gl_error(GL_NO_ERROR))
>> +        pass = false;
>> +
>> +    glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA,
>> +             1, 0, 0, /* w, h, d */
>> +             0, /* border */
>> +             GL_RGBA, GL_FLOAT, NULL);
>> +    if (!piglit_check_gl_error(GL_NO_ERROR))
>> +        pass = false;
>> +
>> +    glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA,
>> +             1, 1, 0, /* w, h, d */
>> +             0, /* border */
>> +             GL_RGBA, GL_FLOAT, NULL);
>> +    if (!piglit_check_gl_error(GL_NO_ERROR))
>> +        pass = false;
>> +
>> +    glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA,
>> +             1, 0, 1, /* w, h, d */
>> +             0, /* border */
>> +             GL_RGBA, GL_FLOAT, NULL);
>> +    if (!piglit_check_gl_error(GL_NO_ERROR))
>> +        pass = false;
>> +
>> +    /* Test too many layers */
>> +    glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA,
>> +             32, 32, MaxLayers + 1, /* w, h, d */
>> +             0, /* border */
>> +             GL_RGBA, GL_FLOAT, NULL);
>> +    if (!piglit_check_gl_error(GL_INVALID_VALUE))
>> +        pass = false;
>> +
>> +    /* Test invalid target */
>> +    glTexImage3D(GL_TEXTURE_1D_ARRAY, 0, GL_RGBA,
>> +             32, 32, 2, /* w, h, d */
>> +             0, /* border */
>> +             GL_RGBA, GL_FLOAT, NULL);
>> +    if (!piglit_check_gl_error(GL_INVALID_ENUM))
>> +        pass = false;
>> +
>> +    return pass;
>> +}
>> +
>> +
>> +enum piglit_result
>> +piglit_display(void)
>> +{
>> +    bool pass;
>> +
>> +    pass = test_1d_dimensions();
>> +    pass = test_2d_dimensions() && pass;
>> +
>> +    return pass ? PIGLIT_PASS : PIGLIT_FAIL;
>> +}
>> +
>> +
>> +void
>> +piglit_init(int argc, char **argv)
>> +{
>> +    piglit_require_extension("GL_EXT_texture_array");
>> +
>> +    glGetIntegerv(GL_MAX_ARRAY_TEXTURE_LAYERS_EXT, &MaxLayers);
>> +}
>>