| Index: src/gpu/gl/glx/SkCreatePlatformGLContext_glx.cpp
|
| diff --git a/src/gpu/gl/glx/SkCreatePlatformGLContext_glx.cpp b/src/gpu/gl/glx/SkCreatePlatformGLContext_glx.cpp
|
| index 794cdb6f038c06f2928c3899c70acfe4a54ef7e9..f9977b2a4671584f1dc77d62689b4325aba01457 100644
|
| --- a/src/gpu/gl/glx/SkCreatePlatformGLContext_glx.cpp
|
| +++ b/src/gpu/gl/glx/SkCreatePlatformGLContext_glx.cpp
|
| @@ -46,65 +46,32 @@ static int ctxErrorHandler(Display *dpy, XErrorEvent *ev) {
|
|
|
| class GLXGLContext : public SkGLContext {
|
| public:
|
| - GLXGLContext();
|
| -
|
| - virtual ~GLXGLContext();
|
| -
|
| + GLXGLContext(GrGLStandard forcedGpuAPI);
|
| + virtual ~GLXGLContext() SK_OVERRIDE;
|
| virtual void makeCurrent() const SK_OVERRIDE;
|
| virtual void swapBuffers() const SK_OVERRIDE;
|
| -protected:
|
| - virtual const GrGLInterface* createGLContext(GrGLStandard forcedGpuAPI) SK_OVERRIDE;
|
| - virtual void destroyGLContext() SK_OVERRIDE;
|
|
|
| private:
|
| + void destroyGLContext();
|
| +
|
| GLXContext fContext;
|
| Display* fDisplay;
|
| Pixmap fPixmap;
|
| GLXPixmap fGlxPixmap;
|
| };
|
|
|
| -GLXGLContext::GLXGLContext()
|
| +GLXGLContext::GLXGLContext(GrGLStandard forcedGpuAPI)
|
| : fContext(NULL)
|
| , fDisplay(NULL)
|
| , fPixmap(0)
|
| , fGlxPixmap(0) {
|
| -}
|
| -
|
| -GLXGLContext::~GLXGLContext() {
|
| - this->destroyGLContext();
|
| -}
|
|
|
| -void GLXGLContext::destroyGLContext() {
|
| - if (fDisplay) {
|
| - glXMakeCurrent(fDisplay, 0, 0);
|
| -
|
| - if (fContext) {
|
| - glXDestroyContext(fDisplay, fContext);
|
| - fContext = NULL;
|
| - }
|
| -
|
| - if (fGlxPixmap) {
|
| - glXDestroyGLXPixmap(fDisplay, fGlxPixmap);
|
| - fGlxPixmap = 0;
|
| - }
|
| -
|
| - if (fPixmap) {
|
| - XFreePixmap(fDisplay, fPixmap);
|
| - fPixmap = 0;
|
| - }
|
| -
|
| - XCloseDisplay(fDisplay);
|
| - fDisplay = NULL;
|
| - }
|
| -}
|
| -
|
| -const GrGLInterface* GLXGLContext::createGLContext(GrGLStandard forcedGpuAPI) {
|
| fDisplay = XOpenDisplay(0);
|
|
|
| if (!fDisplay) {
|
| SkDebugf("Failed to open X display.\n");
|
| this->destroyGLContext();
|
| - return NULL;
|
| + return;
|
| }
|
|
|
| // Get a matching FB config
|
| @@ -121,7 +88,7 @@ const GrGLInterface* GLXGLContext::createGLContext(GrGLStandard forcedGpuAPI) {
|
| ((glx_major == 1) && (glx_minor < 3)) || (glx_major < 1)) {
|
| SkDebugf("GLX version 1.3 or higher required.\n");
|
| this->destroyGLContext();
|
| - return NULL;
|
| + return;
|
| }
|
|
|
| //SkDebugf("Getting matching framebuffer configs.\n");
|
| @@ -131,7 +98,7 @@ const GrGLInterface* GLXGLContext::createGLContext(GrGLStandard forcedGpuAPI) {
|
| if (!fbc) {
|
| SkDebugf("Failed to retrieve a framebuffer config.\n");
|
| this->destroyGLContext();
|
| - return NULL;
|
| + return;
|
| }
|
| //SkDebugf("Found %d matching FB configs.\n", fbcount);
|
|
|
| @@ -171,7 +138,7 @@ const GrGLInterface* GLXGLContext::createGLContext(GrGLStandard forcedGpuAPI) {
|
| if (!fPixmap) {
|
| SkDebugf("Failed to create pixmap.\n");
|
| this->destroyGLContext();
|
| - return NULL;
|
| + return;
|
| }
|
|
|
| fGlxPixmap = glXCreateGLXPixmap(fDisplay, vi, fPixmap);
|
| @@ -283,7 +250,7 @@ const GrGLInterface* GLXGLContext::createGLContext(GrGLStandard forcedGpuAPI) {
|
| if (ctxErrorOccurred || !fContext) {
|
| SkDebugf("Failed to create an OpenGL context.\n");
|
| this->destroyGLContext();
|
| - return NULL;
|
| + return;
|
| }
|
|
|
| // Verify that context is a direct context
|
| @@ -297,16 +264,51 @@ const GrGLInterface* GLXGLContext::createGLContext(GrGLStandard forcedGpuAPI) {
|
| if (!glXMakeCurrent(fDisplay, fGlxPixmap, fContext)) {
|
| SkDebugf("Could not set the context.\n");
|
| this->destroyGLContext();
|
| - return NULL;
|
| + return;
|
| }
|
|
|
| - const GrGLInterface* interface = GrGLCreateNativeInterface();
|
| - if (!interface) {
|
| + fGL.reset(GrGLCreateNativeInterface());
|
| + if (NULL == fGL.get()) {
|
| SkDebugf("Failed to create gl interface");
|
| this->destroyGLContext();
|
| - return NULL;
|
| + return;
|
| + }
|
| +
|
| + if (!fGL->validate()) {
|
| + SkDebugf("Failed to validate gl interface");
|
| + this->destroyGLContext();
|
| + return;
|
| + }
|
| +}
|
| +
|
| +
|
| +GLXGLContext::~GLXGLContext() {
|
| + this->destroyGLContext();
|
| +}
|
| +
|
| +void GLXGLContext::destroyGLContext() {
|
| + fGL.reset(NULL);
|
| + if (fDisplay) {
|
| + glXMakeCurrent(fDisplay, 0, 0);
|
| +
|
| + if (fContext) {
|
| + glXDestroyContext(fDisplay, fContext);
|
| + fContext = NULL;
|
| + }
|
| +
|
| + if (fGlxPixmap) {
|
| + glXDestroyGLXPixmap(fDisplay, fGlxPixmap);
|
| + fGlxPixmap = 0;
|
| + }
|
| +
|
| + if (fPixmap) {
|
| + XFreePixmap(fDisplay, fPixmap);
|
| + fPixmap = 0;
|
| + }
|
| +
|
| + XCloseDisplay(fDisplay);
|
| + fDisplay = NULL;
|
| }
|
| - return interface;
|
| }
|
|
|
| void GLXGLContext::makeCurrent() const {
|
| @@ -321,6 +323,11 @@ void GLXGLContext::swapBuffers() const {
|
|
|
| } // anonymous namespace
|
|
|
| -SkGLContext* SkCreatePlatformGLContext() {
|
| - return SkNEW(GLXGLContext);
|
| +SkGLContext* SkCreatePlatformGLContext(GrGLStandard forcedGpuAPI) {
|
| + GLXGLContext* ctx = SkNEW_ARGS(GLXGLContext, (forcedGpuAPI));
|
| + if (!ctx->isValid()) {
|
| + SkDELETE(ctx);
|
| + return NULL;
|
| + }
|
| + return ctx;
|
| }
|
|
|