On 11/02/2018 01:06 PM, Emil Velikov wrote:
From: Emil Velikov<emil.veli...@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<kbrenne...@nvidia.com>
Cc: Eric Engestrom<e...@engestrom.ch>
Signed-off-by: Emil Velikov<emil.veli...@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.
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to