// Copyright 2016 The SwiftShader Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "libX11.hpp" #include "System/SharedLibrary.hpp" namespace { template void getFuncAddress(void *lib, const char *name, FPTR *out) { *out = reinterpret_cast(getProcAddress(lib, name)); } } // anonymous namespace LibX11exports::LibX11exports(void *libX11, void *libXext) { getFuncAddress(libX11, "XOpenDisplay", &XOpenDisplay); getFuncAddress(libX11, "XGetWindowAttributes", &XGetWindowAttributes); getFuncAddress(libX11, "XDefaultScreenOfDisplay", &XDefaultScreenOfDisplay); getFuncAddress(libX11, "XWidthOfScreen", &XWidthOfScreen); getFuncAddress(libX11, "XHeightOfScreen", &XHeightOfScreen); getFuncAddress(libX11, "XPlanesOfScreen", &XPlanesOfScreen); getFuncAddress(libX11, "XDefaultGC", &XDefaultGC); getFuncAddress(libX11, "XDefaultDepth", &XDefaultDepth); getFuncAddress(libX11, "XMatchVisualInfo", &XMatchVisualInfo); getFuncAddress(libX11, "XDefaultVisual", &XDefaultVisual); getFuncAddress(libX11, "XSetErrorHandler", &XSetErrorHandler); getFuncAddress(libX11, "XSync", &XSync); getFuncAddress(libX11, "XCreateImage", &XCreateImage); getFuncAddress(libX11, "XCloseDisplay", &XCloseDisplay); getFuncAddress(libX11, "XPutImage", &XPutImage); getFuncAddress(libX11, "XDrawString", &XDrawString); getFuncAddress(libXext, "XShmQueryExtension", &XShmQueryExtension); getFuncAddress(libXext, "XShmCreateImage", &XShmCreateImage); getFuncAddress(libXext, "XShmAttach", &XShmAttach); getFuncAddress(libXext, "XShmDetach", &XShmDetach); getFuncAddress(libXext, "XShmPutImage", &XShmPutImage); } LibX11exports *LibX11::operator->() { return loadExports(); } LibX11exports *LibX11::loadExports() { static void *libX11 = nullptr; static void *libXext = nullptr; static LibX11exports *libX11exports = nullptr; if(!libX11) { if(getProcAddress(RTLD_DEFAULT, "XOpenDisplay")) // Search the global scope for pre-loaded X11 library. { libX11exports = new LibX11exports(RTLD_DEFAULT, RTLD_DEFAULT); libX11 = (void *)-1; // No need to load it. } else { libX11 = loadLibrary("libX11.so"); if(libX11) { libXext = loadLibrary("libXext.so"); libX11exports = new LibX11exports(libX11, libXext); } else { libX11 = (void *)-1; // Don't attempt loading more than once. } } } return libX11exports; } LibX11 libX11;