// // Copyright (c) 2016 Advanced Micro Devices, Inc. All rights reserved. // #ifndef WITHOUT_HSA_BACKEND #include "os/os.hpp" #include "utils/debug.hpp" #include "utils/flags.hpp" #include "device/rocm/rocglinterop.hpp" #if !defined(_WIN32) #include #endif namespace roc { #if !defined(_WIN32) static PFNMESAGLINTEROPGLXQUERYDEVICEINFOPROC GlxInfo = nullptr; static PFNMESAGLINTEROPGLXEXPORTOBJECTPROC GlxExport = nullptr; static PFNMESAGLINTEROPEGLQUERYDEVICEINFOPROC EglInfo = nullptr; static PFNMESAGLINTEROPEGLEXPORTOBJECTPROC EglExport = nullptr; #endif std::atomic MesaInterop::refCount(0); bool MesaInterop::Supported() { #ifdef _WIN32 return false; #else return true; #endif } //Attempt to locate Mesa interop APIs. Return which of glx/egl are supported. bool MesaInterop::Bind(MESA_INTEROP_KIND Kind, const DisplayHandle& Display, const ContextHandle& Context) { #if defined(_WIN32) return false; #else if(Kind==MESA_INTEROP_NONE) return false; if(kind!=MESA_INTEROP_NONE) { LogError("Error - MesaInterop Bind while already bound."); return false; } void* glxinfo=dlsym(RTLD_DEFAULT, "MesaGLInteropGLXQueryDeviceInfo"); void* eglinfo=dlsym(RTLD_DEFAULT, "MesaGLInteropEGLQueryDeviceInfo"); if(((glxinfo!=GlxInfo) || (eglinfo!=EglInfo)) && (refCount!=0)) LogWarning("Warning - Mesa changed while holding interop contexts."); GlxInfo=(PFNMESAGLINTEROPGLXQUERYDEVICEINFOPROC)glxinfo; EglInfo=(PFNMESAGLINTEROPEGLQUERYDEVICEINFOPROC)eglinfo; GlxExport=(PFNMESAGLINTEROPGLXEXPORTOBJECTPROC)dlsym(RTLD_DEFAULT, "MesaGLInteropGLXExportObject"); EglExport=(PFNMESAGLINTEROPEGLEXPORTOBJECTPROC)dlsym(RTLD_DEFAULT, "MesaGLInteropEGLExportObject"); uint32_t ret=MESA_INTEROP_NONE; if(GlxInfo && GlxExport) ret|=MESA_INTEROP_GLX; if(EglInfo && EglExport) ret|=MESA_INTEROP_EGL; kind = MESA_INTEROP_KIND(ret & Kind); display=Display; context=Context; if(kind!=MESA_INTEROP_NONE) { refCount++; return true; } return false; #endif } bool MesaInterop::GetInfo(mesa_glinterop_device_info& info) const { #ifdef _WIN32 return false; #else switch(kind) { case MESA_INTEROP_GLX: return GlxInfo(display.glxDisplay, context.glxContext, &info)==MESA_GLINTEROP_SUCCESS; case MESA_INTEROP_EGL: return EglInfo(display.eglDisplay, context.eglContext, &info)==MESA_GLINTEROP_SUCCESS; default: return false; } #endif } bool MesaInterop::Export (mesa_glinterop_export_in& in, mesa_glinterop_export_out& out) const { #ifdef _WIN32 return false; #else switch(kind) { case MESA_INTEROP_GLX: return GlxExport(display.glxDisplay, context.glxContext, &in, &out)==MESA_GLINTEROP_SUCCESS; case MESA_INTEROP_EGL: return EglExport(display.eglDisplay, context.eglContext, &in, &out)==MESA_GLINTEROP_SUCCESS; default: return false; } #endif } } #endif // WITHOUT_HSA_BACKEND