Test includes: - texture uploads - mipmap generation - framebuffer creation - rendering to - reading from
This test includes only GL_BYTE based formats. R16_SNORM, RG16_SNORM and RGBA16_SNORM are tested in GL_EXT_texture_norm16 tests. v2: cleanups and fixes (Nanley Chery) Signed-off-by: Tapani Pälli <tapani.pa...@intel.com> --- tests/opengl.py | 5 + tests/spec/CMakeLists.txt | 1 + tests/spec/ext_render_snorm/CMakeLists.gles2.txt | 7 + tests/spec/ext_render_snorm/CMakeLists.txt | 1 + tests/spec/ext_render_snorm/render.c | 336 +++++++++++++++++++++++ 5 files changed, 350 insertions(+) create mode 100644 tests/spec/ext_render_snorm/CMakeLists.gles2.txt create mode 100644 tests/spec/ext_render_snorm/CMakeLists.txt create mode 100644 tests/spec/ext_render_snorm/render.c diff --git a/tests/opengl.py b/tests/opengl.py index 7026395fa..9c5290f49 100644 --- a/tests/opengl.py +++ b/tests/opengl.py @@ -3078,6 +3078,11 @@ with profile.test_list.group_manager( with profile.test_list.group_manager( PiglitGLTest, + grouptools.join('spec', 'ext_render_snorm')) as g: + g(['ext_render_snorm-render'], 'render') + +with profile.test_list.group_manager( + PiglitGLTest, grouptools.join('spec', 'ext_frag_depth')) as g: g(['fragdepth_gles2']) diff --git a/tests/spec/CMakeLists.txt b/tests/spec/CMakeLists.txt index 26ee3ebf0..bb3f02744 100644 --- a/tests/spec/CMakeLists.txt +++ b/tests/spec/CMakeLists.txt @@ -182,3 +182,4 @@ add_subdirectory (ext_occlusion_query_boolean) add_subdirectory (ext_disjoint_timer_query) add_subdirectory (intel_blackhole_render) add_subdirectory (ext_texture_norm16) +add_subdirectory (ext_render_snorm) diff --git a/tests/spec/ext_render_snorm/CMakeLists.gles2.txt b/tests/spec/ext_render_snorm/CMakeLists.gles2.txt new file mode 100644 index 000000000..4b90257cc --- /dev/null +++ b/tests/spec/ext_render_snorm/CMakeLists.gles2.txt @@ -0,0 +1,7 @@ +link_libraries ( + piglitutil_${piglit_target_api} +) + +piglit_add_executable (ext_render_snorm-render render.c) + +# vim: ft=cmake: diff --git a/tests/spec/ext_render_snorm/CMakeLists.txt b/tests/spec/ext_render_snorm/CMakeLists.txt new file mode 100644 index 000000000..144a306f4 --- /dev/null +++ b/tests/spec/ext_render_snorm/CMakeLists.txt @@ -0,0 +1 @@ +piglit_include_target_api() diff --git a/tests/spec/ext_render_snorm/render.c b/tests/spec/ext_render_snorm/render.c new file mode 100644 index 000000000..3df16991e --- /dev/null +++ b/tests/spec/ext_render_snorm/render.c @@ -0,0 +1,336 @@ +/* + * Copyright © 2018 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. + */ + +/** + * @file + * Basic tests for formats added by GL_EXT_render_snorm extension + * + * https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_render_snorm.txt + * + * Test includes: + * - texture uploads + * - mipmap generation + * - framebuffer creation + * - rendering to + * - reading from + */ + +#include "piglit-util-gl.h" + +PIGLIT_GL_TEST_CONFIG_BEGIN + config.supports_gl_es_version = 31; + config.window_visual = PIGLIT_GL_VISUAL_RGBA; +PIGLIT_GL_TEST_CONFIG_END + +#define PIGLIT_RESULT(x) x ? PIGLIT_PASS : PIGLIT_FAIL + +static const char vs_source[] = + "#version 310 es\n" + "layout(location = 0) in highp vec4 vertex;\n" + "layout(location = 1) in highp vec4 uv;\n" + "out highp vec2 tex_coord;\n" + "\n" + "void main()\n" + "{\n" + " gl_Position = vertex;\n" + " tex_coord = uv.st;\n" + "}\n"; + +static const char fs_source[] = + "#version 310 es\n" + "layout(location = 0) uniform sampler2D texture;\n" + "in highp vec2 tex_coord;\n" + "out highp vec4 color;\n" + "void main()\n" + "{\n" + " color = texture2D(texture, tex_coord);\n" + "}\n"; + +/* trianglestrip, interleaved vertices + texcoords */ +static const GLfloat vertex_data[] = { + -1.0f, 1.0f, + 0.0f, 1.0f, + 1.0f, 1.0f, + 1.0f, 1.0f, + -1.0f, -1.0f, + 0.0f, 0.0f, + 1.0f, -1.0f, + 1.0f, 0.0f +}; + +static const struct fmt_test { + GLenum iformat; + GLenum base_format; + unsigned bpp; +} tests[] = { + { GL_R8_SNORM, GL_RED, 1, }, + { GL_RG8_SNORM, GL_RG, 2, }, + { GL_RGBA8_SNORM, GL_RGBA, 4, }, +}; + +static GLuint prog; + +static void +upload(const struct fmt_test *test, void *data) +{ + glTexStorage2D(GL_TEXTURE_2D, 4, test->iformat, piglit_width, + piglit_height); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, piglit_width, + piglit_height, test->base_format, GL_BYTE, data); + glGenerateMipmap(GL_TEXTURE_2D); +} + +static void +value_for_format(const struct fmt_test *test, void *value) +{ + unsigned short val = SCHAR_MAX; + + char *v = value; + /* red */ + v[0] = val; + /* green */ + if (test->bpp > 1) { + v[0] = 0; + v[1] = val; + } + /* blue */ + if (test->bpp > 2) { + v[0] = 0; + v[1] = 0; + v[2] = val; + v[3] = val; + } +} + +static void +generate_data(const struct fmt_test *test) +{ + unsigned pixels = piglit_width * piglit_height; + void *data = malloc(pixels * test->bpp); + + char *p = data; + for (unsigned i = 0; i < pixels; i++, p += test->bpp) + value_for_format(test, p); + + upload(test, data); + free(data); +} + +static GLuint +create_and_bind_empty_texture() +{ + GLuint tex; + glGenTextures(1, &tex); + glBindTexture(GL_TEXTURE_2D, tex); + + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + return tex; +} + +static GLuint +create_and_bind_texture(const struct fmt_test *test) +{ + GLuint tex = create_and_bind_empty_texture(); + generate_data(test); + return tex; +} + +static GLuint +create_and_bind_rbo(const struct fmt_test *test) +{ + GLuint rbo; + glGenRenderbuffers(1, &rbo); + glBindRenderbuffer(GL_RENDERBUFFER, rbo); + glRenderbufferStorage(GL_RENDERBUFFER, test->iformat, piglit_width, + piglit_height); + return rbo; +} + +static GLuint +create_and_bind_fbo(const struct fmt_test *test, GLuint *tex) +{ + GLuint fbo; + GLuint fbo_tex = create_and_bind_empty_texture(test); + upload(test, NULL); + + *tex = fbo_tex; + + glGenFramebuffers(1, &fbo); + glBindFramebuffer(GL_FRAMEBUFFER, fbo); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, fbo_tex, 0); + return fbo; +} + +static void +render_texture(GLuint texture, GLenum target, GLuint fbo_target) +{ + glBindTexture(target, texture); + glBindFramebuffer(GL_FRAMEBUFFER, fbo_target); + + glViewport(0, 0, piglit_width, piglit_height); + + glClear(GL_COLOR_BUFFER_BIT); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); +} + +static bool +verify_contents(const struct fmt_test *test) +{ + bool result = true; + unsigned amount = piglit_width * piglit_height; + void *pix = malloc(amount * 4); + glReadPixels(0, 0, piglit_width, piglit_height, GL_RGBA, GL_BYTE, pix); + + char value[4] = { 0, 0, 0, SCHAR_MAX }; + value_for_format(test, value); + + char *p = pix; + for (unsigned i = 0; i < amount; i++, p += 4) { + if (memcmp(p, value, sizeof(value)) == 0) + continue; + + fprintf(stderr, "value:\n%d % d %d %d\nexpect:\n%d %d %d %d", + p[0], p[1], p[2], p[3], + value[0], value[1], value[2], value[3]); + + piglit_report_subtest_result(PIGLIT_FAIL, + "format 0x%x read fail", + test->iformat); + result = false; + break; + } + + free(pix); + return result; +} + +static bool +test_format(const struct fmt_test *test) +{ + bool pass = true; + + glUseProgram(prog); + glUniform1i(0 /* explicit loc */, 0); + + /* Create a texture, upload data */ + const GLuint texture = create_and_bind_texture(test); + + /* Test glRenderbufferStorage. */ + GLuint rbo = create_and_bind_rbo(test); + if (!rbo || !piglit_check_gl_error(GL_NO_ERROR)) { + piglit_report_subtest_result(PIGLIT_FAIL, + "format 0x%x RBO test", + test->iformat); + pass &= false; + } else { + piglit_report_subtest_result(PIGLIT_PASS, + "format 0x%x RBO test", + test->iformat); + } + glDeleteRenderbuffers(1, &rbo); + + /* Create framebuffer object. */ + GLuint fbo_tex; + const GLuint fbo = create_and_bind_fbo(test, &fbo_tex); + + if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != + GL_FRAMEBUFFER_COMPLETE) { + piglit_report_subtest_result(PIGLIT_FAIL, + "format 0x%x fbo fail", + test->iformat); + pass &= false; + } + + render_texture(texture, GL_TEXTURE_2D, fbo); + + glDeleteTextures(1, &texture); + + /* Test glCopyTexImage2D by copying current fbo content to + * a texture, rendering copy back to fbo and verifying fbo contents. + */ + GLuint tmp_tex = create_and_bind_empty_texture(); + glCopyTexImage2D(GL_TEXTURE_2D, 0, test->iformat, 0, 0, piglit_width, + piglit_height, 0); + + render_texture(tmp_tex, GL_TEXTURE_2D, fbo); + + glDeleteTextures(1, &tmp_tex); + + /* Verify contents. */ + pass &= verify_contents(test); + + glDeleteFramebuffers(1, &fbo); + + /* Render fbo contents to window. */ + render_texture(fbo_tex, GL_TEXTURE_2D, 0); + + piglit_present_results(); + + glDeleteTextures(1, &fbo_tex); + + return pass; +} + +enum piglit_result +piglit_display(void) +{ + glEnableVertexAttribArray(0); + glEnableVertexAttribArray(1); + + glActiveTexture(GL_TEXTURE0); + + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), + vertex_data); + glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), + (void*) (vertex_data + (2 * sizeof(float)))); + + bool pass = true; + + const struct fmt_test *test = tests; + + /* Loop over each format. */ + for (unsigned i = 0; i < ARRAY_SIZE(tests); i++, test++) { + bool fmt_pass = test_format(test); + piglit_report_subtest_result(PIGLIT_RESULT(fmt_pass), + "format 0x%x", + test->iformat); + pass &= fmt_pass; + } + + if (!piglit_check_gl_error(GL_NO_ERROR)) + piglit_report_result(PIGLIT_FAIL); + + return PIGLIT_RESULT(pass); +} + +void +piglit_init(int argc, char **argv) +{ + piglit_require_extension("GL_EXT_render_snorm"); + prog = piglit_build_simple_program(vs_source, fs_source); +} -- 2.13.6 _______________________________________________ Piglit mailing list Piglit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/piglit