File 0002-Handle-eglQuerySurface-EGL_RENDER_BUFFER.patch of Package libnvidia-egl-x11

From 5e373f88a21b8aa190bf67eec8c6158d8642f289 Mon Sep 17 00:00:00 2001
From: Kyle Brenneman <kbrenneman@nvidia.com>
Date: Mon, 1 Dec 2025 13:33:44 -0700
Subject: [PATCH 2/4] Handle eglQuerySurface(EGL_RENDER_BUFFER)

Add a hook for eglQuerySurface to handle EGL_RENDER_BUFFER.

For windows, always return EGL_BACK_BUFFER, and for pixmaps, always
return EGL_SINGLE_BUFFER.
---
 src/x11/x11-platform.c | 56 ++++++++++++++++++++++++++++++++++++++++++
 src/x11/x11-platform.h |  1 +
 2 files changed, 57 insertions(+)

diff --git a/src/x11/x11-platform.c b/src/x11/x11-platform.c
index 9be220e..1d73bdc 100644
--- a/src/x11/x11-platform.c
+++ b/src/x11/x11-platform.c
@@ -79,11 +79,13 @@ static void eplX11TerminateDisplay(EplPlatformData *plat, EplDisplay *pdpy);
 static void eplX11DestroySurface(EplDisplay *pdpy, EplSurface *surf);
 static void eplX11FreeSurface(EplDisplay *pdpy, EplSurface *surf);
 static EGLBoolean eplX11WaitGL(EplDisplay *pdpy, EplSurface *psurf);
+static EGLBoolean eplX11HookQuerySurface(EGLDisplay edpy, EGLSurface esurf, EGLint attribute, EGLint *value);
 
 static const EplHookFunc X11_HOOK_FUNCTIONS[] =
 {
     { "eglChooseConfig", eplX11HookChooseConfig },
     { "eglGetConfigAttrib", eplX11HookGetConfigAttrib },
+    { "eglQuerySurface", eplX11HookQuerySurface },
     { "eglSwapInterval", eplX11SwapInterval },
 };
 static const int NUM_X11_HOOK_FUNCTIONS = sizeof(X11_HOOK_FUNCTIONS) / sizeof(X11_HOOK_FUNCTIONS[0]);
@@ -183,6 +185,7 @@ EGLBoolean eplX11LoadEGLExternalPlatformCommon(int major, int minor,
 
     plat->priv->egl.QueryDisplayAttribKHR = driver->getProcAddress("eglQueryDisplayAttribKHR");
     plat->priv->egl.SwapInterval = driver->getProcAddress("eglSwapInterval");
+    plat->priv->egl.QuerySurface = driver->getProcAddress("eglQuerySurface");
     plat->priv->egl.QueryDmaBufFormatsEXT = driver->getProcAddress("eglQueryDmaBufFormatsEXT");
     plat->priv->egl.QueryDmaBufModifiersEXT = driver->getProcAddress("eglQueryDmaBufModifiersEXT");
     plat->priv->egl.CreateSync = driver->getProcAddress("eglCreateSync");
@@ -202,6 +205,7 @@ EGLBoolean eplX11LoadEGLExternalPlatformCommon(int major, int minor,
 
     if (plat->priv->egl.QueryDisplayAttribKHR == NULL
             || plat->priv->egl.SwapInterval == NULL
+            || plat->priv->egl.QuerySurface == NULL
             || plat->priv->egl.QueryDmaBufFormatsEXT == NULL
             || plat->priv->egl.QueryDmaBufModifiersEXT == NULL
             || plat->priv->egl.CreateSync == NULL
@@ -1512,3 +1516,55 @@ uint32_t eplX11GetNativeXID(EplDisplay *pdpy, void *native_surface, EGLBoolean c
 
     return xid;
 }
+
+EGLBoolean eplX11HookQuerySurface(EGLDisplay edpy, EGLSurface esurf, EGLint attribute, EGLint *value)
+{
+    EplDisplay *pdpy = NULL;
+    EplSurface *psurf = NULL;
+    EGLBoolean ret = EGL_FALSE;
+
+    pdpy = eplDisplayAcquire(edpy);
+    if (pdpy == NULL)
+    {
+        return EGL_FALSE;
+    }
+
+    if (value == NULL)
+    {
+        eplSetError(pdpy->platform, EGL_BAD_ATTRIBUTE, "value pointer must not be NULL");
+        eplDisplayRelease(pdpy);
+        return EGL_FALSE;
+    }
+
+    psurf = eplSurfaceAcquire(pdpy, esurf);
+    if (psurf != NULL)
+    {
+        if (attribute == EGL_RENDER_BUFFER)
+        {
+            if (psurf->type == EPL_SURFACE_TYPE_WINDOW)
+            {
+                *value = EGL_BACK_BUFFER;
+            }
+            else
+            {
+                *value = EGL_SINGLE_BUFFER;
+            }
+            ret = EGL_TRUE;
+        }
+        else
+        {
+            ret = pdpy->platform->priv->egl.QuerySurface(pdpy->internal_display,
+                    psurf->internal_surface, attribute, value);
+        }
+        eplSurfaceRelease(pdpy, psurf);
+    }
+    else
+    {
+        // If we don't recognize the EGLSurface, then just pass the call
+        // through to the driver.
+        ret = pdpy->platform->priv->egl.QuerySurface(pdpy->internal_display, esurf, attribute, value);
+    }
+
+    eplDisplayRelease(pdpy);
+    return ret;
+}
diff --git a/src/x11/x11-platform.h b/src/x11/x11-platform.h
index c90f67d..62fd866 100644
--- a/src/x11/x11-platform.h
+++ b/src/x11/x11-platform.h
@@ -73,6 +73,7 @@ struct _EplImplPlatform
     {
         PFNEGLQUERYDISPLAYATTRIBKHRPROC QueryDisplayAttribKHR;
         PFNEGLSWAPINTERVALPROC SwapInterval;
+        PFNEGLQUERYSURFACEPROC QuerySurface;
         PFNEGLQUERYDMABUFFORMATSEXTPROC QueryDmaBufFormatsEXT;
         PFNEGLQUERYDMABUFMODIFIERSEXTPROC QueryDmaBufModifiersEXT;
         PFNEGLCREATESYNCPROC CreateSync;
-- 
2.51.0

openSUSE Build Service is sponsored by