framebuffer: validate width/height in _set_viewport

This validates that the viewport width and height arguments are positive
values in _cogl_framebuffer_set_viewport. In addition, just before
calling glViewport we also assert that something else hasn't gone amiss
and that the internal viewport width/height values we track are still
positive before passing to glViewport which generates an error for
negative values.
This commit is contained in:
Robert Bragg 2011-05-27 12:21:26 +01:00
parent 5a9b92a4a5
commit 1e3f4f62e0

View File

@ -513,6 +513,8 @@ _cogl_framebuffer_set_viewport (CoglFramebuffer *framebuffer,
float width, float width,
float height) float height)
{ {
g_return_if_fail (width > 0 && height > 0);
if (framebuffer->viewport_x == x && if (framebuffer->viewport_x == x &&
framebuffer->viewport_y == y && framebuffer->viewport_y == y &&
framebuffer->viewport_width == width && framebuffer->viewport_width == width &&
@ -976,8 +978,10 @@ _cogl_onscreen_new (void)
ctx, ctx,
COGL_FRAMEBUFFER_TYPE_ONSCREEN, COGL_FRAMEBUFFER_TYPE_ONSCREEN,
COGL_PIXEL_FORMAT_RGBA_8888_PRE, COGL_PIXEL_FORMAT_RGBA_8888_PRE,
0xdeadbeef, /* width */ 0x1eadbeef, /* width */
0xdeadbeef); /* height */ 0x1eadbeef); /* height */
/* NB: make sure to pass positive width/height numbers here
* because otherwise we'll hit input validation assertions!*/
COGL_FRAMEBUFFER (onscreen)->allocated = TRUE; COGL_FRAMEBUFFER (onscreen)->allocated = TRUE;
@ -1413,9 +1417,8 @@ _cogl_framebuffer_flush_state (CoglFramebuffer *draw_buffer,
{ {
float gl_viewport_y; float gl_viewport_y;
if (draw_buffer->viewport_width < 0 g_assert (draw_buffer->viewport_width >=0 &&
|| draw_buffer->viewport_height < 0) draw_buffer->viewport_height >=0);
return;
/* Convert the Cogl viewport y offset to an OpenGL viewport y offset /* Convert the Cogl viewport y offset to an OpenGL viewport y offset
* NB: OpenGL defines its window and viewport origins to be bottom * NB: OpenGL defines its window and viewport origins to be bottom