diff options
author | Guillaume Charifi <[email protected]> | 2016-06-20 15:27:33 +0200 |
---|---|---|
committer | Chad Versace <[email protected]> | 2016-07-07 11:28:55 -0700 |
commit | 9fea9d6f8e862a8b3f569d37d06d1ff69c6e18f5 (patch) | |
tree | e22c4431c3f6fcdfdb3b245c3af20160c6938701 /src/egl/main/eglsurface.c | |
parent | 7adb9b094894a512c019b3378eb9e3c69d830edc (diff) |
egl: Fix the bad surface attributes combination checking for pbuffers. (v3)
Fixes a regression induced by commit a0674ce5c41903ccd161e89abb149621bfbc40d2:
When EGL_TEXTURE_FORMAT and EGL_TEXTURE_TARGET were both specified (and
both != EGL_NO_TEXTURE), an error was instantly triggered, before the
other one had even a chance to be checked, which is obviously not the
intended behaviour.
v2: Full commit hash, remove useless variables.
v3: [chadv] Add Fixes footers.
Fixes: piglit "spec/egl 1.4/eglcreatepbuffersurface and then glclear"
Fixes: piglit "spec/egl 1.4/largest possible eglcreatepbuffersurface and then glclear"
Signed-off-by: Guillaume Charifi <[email protected]>
Reviewed-by: Frank Binns <[email protected]>
Reviewed-by: Chad Versace <[email protected]>
Diffstat (limited to 'src/egl/main/eglsurface.c')
-rw-r--r-- | src/egl/main/eglsurface.c | 36 |
1 files changed, 15 insertions, 21 deletions
diff --git a/src/egl/main/eglsurface.c b/src/egl/main/eglsurface.c index 99e24dd8895..231a5f01435 100644 --- a/src/egl/main/eglsurface.c +++ b/src/egl/main/eglsurface.c @@ -71,8 +71,8 @@ _eglParseSurfaceAttribList(_EGLSurface *surf, const EGLint *attrib_list) EGLint type = surf->Type; EGLint texture_type = EGL_PBUFFER_BIT; EGLint i, err = EGL_SUCCESS; - EGLint tex_target = -1; - EGLint tex_format = -1; + EGLint attr = EGL_NONE; + EGLint val = EGL_NONE; if (!attrib_list) return EGL_SUCCESS; @@ -81,8 +81,8 @@ _eglParseSurfaceAttribList(_EGLSurface *surf, const EGLint *attrib_list) texture_type |= EGL_PIXMAP_BIT; for (i = 0; attrib_list[i] != EGL_NONE; i++) { - EGLint attr = attrib_list[i++]; - EGLint val = attrib_list[i]; + attr = attrib_list[i++]; + val = attrib_list[i]; switch (attr) { /* common attributes */ @@ -189,7 +189,6 @@ _eglParseSurfaceAttribList(_EGLSurface *surf, const EGLint *attrib_list) break; } - tex_format = val; switch (val) { case EGL_TEXTURE_RGB: case EGL_TEXTURE_RGBA: @@ -209,7 +208,6 @@ _eglParseSurfaceAttribList(_EGLSurface *surf, const EGLint *attrib_list) break; } - tex_target = val; switch (val) { case EGL_TEXTURE_2D: case EGL_NO_TEXTURE: @@ -235,25 +233,21 @@ _eglParseSurfaceAttribList(_EGLSurface *surf, const EGLint *attrib_list) break; } - if (type == EGL_PBUFFER_BIT) { - if (tex_target == -1) - tex_target = surf->TextureTarget; - - if (tex_format == -1) - tex_format = surf->TextureFormat; - - if ((tex_target == EGL_NO_TEXTURE && tex_format != EGL_NO_TEXTURE) || - (tex_format == EGL_NO_TEXTURE && tex_target != EGL_NO_TEXTURE)) { - err = EGL_BAD_MATCH; - } - } - - if (err != EGL_SUCCESS) { - _eglLog(_EGL_WARNING, "bad surface attribute 0x%04x", attr); + if (err != EGL_SUCCESS) break; + } + + if (err == EGL_SUCCESS && type == EGL_PBUFFER_BIT) { + if ((surf->TextureTarget == EGL_NO_TEXTURE && surf->TextureFormat != EGL_NO_TEXTURE) || + (surf->TextureFormat == EGL_NO_TEXTURE && surf->TextureTarget != EGL_NO_TEXTURE)) { + attr = surf->TextureTarget == EGL_NO_TEXTURE ? EGL_TEXTURE_TARGET : EGL_TEXTURE_FORMAT; + err = EGL_BAD_MATCH; } } + if (err != EGL_SUCCESS) + _eglLog(_EGL_WARNING, "bad surface attribute 0x%04x", attr); + return err; } |