diff options
Diffstat (limited to 'indra/llrender')
| -rw-r--r-- | indra/llrender/llgl.cpp | 114 | ||||
| -rw-r--r-- | indra/llrender/llgl.h | 10 | ||||
| -rw-r--r-- | indra/llrender/llglheaders.h | 30 |
3 files changed, 144 insertions, 10 deletions
diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index 7b8eb7809e..c45ad70758 100644 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -52,10 +52,11 @@ #include <glm/gtc/matrix_access.hpp> #include "glm/gtc/type_ptr.hpp" -#if LL_MESA +#if LL_MESA_HEADLESS # include "GL/osmesa.h" # define LL_GET_PROC_ADDRESS(func) OSMesaGetProcAddress(func) #elif LL_SDL_WINDOW +# include "llwindowsdl.h" # include "SDL3/SDL.h" # define LL_GET_PROC_ADDRESS(func) SDL_GL_GetProcAddress(func) #elif LL_WINDOWS @@ -247,6 +248,19 @@ PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT = nullptr; PFNWGLGETSWAPINTERVALEXTPROC wglGetSwapIntervalEXT = nullptr; #endif +#if LL_LINUX && LL_X11 && !LL_MESA_HEADLESS +// GLX_MESA_query_renderer +PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC glXQueryCurrentRendererIntegerMESA = nullptr; +PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC glXQueryCurrentRendererStringMESA = nullptr; +PFNGLXQUERYRENDERERINTEGERMESAPROC glXQueryRendererIntegerMESA = nullptr; +PFNGLXQUERYRENDERERSTRINGMESAPROC glXQueryRendererStringMESA = nullptr; +#endif + +#if LL_LINUX && LL_WAYLAND &&!LL_MESA_HEADLESS +// EGL_VERSION_1_0 +PFNEGLQUERYSTRINGPROC eglQueryString = nullptr; +#endif + // GL_VERSION_1_0 PFNGLCLEARCOLORPROC glClearColor = nullptr; PFNGLCLEARPROC glClear = nullptr; @@ -1039,6 +1053,42 @@ void LLGLManager::initWGL() #endif } +void LLGLManager::initGLX() +{ +#if LL_LINUX && LL_X11 && !LL_MESA_HEADLESS + if (!mIsX11) + return; + + reloadExtensionsString(); + + mHasGLXMESAQueryRenderer = mGLExtensions.contains("GLX_MESA_query_renderer"); + if (mHasGLXMESAQueryRenderer) + { + glXQueryCurrentRendererIntegerMESA = (PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC)LL_GET_PROC_ADDRESS("glXQueryCurrentRendererIntegerMESA"); + glXQueryCurrentRendererStringMESA = (PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC)LL_GET_PROC_ADDRESS("glXQueryCurrentRendererStringMESA"); + glXQueryRendererIntegerMESA = (PFNGLXQUERYRENDERERINTEGERMESAPROC)LL_GET_PROC_ADDRESS("glXQueryRendererIntegerMESA"); + glXQueryRendererStringMESA = (PFNGLXQUERYRENDERERSTRINGMESAPROC)LL_GET_PROC_ADDRESS("glXQueryRendererStringMESA"); + } +#endif +} + +void LLGLManager::initEGL() +{ +#if LL_LINUX && LL_WAYLAND && !LL_MESA_HEADLESS + if (!mIsWayland) + return; + + reloadExtensionsString(); + + // EGL_VERSION_1_0 + eglQueryString = (PFNEGLQUERYSTRINGPROC)LL_GET_PROC_ADDRESS("eglQueryString"); + + LL_INFOS("RenderInit") << "EGL_VENDOR " << ll_safe_string((const char *)eglQueryString(SDL_EGL_GetCurrentDisplay(), EGL_VENDOR)) << LL_ENDL; + LL_INFOS("RenderInit") << "EGL_VERSION " << ll_safe_string((const char *)eglQueryString(SDL_EGL_GetCurrentDisplay(), EGL_VERSION)) << LL_ENDL; +#endif +} + + // return false if unable (or unwilling due to old drivers) to init GL bool LLGLManager::initGL() { @@ -1221,6 +1271,23 @@ bool LLGLManager::initGL() } } else #endif + +#if LL_LINUX && LL_X11 && !LL_MESA_HEADLESS + if(mHasGLXMESAQueryRenderer && mVRAM == 0) + { + unsigned int vram_val = 0; + if(glXQueryCurrentRendererIntegerMESA(GLX_RENDERER_VIDEO_MEMORY_MESA, &vram_val)) + { + gGLManager.mVRAM = vram_val; + + if (mVRAM != 0) + { + LL_WARNS("RenderInit") << "VRAM Detected (GLXMesaQueryRenderer):" << mVRAM << LL_ENDL; + } + } + } +#endif + #if LL_WINDOWS || LL_LINUX { if (mHasNVXGpuMemoryInfo && mVRAM == 0) @@ -1452,13 +1519,12 @@ void LLGLManager::reloadExtensionsString() } #endif - #if LL_WINDOWS { PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)LL_GET_PROC_ADDRESS("wglGetExtensionsStringARB"); if (wglGetExtensionsStringARB) { - std::string wgl_exts = ll_safe_string((const char*)wglGetExtensionsStringARB(wglGetCurrentDC()));; + std::string wgl_exts = ll_safe_string((const char*)wglGetExtensionsStringARB(wglGetCurrentDC())); boost::char_separator<char> sep(" "); boost::tokenizer<boost::char_separator<char> > tok(wgl_exts, sep); for (boost::tokenizer<boost::char_separator<char> >::iterator i = tok.begin(); i != tok.end(); ++i) @@ -1468,6 +1534,48 @@ void LLGLManager::reloadExtensionsString() } } #endif + +#if LL_SDL_WINDOW && LL_LINUX && LL_X11 && !LL_MESA_HEADLESS + if (mIsX11) + { + if (LLWindowSDL::sX11Data.xdisplay && LLWindowSDL::sX11Data.xwindow) + { + typedef const char *(*PFNEGLXQUERYEXTENSIONSSTRINGPROC) (Display *dpy, int screen ); + PFNEGLXQUERYEXTENSIONSSTRINGPROC llglXQueryExtensionsString = (PFNEGLXQUERYEXTENSIONSSTRINGPROC)LL_GET_PROC_ADDRESS("glXQueryExtensionsString"); + if (llglXQueryExtensionsString) + { + std::string glx_exts = ll_safe_string((const char*)llglXQueryExtensionsString(LLWindowSDL::sX11Data.xdisplay, LLWindowSDL::sX11Data.xscreen)); + boost::char_separator<char> sep(" "); + boost::tokenizer<boost::char_separator<char> > tok(glx_exts, sep); + for (boost::tokenizer<boost::char_separator<char> >::iterator i = tok.begin(); i != tok.end(); ++i) + { + mGLExtensions.insert(*i); + } + } + } + } +#endif + +#if LL_SDL_WINDOW && LL_LINUX && LL_WAYLAND && !LL_MESA_HEADLESS + if (mIsWayland) + { + SDL_EGLDisplay egl_display = SDL_EGL_GetCurrentDisplay(); + if (egl_display) + { + PFNEGLQUERYSTRINGPROC lleglQueryString = (PFNEGLQUERYSTRINGPROC)LL_GET_PROC_ADDRESS("eglQueryString"); + if (lleglQueryString) + { + std::string egl_exts = ll_safe_string((const char*)lleglQueryString((EGLDisplay)egl_display, EGL_EXTENSIONS)); + boost::char_separator<char> sep(" "); + boost::tokenizer<boost::char_separator<char> > tok(egl_exts, sep); + for (boost::tokenizer<boost::char_separator<char> >::iterator i = tok.begin(); i != tok.end(); ++i) + { + mGLExtensions.insert(*i); + } + } + } + } +#endif } void LLGLManager::initExtensions() diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h index b7cd3df3c8..3a311ad03b 100644 --- a/indra/llrender/llgl.h +++ b/indra/llrender/llgl.h @@ -70,7 +70,9 @@ public: bool initGL(); void shutdownGL(); - void initWGL(); // Initializes stupid WGL extensions + void initWGL(); // Initializes WGL extensions + void initGLX(); // Initializes GLX extensions + void initEGL(); // Initializes EGL extensions std::string getRawGLString(); // For sending to simulator @@ -103,6 +105,7 @@ public: bool mHasAMDAssociations = false; bool mHasNVXGpuMemoryInfo = false; bool mHasATIMemInfo = false; + bool mHasGLXMESAQueryRenderer = false; bool mIsAMD; bool mIsNVIDIA; @@ -147,6 +150,11 @@ public: // GL Extension String std::set<std::string> mGLExtensions; +#if LL_LINUX + bool mIsX11 = false; + bool mIsWayland = false; +#endif + private: void reloadExtensionsString(); void initExtensions(); diff --git a/indra/llrender/llglheaders.h b/indra/llrender/llglheaders.h index fb9c339c62..9e4d1c5b3a 100644 --- a/indra/llrender/llglheaders.h +++ b/indra/llrender/llglheaders.h @@ -27,11 +27,11 @@ #ifndef LL_LLGLHEADERS_H #define LL_LLGLHEADERS_H -#if LL_WINDOWS || LL_MESA || LL_SDL_WINDOW || LL_LINUX +#if LL_WINDOWS || LL_MESA_HEADLESS || LL_SDL_WINDOW || LL_LINUX //---------------------------------------------------------------------------- - // LL_WINDOWS || LL_MESA || LL_SDL_WINDOW || LL_LINUX + // LL_WINDOWS || LL_MESA_HEADLESS || LL_SDL_WINDOW || LL_LINUX -#if LL_MESA +#if LL_MESA_HEADLESS #define GL_GLEXT_PROTOTYPES 1 #else #define LL_GL_FUNC_POINTER 1 @@ -43,16 +43,22 @@ // quotes so we get libraries/.../GL/ version #include "GL/glcorearb.h" -#if LL_WINDOWS && !LL_MESA +#if LL_WINDOWS && !LL_MESA_HEADLESS #include "GL/wglext.h" #endif -#if LL_LINUX && !LL_MESA +#if LL_LINUX && LL_X11 && !LL_MESA_HEADLESS +#define GLX_GLXEXT_LEGACY #define __gl_h_ 1 #include "GL/glx.h" #include "GL/glxext.h" #endif +#if LL_LINUX && LL_WAYLAND && !LL_MESA_HEADLESS +#define EGL_EGL_PROTOTYPES 0 +#include "EGL/egl.h" +#endif + #elif LL_DARWIN //---------------------------------------------------------------------------- // LL_DARWIN @@ -64,7 +70,7 @@ #define GL_GLEXT_PROTOTYPES 1 #include "GL/glext.h" -#endif // LL_MESA / LL_SDL_WINDOW // LL_LINUX / LL_WINDOWS / LL_DARWIN +#endif // LL_MESA_HEADLESS / LL_SDL_WINDOW // LL_LINUX / LL_WINDOWS / LL_DARWIN //GL_NVX_gpu_memory_info constants #ifndef GL_NVX_gpu_memory_info @@ -145,6 +151,18 @@ extern PFNWGLCHOOSEPIXELFORMATARBPROC wglChoosePixelFormatARB; #endif // LL_WINDOWS +#if LL_LINUX && LL_X11 && !LL_MESA_HEADLESS +// GLX_MESA_query_renderer +extern PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC glXQueryCurrentRendererIntegerMESA; +extern PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC glXQueryCurrentRendererStringMESA; +extern PFNGLXQUERYRENDERERINTEGERMESAPROC glXQueryRendererIntegerMESA; +extern PFNGLXQUERYRENDERERSTRINGMESAPROC glXQueryRendererStringMESA; +#endif + +#if LL_LINUX && LL_WAYLAND &&!LL_MESA_HEADLESS +extern PFNEGLQUERYSTRINGPROC eglQueryString; +#endif + // We get all functions via getProcAddress when using SDL // GL_VERSION_1_0 extern PFNGLCULLFACEPROC glCullFace; |
