Topi Pohjolainen <topi.pohjolai...@intel.com> writes: > diff --git a/tests/spec/ext_image_dma_buf_import/invalid_attributes.c > b/tests/spec/ext_image_dma_buf_import/invalid_attributes.c > new file mode 100644 > index 0000000..a6a6954 > --- /dev/null > +++ b/tests/spec/ext_image_dma_buf_import/invalid_attributes.c > @@ -0,0 +1,286 @@ > +/* > + * Copyright © 2013 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. > + */ > + > +#include "piglit-util-egl.h" > +#define EGL_EGLEXT_PROTOTYPES 1 > +#include <EGL/eglext.h> > +#include <unistd.h> > +#include "ext_image_dma_buf_fourcc.h" > + > +/** > + * @file invalid_attributes.c > + * > + * From the EXT_image_dma_buf_import spec: > + * > + * "* If <target> is EGL_LINUX_DMA_BUF_EXT and <buffer> is not NULL, the > + * error EGL_BAD_PARAMETER is generated. > + * > + * * If <target> is EGL_LINUX_DMA_BUF_EXT, and the EGL_LINUX_DRM_FOURCC_EXT > + * attribute is set to a format not supported by the EGL, EGL_BAD_MATCH > + * is generated. > + * > + * * If <target> is EGL_LINUX_DMA_BUF_EXT, and the EGL_LINUX_DRM_FOURCC_EXT > + * attribute indicates a single-plane format, EGL_BAD_ATTRIBUTE is > + * generated if any of the EGL_DMA_BUF_PLANE1_* or EGL_DMA_BUF_PLANE2_* > + * attributes are specified. > + * > + * * If <target> is EGL_LINUX_DMA_BUF_EXT and one or more of the values > + * specified for a plane's pitch or offset isn't supported by EGL, > + * EGL_BAD_ACCESS is generated." > + */ > + > +PIGLIT_GL_TEST_CONFIG_BEGIN > + > + config.supports_gl_es_version = 10; > + > +PIGLIT_GL_TEST_CONFIG_END > + > +static bool > +test_excess_attributes(int fd, unsigned w, unsigned h, unsigned stride, > + unsigned offset) > +{ > + unsigned i; > + const EGLint excess_attributes[][2 * 7 + 1] = { > + { EGL_HEIGHT, w, > + EGL_WIDTH, h, > + EGL_LINUX_DRM_FOURCC_EXT, DRM_FORMAT_ARGB8888, > + EGL_DMA_BUF_PLANE0_FD_EXT, fd, > + EGL_DMA_BUF_PLANE0_OFFSET_EXT, offset, > + EGL_DMA_BUF_PLANE0_PITCH_EXT, stride, > + EGL_DMA_BUF_PLANE1_FD_EXT, fd, > + EGL_NONE }, > + { EGL_HEIGHT, w, > + EGL_WIDTH, h, > + EGL_LINUX_DRM_FOURCC_EXT, DRM_FORMAT_ARGB8888, > + EGL_DMA_BUF_PLANE0_FD_EXT, fd, > + EGL_DMA_BUF_PLANE0_OFFSET_EXT, offset, > + EGL_DMA_BUF_PLANE0_PITCH_EXT, stride, > + EGL_DMA_BUF_PLANE1_OFFSET_EXT, 0, > + EGL_NONE }, > + { EGL_HEIGHT, w, > + EGL_WIDTH, h, > + EGL_LINUX_DRM_FOURCC_EXT, DRM_FORMAT_ARGB8888, > + EGL_DMA_BUF_PLANE0_FD_EXT, fd, > + EGL_DMA_BUF_PLANE0_OFFSET_EXT, offset, > + EGL_DMA_BUF_PLANE0_PITCH_EXT, stride, > + EGL_DMA_BUF_PLANE1_PITCH_EXT, stride, > + EGL_NONE }, > + };
I think this particular subtest could be better done like the test_invalid_hints, where a single attribute as a function parameter is plugged into the stock array. It would clarify what's going on in the test, and then you could easily do PLANE2_* checks, too. > + for (i = 0; i < ARRAY_SIZE(excess_attributes); ++i) { > + /** > + * The spec says: > + * > + * "If <target> is EGL_LINUX_DMA_BUF_EXT, <dpy> must be a valid > + * display, <ctx> must be EGL_NO_CONTEXT, and <buffer> must be > + * NULL, cast into the type EGLClientBuffer." > + */ Please remove this copypasta from the eglCreateImageKHR callsites that aren't testing this particular spec text. > + EGLImageKHR img = eglCreateImageKHR(eglGetCurrentDisplay(), > + EGL_NO_CONTEXT, EGL_LINUX_DMA_BUF_EXT, > + (EGLClientBuffer)NULL, excess_attributes[i]); > + > + if (!piglit_check_egl_error(EGL_BAD_ATTRIBUTE)) { > + if (img) > + eglDestroyImageKHR(eglGetCurrentDisplay(), img); > + return false; > + } > + } > + > + return true; > +} > +static bool > +test_invalid_context(int fd, unsigned w, unsigned h, unsigned stride, > + unsigned offset) > +{ > + EGLImageKHR img; > + EGLint attr[] = { > + EGL_WIDTH, w, > + EGL_HEIGHT, h, > + EGL_LINUX_DRM_FOURCC_EXT, DRM_FORMAT_ARGB8888, > + EGL_DMA_BUF_PLANE0_FD_EXT, fd, > + EGL_DMA_BUF_PLANE0_OFFSET_EXT, offset, > + EGL_DMA_BUF_PLANE0_PITCH_EXT, stride, > + EGL_NONE > + }; > + > + /** > + * The spec says: > + * > + * "If <target> is EGL_LINUX_DMA_BUF_EXT, <dpy> must be a valid > + * display, <ctx> must be EGL_NO_CONTEXT, and <buffer> must be > + * NULL, cast into the type EGLClientBuffer." > + */ > + img = eglCreateImageKHR(eglGetCurrentDisplay(), eglGetCurrentContext(), > + EGL_LINUX_DMA_BUF_EXT, (EGLClientBuffer)NULL, attr); > + > + if (!piglit_check_egl_error(EGL_BAD_CONTEXT)) { > + if (img) > + eglDestroyImageKHR(eglGetCurrentDisplay(), img); > + return false; > + } It's not explicitly called out in the spec, but I think this error case would be EGL_BAD_PARAMETER like the other bad parameter cases for this call. > + > +/** > + * One re-uses the buffer for all the tests. Each test is expected to fail > + * meaning that the ownership is not transferred to the EGL in any point. > + */ "One re-uses" reads awkwardly. I think "We reuse" would be better. > +enum piglit_result > +piglit_display(void) > +{ > + const unsigned char pixels[2 * 2 * 4]; > + struct piglit_dma_buf *buf; > + unsigned stride; > + unsigned offset; > + int fd; > + enum piglit_result res; > + bool pass; > + > + res = piglit_create_dma_buf(2, 2, 4, pixels, 2 * 4, &buf, &fd, &stride, > + &offset); > + if (res != PIGLIT_PASS) > + return res; > + > + pass = test_excess_attributes(fd, 2, 2, 2 * 4, 0); > + pass = test_buffer_not_null(fd, 2, 2, 2 * 4, 0) && pass; > + pass = test_invalid_context(fd, 2, 2, 2 * 4, 0) && pass; > + pass = test_invalid_format(fd, 2, 2, 2 * 4, 0) && pass; > + pass = test_pitch_zero(fd, 2, 2, 2 * 4, 0) && pass; You should pass in the allocated stride from the piglit_create_dma_buf, or for an implementation that aligns stride, you'll get BAD_ACCESS errors by ignoring it. Also, please make variables "w" and "h" and use them so I don't have to see this wall of 2s and 4s all over. The "4" parameter in create_dma_buf was not obvious what it was doing (cpp, not size)
pgpMQEFlLC4vk.pgp
Description: PGP signature
_______________________________________________ Piglit mailing list Piglit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/piglit