[Mesa-dev] [PATCH 2/2] egl/glvnd: correctly report errors when vendor cannot be found

Kyle Brenneman kyle.brenneman at gmail.com
Fri Nov 2 22:09:32 UTC 2018


On 11/02/2018 01:06 PM, Emil Velikov wrote:
> From: Emil Velikov<emil.velikov at collabora.com>
>
> If the user provides an invalid display or device the ToVendor lookup
> will fail.
>
> In this case, the local [Mesa vendor] error code will be set. Thus on
> sequential eglGetError(), the error will be EGL_SUCCESS.
>
> To be more specific, GLVND remembers the last vendor and calls back
> into it's eglGetError, although there's no guarantee to ever have had
> one.
>
> Piglit: tests/egl/spec/egl_ext_device_query
> Fixes: ce562f9e3fa ("EGL: Implement the libglvnd interface for EGL (v3)")
> Cc: Kyle Brenneman<kbrenneman at nvidia.com>
> Cc: Eric Engestrom<eric at engestrom.ch>
> Signed-off-by: Emil Velikov<emil.velikov at collabora.com>
> ---
>   src/egl/main/egldispatchstubs.c | 12 ++++++++++--
>   1 file changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/src/egl/main/egldispatchstubs.c b/src/egl/main/egldispatchstubs.c
> index bfc3195c779..e39fd6197a6 100644
> --- a/src/egl/main/egldispatchstubs.c
> +++ b/src/egl/main/egldispatchstubs.c
> @@ -54,9 +54,17 @@ static __eglMustCastToProperFunctionPointerType FetchVendorFunc(__EGLvendorInfo
>   {
>       __eglMustCastToProperFunctionPointerType func = NULL;
>   
> -    if (vendor != NULL) {
> -        func = exports->fetchDispatchEntry(vendor, __EGL_DISPATCH_FUNC_INDICES[index]);
> +    if (vendor == NULL) {
> +        // XXX: How can we end here with EGL_SUCCESS?
> +        if (errorCode != EGL_SUCCESS) {
> +            // Since we have no vendor, the follow-up eglGetError() call will
> +            // end up using the GLVND error code. Set it here.
> +            exports->setEGLError(errorCode);
> +        }
> +        return NULL;
>       }
> +
> +    func = exports->fetchDispatchEntry(vendor, __EGL_DISPATCH_FUNC_INDICES[index]);
>       if (func == NULL) {
>           if (errorCode != EGL_SUCCESS) {
>               _eglError(errorCode, __EGL_DISPATCH_FUNC_NAMES[index]);
The (vendor == NULL) branch should still call _eglError so that it calls 
the debug callback function. Other than that, this looks right to me.

In answer to the question in the comment, getting an EGL_SUCCESS error 
code is inherited from the code in libglvnd itself to handle the 
eglWait* functions. If there's no current context for those functions, 
then they're a no-op and don't set an error code.

Mesa doesn't have any EGL dispatch stubs that look at the current 
context, though, so you could just remove __eglDispatchFetchByCurrent 
and the (errorCode != EGL_SUCCESS) checks.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20181102/d7001bc8/attachment.html>


More information about the mesa-dev mailing list