diff options
author | bsalomon <bsalomon@google.com> | 2014-10-08 04:45:09 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-10-08 04:45:10 -0700 |
commit | 10805961ce424868e8315e00f6dbeeaa62d466ac (patch) | |
tree | 87fbeec3c52176c1794c25ae639adb38c6bcfa60 | |
parent | a5ee45ce9daba663c28ba5f6634af93702aecd96 (diff) |
Revert of Make the Sk GL context class an abstract base class (patchset #4 id:60001 of https://codereview.chromium.org/630843002/)
Reason for revert:
nanobech failing on Android
Original issue's description:
> Make the Sk GL context class an abstract base class
>
> Make the Sk GL context class, SkGLNativeContext, an abstract base class. Before,
> it depended on ifdefs to implement the platform dependent polymorphism. Move
> the logic to subclasses of the various platform implementations.
>
> This a step to enable Skia embedders to compile dm and bench_pictures. The
> concrete goal is to support running these test apps with Chromium command buffer.
>
> With this change, Chromium can implement its own version of SkGLNativeContext
> that uses command buffer, and host the implementation in its own repository.
>
> Implements the above by renaming the SkGLContextHelper to SkGLContext and
> removing the unneeded SkGLNativeContext. Also removes
> SkGLNativeContext::AutoRestoreContext functionality, it appeared to be unused:
> no use in Skia code, and no tests.
>
> BUG=skia:2992
>
> Committed: https://skia.googlesource.com/skia/+/a90ed4e83897b45d6331ee4c54e1edd4054de9a8
TBR=kkinnunen@nvidia.com
NOTREECHECKS=true
NOTRY=true
BUG=skia:2992
Review URL: https://codereview.chromium.org/639793002
29 files changed, 351 insertions, 312 deletions
diff --git a/bench/nanobench.cpp b/bench/nanobench.cpp index 65cef8989e..21aeef4b3c 100644 --- a/bench/nanobench.cpp +++ b/bench/nanobench.cpp @@ -84,7 +84,7 @@ static SkString humanize(double ms) { } #define HUMANIZE(ms) humanize(ms).c_str() -static double time(int loops, Benchmark* bench, SkCanvas* canvas, SkGLContext* gl) { +static double time(int loops, Benchmark* bench, SkCanvas* canvas, SkGLContextHelper* gl) { if (canvas) { canvas->clear(SK_ColorWHITE); } @@ -203,7 +203,7 @@ static int cpu_bench(const double overhead, Benchmark* bench, SkCanvas* canvas, } #if SK_SUPPORT_GPU -static int gpu_bench(SkGLContext* gl, +static int gpu_bench(SkGLContextHelper* gl, Benchmark* bench, SkCanvas* canvas, double* samples) { @@ -274,7 +274,7 @@ struct Target { const Config config; SkAutoTDelete<SkSurface> surface; #if SK_SUPPORT_GPU - SkGLContext* gl; + SkGLContextHelper* gl; #endif }; @@ -389,7 +389,7 @@ static void create_targets(SkTDArray<Target*>* targets, Benchmark* b, } #if SK_SUPPORT_GPU -static void fill_gpu_options(ResultsWriter* log, SkGLContext* ctx) { +static void fill_gpu_options(ResultsWriter* log, SkGLContextHelper* ctx) { const GrGLubyte* version; SK_GL_RET(*ctx, version, GetString(GR_GL_VERSION)); log->configOption("GL_VERSION", (const char*)(version)); diff --git a/gyp/gpu.gypi b/gyp/gpu.gypi index a853cf5675..eb520b5240 100644 --- a/gyp/gpu.gypi +++ b/gyp/gpu.gypi @@ -279,7 +279,7 @@ '<(skia_include_path)/gpu/SkGrPixelRef.h', '<(skia_include_path)/gpu/SkGrTexturePixelRef.h', - '<(skia_include_path)/gpu/gl/SkGLContext.h', + '<(skia_include_path)/gpu/gl/SkGLContextHelper.h', '<(skia_src_path)/gpu/SkGpuDevice.cpp', '<(skia_src_path)/gpu/SkGpuDevice.h', @@ -290,7 +290,7 @@ '<(skia_src_path)/image/SkImage_Gpu.cpp', '<(skia_src_path)/image/SkSurface_Gpu.cpp', - '<(skia_src_path)/gpu/gl/SkGLContext.cpp' + '<(skia_src_path)/gpu/gl/SkGLContextHelper.cpp' ], 'skgpu_native_gl_sources': [ '<(skia_src_path)/gpu/gl/GrGLDefaultInterface_native.cpp', @@ -302,12 +302,13 @@ '<(skia_src_path)/gpu/gl/android/GrGLCreateNativeInterface_android.cpp', # Sk files - '<(skia_src_path)/gpu/gl/mac/SkCreatePlatformGLContext_mac.cpp', - '<(skia_src_path)/gpu/gl/nacl/SkCreatePlatformGLContext_nacl.cpp', - '<(skia_src_path)/gpu/gl/win/SkCreatePlatformGLContext_win.cpp', - '<(skia_src_path)/gpu/gl/glx/SkCreatePlatformGLContext_glx.cpp', - '<(skia_src_path)/gpu/gl/egl/SkCreatePlatformGLContext_egl.cpp', - '<(skia_src_path)/gpu/gl/iOS/SkCreatePlatformGLContext_iOS.mm', + '<(skia_include_path)/gpu/gl/SkNativeGLContext.h', + '<(skia_src_path)/gpu/gl/mac/SkNativeGLContext_mac.cpp', + '<(skia_src_path)/gpu/gl/nacl/SkNativeGLContext_nacl.cpp', + '<(skia_src_path)/gpu/gl/win/SkNativeGLContext_win.cpp', + '<(skia_src_path)/gpu/gl/glx/SkNativeGLContext_glx.cpp', + '<(skia_src_path)/gpu/gl/egl/SkNativeGLContext_egl.cpp', + '<(skia_src_path)/gpu/gl/iOS/SkNativeGLContext_iOS.mm', ], 'skgpu_mesa_gl_sources': [ '<(skia_src_path)/gpu/gl/mesa/GrGLCreateMesaInterface.cpp', diff --git a/gyp/public_headers.gypi b/gyp/public_headers.gypi index 4ee02d5512..6e61b4ec76 100644 --- a/gyp/public_headers.gypi +++ b/gyp/public_headers.gypi @@ -183,8 +183,9 @@ 'gpu/gl/GrGLInterface.h', 'gpu/gl/SkANGLEGLContext.h', 'gpu/gl/SkDebugGLContext.h', + 'gpu/gl/SkGLContextHelper.h', 'gpu/gl/SkMesaGLContext.h', - 'gpu/gl/SkGLContext.h', + 'gpu/gl/SkNativeGLContext.h', 'gpu/gl/SkNullGLContext.h', 'images/SkForceLinking.h', 'images/SkMovie.h', diff --git a/include/gpu/GrContextFactory.h b/include/gpu/GrContextFactory.h index eff1f5834c..d78120ccb0 100644 --- a/include/gpu/GrContextFactory.h +++ b/include/gpu/GrContextFactory.h @@ -15,7 +15,7 @@ #if SK_MESA #include "gl/SkMesaGLContext.h" #endif -#include "gl/SkGLContext.h" +#include "gl/SkNativeGLContext.h" #include "gl/SkNullGLContext.h" #include "GrContext.h" @@ -130,12 +130,12 @@ public: return fContexts[i].fGrContext; } } - SkAutoTUnref<SkGLContext> glCtx; + SkAutoTUnref<SkGLContextHelper> glCtx; SkAutoTUnref<GrContext> grCtx; switch (type) { case kNVPR_GLContextType: // fallthru case kNative_GLContextType: - glCtx.reset(SkCreatePlatformGLContext()); + glCtx.reset(SkNEW(SkNativeGLContext)); break; #ifdef SK_ANGLE case kANGLE_GLContextType: @@ -192,7 +192,7 @@ public: // Returns the GLContext of the given type. If it has not been created yet, // NULL is returned instead. - SkGLContext* getGLContext(GLContextType type) { + SkGLContextHelper* getGLContext(GLContextType type) { for (int i = 0; i < fContexts.count(); ++i) { if (fContexts[i].fType == type) { return fContexts[i].fGLContext; @@ -207,7 +207,7 @@ public: private: struct GPUContext { GLContextType fType; - SkGLContext* fGLContext; + SkGLContextHelper* fGLContext; GrContext* fGrContext; }; SkTArray<GPUContext, true> fContexts; diff --git a/include/gpu/gl/SkANGLEGLContext.h b/include/gpu/gl/SkANGLEGLContext.h index 18cdbdb213..c5f62ff3ce 100644 --- a/include/gpu/gl/SkANGLEGLContext.h +++ b/include/gpu/gl/SkANGLEGLContext.h @@ -10,12 +10,12 @@ #if SK_ANGLE -#include "SkGLContext.h" +#include "SkGLContextHelper.h" #include <GLES2/gl2.h> #include <EGL/egl.h> -class SkANGLEGLContext : public SkGLContext { +class SkANGLEGLContext : public SkGLContextHelper { public: SkANGLEGLContext(); @@ -24,6 +24,17 @@ public: virtual void makeCurrent() const SK_OVERRIDE; virtual void swapBuffers() const SK_OVERRIDE; + class AutoContextRestore { + public: + AutoContextRestore(); + ~AutoContextRestore(); + + private: + EGLContext fOldEGLContext; + EGLDisplay fOldDisplay; + EGLSurface fOldSurface; + }; + protected: virtual const GrGLInterface* createGLContext( GrGLStandard forcedGpuAPI) SK_OVERRIDE; diff --git a/include/gpu/gl/SkDebugGLContext.h b/include/gpu/gl/SkDebugGLContext.h index 792666332e..7db9579617 100644 --- a/include/gpu/gl/SkDebugGLContext.h +++ b/include/gpu/gl/SkDebugGLContext.h @@ -8,9 +8,9 @@ #ifndef SkDebugGLContext_DEFINED #define SkDebugGLContext_DEFINED -#include "SkGLContext.h" +#include "SkGLContextHelper.h" -class SkDebugGLContext : public SkGLContext { +class SkDebugGLContext : public SkGLContextHelper { public: SkDebugGLContext() {} diff --git a/include/gpu/gl/SkGLContext.h b/include/gpu/gl/SkGLContextHelper.h index 83c9146c9b..c4d9bdf997 100644 --- a/include/gpu/gl/SkGLContext.h +++ b/include/gpu/gl/SkGLContextHelper.h @@ -5,8 +5,8 @@ * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ -#ifndef SkGLContext_DEFINED -#define SkGLContext_DEFINED +#ifndef SkGLContextHelper_DEFINED +#define SkGLContextHelper_DEFINED #include "GrGLInterface.h" @@ -15,12 +15,12 @@ * Provides a GrGLInterface struct of function pointers for the context. */ -class SK_API SkGLContext : public SkRefCnt { +class SK_API SkGLContextHelper : public SkRefCnt { public: - SK_DECLARE_INST_COUNT(SkGLContext) + SK_DECLARE_INST_COUNT(SkGLContextHelper) - SkGLContext(); - virtual ~SkGLContext(); + SkGLContextHelper(); + virtual ~SkGLContextHelper(); /** * Initializes the context and makes it current. @@ -81,14 +81,6 @@ private: typedef SkRefCnt INHERITED; }; -/** Creates platform-dependent GL context object - * Note: If Skia embedder needs a custom GL context that sets up the GL - * interface, this function should be implemented by the embedder. - * Otherwise, the default implementation for the platform should be compiled in - * the library. - */ -SK_API SkGLContext* SkCreatePlatformGLContext(); - /** * Helper macros for using the GL context through the GrGLInterface. Example: * SK_GL(glCtx, GenTextures(1, &texID)); diff --git a/include/gpu/gl/SkMesaGLContext.h b/include/gpu/gl/SkMesaGLContext.h index ef0017180c..28349ddd88 100644 --- a/include/gpu/gl/SkMesaGLContext.h +++ b/include/gpu/gl/SkMesaGLContext.h @@ -8,11 +8,11 @@ #ifndef SkMesaGLContext_DEFINED #define SkMesaGLContext_DEFINED -#include "SkGLContext.h" +#include "SkGLContextHelper.h" #if SK_MESA -class SkMesaGLContext : public SkGLContext { +class SkMesaGLContext : public SkGLContextHelper { private: typedef intptr_t Context; @@ -24,6 +24,19 @@ public: virtual void makeCurrent() const SK_OVERRIDE; virtual void swapBuffers() const SK_OVERRIDE; + class AutoContextRestore { + public: + AutoContextRestore(); + ~AutoContextRestore(); + + private: + Context fOldContext; + GrGLint fOldWidth; + GrGLint fOldHeight; + GrGLint fOldFormat; + void* fOldImage; + }; + protected: virtual const GrGLInterface* createGLContext(GrGLStandard forcedGpuAPI) SK_OVERRIDE; virtual void destroyGLContext() SK_OVERRIDE; diff --git a/include/gpu/gl/SkNativeGLContext.h b/include/gpu/gl/SkNativeGLContext.h new file mode 100644 index 0000000000..93b5b4183a --- /dev/null +++ b/include/gpu/gl/SkNativeGLContext.h @@ -0,0 +1,111 @@ + +/* + * Copyright 2011 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ +#ifndef SkNativeGLContext_DEFINED +#define SkNativeGLContext_DEFINED + +#include "SkGLContextHelper.h" + +/* This struct is taken from a mesa demo. Please update as required */ +static const struct { int major, minor; } gl_versions[] = { + {1, 0}, + {1, 1}, + {1, 2}, + {1, 3}, + {1, 4}, + {1, 5}, + {2, 0}, + {2, 1}, + {3, 0}, + {3, 1}, + {3, 2}, + {3, 3}, + {4, 0}, + {4, 1}, + {4, 2}, + {4, 3}, + {4, 4}, + {0, 0} /* end of list */ +}; +#define NUM_GL_VERSIONS SK_ARRAY_COUNT(gl_versions) + +#if defined(SK_BUILD_FOR_MAC) + #include <OpenGL/OpenGL.h> +#elif SK_EGL + #include <GLES2/gl2.h> + #include <EGL/egl.h> +#elif defined(SK_BUILD_FOR_UNIX) + #include <X11/Xlib.h> + #include <GL/glx.h> +#elif defined(SK_BUILD_FOR_WIN32) + #include <windows.h> + #include <GL/GL.h> + #include "SkWGL.h" +#endif + +class SkNativeGLContext : public SkGLContextHelper { +public: + SkNativeGLContext(); + + virtual ~SkNativeGLContext(); + + virtual void makeCurrent() const SK_OVERRIDE; + virtual void swapBuffers() const SK_OVERRIDE; + + class AutoContextRestore { + public: + AutoContextRestore(); + ~AutoContextRestore(); + + private: + #if defined(SK_BUILD_FOR_MAC) + CGLContextObj fOldCGLContext; + #elif SK_EGL + EGLContext fOldEGLContext; + EGLDisplay fOldDisplay; + EGLSurface fOldSurface; + #elif defined(SK_BUILD_FOR_UNIX) + GLXContext fOldGLXContext; + Display* fOldDisplay; + GLXDrawable fOldDrawable; + #elif defined(SK_BUILD_FOR_WIN32) + HDC fOldHDC; + HGLRC fOldHGLRC; + + #elif defined(SK_BUILD_FOR_IOS) + void* fEAGLContext; + #endif + }; + +protected: + virtual const GrGLInterface* createGLContext(GrGLStandard forcedGpuAPI) SK_OVERRIDE; + virtual void destroyGLContext() SK_OVERRIDE; + +private: +#if defined(SK_BUILD_FOR_MAC) + CGLContextObj fContext; +#elif SK_EGL + EGLContext fContext; + EGLDisplay fDisplay; + EGLSurface fSurface; +#elif defined(SK_BUILD_FOR_UNIX) + GLXContext fContext; + Display* fDisplay; + Pixmap fPixmap; + GLXPixmap fGlxPixmap; +#elif defined(SK_BUILD_FOR_WIN32) + HWND fWindow; + HDC fDeviceContext; + HGLRC fGlRenderContext; + static ATOM gWC; + SkWGLPbufferContext* fPbufferContext; +#elif defined(SK_BUILD_FOR_IOS) + void* fEAGLContext; +#endif +}; + +#endif diff --git a/include/gpu/gl/SkNullGLContext.h b/include/gpu/gl/SkNullGLContext.h index 16621fc696..6c2a1d7e59 100644 --- a/include/gpu/gl/SkNullGLContext.h +++ b/include/gpu/gl/SkNullGLContext.h @@ -8,9 +8,9 @@ #ifndef SkNullGLContext_DEFINED #define SkNullGLContext_DEFINED -#include "SkGLContext.h" +#include "SkGLContextHelper.h" -class SK_API SkNullGLContext : public SkGLContext { +class SK_API SkNullGLContext : public SkGLContextHelper { public: SkNullGLContext() {}; diff --git a/src/gpu/gl/SkGLContext.cpp b/src/gpu/gl/SkGLContextHelper.cpp index 92f65cd924..03b70c38f7 100644 --- a/src/gpu/gl/SkGLContext.cpp +++ b/src/gpu/gl/SkGLContextHelper.cpp @@ -5,17 +5,17 @@ * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ -#include "gl/SkGLContext.h" +#include "gl/SkGLContextHelper.h" #include "GrGLUtil.h" -SkGLContext::SkGLContext() +SkGLContextHelper::SkGLContextHelper() : fFBO(0) , fColorBufferID(0) , fDepthStencilBufferID(0) , fGL(NULL) { } -SkGLContext::~SkGLContext() { +SkGLContextHelper::~SkGLContextHelper() { if (fGL) { // TODO: determine why DeleteFramebuffers is generating a GL error in tests @@ -27,7 +27,7 @@ SkGLContext::~SkGLContext() { SkSafeUnref(fGL); } -bool SkGLContext::init(GrGLStandard forcedGpuAPI, int width, +bool SkGLContextHelper::init(GrGLStandard forcedGpuAPI, int width, int height) { if (fGL) { fGL->unref(); @@ -135,7 +135,7 @@ bool SkGLContext::init(GrGLStandard forcedGpuAPI, int width, return false; } -void SkGLContext::testAbandon() { +void SkGLContextHelper::testAbandon() { if (fGL) { fGL->abandon(); } diff --git a/src/gpu/gl/angle/SkANGLEGLContext.cpp b/src/gpu/gl/angle/SkANGLEGLContext.cpp index 4914ba5533..81fccebba0 100644 --- a/src/gpu/gl/angle/SkANGLEGLContext.cpp +++ b/src/gpu/gl/angle/SkANGLEGLContext.cpp @@ -8,6 +8,21 @@ #include "gl/SkANGLEGLContext.h" +SkANGLEGLContext::AutoContextRestore::AutoContextRestore() { + fOldEGLContext = eglGetCurrentContext(); + fOldDisplay = eglGetCurrentDisplay(); + fOldSurface = eglGetCurrentSurface(EGL_DRAW); + +} + +SkANGLEGLContext::AutoContextRestore::~AutoContextRestore() { + if (fOldDisplay) { + eglMakeCurrent(fOldDisplay, fOldSurface, fOldSurface, fOldEGLContext); + } +} + +/////////////////////////////////////////////////////////////////////////////// + SkANGLEGLContext::SkANGLEGLContext() : fContext(EGL_NO_CONTEXT) , fDisplay(EGL_NO_DISPLAY) diff --git a/src/gpu/gl/debug/GrGLCreateDebugInterface.cpp b/src/gpu/gl/debug/GrGLCreateDebugInterface.cpp index 287a43fad0..4bd8f99e22 100644 --- a/src/gpu/gl/debug/GrGLCreateDebugInterface.cpp +++ b/src/gpu/gl/debug/GrGLCreateDebugInterface.cpp @@ -819,7 +819,7 @@ public: // The solution to this is probably to alter SkDebugGlContext's // "makeCurrent" method to make a call like "makeCurrent(this)" to // the debug GL interface (assuming that the application will create - // multiple SkGLContext's) to let it switch between the active + // multiple SkGLContextHelper's) to let it switch between the active // context. Everything in the GrDebugGL object would then need to be // moved to a GrContextObj and the GrDebugGL object would just switch // between them. Note that this approach would also require that diff --git a/src/gpu/gl/egl/SkCreatePlatformGLContext_egl.cpp b/src/gpu/gl/egl/SkNativeGLContext_egl.cpp index dac2d11f16..d4d7219b5b 100644 --- a/src/gpu/gl/egl/SkCreatePlatformGLContext_egl.cpp +++ b/src/gpu/gl/egl/SkNativeGLContext_egl.cpp @@ -5,42 +5,34 @@ * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ -#include "gl/SkGLContext.h" +#include "gl/SkNativeGLContext.h" -#include <GLES2/gl2.h> -#include <EGL/egl.h> +SkNativeGLContext::AutoContextRestore::AutoContextRestore() { + fOldEGLContext = eglGetCurrentContext(); + fOldDisplay = eglGetCurrentDisplay(); + fOldSurface = eglGetCurrentSurface(EGL_DRAW); -namespace { - -class EGLGLContext : public SkGLContext { -public: - EGLGLContext(); - - virtual ~EGLGLContext(); +} - 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; +SkNativeGLContext::AutoContextRestore::~AutoContextRestore() { + if (fOldDisplay) { + eglMakeCurrent(fOldDisplay, fOldSurface, fOldSurface, fOldEGLContext); + } +} -private: - EGLContext fContext; - EGLDisplay fDisplay; - EGLSurface fSurface; -}; +/////////////////////////////////////////////////////////////////////////////// -EGLGLContext::EGLGLContext() +SkNativeGLContext::SkNativeGLContext() : fContext(EGL_NO_CONTEXT) , fDisplay(EGL_NO_DISPLAY) , fSurface(EGL_NO_SURFACE) { } -EGLGLContext::~EGLGLContext() { +SkNativeGLContext::~SkNativeGLContext() { this->destroyGLContext(); } -void EGLGLContext::destroyGLContext() { +void SkNativeGLContext::destroyGLContext() { if (fDisplay) { eglMakeCurrent(fDisplay, 0, 0, 0); @@ -59,7 +51,7 @@ void EGLGLContext::destroyGLContext() { } } -const GrGLInterface* EGLGLContext::createGLContext(GrGLStandard forcedGpuAPI) { +const GrGLInterface* SkNativeGLContext::createGLContext(GrGLStandard forcedGpuAPI) { static const EGLint kEGLContextAttribsForOpenGL[] = { EGL_NONE }; @@ -177,21 +169,14 @@ const GrGLInterface* EGLGLContext::createGLContext(GrGLStandard forcedGpuAPI) { return interface; } -void EGLGLContext::makeCurrent() const { +void SkNativeGLContext::makeCurrent() const { if (!eglMakeCurrent(fDisplay, fSurface, fSurface, fContext)) { SkDebugf("Could not set the context.\n"); } } -void EGLGLContext::swapBuffers() const { +void SkNativeGLContext::swapBuffers() const { if (!eglSwapBuffers(fDisplay, fSurface)) { SkDebugf("Could not complete eglSwapBuffers.\n"); } } - -} // anonymous namespace - -SkGLContext* CreatePlatformGLContext() { - return SkNEW(EGLGLContext); -} - diff --git a/src/gpu/gl/glx/SkCreatePlatformGLContext_glx.cpp b/src/gpu/gl/glx/SkNativeGLContext_glx.cpp index 794cdb6f03..bd130b545c 100644 --- a/src/gpu/gl/glx/SkCreatePlatformGLContext_glx.cpp +++ b/src/gpu/gl/glx/SkNativeGLContext_glx.cpp @@ -5,38 +5,25 @@ * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ -#include "gl/SkGLContext.h" +#include "gl/SkNativeGLContext.h" -#include <X11/Xlib.h> -#include <GL/glx.h> #include <GL/glu.h> -namespace { - /* Note: Skia requires glx 1.3 or newer */ -/* This struct is taken from a mesa demo. Please update as required */ -static const struct { int major, minor; } gl_versions[] = { - {1, 0}, - {1, 1}, - {1, 2}, - {1, 3}, - {1, 4}, - {1, 5}, - {2, 0}, - {2, 1}, - {3, 0}, - {3, 1}, - {3, 2}, - {3, 3}, - {4, 0}, - {4, 1}, - {4, 2}, - {4, 3}, - {4, 4}, - {0, 0} /* end of list */ -}; -#define NUM_GL_VERSIONS SK_ARRAY_COUNT(gl_versions) +SkNativeGLContext::AutoContextRestore::AutoContextRestore() { + fOldGLXContext = glXGetCurrentContext(); + fOldDisplay = glXGetCurrentDisplay(); + fOldDrawable = glXGetCurrentDrawable(); +} + +SkNativeGLContext::AutoContextRestore::~AutoContextRestore() { + if (fOldDisplay) { + glXMakeCurrent(fOldDisplay, fOldDrawable, fOldGLXContext); + } +} + +/////////////////////////////////////////////////////////////////////////////// static bool ctxErrorOccurred = false; static int ctxErrorHandler(Display *dpy, XErrorEvent *ev) { @@ -44,37 +31,18 @@ static int ctxErrorHandler(Display *dpy, XErrorEvent *ev) { return 0; } -class GLXGLContext : public SkGLContext { -public: - GLXGLContext(); - - virtual ~GLXGLContext(); - - 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: - GLXContext fContext; - Display* fDisplay; - Pixmap fPixmap; - GLXPixmap fGlxPixmap; -}; - -GLXGLContext::GLXGLContext() +SkNativeGLContext::SkNativeGLContext() : fContext(NULL) , fDisplay(NULL) , fPixmap(0) , fGlxPixmap(0) { } -GLXGLContext::~GLXGLContext() { +SkNativeGLContext::~SkNativeGLContext() { this->destroyGLContext(); } -void GLXGLContext::destroyGLContext() { +void SkNativeGLContext::destroyGLContext() { if (fDisplay) { glXMakeCurrent(fDisplay, 0, 0); @@ -98,7 +66,7 @@ void GLXGLContext::destroyGLContext() { } } -const GrGLInterface* GLXGLContext::createGLContext(GrGLStandard forcedGpuAPI) { +const GrGLInterface* SkNativeGLContext::createGLContext(GrGLStandard forcedGpuAPI) { fDisplay = XOpenDisplay(0); if (!fDisplay) { @@ -309,18 +277,12 @@ const GrGLInterface* GLXGLContext::createGLContext(GrGLStandard forcedGpuAPI) { return interface; } -void GLXGLContext::makeCurrent() const { +void SkNativeGLContext::makeCurrent() const { if (!glXMakeCurrent(fDisplay, fGlxPixmap, fContext)) { SkDebugf("Could not set the context.\n"); } } -void GLXGLContext::swapBuffers() const { +void SkNativeGLContext::swapBuffers() const { glXSwapBuffers(fDisplay, fGlxPixmap); } - -} // anonymous namespace - -SkGLContext* SkCreatePlatformGLContext() { - return SkNEW(GLXGLContext); -} diff --git a/src/gpu/gl/iOS/SkCreatePlatformGLContext_iOS.mm b/src/gpu/gl/iOS/SkNativeGLContext_iOS.mm index ce44dd37ee..1bdaf70f1c 100644 --- a/src/gpu/gl/iOS/SkCreatePlatformGLContext_iOS.mm +++ b/src/gpu/gl/iOS/SkNativeGLContext_iOS.mm @@ -6,38 +6,36 @@ * found in the LICENSE file. */ -#include "gl/SkGLContext.h" +#include "gl/SkNativeGLContext.h" #import <OpenGLES/EAGL.h> #define EAGLCTX ((EAGLContext*)(fEAGLContext)) -namespace { - -class IOSNativeGLContext : public SkNativeGLContext { -public: - IOSNativeGLContext(); - - virtual ~IOSNativeGLContext(); +SkNativeGLContext::AutoContextRestore::AutoContextRestore() { + fEAGLContext = [EAGLContext currentContext]; + if (EAGLCTX) { + [EAGLCTX retain]; + } +} - 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; +SkNativeGLContext::AutoContextRestore::~AutoContextRestore() { + if (EAGLCTX) { + [EAGLContext setCurrentContext:EAGLCTX]; + [EAGLCTX release]; + } +} -private: - void* fEAGLContext; -}; +/////////////////////////////////////////////////////////////////////////////// -IOSNativeGLContext::IOSNativeGLContext() +SkNativeGLContext::SkNativeGLContext() : fEAGLContext(NULL) { } -IOSNativeGLContext::~IOSNativeGLContext() { +SkNativeGLContext::~SkNativeGLContext() { this->destroyGLContext(); } -void IOSNativeGLContext::destroyGLContext() { +void SkNativeGLContext::destroyGLContext() { if (fEAGLContext) { if ([EAGLContext currentContext] == EAGLCTX) { [EAGLContext setCurrentContext:nil]; @@ -47,7 +45,7 @@ void IOSNativeGLContext::destroyGLContext() { } } -const GrGLInterface* IOSNativeGLContext::createGLContext(GrGLStandard forcedGpuAPI) { +const GrGLInterface* SkNativeGLContext::createGLContext(GrGLStandard forcedGpuAPI) { if (kGL_GrGLStandard == forcedGpuAPI) { return NULL; } @@ -64,18 +62,10 @@ const GrGLInterface* IOSNativeGLContext::createGLContext(GrGLStandard forcedGpuA return interface; } -void IOSNativeGLContext::makeCurrent() const { +void SkNativeGLContext::makeCurrent() const { if (![EAGLContext setCurrentContext:EAGLCTX]) { SkDebugf("Could not set the context.\n"); } } -void IOSNativeGLContext::swapBuffers() const { } - -} // anonymous namespace - - -SkNativeGLContext* SkCreatePlatformGLContext() { - return SkNEW(IOSNativeGLContext); -} - +void SkNativeGLContext::swapBuffers() const { } diff --git a/src/gpu/gl/mac/SkCreatePlatformGLContext_mac.cpp b/src/gpu/gl/mac/SkNativeGLContext_mac.cpp index 35ec276296..f63471c16a 100644 --- a/src/gpu/gl/mac/SkCreatePlatformGLContext_mac.cpp +++ b/src/gpu/gl/mac/SkNativeGLContext_mac.cpp @@ -5,43 +5,34 @@ * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ -#include "gl/SkGLContext.h" +#include "gl/SkNativeGLContext.h" #include "AvailabilityMacros.h" -#include <OpenGL/OpenGL.h> - -namespace { -class MacGLContext : public SkGLContext { -public: - MacGLContext(); - - virtual ~MacGLContext(); +SkNativeGLContext::AutoContextRestore::AutoContextRestore() { + fOldCGLContext = CGLGetCurrentContext(); +} - 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; +SkNativeGLContext::AutoContextRestore::~AutoContextRestore() { + CGLSetCurrentContext(fOldCGLContext); +} -private: - CGLContextObj fContext; -}; +/////////////////////////////////////////////////////////////////////////////// -MacGLContext::MacGLContext() +SkNativeGLContext::SkNativeGLContext() : fContext(NULL) { } -MacGLContext::~MacGLContext() { +SkNativeGLContext::~SkNativeGLContext() { this->destroyGLContext(); } -void MacGLContext::destroyGLContext() { +void SkNativeGLContext::destroyGLContext() { if (fContext) { CGLReleaseContext(fContext); } } -const GrGLInterface* MacGLContext::createGLContext(GrGLStandard forcedGpuAPI) { +const GrGLInterface* SkNativeGLContext::createGLContext(GrGLStandard forcedGpuAPI) { SkASSERT(NULL == fContext); if (kGLES_GrGLStandard == forcedGpuAPI) { return NULL; @@ -84,16 +75,10 @@ const GrGLInterface* MacGLContext::createGLContext(GrGLStandard forcedGpuAPI) { return interface; } -void MacGLContext::makeCurrent() const { +void SkNativeGLContext::makeCurrent() const { CGLSetCurrentContext(fContext); } -void MacGLContext::swapBuffers() const { +void SkNativeGLContext::swapBuffers() const { CGLFlushDrawable(fContext); } - -} // anonymous namespace - -SkGLContext* SkCreatePlatformGLContext() { - return SkNEW(MacGLContext); -} diff --git a/src/gpu/gl/mesa/SkMesaGLContext.cpp b/src/gpu/gl/mesa/SkMesaGLContext.cpp index 8c339c7fac..31402c5a3c 100644 --- a/src/gpu/gl/mesa/SkMesaGLContext.cpp +++ b/src/gpu/gl/mesa/SkMesaGLContext.cpp @@ -11,6 +11,24 @@ #include "gl/SkMesaGLContext.h" #include "gl/GrGLDefines.h" +SkMesaGLContext::AutoContextRestore::AutoContextRestore() { + fOldContext = (Context)OSMesaGetCurrentContext(); + if (fOldContext) { + OSMesaGetColorBuffer((OSMesaContext)fOldContext, + &fOldWidth, &fOldHeight, + &fOldFormat, &fOldImage); + } +} + +SkMesaGLContext::AutoContextRestore::~AutoContextRestore() { + if (fOldContext) { + OSMesaMakeCurrent((OSMesaContext)fOldContext, fOldImage, + fOldFormat, fOldWidth, fOldHeight); + } +} + +/////////////////////////////////////////////////////////////////////////////// + SkMesaGLContext::SkMesaGLContext() : fContext(static_cast<Context>(NULL)) , fImage(NULL) { diff --git a/src/gpu/gl/nacl/SkCreatePlatformGLContext_nacl.cpp b/src/gpu/gl/nacl/SkCreatePlatformGLContext_nacl.cpp deleted file mode 100644 index 5e4b2e4917..0000000000 --- a/src/gpu/gl/nacl/SkCreatePlatformGLContext_nacl.cpp +++ /dev/null @@ -1,60 +0,0 @@ - -/* - * Copyright 2012 Google Inc. - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ -#include "gl/SkGLContext.h" - -#include <GLES2/gl2.h> -#include <EGL/egl.h> - -namespace { -class NACLGLContext : public SkGLContext { -public: - SkGLContextEGL(); - - virtual ~NACLGLContext(); - - 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: - EGLContext fContext; - EGLDisplay fDisplay; - EGLSurface fSurface; -}; - -NACLGLContext::NACLGLContext() - : fContext(NULL) - , fDisplay(NULL) -{ -} - -NACLGLContext::~NACLGLContext() { - this->destroyGLContext(); -} - -void NACLGLContext::destroyGLContext() { -} - -const GrGLInterface* NACLGLContext::createGLContext(GrGLStandard forcedGpuAPI) { - return NULL; -} - -void NACLGLContext::makeCurrent() const { -} - -void NACLGLContext::swapBuffers() const { -} - -} // anonymous namespace - -NACLGLContext* SkCreatePlatformGLContext() { - return SkNEW(NACLGLContext); -} - diff --git a/src/gpu/gl/nacl/SkNativeGLContext_nacl.cpp b/src/gpu/gl/nacl/SkNativeGLContext_nacl.cpp new file mode 100644 index 0000000000..334be1d954 --- /dev/null +++ b/src/gpu/gl/nacl/SkNativeGLContext_nacl.cpp @@ -0,0 +1,37 @@ + +/* + * Copyright 2012 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ +#include "gl/SkNativeGLContext.h" + +SkNativeGLContext::AutoContextRestore::AutoContextRestore() { +} + +SkNativeGLContext::AutoContextRestore::~AutoContextRestore() { +} + +SkNativeGLContext::SkNativeGLContext() + : fContext(NULL) + , fDisplay(NULL) +{ +} + +SkNativeGLContext::~SkNativeGLContext() { + this->destroyGLContext(); +} + +void SkNativeGLContext::destroyGLContext() { +} + +const GrGLInterface* SkNativeGLContext::createGLContext(GrGLStandard forcedGpuAPI) { + return NULL; +} + +void SkNativeGLContext::makeCurrent() const { +} + +void SkNativeGLContext::swapBuffers() const { +} diff --git a/src/gpu/gl/win/SkCreatePlatformGLContext_win.cpp b/src/gpu/gl/win/SkNativeGLContext_win.cpp index d362556a4e..ab66ba4d55 100644 --- a/src/gpu/gl/win/SkCreatePlatformGLContext_win.cpp +++ b/src/gpu/gl/win/SkNativeGLContext_win.cpp @@ -6,51 +6,36 @@ * found in the LICENSE file. */ -#include "gl/SkGLContext.h" - -#include <windows.h> -#include <GL/GL.h> -#include "SkWGL.h" +#include "gl/SkNativeGLContext.h" #define WIN32_LEAN_AND_MEAN #include <windows.h> -namespace { - -class WinGLContext : public SkGLContext { -public: - WinGLContext(); - - virtual ~WinGLContext(); +SkNativeGLContext::AutoContextRestore::AutoContextRestore() { + fOldHGLRC = wglGetCurrentContext(); + fOldHDC = wglGetCurrentDC(); +} - 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; +SkNativeGLContext::AutoContextRestore::~AutoContextRestore() { + wglMakeCurrent(fOldHDC, fOldHGLRC); +} -private: - HWND fWindow; - HDC fDeviceContext; - HGLRC fGlRenderContext; - static ATOM gWC; - SkWGLPbufferContext* fPbufferContext; -}; +/////////////////////////////////////////////////////////////////////////////// -ATOM WinGLContext::gWC = 0; +ATOM SkNativeGLContext::gWC = 0; -WinGLContext::WinGLContext() +SkNativeGLContext::SkNativeGLContext() : fWindow(NULL) , fDeviceContext(NULL) , fGlRenderContext(0) , fPbufferContext(NULL) { } -WinGLContext::~WinGLContext() { +SkNativeGLContext::~SkNativeGLContext() { this->destroyGLContext(); } -void WinGLContext::destroyGLContext() { +void SkNativeGLContext::destroyGLContext() { SkSafeSetNull(fPbufferContext); if (fGlRenderContext) { wglDeleteContext(fGlRenderContext); @@ -66,7 +51,7 @@ void WinGLContext::destroyGLContext() { } } -const GrGLInterface* WinGLContext::createGLContext(GrGLStandard forcedGpuAPI) { +const GrGLInterface* SkNativeGLContext::createGLContext(GrGLStandard forcedGpuAPI) { HINSTANCE hInstance = (HINSTANCE)GetModuleHandle(NULL); if (!gWC) { @@ -149,7 +134,7 @@ const GrGLInterface* WinGLContext::createGLContext(GrGLStandard forcedGpuAPI) { return interface; } -void WinGLContext::makeCurrent() const { +void SkNativeGLContext::makeCurrent() const { HDC dc; HGLRC glrc; @@ -166,7 +151,7 @@ void WinGLContext::makeCurrent() const { } } -void WinGLContext::swapBuffers() const { +void SkNativeGLContext::swapBuffers() const { HDC dc; if (NULL == fPbufferContext) { @@ -178,10 +163,3 @@ void WinGLContext::swapBuffers() const { SkDebugf("Could not complete SwapBuffers.\n"); } } - -} // anonymous namespace - -SkGLContext* SkCreatePlatformGLContext() { - return SkNEW(WinGLContext); -} - diff --git a/tests/GLInterfaceValidationTest.cpp b/tests/GLInterfaceValidationTest.cpp index 83f9e2eae2..797ba72cc0 100755 --- a/tests/GLInterfaceValidationTest.cpp +++ b/tests/GLInterfaceValidationTest.cpp @@ -17,20 +17,20 @@ DEF_GPUTEST(GLInterfaceValidation, reporter, factory) { GrContextFactory::GLContextType glCtxType = (GrContextFactory::GLContextType)i; // this forces the factory to make the context if it hasn't yet factory->get(glCtxType); - SkGLContext* glCtx = factory->getGLContext(glCtxType); + SkGLContextHelper* glCtxHelper = factory->getGLContext(glCtxType); // We're supposed to fail the NVPR context type when we the native context that does not // support the NVPR extension. if (GrContextFactory::kNVPR_GLContextType == glCtxType && factory->getGLContext(GrContextFactory::kNative_GLContextType) && !factory->getGLContext(GrContextFactory::kNative_GLContextType)->hasExtension("GL_NV_path_rendering")) { - REPORTER_ASSERT(reporter, NULL == glCtx); + REPORTER_ASSERT(reporter, NULL == glCtxHelper); continue; } - REPORTER_ASSERT(reporter, glCtx); - if (glCtx) { - const GrGLInterface* interface = glCtx->gl(); + REPORTER_ASSERT(reporter, glCtxHelper); + if (glCtxHelper) { + const GrGLInterface* interface = glCtxHelper->gl(); REPORTER_ASSERT(reporter, interface->validate()); } } diff --git a/tests/Test.cpp b/tests/Test.cpp index c458f897fb..d0147e1e4a 100644 --- a/tests/Test.cpp +++ b/tests/Test.cpp @@ -15,7 +15,7 @@ #if SK_SUPPORT_GPU #include "GrContext.h" -#include "gl/SkGLContext.h" +#include "gl/SkNativeGLContext.h" #else class GrContext; #endif diff --git a/tools/PictureRenderer.cpp b/tools/PictureRenderer.cpp index ca449855d0..705849d01a 100644 --- a/tools/PictureRenderer.cpp +++ b/tools/PictureRenderer.cpp @@ -228,7 +228,7 @@ void PictureRenderer::buildBBoxHierarchy() { void PictureRenderer::resetState(bool callFinish) { #if SK_SUPPORT_GPU - SkGLContext* glContext = this->getGLContext(); + SkGLContextHelper* glContext = this->getGLContext(); if (NULL == glContext) { SkASSERT(kBitmap_DeviceType == fDeviceType); return; @@ -248,7 +248,7 @@ void PictureRenderer::purgeTextures() { pool->dumpPool(); #if SK_SUPPORT_GPU - SkGLContext* glContext = this->getGLContext(); + SkGLContextHelper* glContext = this->getGLContext(); if (NULL == glContext) { SkASSERT(kBitmap_DeviceType == fDeviceType); return; diff --git a/tools/PictureRenderer.h b/tools/PictureRenderer.h index 8465af2deb..04ac20fcb6 100644 --- a/tools/PictureRenderer.h +++ b/tools/PictureRenderer.h @@ -30,7 +30,7 @@ class SkBitmap; class SkCanvas; -class SkGLContext; +class SkGLContextHelper; class SkThread; namespace sk_tools { @@ -369,7 +369,7 @@ public: } } - SkGLContext* getGLContext() { + SkGLContextHelper* getGLContext() { GrContextFactory::GLContextType glContextType = GrContextFactory::kNull_GLContextType; switch(fDeviceType) { diff --git a/tools/timer/GpuTimer.cpp b/tools/timer/GpuTimer.cpp index 0fdd999922..aac10a3b07 100644 --- a/tools/timer/GpuTimer.cpp +++ b/tools/timer/GpuTimer.cpp @@ -6,10 +6,10 @@ * found in the LICENSE file. */ #include "GpuTimer.h" -#include "gl/SkGLContext.h" +#include "gl/SkGLContextHelper.h" #include "gl/GrGLUtil.h" -GpuTimer::GpuTimer(const SkGLContext* glctx) : fContext(glctx) { +GpuTimer::GpuTimer(const SkGLContextHelper* glctx) : fContext(glctx) { if (fContext) { fContext->ref(); fContext->makeCurrent(); diff --git a/tools/timer/GpuTimer.h b/tools/timer/GpuTimer.h index da1fdab5c0..2100312a21 100644 --- a/tools/timer/GpuTimer.h +++ b/tools/timer/GpuTimer.h @@ -7,18 +7,18 @@ #ifndef GpuTimer_DEFINED #define GpuTimer_DEFINED -class SkGLContext; +class SkGLContextHelper; class GpuTimer { public: - GpuTimer(const SkGLContext*); + GpuTimer(const SkGLContextHelper*); ~GpuTimer(); void start(); double end(); private: unsigned fQuery; int fStarted; - const SkGLContext* fContext; + const SkGLContextHelper* fContext; bool fSupported; }; diff --git a/tools/timer/Timer.cpp b/tools/timer/Timer.cpp index a9f04afe75..4f3fc85cff 100644 --- a/tools/timer/Timer.cpp +++ b/tools/timer/Timer.cpp @@ -6,7 +6,7 @@ */ #include "Timer.h" -Timer::Timer(SkGLContext* gl) +Timer::Timer(SkGLContextHelper* gl) : fCpu(-1.0) , fWall(-1.0) , fTruncatedCpu(-1.0) diff --git a/tools/timer/Timer.h b/tools/timer/Timer.h index 81d1ca50ef..15c93f5603 100644 --- a/tools/timer/Timer.h +++ b/tools/timer/Timer.h @@ -21,7 +21,7 @@ #include "GpuTimer.h" #endif -class SkGLContext; +class SkGLContextHelper; /** * SysTimers and GpuTimers are implemented orthogonally. @@ -34,7 +34,7 @@ class SkGLContext; */ class Timer { public: - explicit Timer(SkGLContext* gl = NULL); + explicit Timer(SkGLContextHelper* gl = NULL); void start(); void truncatedEnd(); |