blob: 1337f8bb12fb85d6bc2224755c52f4362a0b758f [file] [log] [blame]
//
// Copyright 2015 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// FunctionsGLX.h: Defines the FunctionsGLX class to load functions and data from GLX
#ifndef LIBANGLE_RENDERER_GL_GLX_FUNCTIONSGLX_H_
#define LIBANGLE_RENDERER_GL_GLX_FUNCTIONSGLX_H_
#include <string>
#include <vector>
#include "libANGLE/renderer/gl/glx/platform_glx.h"
namespace rx
{
class FunctionsGLX
{
public:
FunctionsGLX();
~FunctionsGLX();
// Load data from GLX, can be called multiple times
bool initialize(Display *xDisplay, int screen, std::string *errorString);
void terminate();
bool hasExtension(const char *extension) const;
int majorVersion;
int minorVersion;
Display *getDisplay() const;
int getScreen() const;
PFNGETPROCPROC getProc;
// GLX 1.0
glx::Context createContext(XVisualInfo *visual, glx::Context share, bool direct) const;
void destroyContext(glx::Context context) const;
Bool makeCurrent(glx::Drawable drawable, glx::Context context) const;
void swapBuffers(glx::Drawable drawable) const;
Bool queryExtension(int *errorBase, int *event) const;
Bool queryVersion(int *major, int *minor) const;
glx::Context getCurrentContext() const;
glx::Drawable getCurrentDrawable() const;
void waitX() const;
void waitGL() const;
// GLX 1.1
const char *getClientString(int name) const;
const char *queryExtensionsString() const;
// GLX 1.3
glx::FBConfig *getFBConfigs(int *nElements) const;
glx::FBConfig *chooseFBConfig(const int *attribList, int *nElements) const;
int getFBConfigAttrib(glx::FBConfig config, int attribute, int *value) const;
XVisualInfo *getVisualFromFBConfig(glx::FBConfig config) const;
glx::Window createWindow(glx::FBConfig config, Window window, const int *attribList) const;
void destroyWindow(glx::Window window) const;
glx::Pbuffer createPbuffer(glx::FBConfig config, const int *attribList) const;
void destroyPbuffer(glx::Pbuffer pbuffer) const;
void queryDrawable(glx::Drawable drawable, int attribute, unsigned int *value) const;
// GLX_ARB_create_context
glx::Context createContextAttribsARB(glx::FBConfig config,
glx::Context shareContext,
Bool direct,
const int *attribList) const;
// GLX_EXT_swap_control
void swapIntervalEXT(glx::Drawable drawable, int interval) const;
// GLX_MESA_swap_control
int swapIntervalMESA(int interval) const;
// GLX_SGI_swap_control
int swapIntervalSGI(int interval) const;
// GLX_OML_sync_control
bool getSyncValuesOML(glx::Drawable drawable, int64_t *ust, int64_t *msc, int64_t *sbc) const;
private:
// So as to isolate GLX from angle we do not include angleutils.h and cannot
// use angle::NonCopyable so we replicated it here instead.
FunctionsGLX(const FunctionsGLX &) = delete;
void operator=(const FunctionsGLX &) = delete;
struct GLXFunctionTable;
static void *sLibHandle;
Display *mXDisplay;
int mXScreen;
GLXFunctionTable *mFnPtrs;
std::vector<std::string> mExtensions;
};
} // namespace rx
#endif // LIBANGLE_RENDERER_GL_GLX_FUNCTIONSGLX_H_