Commit 3cd0ca3c by Corentin Wallez

Completely isolate GLX in FunctionsGLX

This makes it so it is the only file including glx.h. BUG=angleproject:892 Change-Id: I5c45b659ec102b7a2c92e010a6843fa21b7c664b Reviewed-on: https://chromium-review.googlesource.com/271418Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Tested-by: 's avatarCorentin Wallez <cwallez@chromium.org>
parent 7d7f8c44
......@@ -6,10 +6,8 @@
// DisplayGLX.h: GLX implementation of egl::Display
#define GLX_GLXEXT_PROTOTYPES
#include "libANGLE/renderer/gl/glx/DisplayGLX.h"
#include <GL/glxext.h>
#include <EGL/eglext.h>
#include <algorithm>
......@@ -26,7 +24,7 @@ namespace rx
class FunctionsGLGLX : public FunctionsGL
{
public:
FunctionsGLGLX(PFNGLXGETPROCADDRESSPROC getProc)
FunctionsGLGLX(PFNGETPROCPROC getProc)
: mGetProc(getProc)
{
}
......@@ -38,10 +36,10 @@ class FunctionsGLGLX : public FunctionsGL
private:
void *loadProcAddress(const std::string &function) override
{
return reinterpret_cast<void*>(mGetProc(reinterpret_cast<const unsigned char*>(function.c_str())));
return reinterpret_cast<void*>(mGetProc(function.c_str()));
}
PFNGLXGETPROCADDRESSPROC mGetProc;
PFNGETPROCPROC mGetProc;
};
DisplayGLX::DisplayGLX()
......@@ -95,7 +93,7 @@ egl::Error DisplayGLX::initialize(egl::Display *display)
}
}
GLXFBConfig contextConfig;
glx::FBConfig contextConfig;
// When glXMakeCurrent is called, the context and the surface must be
// compatible which in glX-speak means that their config have the same
// color buffer type, are both RGBA or ColorIndex, and their buffers have
......@@ -124,7 +122,7 @@ egl::Error DisplayGLX::initialize(egl::Display *display)
GLX_CONFIG_CAVEAT, GLX_NONE,
None
};
GLXFBConfig* candidates = mGLX.chooseFBConfig(attribList, &nConfigs);
glx::FBConfig* candidates = mGLX.chooseFBConfig(attribList, &nConfigs);
if (nConfigs == 0)
{
XFree(candidates);
......@@ -184,7 +182,7 @@ SurfaceImpl *DisplayGLX::createWindowSurface(const egl::Config *configuration,
const egl::AttributeMap &attribs)
{
ASSERT(configIdToGLXConfig.count(configuration->configID) > 0);
GLXFBConfig fbConfig = configIdToGLXConfig[configuration->configID];
glx::FBConfig fbConfig = configIdToGLXConfig[configuration->configID];
return new WindowSurfaceGLX(mGLX, window, mGLX.getDisplay(), mContext, fbConfig);
}
......@@ -193,7 +191,7 @@ SurfaceImpl *DisplayGLX::createPbufferSurface(const egl::Config *configuration,
const egl::AttributeMap &attribs)
{
ASSERT(configIdToGLXConfig.count(configuration->configID) > 0);
GLXFBConfig fbConfig = configIdToGLXConfig[configuration->configID];
glx::FBConfig fbConfig = configIdToGLXConfig[configuration->configID];
EGLint width = attribs.get(EGL_WIDTH, 0);
EGLint height = attribs.get(EGL_HEIGHT, 0);
......@@ -241,11 +239,11 @@ egl::ConfigSet DisplayGLX::generateConfigs() const
};
int glxConfigCount;
GLXFBConfig *glxConfigs = mGLX.chooseFBConfig(attribList, &glxConfigCount);
glx::FBConfig *glxConfigs = mGLX.chooseFBConfig(attribList, &glxConfigCount);
for (int i = 0; i < glxConfigCount; i++)
{
GLXFBConfig glxConfig = glxConfigs[i];
glx::FBConfig glxConfig = glxConfigs[i];
egl::Config config;
// Native stuff
......@@ -407,7 +405,7 @@ void DisplayGLX::generateCaps(egl::Caps *outCaps) const
outCaps->textureNPOT = true;
}
int DisplayGLX::getGLXFBConfigAttrib(GLXFBConfig config, int attrib) const
int DisplayGLX::getGLXFBConfigAttrib(glx::FBConfig config, int attrib) const
{
int result;
mGLX.getFBConfigAttrib(config, attrib, &result);
......
......@@ -59,16 +59,16 @@ class DisplayGLX : public DisplayGL
void generateExtensions(egl::DisplayExtensions *outExtensions) const override;
void generateCaps(egl::Caps *outCaps) const override;
int getGLXFBConfigAttrib(GLXFBConfig config, int attrib) const;
int getGLXFBConfigAttrib(glx::FBConfig config, int attrib) const;
FunctionsGL *mFunctionsGL;
//TODO(cwallez) yuck, change generateConfigs to be non-const or add a userdata member to egl::Config?
mutable std::map<int, GLXFBConfig> configIdToGLXConfig;
mutable std::map<int, glx::FBConfig> configIdToGLXConfig;
GLXContext mContext;
glx::Context mContext;
// A pbuffer the context is current on during ANGLE initialization
GLXPbuffer mDummyPbuffer;
glx::Pbuffer mDummyPbuffer;
FunctionsGLX mGLX;
egl::Display *mEGLDisplay;
......
......@@ -14,7 +14,7 @@
#include "common/angleutils.h"
#include "libANGLE/Error.h"
#include "libANGLE/renderer/gl/glx/functionsglx_typedefs.h"
#include "libANGLE/renderer/gl/glx/platform_glx.h"
namespace rx
{
......@@ -37,12 +37,12 @@ class FunctionsGLX : angle::NonCopyable
Display *getDisplay() const;
int getScreen() const;
PFNGLXGETPROCADDRESSPROC getProc;
PFNGETPROCPROC getProc;
// GLX 1.0
void destroyContext(GLXContext context) const;
Bool makeCurrent(GLXDrawable drawable, GLXContext context) const;
void swapBuffers(GLXDrawable drawable) 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;
void waitX() const;
......@@ -52,51 +52,28 @@ class FunctionsGLX : angle::NonCopyable
const char *queryExtensionsString() const;
// GLX 1.3
GLXFBConfig *getFBConfigs(int *nElements) const;
GLXFBConfig *chooseFBConfig(const int *attribList, int *nElements) const;
int getFBConfigAttrib(GLXFBConfig config, int attribute, int *value) const;
XVisualInfo *getVisualFromFBConfig(GLXFBConfig config) const;
GLXWindow createWindow(GLXFBConfig config, Window window, const int *attribList) const;
void destroyWindow(GLXWindow window) const;
GLXPbuffer createPbuffer(GLXFBConfig config, const int *attribList) const;
void destroyPbuffer(GLXPbuffer pbuffer) const;
void queryDrawable(GLXDrawable drawable, int attribute, unsigned int *value) const;
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
GLXContext createContextAttribsARB(GLXFBConfig config, GLXContext shareContext, Bool direct, const int *attribList) const;
glx::Context createContextAttribsARB(glx::FBConfig config, glx::Context shareContext, Bool direct, const int *attribList) const;
private:
struct GLXFunctionTable;
void *mLibHandle;
Display *mXDisplay;
int mXScreen;
GLXFunctionTable *mFnPtrs;
std::vector<std::string> mExtensions;
// GLX 1.0
PFNGLXDESTROYCONTEXTPROC mDestroyContextPtr;
PFNGLXMAKECURRENTPROC mMakeCurrentPtr;
PFNGLXSWAPBUFFERSPROC mSwapBuffersPtr;
PFNGLXQUERYEXTENSIONPROC mQueryExtensionPtr;
PFNGLXQUERYVERSIONPROC mQueryVersionPtr;
PFNGLXWAITXPROC mWaitXPtr;
PFNGLXWAITGLPROC mWaitGLPtr;
// GLX 1.1
PFNGLXQUERYEXTENSIONSSTRINGPROC mQueryExtensionsStringPtr;
//GLX 1.3
PFNGLXGETFBCONFIGSPROC mGetFBConfigsPtr;
PFNGLXCHOOSEFBCONFIGPROC mChooseFBConfigPtr;
PFNGLXGETFBCONFIGATTRIBPROC mGetFBConfigAttribPtr;
PFNGLXGETVISUALFROMFBCONFIGPROC mGetVisualFromFBConfigPtr;
PFNGLXCREATEWINDOWPROC mCreateWindowPtr;
PFNGLXDESTROYWINDOWPROC mDestroyWindowPtr;
PFNGLXCREATEPBUFFERPROC mCreatePbufferPtr;
PFNGLXDESTROYPBUFFERPROC mDestroyPbufferPtr;
PFNGLXQUERYDRAWABLEPROC mQueryDrawablePtr;
// GLX_ARB_create_context
PFNGLXCREATECONTEXTATTRIBSARBPROC mCreateContextAttribsARBPtr;
};
}
......
......@@ -15,7 +15,7 @@ namespace rx
{
PbufferSurfaceGLX::PbufferSurfaceGLX(EGLint width, EGLint height, bool largest, const FunctionsGLX &glx,
GLXContext context, GLXFBConfig fbConfig)
glx::Context context, glx::FBConfig fbConfig)
: SurfaceGL(),
mWidth(width),
mHeight(height),
......
......@@ -12,8 +12,6 @@
#include "libANGLE/renderer/gl/SurfaceGL.h"
#include "libANGLE/renderer/gl/glx/platform_glx.h"
#include <GL/glxext.h>
namespace rx
{
......@@ -23,7 +21,7 @@ class PbufferSurfaceGLX : public SurfaceGL
{
public:
PbufferSurfaceGLX(EGLint width, EGLint height, bool largest, const FunctionsGLX &glx,
GLXContext context, GLXFBConfig fbConfig);
glx::Context context, glx::FBConfig fbConfig);
~PbufferSurfaceGLX() override;
egl::Error initialize();
......@@ -47,9 +45,9 @@ class PbufferSurfaceGLX : public SurfaceGL
bool mLargest;
const FunctionsGLX &mGLX;
GLXContext mContext;
GLXFBConfig mFBConfig;
GLXPbuffer mPbuffer;
glx::Context mContext;
glx::FBConfig mFBConfig;
glx::Pbuffer mPbuffer;
};
}
......
......@@ -15,7 +15,7 @@
namespace rx
{
WindowSurfaceGLX::WindowSurfaceGLX(const FunctionsGLX &glx, EGLNativeWindowType window, Display *display, GLXContext context, GLXFBConfig fbConfig)
WindowSurfaceGLX::WindowSurfaceGLX(const FunctionsGLX &glx, Window window, Display *display, glx::Context context, glx::FBConfig fbConfig)
: SurfaceGL(),
mGLX(glx),
mParent(window),
......
......@@ -20,7 +20,7 @@ class FunctionsGLX;
class WindowSurfaceGLX : public SurfaceGL
{
public:
WindowSurfaceGLX(const FunctionsGLX &glx, Window window, Display *display, GLXContext context, GLXFBConfig fbConfig);
WindowSurfaceGLX(const FunctionsGLX &glx, Window window, Display *display, glx::Context context, glx::FBConfig fbConfig);
~WindowSurfaceGLX() override;
egl::Error initialize();
......@@ -41,10 +41,10 @@ class WindowSurfaceGLX : public SurfaceGL
const FunctionsGLX &mGLX;
Window mParent;
Display *mDisplay;
GLXContext mContext;
GLXFBConfig mFBConfig;
glx::Context mContext;
glx::FBConfig mFBConfig;
Window mWindow;
GLXWindow mGLXWindow;
glx::Window mGLXWindow;
};
}
......
......@@ -9,14 +9,164 @@
#ifndef LIBANGLE_RENDERER_GL_GLX_PLATFORMGLX_H_
#define LIBANGLE_RENDERER_GL_GLX_PLATFORMGLX_H_
// HACK(cwallez) this is a horrible hack to prevent glx from including GL/glext.h
// as it causes a bunch of conflicts (macro redefinition, etc) with GLES2/gl2ext.h
#define __glext_h_ 1
#include <GL/glx.h>
#undef __glext_h_
#if !defined(ANGLE_SKIP_GLX_DEFINES)
// GLX 1.0
#define GLX_USE_GL 1
#define GLX_BUFFER_SIZE 2
#define GLX_LEVEL 3
#define GLX_RGBA 4
#define GLX_DOUBLEBUFFER 5
#define GLX_STEREO 6
#define GLX_AUX_BUFFERS 7
#define GLX_RED_SIZE 8
#define GLX_GREEN_SIZE 9
#define GLX_BLUE_SIZE 10
#define GLX_ALPHA_SIZE 11
#define GLX_DEPTH_SIZE 12
#define GLX_STENCIL_SIZE 13
#define GLX_ACCUM_RED_SIZE 14
#define GLX_ACCUM_GREEN_SIZE 15
#define GLX_ACCUM_BLUE_SIZE 16
#define GLX_ACCUM_ALPHA_SIZE 17
#define GLX_BAD_SCREEN 1
#define GLX_BAD_ATTRIBUTE 2
#define GLX_NO_EXTENSION 3
#define GLX_BAD_VISUAL 4
#define GLX_BAD_CONTEXT 5
#define GLX_BAD_VALUE 6
#define GLX_BAD_ENUM 7
// GLX 1.1
#define GLX_VENDOR 1
#define GLX_VERSION 2
#define GLX_EXTENSIONS 3
// GLX 1.3
#define GLX_CONFIG_CAVEAT 0x20
#define GLX_DONT_CARE 0xFFFFFFFF
#define GLX_X_VISUAL_TYPE 0x22
#define GLX_TRANSPARENT_TYPE 0x23
#define GLX_TRANSPARENT_INDEX_VALUE 0x24
#define GLX_TRANSPARENT_RED_VALUE 0x25
#define GLX_TRANSPARENT_GREEN_VALUE 0x26
#define GLX_TRANSPARENT_BLUE_VALUE 0x27
#define GLX_TRANSPARENT_ALPHA_VALUE 0x28
#define GLX_WINDOW_BIT 0x00000001
#define GLX_PIXMAP_BIT 0x00000002
#define GLX_PBUFFER_BIT 0x00000004
#define GLX_AUX_BUFFERS_BIT 0x00000010
#define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001
#define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002
#define GLX_BACK_LEFT_BUFFER_BIT 0x00000004
#define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008
#define GLX_DEPTH_BUFFER_BIT 0x00000020
#define GLX_STENCIL_BUFFER_BIT 0x00000040
#define GLX_ACCUM_BUFFER_BIT 0x00000080
#define GLX_NONE 0x8000
#define GLX_SLOW_CONFIG 0x8001
#define GLX_TRUE_COLOR 0x8002
#define GLX_DIRECT_COLOR 0x8003
#define GLX_PSEUDO_COLOR 0x8004
#define GLX_STATIC_COLOR 0x8005
#define GLX_GRAY_SCALE 0x8006
#define GLX_STATIC_GRAY 0x8007
#define GLX_TRANSPARENT_RGB 0x8008
#define GLX_TRANSPARENT_INDEX 0x8009
#define GLX_VISUAL_ID 0x800B
#define GLX_SCREEN 0x800C
#define GLX_NON_CONFORMANT_CONFIG 0x800D
#define GLX_DRAWABLE_TYPE 0x8010
#define GLX_RENDER_TYPE 0x8011
#define GLX_X_RENDERABLE 0x8012
#define GLX_FBCONFIG_ID 0x8013
#define GLX_RGBA_TYPE 0x8014
#define GLX_COLOR_INDEX_TYPE 0x8015
#define GLX_MAX_PBUFFER_WIDTH 0x8016
#define GLX_MAX_PBUFFER_HEIGHT 0x8017
#define GLX_MAX_PBUFFER_PIXELS 0x8018
#define GLX_PRESERVED_CONTENTS 0x801B
#define GLX_LARGEST_PBUFFER 0x801C
#define GLX_WIDTH 0x801D
#define GLX_HEIGHT 0x801E
#define GLX_EVENT_MASK 0x801F
#define GLX_DAMAGED 0x8020
#define GLX_SAVED 0x8021
#define GLX_WINDOW 0x8022
#define GLX_PBUFFER 0x8023
#define GLX_PBUFFER_HEIGHT 0x8040
#define GLX_PBUFFER_WIDTH 0x8041
#define GLX_RGBA_BIT 0x00000001
#define GLX_COLOR_INDEX_BIT 0x00000002
#define GLX_PBUFFER_CLOBBER_MASK 0x08000000
// GLX 1.4
#define GLX_SAMPLE_BUFFERS 0x186a0
#define GLX_SAMPLES 0x186a1
// GLX_ARB_create_context
#define GLX_CONTEXT_DEBUG_BIT_ARB 0x00000001
#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002
#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091
#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092
#define GLX_CONTEXT_FLAGS_ARB 0x2094
// GLX_EXT_texture_from_pixmap
#define GLX_TEXTURE_1D_BIT_EXT 0x00000001
#define GLX_TEXTURE_2D_BIT_EXT 0x00000002
#define GLX_TEXTURE_RECTANGLE_BIT_EXT 0x00000004
#define GLX_BIND_TO_TEXTURE_RGB_EXT 0x20D0
#define GLX_BIND_TO_TEXTURE_RGBA_EXT 0x20D1
#define GLX_BIND_TO_MIPMAP_TEXTURE_EXT 0x20D2
#define GLX_BIND_TO_TEXTURE_TARGETS_EXT 0x20D3
#define GLX_Y_INVERTED_EXT 0x20D4
#define GLX_TEXTURE_FORMAT_EXT 0x20D5
#define GLX_TEXTURE_TARGET_EXT 0x20D6
#define GLX_MIPMAP_TEXTURE_EXT 0x20D7
#define GLX_TEXTURE_FORMAT_NONE_EXT 0x20D8
#define GLX_TEXTURE_FORMAT_RGB_EXT 0x20D9
#define GLX_TEXTURE_FORMAT_RGBA_EXT 0x20DA
#define GLX_TEXTURE_1D_EXT 0x20DB
#define GLX_TEXTURE_2D_EXT 0x20DC
#define GLX_TEXTURE_RECTANGLE_EXT 0x20DD
#define GLX_FRONT_LEFT_EXT 0x20DE
#define GLX_FRONT_RIGHT_EXT 0x20DF
#define GLX_BACK_LEFT_EXT 0x20E0
#define GLX_BACK_RIGHT_EXT 0x20E1
#define GLX_FRONT_EXT 0x20DE
#define GLX_BACK_EXT 0x20E0
#define GLX_AUX0_EXT 0x20E2
#define GLX_AUX1_EXT 0x20E3
#define GLX_AUX2_EXT 0x20E4
#define GLX_AUX3_EXT 0x20E5
#define GLX_AUX4_EXT 0x20E6
#define GLX_AUX5_EXT 0x20E7
#define GLX_AUX6_EXT 0x20E8
#define GLX_AUX7_EXT 0x20E9
#define GLX_AUX8_EXT 0x20EA
#define GLX_AUX9_EXT 0x20EB
#endif // !defined(ANGLE_SKIP_GLX_DEFINES)
// GLX typedefs depend on the X headers
#include <X11/Xlib.h>
#include <X11/Xresource.h>
#include <X11/Xutil.h>
// GLX typedefs
namespace glx
{
typedef void *Context;
typedef void *FBConfig;
typedef XID FBConfigID;
typedef XID ContextID;
typedef XID Window;
typedef XID Pbuffer;
typedef XID Pixmap;
typedef XID Drawable;
}
typedef void* (*PFNGETPROCPROC) (const char *name);
#endif // LIBANGLE_RENDERER_GL_GLX_PLATFORMGLX_H_
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment