[cairo] [PATCH] test: Add test oversized egl surfaces

Bryce Harrington bryce at osg.samsung.com
Wed Sep 17 14:05:36 PDT 2014


On Tue, Sep 16, 2014 at 12:33:00PM +0530, RAVI NANJUNDAPPA wrote:
> Hi, 
> 
> Am facing some problem with UTF while sending the patch inline.  I guess
> that's one of the reason why that patch was not be displayed in the mailing
> list as well. 
> So attaching the patch here for better clarity.

One thing I've learned doing egl tests is that the error handling can
sometimes hang EGL if the test isn't aggressive enough in letting go of
everything.

So one thing I'd suggest is everywhere that you are returning early in 
preamble(), to instead do 'goto CLEANUP;' and then at the end of the
routine have it go through all of the cleanup logic.  Here's what I
arrived at doing for caskbench:


 void destroyEGLContextAndWindow (egl_state_t *state) {
 {
    if (state->egl_display) {
        eglMakeCurrent (state->egl_display, EGL_NO_SURFACE,
        EGL_NO_SURFACE, EGL_NO_CONTEXT);
        eglDestroyContext (state->egl_display, state->egl_context);
        eglDestroySurface (state->egl_display, state->egl_surface);
        state->egl_context = EGL_NO_CONTEXT;
	state->egl_surface = EGL_NO_SURFACE;
        eglTerminate (state->egl_display);
    }

    if (state->dpy) {
        XUnmapWindow (state->dpy, state->window);
        XDestroyWindow (state->dpy, state->window);
        XCloseDisplay (state->dpy);
    }
 }

You have local variables rather than tracking things in a state struct,
so you can simplify this down further.

(If we add more EGL testing in the future, it might be useful to use
separate create/destroy routines with a state structure, as those
routines can then be shared across tests.)

Aside from the cleanup logic, the patch looks good to me.

Bryce
 
> > -----Original Message-----
> > From: cairo [mailto:cairo-bounces at cairographics.org] On Behalf Of RAVI
> > NANJUNDAPPA
> > Sent: Tuesday, September 16, 2014 12:00 PM
> > To: cairo at cairographics.org
> > Subject: Re: [cairo] [PATCH] test: Add test oversized egl surfaces
> > 
> > Hi,
> > 
> > I've referred test/gl-oversized-surface.c file and wrote this new
> test/egl-
> > oversized-surface.c to handle the egl surfaces.
> > Please let me know if the banner needs to modified.
> > 
> > Thanks and Best Regards,
> > N Ravi
> > 
> > > -----Original Message-----
> > > From: Ravi Nanjundappa [mailto:nravi.n at samsung.com]
> > > Sent: Tuesday, September 16, 2014 11:52 AM
> > > To: cairo at cairographics.org
> > > Cc: Ravi Nanjundappa
> > > Subject: [PATCH] test: Add test oversized egl surfaces
> > >
> > > This test exercises error scenario when creating over sized egl
> > > surface
> > that is
> > > larger than maximum framebuffer or texture dimensions of the context
> > >
> > > Signed-off-by: Ravi Nanjundappa <nravi.n at samsung.com>
> > > ---
> > >  test/Makefile.am             |    4 ++
> > >  test/Makefile.sources        |    3 ++
> > >  test/egl-oversized-surface.c |  112
> > > ++++++++++++++++++++++++++++++++++++++++++
> > >  3 files changed, 119 insertions(+)
> > >  create mode 100644 test/egl-oversized-surface.c
> > >
> > > diff --git a/test/Makefile.am b/test/Makefile.am index
> > > 81c50e6..950629b
> > > 100644
> > > --- a/test/Makefile.am
> > > +++ b/test/Makefile.am
> > > @@ -20,6 +20,10 @@ if CAIRO_HAS_GL_SURFACE  test_sources +=
> > > $(gl_surface_test_sources)  endif
> > >
> > > +if CAIRO_HAS_EGL_FUNCTIONS
> > > +test_sources += $(egl_surface_test_sources) endif
> > > +
> > >  # Need to add quartz-surface-source
> > >  if CAIRO_HAS_QUARTZ_SURFACE
> > >  test_sources += $(quartz_surface_test_sources) diff --git
> > > a/test/Makefile.sources b/test/Makefile.sources index 916d91a..689645c
> > > 100644
> > > --- a/test/Makefile.sources
> > > +++ b/test/Makefile.sources
> > > @@ -401,6 +401,9 @@ gl_surface_test_sources = \
> > >  	gl-oversized-surface.c \
> > >  	gl-surface-source.c
> > >
> > > +egl_surface_test_sources = \
> > > +       egl-oversized-surface.c
> > > +
> > >  quartz_surface_test_sources = quartz-surface-source.c
> > >
> > >  pdf_surface_test_sources = \
> > > diff --git a/test/egl-oversized-surface.c
> > > b/test/egl-oversized-surface.c
> > new
> > > file mode 100644 index 0000000..f946da6
> > > --- /dev/null
> > > +++ b/test/egl-oversized-surface.c
> > > @@ -0,0 +1,112 @@
> > > +/*
> > > + * Copyright © 2014 Samsung Electronics
> > > + *
> > > + * 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 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.
> > > + *
> > > + * Author: Ravi Nanjundappa <nravi.n at samsung.com>  */
> > > +
> > > +/*
> > > + * This test exercises error scenario for over sized egl surface
> > > + *
> > > + */
> > > +
> > > +#include "cairo-test.h"
> > > +#include <cairo-gl.h>
> > > +#include <assert.h>
> > > +#include <limits.h>
> > > +
> > > +static cairo_test_status_t
> > > +preamble (cairo_test_context_t *test_ctx) {
> > > +    EGLint rgba_attribs[] = {
> > > +	EGL_RED_SIZE, 8,
> > > +	EGL_GREEN_SIZE, 8,
> > > +	EGL_BLUE_SIZE, 8,
> > > +	EGL_ALPHA_SIZE, 8,
> > > +	EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
> > > +#if CAIRO_HAS_GL_SURFACE
> > > +	EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, #elif
> > CAIRO_HAS_GLESV2_SURFACE
> > > +	EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, #endif
> > > +	EGL_NONE
> > > +    };
> > > +    const EGLint ctx_attribs[] = {
> > > +#if CAIRO_HAS_GLESV2_SURFACE
> > > +	EGL_CONTEXT_CLIENT_VERSION, 2,
> > > +#endif
> > > +	EGL_NONE
> > > +    };
> > > +
> > > +    EGLDisplay dpy;
> > > +    EGLContext ctx;
> > > +    EGLConfig config;
> > > +    EGLint numConfigs;
> > > +    int major, minor;
> > > +    cairo_device_t *device;
> > > +    cairo_surface_t *oversized_surface;
> > > +    cairo_test_status_t test_status = CAIRO_TEST_SUCCESS;
> > > +
> > > +    dpy = eglGetDisplay (EGL_DEFAULT_DISPLAY);
> > > +    if (! eglInitialize (dpy, &major, &minor)) {
> > > +	return CAIRO_TEST_UNTESTED;
> > > +    }
> > > +
> > > +    eglChooseConfig (dpy, rgba_attribs, &config, 1, &numConfigs);
> > > +    if (numConfigs == 0) {
> > > +	return CAIRO_TEST_UNTESTED;
> > > +    }
> > > +
> > > +#if CAIRO_HAS_GL_SURFACE
> > > +    eglBindAPI (EGL_OPENGL_API);
> > > +#elif CAIRO_HAS_GLESV2_SURFACE
> > > +    eglBindAPI (EGL_OPENGL_ES_API);
> > > +#endif
> > > +
> > > +   ctx = eglCreateContext (dpy, config, EGL_NO_CONTEXT,
> > > +				  ctx_attribs);
> > > +    if (ctx == EGL_NO_CONTEXT) {
> > > +	eglTerminate (dpy);
> > > +	return CAIRO_TEST_UNTESTED;
> > > +    }
> > > +
> > > +    device = cairo_egl_device_create (dpy, ctx);
> > > +
> > > +    oversized_surface = cairo_gl_surface_create (device,
> > > CAIRO_CONTENT_COLOR_ALPHA, INT_MAX, INT_MAX);
> > > +    if (cairo_surface_status (oversized_surface) !=
> > > CAIRO_STATUS_INVALID_SIZE)
> > > +        test_status = CAIRO_TEST_FAILURE;
> > > +
> > > +    cairo_device_destroy (device);
> > > +
> > > +    eglDestroyContext (dpy, ctx);
> > > +    eglMakeCurrent (dpy, EGL_NO_SURFACE, EGL_NO_SURFACE,
> > > EGL_NO_CONTEXT);
> > > +    eglTerminate (dpy);
> > > +
> > > +    return test_status;
> > > +}
> > > +
> > > +CAIRO_TEST (egl_oversized_surface,
> > > +	    "Test that creating a surface beyond texture limits results in
> > an
> > > error surface",
> > > +	    "egl", /* keywords */
> > > +	    NULL, /* requirements */
> > > +	    0, 0,
> > > +	    preamble, NULL)
> > > --
> > > 1.7.9.5
> > 
> > --
> > cairo mailing list
> > cairo at cairographics.org
> > http://lists.cairographics.org/mailman/listinfo/cairo

> >From 2387f10a09086ca292781e2c43649a4ef162cafe Mon Sep 17 00:00:00 2001
> From: Ravi Nanjundappa <nravi.n at samsung.com>
> Date: Tue, 16 Sep 2014 10:18:02 +0530
> Subject: [PATCH] test: Add test oversized egl surfaces
> 
> This test exercises error scenario when creating over sized egl surface
> that is larger than maximum framebuffer or texture dimensions of the
> context
> 
> Signed-off-by: Ravi Nanjundappa <nravi.n at samsung.com>
> ---
>  test/Makefile.am             |    4 ++
>  test/Makefile.sources        |    3 ++
>  test/egl-oversized-surface.c |  112 ++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 119 insertions(+)
>  create mode 100644 test/egl-oversized-surface.c
> 
> diff --git a/test/Makefile.am b/test/Makefile.am
> index 81c50e6..950629b 100644
> --- a/test/Makefile.am
> +++ b/test/Makefile.am
> @@ -20,6 +20,10 @@ if CAIRO_HAS_GL_SURFACE
>  test_sources += $(gl_surface_test_sources)
>  endif
>  
> +if CAIRO_HAS_EGL_FUNCTIONS
> +test_sources += $(egl_surface_test_sources)
> +endif
> +
>  # Need to add quartz-surface-source
>  if CAIRO_HAS_QUARTZ_SURFACE
>  test_sources += $(quartz_surface_test_sources)
> diff --git a/test/Makefile.sources b/test/Makefile.sources
> index 916d91a..689645c 100644
> --- a/test/Makefile.sources
> +++ b/test/Makefile.sources
> @@ -401,6 +401,9 @@ gl_surface_test_sources = \
>  	gl-oversized-surface.c \
>  	gl-surface-source.c
>  
> +egl_surface_test_sources = \
> +       egl-oversized-surface.c
> +
>  quartz_surface_test_sources = quartz-surface-source.c
>  
>  pdf_surface_test_sources = \
> diff --git a/test/egl-oversized-surface.c b/test/egl-oversized-surface.c
> new file mode 100644
> index 0000000..f946da6
> --- /dev/null
> +++ b/test/egl-oversized-surface.c
> @@ -0,0 +1,112 @@
> +/*
> + * Copyright © 2014 Samsung Electronics
> + *
> + * 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 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.
> + *
> + * Author: Ravi Nanjundappa <nravi.n at samsung.com>
> + */
> +
> +/*
> + * This test exercises error scenario for over sized egl surface
> + *
> + */
> +
> +#include "cairo-test.h"
> +#include <cairo-gl.h>
> +#include <assert.h>
> +#include <limits.h>
> +
> +static cairo_test_status_t
> +preamble (cairo_test_context_t *test_ctx)
> +{
> +    EGLint rgba_attribs[] = {
> +	EGL_RED_SIZE, 8,
> +	EGL_GREEN_SIZE, 8,
> +	EGL_BLUE_SIZE, 8,
> +	EGL_ALPHA_SIZE, 8,
> +	EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
> +#if CAIRO_HAS_GL_SURFACE
> +	EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
> +#elif CAIRO_HAS_GLESV2_SURFACE
> +	EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
> +#endif
> +	EGL_NONE
> +    };
> +    const EGLint ctx_attribs[] = {
> +#if CAIRO_HAS_GLESV2_SURFACE
> +	EGL_CONTEXT_CLIENT_VERSION, 2,
> +#endif
> +	EGL_NONE
> +    };
> +
> +    EGLDisplay dpy;
> +    EGLContext ctx;
> +    EGLConfig config;
> +    EGLint numConfigs;
> +    int major, minor;
> +    cairo_device_t *device;
> +    cairo_surface_t *oversized_surface;
> +    cairo_test_status_t test_status = CAIRO_TEST_SUCCESS;
> +
> +    dpy = eglGetDisplay (EGL_DEFAULT_DISPLAY);
> +    if (! eglInitialize (dpy, &major, &minor)) {
> +	return CAIRO_TEST_UNTESTED;
> +    }
> +
> +    eglChooseConfig (dpy, rgba_attribs, &config, 1, &numConfigs);
> +    if (numConfigs == 0) {
> +	return CAIRO_TEST_UNTESTED;
> +    }
> +
> +#if CAIRO_HAS_GL_SURFACE
> +    eglBindAPI (EGL_OPENGL_API);
> +#elif CAIRO_HAS_GLESV2_SURFACE
> +    eglBindAPI (EGL_OPENGL_ES_API);
> +#endif
> +
> +   ctx = eglCreateContext (dpy, config, EGL_NO_CONTEXT,
> +				  ctx_attribs);
> +    if (ctx == EGL_NO_CONTEXT) {
> +	eglTerminate (dpy);
> +	return CAIRO_TEST_UNTESTED;
> +    }
> +
> +    device = cairo_egl_device_create (dpy, ctx);
> +
> +    oversized_surface = cairo_gl_surface_create (device, CAIRO_CONTENT_COLOR_ALPHA, INT_MAX, INT_MAX);
> +    if (cairo_surface_status (oversized_surface) != CAIRO_STATUS_INVALID_SIZE)
> +        test_status = CAIRO_TEST_FAILURE;
> +
> +    cairo_device_destroy (device);
> +
> +    eglDestroyContext (dpy, ctx);
> +    eglMakeCurrent (dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
> +    eglTerminate (dpy);
> +
> +    return test_status;
> +}
> +
> +CAIRO_TEST (egl_oversized_surface,
> +	    "Test that creating a surface beyond texture limits results in an error surface",
> +	    "egl", /* keywords */
> +	    NULL, /* requirements */
> +	    0, 0,
> +	    preamble, NULL)
> -- 
> 1.7.9.5
> 

> -- 
> cairo mailing list
> cairo at cairographics.org
> http://lists.cairographics.org/mailman/listinfo/cairo



More information about the cairo mailing list