diff options
author | Chia-I Wu <[email protected]> | 2011-12-20 17:18:56 +0800 |
---|---|---|
committer | Chia-I Wu <[email protected]> | 2011-12-20 17:26:18 +0800 |
commit | 249c6f1934d1d0a6215d02ef6b8a7e9585dfe955 (patch) | |
tree | c1fc390854b18122c65807d842b12086be447ad9 /src/gallium/state_trackers/egl/common | |
parent | eb7d1b9474b021769e2d1f1b64901c64130e53d8 (diff) |
st/egl: error check and clamp coordinates in eglPostSubBufferNV
EGL_BAD_PARAMETER should be returned when any of the coordinates is negative.
Diffstat (limited to 'src/gallium/state_trackers/egl/common')
-rw-r--r-- | src/gallium/state_trackers/egl/common/egl_g3d_api.c | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/src/gallium/state_trackers/egl/common/egl_g3d_api.c b/src/gallium/state_trackers/egl/common/egl_g3d_api.c index 606e7601f9a..37903ceb5af 100644 --- a/src/gallium/state_trackers/egl/common/egl_g3d_api.c +++ b/src/gallium/state_trackers/egl/common/egl_g3d_api.c @@ -296,13 +296,9 @@ egl_g3d_create_surface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLConfig *conf, gconf->stvis.buffer_mask & ST_ATTACHMENT_FRONT_LEFT_MASK) gsurf->stvis.render_buffer = ST_ATTACHMENT_FRONT_LEFT; - if (dpy->Extensions.NV_post_sub_buffer) { - if (gsurf->base.Type == EGL_WINDOW_BIT && - gsurf->base.RenderBuffer == EGL_BACK_BUFFER) - gsurf->base.PostSubBufferSupportedNV = EGL_TRUE; - else - gsurf->base.PostSubBufferSupportedNV = EGL_FALSE; - } + /* surfaces can always be posted when the display supports it */ + if (dpy->Extensions.NV_post_sub_buffer) + gsurf->base.PostSubBufferSupportedNV = EGL_TRUE; gsurf->stfbi = egl_g3d_create_st_framebuffer(&gsurf->base); if (!gsurf->stfbi) { @@ -613,8 +609,25 @@ static EGLBoolean egl_g3d_post_sub_buffer(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint x, EGLint y, EGLint width, EGLint height) { + EGLint rect[4]; + + if (x < 0 || y < 0 || width < 0 || height < 0) + return _eglError(EGL_BAD_PARAMETER, "eglPostSubBufferNV"); + + /* clamp */ + if (x + width > surf->Width) + width = surf->Width - x; + if (y + height > surf->Height) + height = surf->Height - y; + + if (width <= 0 || height <= 0) + return EGL_TRUE; + + rect[0] = x; /* Note: y=0=bottom */ - const EGLint rect[4] = { x, surf->Height - y - height, width, height }; + rect[1] = surf->Height - y - height; + rect[2] = width; + rect[3] = height; return swap_buffers(drv, dpy, surf, 1, rect, EGL_TRUE); } |