Parameter checking and fbo flipping of scissored buffer. --- tests/opengl.py | 7 + tests/spec/CMakeLists.txt | 1 + .../CMakeLists.gles2.txt | 15 ++ .../mesa_framebuffer_flip_y/CMakeLists.txt | 1 + tests/spec/mesa_framebuffer_flip_y/params.c | 97 +++++++ tests/spec/mesa_framebuffer_flip_y/scissor.c | 240 ++++++++++++++++++ 6 files changed, 361 insertions(+) create mode 100644 tests/spec/mesa_framebuffer_flip_y/CMakeLists.gles2.txt create mode 100644 tests/spec/mesa_framebuffer_flip_y/CMakeLists.txt create mode 100644 tests/spec/mesa_framebuffer_flip_y/params.c create mode 100644 tests/spec/mesa_framebuffer_flip_y/scissor.c
diff --git a/tests/opengl.py b/tests/opengl.py index c599eb180..6cfa56e01 100644 --- a/tests/opengl.py +++ b/tests/opengl.py @@ -4946,5 +4946,12 @@ with profile.test_list.group_manager( grouptools.join('spec', 'NV_image_formats')) as g: g(['nv_image_formats-gles3']) +# Group MESA_framebuffer_flip_y +with profile.test_list.group_manager( + PiglitGLTest, + grouptools.join('spec', 'mesa_framebuffer_flip_y')) as g: + g(['mesa_framebuffer_flip_y-params']) + g(['mesa_framebuffer_flip_y-scissor']) + if platform.system() is 'Windows': profile.filters.append(lambda p, _: not p.startswith('glx')) diff --git a/tests/spec/CMakeLists.txt b/tests/spec/CMakeLists.txt index 4df9d331d..92be9ae64 100644 --- a/tests/spec/CMakeLists.txt +++ b/tests/spec/CMakeLists.txt @@ -184,3 +184,4 @@ add_subdirectory (ext_disjoint_timer_query) add_subdirectory (intel_blackhole_render) add_subdirectory (ext_texture_norm16) add_subdirectory (ext_render_snorm) +add_subdirectory (mesa_framebuffer_flip_y) diff --git a/tests/spec/mesa_framebuffer_flip_y/CMakeLists.gles2.txt b/tests/spec/mesa_framebuffer_flip_y/CMakeLists.gles2.txt new file mode 100644 index 000000000..f8a758fba --- /dev/null +++ b/tests/spec/mesa_framebuffer_flip_y/CMakeLists.gles2.txt @@ -0,0 +1,15 @@ +link_libraries ( + piglitutil_${piglit_target_api} +) + +piglit_add_executable (mesa_framebuffer_flip_y-params params.c) + +if(PIGLIT_BUILD_DMA_BUF_TESTS) + add_definitions(-DHAVE_LIBDRM) + + include_directories( + ${LIBDRM_INCLUDE_DIRS} + ) + + piglit_add_executable (mesa_framebuffer_flip_y-scissor scissor.c) +endif() diff --git a/tests/spec/mesa_framebuffer_flip_y/CMakeLists.txt b/tests/spec/mesa_framebuffer_flip_y/CMakeLists.txt new file mode 100644 index 000000000..144a306f4 --- /dev/null +++ b/tests/spec/mesa_framebuffer_flip_y/CMakeLists.txt @@ -0,0 +1 @@ +piglit_include_target_api() diff --git a/tests/spec/mesa_framebuffer_flip_y/params.c b/tests/spec/mesa_framebuffer_flip_y/params.c new file mode 100644 index 000000000..084e1394e --- /dev/null +++ b/tests/spec/mesa_framebuffer_flip_y/params.c @@ -0,0 +1,97 @@ +/* + * 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 params.c + * Parameter checking for GL_MESA_framebuffer_flip_y extension + * + * https://www.khronos.org/registry/OpenGL/extensions/MESA/MESA_framebuffer_flip_y.txt + * + * Test parameter setting and reading through glFramebufferParameteri. + */ + +#include "piglit-util-gl.h" + +PIGLIT_GL_TEST_CONFIG_BEGIN + + config.supports_gl_es_version = 30; + config.khr_no_error_support = PIGLIT_HAS_ERRORS; + +PIGLIT_GL_TEST_CONFIG_END + +enum piglit_result +piglit_display(void) +{ + return PIGLIT_FAIL; +} + +void piglit_init(int argc, char **argv) +{ + GLuint fbo; + GLint value; + bool pass = true; + bool winsys_pass = true; + bool flip_default_pass = true; + bool flip_set_pass = true; + + piglit_require_extension("GL_MESA_framebuffer_flip_y"); + + /* Bind to winsys fbo */ + glBindFramebuffer(GL_FRAMEBUFFER, 0); + + /* Should not work on winsys fbo */ + glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1); + if (!piglit_check_gl_error(GL_INVALID_OPERATION)) + winsys_pass = false; + + glGetFramebufferParameteriv(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, &value); + if (!piglit_check_gl_error(GL_INVALID_OPERATION)) + winsys_pass = false; + + piglit_report_subtest_result(winsys_pass ? PIGLIT_PASS : PIGLIT_FAIL, + "winsys fbo check"); + + /* Create user fbo and bind to it */ + glGenFramebuffers(1, &fbo); + glBindFramebuffer(GL_FRAMEBUFFER, fbo); + + /* Check to make sure the default setting for flip orientation is 0 */ + glGetFramebufferParameteriv(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, &value); + if (!piglit_check_gl_error(GL_NO_ERROR) || value != 0) + flip_default_pass = false; + piglit_report_subtest_result(flip_default_pass ? PIGLIT_PASS : PIGLIT_FAIL, + "default flip orientation"); + + /* Set the flip orientation and read it back */ + glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1); + if (!piglit_check_gl_error(GL_NO_ERROR)) + flip_set_pass = false; + glGetFramebufferParameteriv(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, &value); + if (!piglit_check_gl_error(GL_NO_ERROR) || value != 1) + flip_set_pass = false; + piglit_report_subtest_result(flip_set_pass ? PIGLIT_PASS : PIGLIT_FAIL, + "change flip orientation"); + + pass = winsys_pass && flip_default_pass && flip_set_pass; + piglit_report_result(pass ? PIGLIT_PASS : PIGLIT_FAIL); +} diff --git a/tests/spec/mesa_framebuffer_flip_y/scissor.c b/tests/spec/mesa_framebuffer_flip_y/scissor.c new file mode 100644 index 000000000..9c9ad3ae6 --- /dev/null +++ b/tests/spec/mesa_framebuffer_flip_y/scissor.c @@ -0,0 +1,240 @@ +/* + * 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 scissor.c + * Testing for GL_MESA_framebuffer_flip_y extension using scissor + * + * https://www.khronos.org/registry/OpenGL/extensions/MESA/MESA_framebuffer_flip_y.txt + * + * Check that access to a flipped fbo occurs correctly. + * Access to a texture that is bound to a framebuffer and rendered to + * should occur the same whether the fbo is flipped or not. This is done + * using piglit_probe_rect_rgb which uses glReadPixels. But if this texture + * is bound to an fbo that is not flipped, the access will be opposite that + * of the first access. + * + * The main use for this extension is to render to a texture that is backed + * by a dma buf. Then this dma buf can be submitted to a display controller + * like a winsys fbo. + */ + +#include "piglit-framework-gl/piglit_drm_dma_buf.h" +#include "piglit-util-egl.h" +#include "piglit-util-gl.h" + +#include <sys/mman.h> + +PIGLIT_GL_TEST_CONFIG_BEGIN + + config.supports_gl_es_version = 30; + config.khr_no_error_support = PIGLIT_HAS_ERRORS; + +PIGLIT_GL_TEST_CONFIG_END + +static const float red[4] = {1.0, 0.0, 0.0, 1.0}; +static const float green[4] = {0.0, 1.0, 0.0, 1.0}; +static const int tex_width = 8; +static const int tex_height = 8; +PFNEGLCREATEIMAGEKHRPROC peglCreateImageKHR; +PFNEGLDESTROYIMAGEKHRPROC peglDestroyImageKHR; + +static bool setup_egl(EGLDisplay egl_dpy) { + EGLint egl_major, egl_minor; + + if (!eglInitialize(egl_dpy, &egl_major, &egl_minor)) { + EGLint egl_error = eglGetError(); + piglit_loge("failed to get EGLConfig: %s(0x%x)", + piglit_get_egl_error_name(egl_error), egl_error); + return false; + } + + peglCreateImageKHR = (void*) eglGetProcAddress("eglCreateImageKHR"); + if (!peglCreateImageKHR) { + fprintf(stderr, "eglGetProcAddress(\"eglCreateImageKHR\") failed\n"); + return false; + } + + peglDestroyImageKHR = (void*) eglGetProcAddress("eglDestroyImageKHR"); + if (!peglCreateImageKHR) { + fprintf(stderr, "eglGetProcAddress(\"eglDestroyImageKHR\") failed\n"); + return false; + } + + return true; +} + +static EGLImageKHR +create_image(unsigned w, unsigned h, unsigned fourcc, int fd, unsigned stride, unsigned offset) +{ + EGLint attr[] = { + EGL_WIDTH, w, + EGL_HEIGHT, h, + EGL_LINUX_DRM_FOURCC_EXT, fourcc, + EGL_DMA_BUF_PLANE0_FD_EXT, fd, + EGL_DMA_BUF_PLANE0_OFFSET_EXT, offset, + EGL_DMA_BUF_PLANE0_PITCH_EXT, stride, + EGL_NONE + }; + + return peglCreateImageKHR(eglGetCurrentDisplay(), EGL_NO_CONTEXT, + EGL_LINUX_DMA_BUF_EXT, (EGLClientBuffer)NULL, attr); +} + +static bool +compare_pixels(const unsigned char *c1, const float *c2) +{ + if (c1[0] == 255 * c2[2] && + c1[1] == 255 * c2[1] && + c1[2] == 255 * c2[0] && + c1[3] == 255 * c2[3]) { + return true; + } + + return false; +} + +enum piglit_result +piglit_display(void) +{ + return PIGLIT_FAIL; +} + +void piglit_init(int argc, char **argv) +{ + const unsigned fourcc = DRM_FORMAT_ARGB8888; + GLuint fbo_flip, fbo_normal, tex; + bool pass = true; + struct piglit_dma_buf *buf; + EGLImageKHR img; + EGLDisplay egl_dpy = eglGetCurrentDisplay(); + unsigned char *src_pixels = alloca(tex_width * tex_height * 4); + unsigned char *p, *top_middle_pixel, *bot_middle_pixel; + + piglit_require_egl_extension(egl_dpy, "EGL_EXT_image_dma_buf_import"); + piglit_require_egl_extension(egl_dpy, "EGL_KHR_image_base"); + piglit_require_extension("GL_OES_EGL_image"); + piglit_require_extension("GL_MESA_framebuffer_flip_y"); + + if (!setup_egl(egl_dpy)) { + piglit_report_result(PIGLIT_FAIL); + return; + } + + if (piglit_create_dma_buf(tex_width, tex_height, + fourcc, src_pixels, &buf) != PIGLIT_PASS) { + pass = false; + } + + img = create_image(tex_width, tex_height, + fourcc, buf->fd, buf->stride[0], buf->offset[0]); + if (!img || !pass) { + piglit_destroy_dma_buf(buf); + pass = false; + } else { + /* Create flipped fbo */ + glGenFramebuffers(1, &fbo_flip); + glBindFramebuffer(GL_FRAMEBUFFER, fbo_flip); + glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1); + + glGenTextures(1, &tex); + glBindTexture(GL_TEXTURE_2D, tex); + glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, (GLeglImageOES)img); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, tex, 0); + + /* clear to red */ + glClearColor(red[0], red[1], red[2], red[3]); + glClear(GL_COLOR_BUFFER_BIT); + + /* clear top half to green */ + glEnable(GL_SCISSOR_TEST); + glScissor(0, 0, tex_width, tex_height / 2); + glClearColor(green[0], green[1], green[2], green[3]); + glClear(GL_COLOR_BUFFER_BIT); + glDisable(GL_SCISSOR_TEST); + glFinish(); + + /* Check that reading back the through the framebuffer + * that the flipped orientation is not shown */ + /* Check top half is green */ + pass &= piglit_probe_rect_rgb(0, 0, tex_width, tex_height / 2, green); + + /* Check bottom half is red */ + pass &= piglit_probe_rect_rgb(0, tex_height / 2, + tex_width, tex_height / 2, + red); + + piglit_report_subtest_result(pass ? PIGLIT_PASS : PIGLIT_FAIL, + "inverted fbo access"); + + /* Create another fbo, this time not flipped */ + glGenFramebuffers(1, &fbo_normal); + glBindFramebuffer(GL_FRAMEBUFFER, fbo_normal); + + /* Bind the previously created texture to it */ + glBindTexture(GL_TEXTURE_2D, tex); + glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, (GLeglImageOES)img); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, tex, 0); + + /* Now when reading back from the fbo the texture should + * be flipped */ + /* Check top half is red */ + pass &= piglit_probe_rect_rgb(0, 0, tex_width, tex_height / 2, red); + + /* Check top half is green */ + pass &= piglit_probe_rect_rgb(0, tex_height / 2, + tex_width, tex_height / 2, + green); + + piglit_report_subtest_result(pass ? PIGLIT_PASS : PIGLIT_FAIL, + "normal fbo access"); + + /* Check the backing store to see what the orientation is. */ + p = mmap (0, tex_width * tex_height * 4, PROT_READ, MAP_SHARED, buf->fd, 0); + + /* Probe the byte array to make sure it is flipped correctly */ + top_middle_pixel = p + ((tex_width / 2) * 4) + (2 * tex_width * 4); + bot_middle_pixel = p + ((tex_width / 2) * 4) + ((tex_height - 1) * tex_width * 4); + + pass &= compare_pixels(top_middle_pixel, red); + pass &= compare_pixels(bot_middle_pixel, green); + + piglit_report_subtest_result(pass ? PIGLIT_PASS : PIGLIT_FAIL, + "dma buf access"); + + munmap(p, tex_width * tex_height * 4); + + glDeleteTextures(1, &tex); + glDeleteFramebuffers(1, &fbo_flip); + glDeleteFramebuffers(1, &fbo_normal); + peglDestroyImageKHR(egl_dpy, img); + piglit_destroy_dma_buf(buf); + } + + if (!piglit_check_gl_error(GL_NO_ERROR)) + pass = false; + + piglit_report_result(pass ? PIGLIT_PASS : PIGLIT_FAIL); +} -- 2.19.0.397.gdd90340f6a-goog _______________________________________________ Piglit mailing list Piglit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/piglit