Commit 6703b265 by Corentin Wallez

Add an angle_link_glx that can be used for debugging

This replaces the dlsyming of glX entry point with linking to libGL which in trun allows the ANGLE to be traced using apitrace. BUG=angleproject:892 Change-Id: Ic065582401e0e1e3fce1329cde216220a1e086a8 Reviewed-on: https://chromium-review.googlesource.com/286880Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Tested-by: 's avatarCorentin Wallez <cwallez@chromium.org>
parent c4c7442d
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
'angle_enable_d3d11%': 0, 'angle_enable_d3d11%': 0,
'angle_enable_gl%': 0, 'angle_enable_gl%': 0,
'angle_enable_hlsl%': 0, 'angle_enable_hlsl%': 0,
'angle_link_glx%': 0,
'conditions': 'conditions':
[ [
['OS=="win"', ['OS=="win"',
......
...@@ -108,6 +108,7 @@ bool FunctionsGLX::initialize(Display *xDisplay, int screen, std::string *errorS ...@@ -108,6 +108,7 @@ bool FunctionsGLX::initialize(Display *xDisplay, int screen, std::string *errorS
mXDisplay = xDisplay; mXDisplay = xDisplay;
mXScreen = screen; mXScreen = screen;
#if !defined(ANGLE_LINK_GLX)
// Some OpenGL implementations can't handle having this library // Some OpenGL implementations can't handle having this library
// handle closed while there's any X window still open against // handle closed while there's any X window still open against
// which a GLXWindow was ever created. // which a GLXWindow was ever created.
...@@ -131,25 +132,33 @@ bool FunctionsGLX::initialize(Display *xDisplay, int screen, std::string *errorS ...@@ -131,25 +132,33 @@ bool FunctionsGLX::initialize(Display *xDisplay, int screen, std::string *errorS
*errorString = "Could not retrieve glXGetProcAddress"; *errorString = "Could not retrieve glXGetProcAddress";
return false; return false;
} }
#else
getProc = reinterpret_cast<PFNGETPROCPROC>(glXGetProcAddress);
#endif
#define GET_PROC_OR_ERROR(MEMBER, NAME) \ #define GET_PROC_OR_ERROR(MEMBER, NAME) \
if (!GetProc(getProc, MEMBER, NAME)) \ if (!GetProc(getProc, MEMBER, #NAME)) \
{ \ { \
*errorString = "Could not load GLX entry point " NAME; \ *errorString = "Could not load GLX entry point " #NAME; \
return false; \ return false; \
} }
#if !defined(ANGLE_LINK_GLX)
#define GET_FNPTR_OR_ERROR(MEMBER, NAME) GET_PROC_OR_ERROR(MEMEBER, NAME)
#else
#define GET_FNPTR_OR_ERROR(MEMBER, NAME) *MEMBER = NAME;
#endif
// GLX 1.0 // GLX 1.0
GET_PROC_OR_ERROR(&mFnPtrs->destroyContextPtr, "glXDestroyContext"); GET_FNPTR_OR_ERROR(&mFnPtrs->destroyContextPtr, glXDestroyContext);
GET_PROC_OR_ERROR(&mFnPtrs->makeCurrentPtr, "glXMakeCurrent"); GET_FNPTR_OR_ERROR(&mFnPtrs->makeCurrentPtr, glXMakeCurrent);
GET_PROC_OR_ERROR(&mFnPtrs->swapBuffersPtr, "glXSwapBuffers"); GET_FNPTR_OR_ERROR(&mFnPtrs->swapBuffersPtr, glXSwapBuffers);
GET_PROC_OR_ERROR(&mFnPtrs->queryExtensionPtr, "glXQueryExtension"); GET_FNPTR_OR_ERROR(&mFnPtrs->queryExtensionPtr, glXQueryExtension);
GET_PROC_OR_ERROR(&mFnPtrs->queryVersionPtr, "glXQueryVersion"); GET_FNPTR_OR_ERROR(&mFnPtrs->queryVersionPtr, glXQueryVersion);
GET_PROC_OR_ERROR(&mFnPtrs->waitXPtr, "glXWaitX"); GET_FNPTR_OR_ERROR(&mFnPtrs->waitXPtr, glXWaitX);
GET_PROC_OR_ERROR(&mFnPtrs->waitGLPtr, "glXWaitGL"); GET_FNPTR_OR_ERROR(&mFnPtrs->waitGLPtr, glXWaitGL);
// GLX 1.1 // GLX 1.1
GET_PROC_OR_ERROR(&mFnPtrs->queryExtensionsStringPtr, "glXQueryExtensionsString"); GET_FNPTR_OR_ERROR(&mFnPtrs->queryExtensionsStringPtr, glXQueryExtensionsString);
// Check we have a working GLX // Check we have a working GLX
{ {
...@@ -183,20 +192,20 @@ bool FunctionsGLX::initialize(Display *xDisplay, int screen, std::string *errorS ...@@ -183,20 +192,20 @@ bool FunctionsGLX::initialize(Display *xDisplay, int screen, std::string *errorS
angle::SplitStringAlongWhitespace(extensions, &mExtensions); angle::SplitStringAlongWhitespace(extensions, &mExtensions);
// GLX 1.3 // GLX 1.3
GET_PROC_OR_ERROR(&mFnPtrs->getFBConfigsPtr, "glXGetFBConfigs"); GET_FNPTR_OR_ERROR(&mFnPtrs->getFBConfigsPtr, glXGetFBConfigs);
GET_PROC_OR_ERROR(&mFnPtrs->chooseFBConfigPtr, "glXChooseFBConfig"); GET_FNPTR_OR_ERROR(&mFnPtrs->chooseFBConfigPtr, glXChooseFBConfig);
GET_PROC_OR_ERROR(&mFnPtrs->getFBConfigAttribPtr, "glXGetFBConfigAttrib"); GET_FNPTR_OR_ERROR(&mFnPtrs->getFBConfigAttribPtr, glXGetFBConfigAttrib);
GET_PROC_OR_ERROR(&mFnPtrs->getVisualFromFBConfigPtr, "glXGetVisualFromFBConfig"); GET_FNPTR_OR_ERROR(&mFnPtrs->getVisualFromFBConfigPtr, glXGetVisualFromFBConfig);
GET_PROC_OR_ERROR(&mFnPtrs->createWindowPtr, "glXCreateWindow"); GET_FNPTR_OR_ERROR(&mFnPtrs->createWindowPtr, glXCreateWindow);
GET_PROC_OR_ERROR(&mFnPtrs->destroyWindowPtr, "glXDestroyWindow"); GET_FNPTR_OR_ERROR(&mFnPtrs->destroyWindowPtr, glXDestroyWindow);
GET_PROC_OR_ERROR(&mFnPtrs->createPbufferPtr, "glXCreatePbuffer"); GET_FNPTR_OR_ERROR(&mFnPtrs->createPbufferPtr, glXCreatePbuffer);
GET_PROC_OR_ERROR(&mFnPtrs->destroyPbufferPtr, "glXDestroyPbuffer"); GET_FNPTR_OR_ERROR(&mFnPtrs->destroyPbufferPtr, glXDestroyPbuffer);
GET_PROC_OR_ERROR(&mFnPtrs->queryDrawablePtr, "glXQueryDrawable"); GET_FNPTR_OR_ERROR(&mFnPtrs->queryDrawablePtr, glXQueryDrawable);
// Extensions // Extensions
if (hasExtension("GLX_ARB_create_context")) if (hasExtension("GLX_ARB_create_context"))
{ {
GET_PROC_OR_ERROR(&mFnPtrs->createContextAttribsARBPtr, "glXCreateContextAttribsARB"); GET_PROC_OR_ERROR(&mFnPtrs->createContextAttribsARBPtr, glXCreateContextAttribsARB);
} }
else else
{ {
...@@ -204,13 +213,14 @@ bool FunctionsGLX::initialize(Display *xDisplay, int screen, std::string *errorS ...@@ -204,13 +213,14 @@ bool FunctionsGLX::initialize(Display *xDisplay, int screen, std::string *errorS
} }
if (hasExtension("GLX_EXT_swap_control")) if (hasExtension("GLX_EXT_swap_control"))
{ {
GET_PROC_OR_ERROR(&mFnPtrs->swapIntervalEXTPtr, "glXSwapIntervalEXT"); GET_PROC_OR_ERROR(&mFnPtrs->swapIntervalEXTPtr, glXSwapIntervalEXT);
} }
else else
{ {
mFnPtrs->swapIntervalEXTPtr = nullptr; mFnPtrs->swapIntervalEXTPtr = nullptr;
} }
#undef GET_FNPTR_OR_ERROR
#undef GET_PROC_OR_ERROR #undef GET_PROC_OR_ERROR
*errorString = ""; *errorString = "";
......
...@@ -729,6 +729,20 @@ ...@@ -729,6 +729,20 @@
{ {
'msvs_enable_winphone' : '1', 'msvs_enable_winphone' : '1',
}], }],
['angle_link_glx==1',
{
'link_settings':
{
'libraries':
[
'-lGL',
],
},
'defines':
[
'ANGLE_LINK_GLX',
],
}],
], ],
}, },
{ {
......
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