Commit e7419b9f by Frank Henigman Committed by Commit Bot

Add FunctionsEGL, FunctionsEGLDL - EGL wrappers.

FunctionsEGL is an abstract class. FunctionsEGLDL is an libdl-based implementation. BUG=angleproject:1297 Change-Id: I0fe5a337e34518cc6248494dbc4ee5c2938d4b77 Reviewed-on: https://chromium-review.googlesource.com/338884Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarYuly Novikov <ynovikov@chromium.org> Commit-Queue: Frank Henigman <fjhenigman@chromium.org>
parent 4200fc36
//
// Copyright (c) 2016 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.
//
// FunctionsEGL.cpp: Implements the FunctionsEGL class.
#include "libANGLE/renderer/gl/egl/FunctionsEGL.h"
#include <algorithm>
#include "libANGLE/renderer/gl/FunctionsGL.h"
#include "libANGLE/renderer/gl/egl/functionsegl_typedefs.h"
#include "common/string_utils.h"
namespace
{
template <typename T>
bool SetPtr(T *dst, void *src)
{
if (src)
{
*dst = reinterpret_cast<T>(src);
return true;
}
return false;
}
} // namespace
namespace rx
{
struct FunctionsEGL::EGLDispatchTable
{
EGLDispatchTable()
: bindAPIPtr(nullptr),
chooseConfigPtr(nullptr),
createContextPtr(nullptr),
destroyContextPtr(nullptr),
getConfigAttribPtr(nullptr),
getDisplayPtr(nullptr),
getErrorPtr(nullptr),
initializePtr(nullptr),
makeCurrentPtr(nullptr),
queryStringPtr(nullptr),
terminatePtr(nullptr),
createImageKHRPtr(nullptr),
destroyImageKHRPtr(nullptr),
clientWaitSyncKHRPtr(nullptr),
createSyncKHRPtr(nullptr),
destroySyncKHRPtr(nullptr),
getSyncAttribKHRPtr(nullptr)
{
}
PFNEGLBINDAPIPROC bindAPIPtr;
PFNEGLCHOOSECONFIGPROC chooseConfigPtr;
PFNEGLCREATECONTEXTPROC createContextPtr;
PFNEGLDESTROYCONTEXTPROC destroyContextPtr;
PFNEGLGETCONFIGATTRIBPROC getConfigAttribPtr;
PFNEGLGETDISPLAYPROC getDisplayPtr;
PFNEGLGETERRORPROC getErrorPtr;
PFNEGLINITIALIZEPROC initializePtr;
PFNEGLMAKECURRENTPROC makeCurrentPtr;
PFNEGLQUERYSTRINGPROC queryStringPtr;
PFNEGLTERMINATEPROC terminatePtr;
// EGL_KHR_image
PFNEGLCREATEIMAGEKHRPROC createImageKHRPtr;
PFNEGLDESTROYIMAGEKHRPROC destroyImageKHRPtr;
// EGL_KHR_fence_sync
PFNEGLCLIENTWAITSYNCKHRPROC clientWaitSyncKHRPtr;
PFNEGLCREATESYNCKHRPROC createSyncKHRPtr;
PFNEGLDESTROYSYNCKHRPROC destroySyncKHRPtr;
PFNEGLGETSYNCATTRIBKHRPROC getSyncAttribKHRPtr;
};
FunctionsEGL::FunctionsEGL()
: majorVersion(0), minorVersion(0), mFnPtrs(new EGLDispatchTable()), mEGLDisplay(EGL_NO_DISPLAY)
{
}
FunctionsEGL::~FunctionsEGL()
{
SafeDelete(mFnPtrs);
}
egl::Error FunctionsEGL::initialize(EGLNativeDisplayType nativeDisplay)
{
#define ANGLE_GET_PROC_OR_ERROR(MEMBER, NAME) \
if (!SetPtr(MEMBER, getProcAddress(#NAME))) \
{ \
return egl::Error(EGL_NOT_INITIALIZED, "Could not load EGL entry point " #NAME); \
}
ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->bindAPIPtr, eglBindAPI);
ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->chooseConfigPtr, eglChooseConfig);
ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->createContextPtr, eglCreateContext);
ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->destroyContextPtr, eglDestroyContext);
ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->getConfigAttribPtr, eglGetConfigAttrib);
ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->getDisplayPtr, eglGetDisplay);
ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->getErrorPtr, eglGetError);
ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->initializePtr, eglInitialize);
ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->makeCurrentPtr, eglMakeCurrent);
ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->queryStringPtr, eglQueryString);
ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->terminatePtr, eglTerminate);
mEGLDisplay = mFnPtrs->getDisplayPtr(nativeDisplay);
if (mEGLDisplay == EGL_NO_DISPLAY)
{
return egl::Error(mFnPtrs->getErrorPtr(), "Failed to get system egl display");
}
if (mFnPtrs->initializePtr(mEGLDisplay, &majorVersion, &minorVersion) != EGL_TRUE)
{
return egl::Error(mFnPtrs->getErrorPtr(), "Failed to initialize system egl");
}
if (majorVersion < 1 || (majorVersion == 1 && minorVersion < 4))
{
return egl::Error(EGL_NOT_INITIALIZED, "Unsupported EGL version (require at least 1.4).");
}
if (mFnPtrs->bindAPIPtr(EGL_OPENGL_ES_API) != EGL_TRUE)
{
return egl::Error(mFnPtrs->getErrorPtr(), "Failed to bind API in system egl");
}
const char *extensions = queryString(EGL_EXTENSIONS);
if (!extensions)
{
return egl::Error(mFnPtrs->getErrorPtr(), "Faild to query extensions in system egl");
}
angle::SplitStringAlongWhitespace(extensions, &mExtensions);
if (hasExtension("EGL_KHR_image_base"))
{
ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->createImageKHRPtr, eglCreateImageKHR);
ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->destroyImageKHRPtr, eglDestroyImageKHR);
}
if (hasExtension("EGL_KHR_fence_sync"))
{
ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->clientWaitSyncKHRPtr, eglClientWaitSyncKHR);
ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->createSyncKHRPtr, eglCreateSyncKHR);
ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->destroySyncKHRPtr, eglDestroySyncKHR);
ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->getSyncAttribKHRPtr, eglGetSyncAttribKHR);
}
#undef ANGLE_GET_PROC_OR_ERROR
return egl::Error(EGL_SUCCESS);
}
egl::Error FunctionsEGL::terminate()
{
if (mFnPtrs->terminatePtr(mEGLDisplay) == EGL_TRUE)
{
mEGLDisplay = nullptr;
return egl::Error(EGL_SUCCESS);
}
return egl::Error(mFnPtrs->getErrorPtr());
}
class FunctionsGLEGL : public FunctionsGL
{
public:
FunctionsGLEGL(const FunctionsEGL &egl) : mEGL(egl) {}
~FunctionsGLEGL() override {}
private:
void *loadProcAddress(const std::string &function) override
{
return mEGL.getProcAddress(function.c_str());
}
const FunctionsEGL &mEGL;
};
FunctionsGL *FunctionsEGL::makeFunctionsGL(void) const
{
return new FunctionsGLEGL(*this);
}
bool FunctionsEGL::hasExtension(const char *extension) const
{
return std::find(mExtensions.begin(), mExtensions.end(), extension) != mExtensions.end();
}
EGLDisplay FunctionsEGL::getDisplay() const
{
return mEGLDisplay;
}
EGLBoolean FunctionsEGL::chooseConfig(EGLint const *attribList,
EGLConfig *configs,
EGLint configSize,
EGLint *numConfig)
{
return mFnPtrs->chooseConfigPtr(mEGLDisplay, attribList, configs, configSize, numConfig);
}
EGLBoolean FunctionsEGL::getConfigAttrib(EGLConfig config, EGLint attribute, EGLint *value)
{
return mFnPtrs->getConfigAttribPtr(mEGLDisplay, config, attribute, value);
}
EGLContext FunctionsEGL::createContext(EGLConfig config,
EGLContext share_context,
EGLint const *attrib_list) const
{
return mFnPtrs->createContextPtr(mEGLDisplay, config, share_context, attrib_list);
}
EGLBoolean FunctionsEGL::destroyContext(EGLContext context) const
{
return mFnPtrs->destroyContextPtr(mEGLDisplay, context);
}
EGLBoolean FunctionsEGL::makeCurrent(EGLSurface surface, EGLContext context) const
{
return mFnPtrs->makeCurrentPtr(mEGLDisplay, surface, surface, context);
}
char const *FunctionsEGL::queryString(EGLint name) const
{
return mFnPtrs->queryStringPtr(mEGLDisplay, name);
}
EGLImageKHR FunctionsEGL::createImageKHR(EGLContext context,
EGLenum target,
EGLClientBuffer buffer,
const EGLint *attrib_list) const
{
return mFnPtrs->createImageKHRPtr(mEGLDisplay, context, target, buffer, attrib_list);
}
EGLBoolean FunctionsEGL::destroyImageKHR(EGLImageKHR image) const
{
return mFnPtrs->destroyImageKHRPtr(mEGLDisplay, image);
}
EGLSyncKHR FunctionsEGL::createSyncKHR(EGLenum type, const EGLint *attrib_list)
{
return mFnPtrs->createSyncKHRPtr(mEGLDisplay, type, attrib_list);
}
EGLBoolean FunctionsEGL::destroySyncKHR(EGLSyncKHR sync)
{
return mFnPtrs->destroySyncKHRPtr(mEGLDisplay, sync);
}
EGLint FunctionsEGL::clientWaitSyncKHR(EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout)
{
return mFnPtrs->clientWaitSyncKHRPtr(mEGLDisplay, sync, flags, timeout);
}
EGLBoolean FunctionsEGL::getSyncAttribKHR(EGLSyncKHR sync, EGLint attribute, EGLint *value)
{
return mFnPtrs->getSyncAttribKHRPtr(mEGLDisplay, sync, attribute, value);
}
} // namespace rx
//
// Copyright (c) 2016 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.
//
// FunctionsEGL.h: Defines the FunctionsEGL class to load functions and data from EGL
#ifndef LIBANGLE_RENDERER_GL_CROS_FUNCTIONSEGL_H_
#define LIBANGLE_RENDERER_GL_CROS_FUNCTIONSEGL_H_
#include <EGL/egl.h>
#include <EGL/eglext.h>
#include <string>
#include <vector>
#include "libANGLE/Error.h"
namespace rx
{
class FunctionsGL;
class FunctionsEGL
{
public:
FunctionsEGL();
virtual ~FunctionsEGL();
int majorVersion;
int minorVersion;
virtual egl::Error initialize(EGLNativeDisplayType nativeDisplay);
virtual egl::Error terminate();
virtual void *getProcAddress(const char *name) const = 0;
FunctionsGL *makeFunctionsGL() const;
bool hasExtension(const char *extension) const;
EGLDisplay getDisplay() const;
EGLBoolean chooseConfig(EGLint const *attrib_list,
EGLConfig *configs,
EGLint config_size,
EGLint *num_config);
EGLBoolean getConfigAttrib(EGLConfig config, EGLint attribute, EGLint *value);
EGLContext createContext(EGLConfig config,
EGLContext share_context,
EGLint const *attrib_list) const;
EGLBoolean destroyContext(EGLContext context) const;
EGLBoolean makeCurrent(EGLSurface surface, EGLContext context) const;
const char *queryString(EGLint name) const;
EGLImageKHR createImageKHR(EGLContext context,
EGLenum target,
EGLClientBuffer buffer,
const EGLint *attrib_list) const;
EGLBoolean destroyImageKHR(EGLImageKHR image) const;
EGLSyncKHR createSyncKHR(EGLenum type, const EGLint *attrib_list);
EGLBoolean destroySyncKHR(EGLSyncKHR sync);
EGLint clientWaitSyncKHR(EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout);
EGLBoolean getSyncAttribKHR(EGLSyncKHR sync, EGLint attribute, EGLint *value);
private:
// So as to isolate from angle we do not include angleutils.h and cannot
// use angle::NonCopyable so we replicated it here instead.
FunctionsEGL(const FunctionsEGL &) = delete;
void operator=(const FunctionsEGL &) = delete;
struct EGLDispatchTable;
EGLDispatchTable *mFnPtrs;
EGLDisplay mEGLDisplay;
std::vector<std::string> mExtensions;
};
} // namespace rx
#endif // LIBANGLE_RENDERER_GL_CROS_FUNCTIONSEGL_H_
//
// Copyright (c) 2016 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.
//
// FunctionsEGLDL.cpp: Implements the FunctionsEGLDL class.
#include "libANGLE/renderer/gl/egl/FunctionsEGLDL.h"
#include <dlfcn.h>
namespace rx
{
DynamicLib::DynamicLib() : handle(nullptr)
{
}
DynamicLib::~DynamicLib()
{
if (handle)
{
dlclose(handle);
handle = nullptr;
}
}
// Due to a bug in Mesa (or maybe libdl) it's not possible to close and re-open libEGL.so
// an arbitrary number of times. End2end tests would die after a couple hundred tests.
// So we use a static object with a destructor to close the library when the program exits.
// TODO(fjhenigman) File a bug and put a link here.
DynamicLib FunctionsEGLDL::sNativeLib;
FunctionsEGLDL::FunctionsEGLDL()
{
}
FunctionsEGLDL::~FunctionsEGLDL()
{
}
egl::Error FunctionsEGLDL::initialize(EGLNativeDisplayType nativeDisplay, const char *libName)
{
if (!sNativeLib.handle)
{
sNativeLib.handle = dlopen(libName, RTLD_NOW);
if (!sNativeLib.handle)
{
return egl::Error(EGL_NOT_INITIALIZED, "Could not dlopen native EGL: %s", dlerror());
}
}
mGetProcAddressPtr =
reinterpret_cast<PFNEGLGETPROCADDRESSPROC>(dlsym(sNativeLib.handle, "eglGetProcAddress"));
if (!mGetProcAddressPtr)
{
return egl::Error(EGL_NOT_INITIALIZED, "Could not find eglGetProcAddress");
}
return FunctionsEGL::initialize(nativeDisplay);
}
void *FunctionsEGLDL::getProcAddress(const char *name) const
{
void *f = reinterpret_cast<void *>(mGetProcAddressPtr(name));
if (f)
{
return f;
}
return dlsym(sNativeLib.handle, name);
}
} // namespace rx
//
// Copyright (c) 2016 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.
//
// FunctionsEGL.h: Implements FunctionsEGL with dlopen/dlsym/dlclose
#ifndef LIBANGLE_RENDERER_GL_CROS_FUNCTIONSEGLDL_H_
#define LIBANGLE_RENDERER_GL_CROS_FUNCTIONSEGLDL_H_
#include "libANGLE/renderer/gl/egl/FunctionsEGL.h"
#include "libANGLE/renderer/gl/egl/functionsegl_typedefs.h"
namespace rx
{
class DynamicLib final
{
public:
void *handle;
DynamicLib();
~DynamicLib();
};
class FunctionsEGLDL : public FunctionsEGL
{
public:
FunctionsEGLDL();
virtual ~FunctionsEGLDL();
egl::Error initialize(EGLNativeDisplayType nativeDisplay, const char *libName);
virtual void *getProcAddress(const char *name) const override;
private:
PFNEGLGETPROCADDRESSPROC mGetProcAddressPtr;
static DynamicLib sNativeLib;
};
} // namespace rx
#endif // LIBANGLE_RENDERER_GL_CROS_FUNCTIONSEGLDL_H_
//
// Copyright (c) 2016 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.
//
// functionsegl_typedefs.h: Typedefs of EGL functions.
#ifndef LIBANGLE_RENDERER_GL_EGL_FUNCTIONSEGLTYPEDEFS_H_
#define LIBANGLE_RENDERER_GL_EGL_FUNCTIONSEGLTYPEDEFS_H_
#include <EGL/egl.h>
namespace rx
{
// EGL 1.0
typedef EGLBoolean (*PFNEGLCHOOSECONFIGPROC)(EGLDisplay dpy,
const EGLint *attrib_list,
EGLConfig *configs,
EGLint config_size,
EGLint *num_config);
typedef EGLBoolean (*PFNEGLCOPYBUFFERSPROC)(EGLDisplay dpy,
EGLSurface surface,
EGLNativePixmapType target);
typedef EGLContext (*PFNEGLCREATECONTEXTPROC)(EGLDisplay dpy,
EGLConfig config,
EGLContext share_context,
const EGLint *attrib_list);
typedef EGLSurface (*PFNEGLCREATEPBUFFERSURFACEPROC)(EGLDisplay dpy,
EGLConfig config,
const EGLint *attrib_list);
typedef EGLSurface (*PFNEGLCREATEPIXMAPSURFACEPROC)(EGLDisplay dpy,
EGLConfig config,
EGLNativePixmapType pixmap,
const EGLint *attrib_list);
typedef EGLSurface (*PFNEGLCREATEWINDOWSURFACEPROC)(EGLDisplay dpy,
EGLConfig config,
EGLNativeWindowType win,
const EGLint *attrib_list);
typedef EGLBoolean (*PFNEGLDESTROYCONTEXTPROC)(EGLDisplay dpy, EGLContext ctx);
typedef EGLBoolean (*PFNEGLDESTROYSURFACEPROC)(EGLDisplay dpy, EGLSurface surface);
typedef EGLBoolean (*PFNEGLGETCONFIGATTRIBPROC)(EGLDisplay dpy,
EGLConfig config,
EGLint attribute,
EGLint *value);
typedef EGLBoolean (*PFNEGLGETCONFIGSPROC)(EGLDisplay dpy,
EGLConfig *configs,
EGLint config_size,
EGLint *num_config);
typedef EGLDisplay (*PFNEGLGETCURRENTDISPLAYPROC)(void);
typedef EGLSurface (*PFNEGLGETCURRENTSURFACEPROC)(EGLint readdraw);
typedef EGLDisplay (*PFNEGLGETDISPLAYPROC)(EGLNativeDisplayType display_id);
typedef EGLint (*PFNEGLGETERRORPROC)(void);
typedef __eglMustCastToProperFunctionPointerType (*PFNEGLGETPROCADDRESSPROC)(const char *procname);
typedef EGLBoolean (*PFNEGLINITIALIZEPROC)(EGLDisplay dpy, EGLint *major, EGLint *minor);
typedef EGLBoolean (*PFNEGLMAKECURRENTPROC)(EGLDisplay dpy,
EGLSurface draw,
EGLSurface read,
EGLContext ctx);
typedef EGLBoolean (*PFNEGLQUERYCONTEXTPROC)(EGLDisplay dpy,
EGLContext ctx,
EGLint attribute,
EGLint *value);
typedef const char *(*PFNEGLQUERYSTRINGPROC)(EGLDisplay dpy, EGLint name);
typedef EGLBoolean (*PFNEGLQUERYSURFACEPROC)(EGLDisplay dpy,
EGLSurface surface,
EGLint attribute,
EGLint *value);
typedef EGLBoolean (*PFNEGLSWAPBUFFERSPROC)(EGLDisplay dpy, EGLSurface surface);
typedef EGLBoolean (*PFNEGLTERMINATEPROC)(EGLDisplay dpy);
typedef EGLBoolean (*PFNEGLWAITGLPROC)(void);
typedef EGLBoolean (*PFNEGLWAITNATIVEPROC)(EGLint engine);
// EGL 1.1
typedef EGLBoolean (*PFNEGLBINDTEXIMAGEPROC)(EGLDisplay dpy, EGLSurface surface, EGLint buffer);
typedef EGLBoolean (*PFNEGLRELEASETEXIMAGEPROC)(EGLDisplay dpy, EGLSurface surface, EGLint buffer);
typedef EGLBoolean (*PFNEGLSURFACEATTRIBPROC)(EGLDisplay dpy,
EGLSurface surface,
EGLint attribute,
EGLint value);
typedef EGLBoolean (*PFNEGLSWAPINTERVALPROC)(EGLDisplay dpy, EGLint interval);
// EGL 1.2
typedef EGLBoolean (*PFNEGLBINDAPIPROC)(EGLenum api);
typedef EGLenum (*PFNEGLQUERYAPIPROC)(void);
typedef EGLSurface (*PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC)(EGLDisplay dpy,
EGLenum buftype,
EGLClientBuffer buffer,
EGLConfig config,
const EGLint *attrib_list);
typedef EGLBoolean (*PFNEGLRELEASETHREADPROC)(void);
typedef EGLBoolean (*PFNEGLWAITCLIENTPROC)(void);
// EGL 1.3
// EGL 1.4
typedef EGLContext (*PFNEGLGETCURRENTCONTEXTPROC)(void);
// EGL 1.5
typedef EGLSync (*PFNEGLCREATESYNCPROC)(EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list);
typedef EGLBoolean (*PFNEGLDESTROYSYNCPROC)(EGLDisplay dpy, EGLSync sync);
typedef EGLint (*PFNEGLCLIENTWAITSYNCPROC)(EGLDisplay dpy,
EGLSync sync,
EGLint flags,
EGLTime timeout);
typedef EGLBoolean (*PFNEGLGETSYNCATTRIBPROC)(EGLDisplay dpy,
EGLSync sync,
EGLint attribute,
EGLAttrib *value);
typedef EGLImage (*PFNEGLCREATEIMAGEPROC)(EGLDisplay dpy,
EGLContext ctx,
EGLenum target,
EGLClientBuffer buffer,
const EGLAttrib *attrib_list);
typedef EGLBoolean (*PFNEGLDESTROYIMAGEPROC)(EGLDisplay dpy, EGLImage image);
typedef EGLDisplay (*PFNEGLGETPLATFORMDISPLAYPROC)(EGLenum platform,
void *native_display,
const EGLAttrib *attrib_list);
typedef EGLSurface (*PFNEGLCREATEPLATFORMWINDOWSURFACEPROC)(EGLDisplay dpy,
EGLConfig config,
void *native_window,
const EGLAttrib *attrib_list);
typedef EGLSurface (*PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC)(EGLDisplay dpy,
EGLConfig config,
void *native_pixmap,
const EGLAttrib *attrib_list);
typedef EGLBoolean (*PFNEGLWAITSYNCPROC)(EGLDisplay dpy, EGLSync sync, EGLint flags);
} // namespace rx
#endif // LIBANGLE_RENDERER_GL_EGL_FUNCTIONSEGLTYPEDEFS_H_
...@@ -498,6 +498,17 @@ ...@@ -498,6 +498,17 @@
'libANGLE/renderer/gl/glx/functionsglx_typedefs.h', 'libANGLE/renderer/gl/glx/functionsglx_typedefs.h',
'libANGLE/renderer/gl/glx/platform_glx.h', 'libANGLE/renderer/gl/glx/platform_glx.h',
], ],
'libangle_gl_egl_sources':
[
'libANGLE/renderer/gl/egl/FunctionsEGL.cpp',
'libANGLE/renderer/gl/egl/FunctionsEGL.h',
'libANGLE/renderer/gl/egl/functionsegl_typedefs.h',
],
'libangle_gl_egl_dl_sources':
[
'libANGLE/renderer/gl/egl/FunctionsEGLDL.cpp',
'libANGLE/renderer/gl/egl/FunctionsEGLDL.h',
],
'libangle_gl_cgl_sources': 'libangle_gl_cgl_sources':
[ [
'libANGLE/renderer/gl/cgl/DisplayCGL.mm', 'libANGLE/renderer/gl/cgl/DisplayCGL.mm',
......
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