Re: [PATCH]: gl: Return surface in error when creating oversized texture surfaces

Martin Robinson <[email protected]>
Newsgroups gmane.comp.lib.cairo
Message-ID <[email protected]>
On 07/29/2013 01:35 PM, Chris Wilson wrote:

> (Note there is already a function _cairo_gl_surface_size_valid, maybe
> extend that to handle read-only/write-only/read-write surfaces?)

Oof. Can't believe I missed that. Thanks for pointing it out.

> The majority of its callers do seem to be internal and only expect a gl
> surface to be created.

It's true that this is mainly aimed at cairo_gl_surface_create, which is
public.

> I feel a little uneasy about changing the user API though to error out
> if asked to handle a surface too large for hw. In most cases it is
> better to be upfront about when they are going to encounter pain, but on
> the other hand we have a long history of hiding such hardware details.
> (Though I thought we did expose the limits through queries on the
> cairo_gl_context_t device.) The problem is that though the hardware may
> only support 8k coordinates, it may be be sample from and render to
> textures 64k x 64k in size (and technically even larger), for instance
> Intel hw. Whether or not OpenGL is ever capable of expressing such
> operations and their limits sanely is another question. But imposing
> this limit feels like we are artificially constraining the hw and
> preventing common use cases.

If you are more comfortable with it, I can simply replicate the check at
the beginning of _cairo_gl_surface_create_similar and the associated
error surface. I think that's sufficient for what we need in WebKit.

> This patch also needs to extend (create!) the documentation for
> cairo_gl_surface_create() explaining the various limits and how to
> implement a fallback, such as
> 
>   surface = cairo_gl_surface_create(device, content, width, height);
>   if (cairo_surface_status(surface) == CAIRO_STATUS_INVALID_SIZE)
>      surface = cairo_image_surface_create(choose_format_from_content(content),
>                                           width, height);
> 
> and perhaps remind the reader that cairo_surface_create_similar() will
> do a similar substitution automatically.
> 
>> +    oversized_surface = cairo_gl_surface_create (device, CAIRO_CONTENT_COLOR_ALPHA, INT_MAX, INT_MAX);
>> +    assert (cairo_surface_status (oversized_surface) == CAIRO_STATUS_INVALID_SIZE);
> 
> This should just set the test_status = CAIRO_TEST_FAILURE and keep going.
> So that we don't rely on the test process being forked (i.e. under
> gdb and valgrind etc).

I've spent too much time writing tests for other harnesses. :) I'll fix
that.

-- 
cairo mailing list
[email protected]
http://lists.cairographics.org/mailman/listinfo/cairo
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.