From 5fabfedbd132076d6f41306e2eef7780576e0a9f Mon Sep 17 00:00:00 2001 From: "Brzak, Branislav" Date: Tue, 10 Jun 2025 10:01:32 +0200 Subject: [PATCH] SWDEV-531996 SWDEV-530154 - Use *getprocaddress to obtain Mesa functions (#504) --- rocclr/device/rocm/rocglinterop.cpp | 84 +++++++++++++++++------------ 1 file changed, 51 insertions(+), 33 deletions(-) diff --git a/rocclr/device/rocm/rocglinterop.cpp b/rocclr/device/rocm/rocglinterop.cpp index 05b21fa0b4..9b0f309c4b 100644 --- a/rocclr/device/rocm/rocglinterop.cpp +++ b/rocclr/device/rocm/rocglinterop.cpp @@ -34,24 +34,28 @@ namespace amd::roc { namespace MesaInterop { #if !defined(_WIN32) -static PFNMESAGLINTEROPGLXQUERYDEVICEINFOPROC* GlxInfo = nullptr; -static PFNMESAGLINTEROPGLXEXPORTOBJECTPROC* GlxExport = nullptr; -static PFNMESAGLINTEROPEGLQUERYDEVICEINFOPROC* EglInfo = nullptr; -static PFNMESAGLINTEROPEGLEXPORTOBJECTPROC* EglExport = nullptr; +static PFNMESAGLINTEROPGLXQUERYDEVICEINFOPROC* GlxInfo = nullptr; +static PFNMESAGLINTEROPGLXEXPORTOBJECTPROC* GlxExport = nullptr; +static PFNMESAGLINTEROPEGLQUERYDEVICEINFOPROC* EglInfo = nullptr; +static PFNMESAGLINTEROPEGLEXPORTOBJECTPROC* EglExport = nullptr; static MESA_INTEROP_KIND loadedGLAPITypes(MESA_INTEROP_NONE); + +using PFNGLXGETPROCADDRESSPROC = void* (*)(const GLubyte* procname); + +using PFNEGLGETPROCADDRESSPROC = void* (*)(const char* procName); #endif static constexpr const char* errorStrings[] = {"MESA_GLINTEROP_SUCCESS", - "MESA_GLINTEROP_OUT_OF_RESOURCES", - "MESA_GLINTEROP_OUT_OF_HOST_MEMORY", - "MESA_GLINTEROP_INVALID_OPERATION", - "MESA_GLINTEROP_INVALID_VERSION", - "MESA_GLINTEROP_INVALID_DISPLAY", - "MESA_GLINTEROP_INVALID_CONTEXT", - "MESA_GLINTEROP_INVALID_TARGET", - "MESA_GLINTEROP_INVALID_OBJECT", - "MESA_GLINTEROP_INVALID_MIP_LEVEL", - "MESA_GLINTEROP_UNSUPPORTED"}; + "MESA_GLINTEROP_OUT_OF_RESOURCES", + "MESA_GLINTEROP_OUT_OF_HOST_MEMORY", + "MESA_GLINTEROP_INVALID_OPERATION", + "MESA_GLINTEROP_INVALID_VERSION", + "MESA_GLINTEROP_INVALID_DISPLAY", + "MESA_GLINTEROP_INVALID_CONTEXT", + "MESA_GLINTEROP_INVALID_TARGET", + "MESA_GLINTEROP_INVALID_OBJECT", + "MESA_GLINTEROP_INVALID_MIP_LEVEL", + "MESA_GLINTEROP_UNSUPPORTED"}; bool Supported() { #ifdef _WIN32 @@ -68,18 +72,32 @@ bool Init(MESA_INTEROP_KIND Kind) { return false; #else if (loadedGLAPITypes == MESA_INTEROP_NONE) { - void* glxinfo=dlsym(RTLD_DEFAULT, "MesaGLInteropGLXQueryDeviceInfo"); - void* eglinfo=dlsym(RTLD_DEFAULT, "MesaGLInteropEGLQueryDeviceInfo"); + auto glx_procaddr_fn = (PFNGLXGETPROCADDRESSPROC)dlsym(RTLD_DEFAULT, "glXGetProcAddress"); + auto egl_procaddr_fn = (PFNEGLGETPROCADDRESSPROC)dlsym(RTLD_DEFAULT, "eglGetProcAddress"); - GlxInfo=(PFNMESAGLINTEROPGLXQUERYDEVICEINFOPROC*)glxinfo; - EglInfo=(PFNMESAGLINTEROPEGLQUERYDEVICEINFOPROC*)eglinfo; + if (glx_procaddr_fn) { + GlxInfo = (PFNMESAGLINTEROPGLXQUERYDEVICEINFOPROC*)glx_procaddr_fn( + (const GLubyte*)"glXGLInteropQueryDeviceInfoMESA"); + GlxExport = (PFNMESAGLINTEROPGLXEXPORTOBJECTPROC*)glx_procaddr_fn( + (const GLubyte*)"glXGLInteropExportObjectMESA"); + } - GlxExport=(PFNMESAGLINTEROPGLXEXPORTOBJECTPROC*)dlsym(RTLD_DEFAULT, "MesaGLInteropGLXExportObject"); - EglExport=(PFNMESAGLINTEROPEGLEXPORTOBJECTPROC*)dlsym(RTLD_DEFAULT, "MesaGLInteropEGLExportObject"); + if (egl_procaddr_fn) { + EglInfo = (PFNMESAGLINTEROPEGLQUERYDEVICEINFOPROC*)egl_procaddr_fn( + "eglGLInteropQueryDeviceInfoMESA"); + EglExport = + (PFNMESAGLINTEROPEGLEXPORTOBJECTPROC*)egl_procaddr_fn("eglGLInteropExportObjectMESA"); + } + + uint32_t ret = MESA_INTEROP_NONE; + if (GlxInfo && GlxExport) { + ret |= MESA_INTEROP_GLX; + } + + if (EglInfo && EglExport) { + ret |= MESA_INTEROP_EGL; + } - uint32_t ret=MESA_INTEROP_NONE; - if (GlxInfo && GlxExport) ret |= MESA_INTEROP_GLX; - if (EglInfo && EglExport) ret |= MESA_INTEROP_EGL; loadedGLAPITypes = MESA_INTEROP_KIND(ret); } @@ -95,15 +113,15 @@ bool GetInfo(mesa_glinterop_device_info& info, MESA_INTEROP_KIND Kind, const Dis assert((loadedGLAPITypes & Kind) == Kind && "Requested interop API is not currently loaded."); int ret; switch (Kind) { - case MESA_INTEROP_GLX: + case MESA_INTEROP_GLX: ret = GlxInfo(display.glxDisplay, context.glxContext, &info); break; - case MESA_INTEROP_EGL: + case MESA_INTEROP_EGL: ret = EglInfo(display.eglDisplay, context.eglContext, &info); break; - default: + default: assert(false && "Invalid interop kind."); - return false; + return false; } if (ret == MESA_GLINTEROP_SUCCESS) return true; if (ret < int(sizeof(errorStrings) / sizeof(errorStrings[0]))) @@ -122,15 +140,15 @@ bool Export(mesa_glinterop_export_in& in, mesa_glinterop_export_out& out, MESA_I assert((loadedGLAPITypes & Kind) == Kind && "Requested interop API is not currently loaded."); int ret; switch (Kind) { - case MESA_INTEROP_GLX: + case MESA_INTEROP_GLX: ret = GlxExport(display.glxDisplay, context.glxContext, &in, &out); break; - case MESA_INTEROP_EGL: + case MESA_INTEROP_EGL: ret = EglExport(display.eglDisplay, context.eglContext, &in, &out); break; - default: + default: assert(false && "Invalid interop kind."); - return false; + return false; } if (ret == MESA_GLINTEROP_SUCCESS) return true; if (ret < int(sizeof(errorStrings) / sizeof(errorStrings[0]))) @@ -140,7 +158,7 @@ bool Export(mesa_glinterop_export_in& in, mesa_glinterop_export_out& out, MESA_I return false; #endif } -} -} +} // namespace MesaInterop +} // namespace amd::roc #endif // WITHOUT_HSA_BACKEND