From: Ian Romanick <[email protected]> Mesa fails the same subset of tests here as on desktop.
Signed-off-by: Ian Romanick <[email protected]> --- tests/all.tests | 4 + .../ext_packed_depth_stencil/CMakeLists.gles2.txt | 13 ++ .../depth-stencil-texture.c | 253 +++++++++++++++++++-- 3 files changed, 252 insertions(+), 18 deletions(-) create mode 100644 tests/spec/ext_packed_depth_stencil/CMakeLists.gles2.txt diff --git a/tests/all.tests b/tests/all.tests index fa25c6c..ceca3fb 100644 --- a/tests/all.tests +++ b/tests/all.tests @@ -2138,6 +2138,10 @@ add_depthstencil_render_miplevels_tests( ext_packed_depth_stencil['fbo-clear-formats stencil'] = concurrent_test('fbo-clear-formats GL_EXT_packed_depth_stencil stencil') ext_packed_depth_stencil['DEPTH_STENCIL texture'] = concurrent_test('ext_packed_depth_stencil-depth-stencil-texture') +oes_packed_depth_stencil = Group() +spec['OES_packed_depth_stencil'] = oes_packed_depth_stencil +oes_packed_depth_stencil['DEPTH_STENCIL texture GLES2'] = concurrent_test('oes_packed_depth_stencil-depth-stencil-texture_gles2') + ext_texture_array = Group() spec['EXT_texture_array'] = ext_texture_array add_plain_test(ext_texture_array, 'fbo-generatemipmap-array') diff --git a/tests/spec/ext_packed_depth_stencil/CMakeLists.gles2.txt b/tests/spec/ext_packed_depth_stencil/CMakeLists.gles2.txt new file mode 100644 index 0000000..e5cb763 --- /dev/null +++ b/tests/spec/ext_packed_depth_stencil/CMakeLists.gles2.txt @@ -0,0 +1,13 @@ +include_directories( + ${GLEXT_INCLUDE_DIR} + ${OPENGL_INCLUDE_PATH} +) + +link_libraries ( + piglitutil_${piglit_target_api} + ${OPENGL_gles2_LIBRARY} +) + +piglit_add_executable (oes_packed_depth_stencil-depth-stencil-texture_${piglit_target_api} depth-stencil-texture.c) + +# vim: ft=cmake: diff --git a/tests/spec/ext_packed_depth_stencil/depth-stencil-texture.c b/tests/spec/ext_packed_depth_stencil/depth-stencil-texture.c index c641772..22c0777 100644 --- a/tests/spec/ext_packed_depth_stencil/depth-stencil-texture.c +++ b/tests/spec/ext_packed_depth_stencil/depth-stencil-texture.c @@ -43,49 +43,224 @@ PIGLIT_GL_TEST_CONFIG_BEGIN +#if defined PIGLIT_USE_OPENGL config.supports_gl_compat_version = 12; config.supports_gl_core_version = 31; +#elif defined PIGLIT_USE_OPENGL_ES2 + config.supports_gl_es_version = 20; +#endif config.window_visual = PIGLIT_GL_VISUAL_RGBA; PIGLIT_GL_TEST_CONFIG_END +static bool has_texture_3d = false; static bool has_texture_cube_map = false; static bool has_depth_texture_cube_map = false; static bool has_depth_texture = false; static bool +check_gl_error2_(GLenum expected_error1, GLenum expected_error2, + const char *file, unsigned line) +{ + const GLenum actual_error = glGetError(); + + if (actual_error == expected_error1 + || actual_error == expected_error2) { + return true; + } + + /* + * If the lookup of the error's name is successful, then print + * Unexpected GL error: NAME 0xHEX + * Else, print + * Unexpected GL error: 0xHEX + */ + printf("Unexpected GL error: %s 0x%x\n", + piglit_get_gl_error_name(actual_error), actual_error); + printf("(Error at %s:%u)\n", file, line); + + if (expected_error2 != GL_NO_ERROR) { + printf("Expected GL error: %s 0x%x or %s 0x%x\n", + piglit_get_gl_error_name(expected_error1), expected_error1, + piglit_get_gl_error_name(expected_error2), expected_error2); + } else if (expected_error1 != GL_NO_ERROR) { + printf("Expected GL error: %s 0x%x\n", + piglit_get_gl_error_name(expected_error1), expected_error1); + } + + return false; +} + +#define check_gl_error2(a, b) check_gl_error2_(a, b, __FILE__, __LINE__) + +static bool try_TexImage(GLenum internalFormat) { bool pass = true; GLuint tex[4]; - const GLenum expected_error = has_depth_texture + GLenum expected_error = has_depth_texture ? GL_NO_ERROR : GL_INVALID_VALUE; + GLenum alt_error = GL_NO_ERROR; - const GLenum expected_3D_error = has_depth_texture + GLenum expected_3D_error = has_depth_texture ? GL_INVALID_OPERATION : GL_INVALID_VALUE; + GLenum alt_3D_error = GL_NO_ERROR; - const GLenum expected_cube_error = has_depth_texture_cube_map + GLenum expected_cube_error = has_depth_texture_cube_map ? GL_NO_ERROR : expected_3D_error; + GLenum alt_cube_error = GL_NO_ERROR; + +#if !defined PIGLIT_USE_OPENGL + /* The OpenGL ES rules are non-obvious. + * + * In OpenGL ES 1.x and 2.x, the internal format and the format must + * be the same. This even applies in OpenGL ES 2.0 when + * GL_OES_depth_texture is available. + * + * Section 3.7.1 (Texture Image Specification) of the OpenGL ES 1.1.12 + * spec says: + * + * "If internalformat does not match format, the error + * INVALID_OPERATION is generated." + * + * Section 3.7.1 (Texture Image Specification) of the OpenGL ES 2.0.25 + * spec says the same thing. + * + * As a result, in OpenGL ES 1.x or OpenGL ES 2.0 without + * GL_OES_depth_texture, glTexImage2D(..., GL_DEPTH24_STENCIL8, ..., + * GL_DEPTH_STENCIL, FLOAT_32_UNSIGNED_INT_24_8) may generate *either* + * GL_INVALID_VALUE or GL_INVALID_OPERATION depending on the order the + * implementation checks the errors. + * + * In OpenGL ES 3.0, the internal format must not be GL_DEPTH_STENCIL. + * Section 3.8.3 (Texture Image Specification) of the OpenGL ES 3.0.3 + * spec says: + * + * "Specifying a combination of values for format, type, and + * internalformat that is not listed as a valid combination in + * tables 3.2 or 3.3 generates the error INVALID_OPERATION." + * + * Table 3.2 contains the lines: + * + * Format Type External Internal + * Bytes Format + * Per Pixel + * DEPTH_STENCIL UNSIGNED_INT_24_8 4 DEPTH24_STENCIL8 + * DEPTH_STENCIL FLOAT_32_UNSIGNED_INT_24_8 8 DEPTH32F_STENCIL8 + * + * The GL_OES_packed_depth_stencil spec still says: + * + * "Accepted by the <format> parameter of TexImage2D and + * TexSubImage2D and by the <internalformat> parameter of + * TexImage2D: + * + * DEPTH_STENCIL_OES 0x84F9" + * + * An OpenGL ES 3.0 implementation that advertises + * GL_OES_packed_depth_stencil should accepth both GL_DEPTH_STENCIL + * and GL_DEPTH24_STENCIL8 for internalformat. + */ + if (has_depth_texture) { + if ((piglit_get_gl_version() < 30 + && internalFormat != GL_DEPTH_STENCIL) + || (piglit_get_gl_version() >= 30 + && internalFormat == GL_DEPTH_STENCIL + && !piglit_is_extension_supported("GL_OES_packed_depth_stencil"))) { + + expected_error = GL_INVALID_OPERATION; + alt_error = GL_NO_ERROR; + + /* 3D depth textures are never supported. + * GL_INVALID_OPERATION is expected. That + * error is already expected due to the + * mismatch of internalformat and format. + */ + expected_3D_error = GL_INVALID_OPERATION; + alt_3D_error = GL_NO_ERROR; + + /* Cube map depth textures are only supported + * with GL_OES_depth_texture_cube_map. + * Without that extension, + * GL_INVALID_OPERATION is expected. That + * error is already expected due to the + * mismatch of internalformat and format. + */ + expected_cube_error = GL_INVALID_OPERATION; + alt_cube_error = GL_NO_ERROR; + } else { + expected_error = GL_NO_ERROR; + alt_error = GL_NO_ERROR; + + /* 3D depth textures are never supported. + * GL_INVALID_OPERATION is expected. + */ + expected_3D_error = GL_INVALID_OPERATION; + alt_3D_error = GL_NO_ERROR; + + /* Cube map depth textures are only supported + * with GL_OES_depth_texture_cube_map. + * Without that extension, + * GL_INVALID_OPERATION is expected. + */ + expected_cube_error = has_depth_texture_cube_map + ? GL_NO_ERROR : GL_INVALID_OPERATION; + alt_cube_error = GL_NO_ERROR; + } + } else { + assert(piglit_get_gl_version() < 30); + + if (internalFormat != GL_DEPTH_STENCIL) { + /* For all of the cases either GL_INVALID_VALUE could + * be generated due to format being GL_DEPTH_STENCIL + * or GL_INVALID_OPERATION could be generated due to + * format not being the same as internalformat. + */ + expected_error = GL_INVALID_OPERATION; + alt_error = GL_INVALID_VALUE; + + expected_3D_error = GL_INVALID_OPERATION; + alt_3D_error = GL_INVALID_VALUE; + + expected_cube_error = GL_INVALID_OPERATION; + alt_cube_error = GL_INVALID_VALUE; + } else { + /* For all of these cases, GL_INVALID_VALUE is the + * only acceptable error. The OpenGL ES 1.x and 2.0 + * specs make no mention of generating + * GL_INVALID_OPERATION for the 3D or cube map cases. + */ + expected_error = GL_INVALID_VALUE; + alt_error = GL_NO_ERROR; + + expected_3D_error = GL_INVALID_VALUE; + alt_3D_error = GL_NO_ERROR; + + expected_cube_error = GL_INVALID_VALUE; + alt_cube_error = GL_NO_ERROR; + } + } +#endif /* !defined PIGLIT_USE_OPENGL */ printf("Testing glTexImage with %s...\n", piglit_get_gl_enum_name(internalFormat)); glGenTextures(ARRAY_SIZE(tex), tex); +#if defined PIGLIT_USE_OPENGL glBindTexture(GL_TEXTURE_1D, tex[0]); glTexImage1D(GL_TEXTURE_1D, 0, internalFormat, 16, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, NULL); - pass = piglit_check_gl_error(expected_error) && pass; - + pass = check_gl_error2(expected_error, alt_error) && pass; +#endif glBindTexture(GL_TEXTURE_2D, tex[1]); glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, 16, 16, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, NULL); - pass = piglit_check_gl_error(expected_error) && pass; + pass = check_gl_error2(expected_error, alt_error) && pass; /* Section 3.8.1 (Texture Image Specification) of the OpenGL 2.1 spec @@ -100,11 +275,13 @@ try_TexImage(GLenum internalFormat) * The OpenGL 4.4 spec lists the same error, but it greatly expands * the list of valid texture targets. */ - glBindTexture(GL_TEXTURE_3D, tex[2]); - glTexImage3D(GL_TEXTURE_3D, 0, internalFormat, - 8, 8, 8, 0, - GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, NULL); - pass = piglit_check_gl_error(expected_3D_error) && pass; + if (has_texture_3d) { + glBindTexture(GL_TEXTURE_3D, tex[2]); + glTexImage3D(GL_TEXTURE_3D, 0, internalFormat, + 8, 8, 8, 0, + GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, NULL); + pass = check_gl_error2(expected_3D_error, alt_3D_error) && pass; + } if (has_texture_cube_map) { unsigned i; @@ -117,14 +294,18 @@ try_TexImage(GLenum internalFormat) 16, 16, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, NULL); - pass = piglit_check_gl_error(expected_cube_error) + pass = check_gl_error2(expected_cube_error, + alt_cube_error) && pass; } } +#if defined PIGLIT_USE_OPENGL glBindTexture(GL_TEXTURE_1D, 0); +#endif glBindTexture(GL_TEXTURE_2D, 0); - glBindTexture(GL_TEXTURE_3D, 0); + if (has_texture_3d) + glBindTexture(GL_TEXTURE_3D, 0); if (has_texture_cube_map) glBindTexture(GL_TEXTURE_CUBE_MAP, 0); @@ -173,17 +354,21 @@ try_TexStorage(GLenum internalFormat) glGenTextures(ARRAY_SIZE(tex), tex); +#if defined PIGLIT_USE_OPENGL glBindTexture(GL_TEXTURE_1D, tex[0]); glTexStorage1D(GL_TEXTURE_1D, 1, internalFormat, 16); pass = piglit_check_gl_error(expected_error) && pass; +#endif glBindTexture(GL_TEXTURE_2D, tex[1]); glTexStorage2D(GL_TEXTURE_2D, 1, internalFormat, 16, 16); pass = piglit_check_gl_error(expected_error) && pass; - glBindTexture(GL_TEXTURE_3D, tex[2]); - glTexStorage3D(GL_TEXTURE_3D, 1, internalFormat, 8, 8, 8); - pass = piglit_check_gl_error(expected_3D_error) && pass; + if (has_texture_3d) { + glBindTexture(GL_TEXTURE_3D, tex[2]); + glTexStorage3D(GL_TEXTURE_3D, 1, internalFormat, 8, 8, 8); + pass = piglit_check_gl_error(expected_3D_error) && pass; + } if (has_texture_cube_map) { glBindTexture(GL_TEXTURE_CUBE_MAP, tex[3]); @@ -191,9 +376,12 @@ try_TexStorage(GLenum internalFormat) pass = piglit_check_gl_error(expected_cube_error) && pass; } +#if defined PIGLIT_USE_OPENGL glBindTexture(GL_TEXTURE_1D, 0); +#endif glBindTexture(GL_TEXTURE_2D, 0); - glBindTexture(GL_TEXTURE_3D, 0); + if (has_texture_3d) + glBindTexture(GL_TEXTURE_3D, 0); if (has_texture_cube_map) glBindTexture(GL_TEXTURE_CUBE_MAP, 0); @@ -207,7 +395,9 @@ try_TexStorage(GLenum internalFormat) void piglit_init(int argc, char **argv) { bool pass = true; + bool has_texture_storage; +#if defined PIGLIT_USE_OPENGL if (piglit_get_gl_version() < 30 && !piglit_is_extension_supported("GL_EXT_packed_depth_stencil") && !piglit_is_extension_supported("GL_ARB_framebuffer_object")) { @@ -220,16 +410,43 @@ void piglit_init(int argc, char **argv) || piglit_is_extension_supported("GL_ARB_depth_texture") || piglit_is_extension_supported("GL_SGIX_depth_texture"); + has_texture_3d = true; + has_texture_cube_map = piglit_get_gl_version() >= 13 || piglit_is_extension_supported("GL_ARB_texture_cube_map"); has_depth_texture_cube_map = piglit_get_gl_version() >= 30 || piglit_is_extension_supported("GL_EXT_gpu_shader4"); + has_texture_storage = piglit_get_gl_version() >= 42 + || piglit_is_extension_supported("GL_ARB_texture_storage"); +#elif defined PIGLIT_USE_OPENGL_ES2 + if (piglit_get_gl_version() < 30 + && !piglit_is_extension_supported("GL_OES_packed_depth_stencil")) { + printf("OpenGL ES 3.0 or GL_OES_packed_depth_stencil " + "is required.\n"); + piglit_report_result(PIGLIT_SKIP); + } + + has_depth_texture = piglit_get_gl_version() >= 30 + || piglit_is_extension_supported("GL_OES_depth_texture"); + + has_texture_3d = piglit_get_gl_version() >= 30 + || piglit_is_extension_supported("GL_OES_texture_3D"); + + has_texture_cube_map = true; + + has_depth_texture_cube_map = piglit_get_gl_version() >= 30 + || piglit_is_extension_supported("GL_OES_depth_texture_cube_map"); + + has_texture_storage = piglit_get_gl_version() >= 30 + || piglit_is_extension_supported("GL_EXT_texture_storage"); +#endif + pass = try_TexImage(GL_DEPTH_STENCIL) && pass; pass = try_TexImage(GL_DEPTH24_STENCIL8) && pass; - if (piglit_is_extension_supported("GL_ARB_texture_storage")) { + if (has_texture_storage) { pass = try_TexStorage(GL_DEPTH_STENCIL) && pass; pass = try_TexStorage(GL_DEPTH24_STENCIL8) && pass; } -- 1.8.1.4 _______________________________________________ Piglit mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/piglit
