// 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"

#include <memory>

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 std::unique_ptr<LibX11exports> libX11exports = nullptr;

	if(!libX11)
	{
		if(getProcAddress(RTLD_DEFAULT, "XOpenDisplay"))  // Search the global scope for pre-loaded X11 library.
		{
			libX11exports = std::make_unique<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 = std::make_unique<LibX11exports>(libX11, libXext);
			}
			else
			{
				libX11 = (void *)-1;  // Don't attempt loading more than once.
			}
		}
	}

	return libX11exports.get();
}

LibX11 libX11;
