diff options
29 files changed, 312 insertions, 351 deletions
diff --git a/bench/nanobench.cpp b/bench/nanobench.cpp index 21aeef4b3c..65cef8989e 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, SkGLContextHelper* gl) { +static double time(int loops, Benchmark* bench, SkCanvas* canvas, SkGLContext* 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(SkGLContextHelper* gl, +static int gpu_bench(SkGLContext* gl, Benchmark* bench, SkCanvas* canvas, double* samples) { @@ -274,7 +274,7 @@ struct Target { const Config config; SkAutoTDelete<SkSurface> surface; #if SK_SUPPORT_GPU - SkGLContextHelper* gl; + SkGLContext* 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, SkGLContextHelper* ctx) { +static void fill_gpu_options(ResultsWriter* log, SkGLContext* 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 eb520b5240..a853cf5675 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/SkGLContextHelper.h', + '<(skia_include_path)/gpu/gl/SkGLContext.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/SkGLContextHelper.cpp' + '<(skia_src_path)/gpu/gl/SkGLContext.cpp' ], 'skgpu_native_gl_sources': [ '<(skia_src_path)/gpu/gl/GrGLDefaultInterface_native.cpp', @@ -302,13 +302,12 @@ '<(skia_src_path)/gpu/gl/android/GrGLCreateNativeInterface_android.cpp', # Sk files - '<(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', + '<(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', ], '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 6e61b4ec76..4ee02d5512 100644 --- a/gyp/public_headers.gypi +++ b/gyp/public_headers.gypi @@ -183,9 +183,8 @@ 'gpu/gl/GrGLInterface.h', 'gpu/gl/SkANGLEGLContext.h', 'gpu/gl/SkDebugGLContext.h', - 'gpu/gl/SkGLContextHelper.h', 'gpu/gl/SkMesaGLContext.h', - 'gpu/gl/SkNativeGLContext.h', + 'gpu/gl/SkGLContext.h', 'gpu/gl/SkNullGLContext.h', 'images/SkForceLinking.h', 'images/SkMovie.h', diff --git a/include/gpu/GrContextFactory.h b/include/gpu/GrContextFactory.h index d78120ccb0..eff1f5834c 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/SkNativeGLContext.h" +#include "gl/SkGLContext.h" #include "gl/SkNullGLContext.h" #include "GrContext.h" @@ -130,12 +130,12 @@ public: return fContexts[i].fGrContext; } } - SkAutoTUnref<SkGLContextHelper> glCtx; + SkAutoTUnref<SkGLContext> glCtx; SkAutoTUnref<GrContext> grCtx; switch (type) { case kNVPR_GLContextType: // fallthru case kNative_GLContextType: - glCtx.reset(SkNEW(SkNativeGLContext)); + glCtx.reset(SkCreatePlatformGLContext()); 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. - SkGLContextHelper* getGLContext(GLContextType type) { + SkGLContext* 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; - SkGLContextHelper* fGLContext; + SkGLContext* fGLContext; GrContext* fGrContext; }; SkTArray<GPUContext, true> fContexts; diff --git a/include/gpu/gl/SkANGLEGLContext.h b/include/gpu/gl/SkANGLEGLContext.h index c5f62ff3ce..18cdbdb213 100644 --- a/include/gpu/gl/SkANGLEGLContext.h +++ b/include/gpu/gl/SkANGLEGLContext.h @@ -10,12 +10,12 @@ #if SK_ANGLE -#include "SkGLContextHelper.h" +#include "SkGLContext.h" #include <GLES2/gl2.h> #include <EGL/egl.h> -class SkANGLEGLContext : public SkGLContextHelper { +class SkANGLEGLContext : public SkGLContext { public: SkANGLEGLContext(); @@ -24,17 +24,6 @@ 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 7db9579617..792666332e 100644 --- a/include/gpu/gl/SkDebugGLContext.h +++ b/include/gpu/gl/SkDebugGLContext.h @@ -8,9 +8,9 @@ #ifndef SkDebugGLContext_DEFINED #define SkDebugGLContext_DEFINED -#include "SkGLContextHelper.h" +#include "SkGLContext.h" -class SkDebugGLContext : public SkGLContextHelper { +class SkDebugGLContext : public SkGLContext { public: SkDebugGLContext() {} diff --git a/include/gpu/gl/SkGLContextHelper.h b/include/gpu/gl/SkGLContext.h index c4d9bdf997..83c9146c9b 100644 --- a/include/gpu/gl/SkGLContextHelper.h +++ b/include/gpu/gl/SkGLContext.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 SkGLContextHelper_DEFINED -#define SkGLContextHelper_DEFINED +#ifndef SkGLContext_DEFINED +#define SkGLContext_DEFINED #include "GrGLInterface.h" @@ -15,12 +15,12 @@ * Provides a GrGLInterface struct of function pointers for the context. */ -class SK_API SkGLContextHelper : public SkRefCnt { +class SK_API SkGLContext : public SkRefCnt { public: - SK_DECLARE_INST_COUNT(SkGLContextHelper) + SK_DECLARE_INST_COUNT(SkGLContext) - SkGLContextHelper(); - virtual ~SkGLContextHelper(); + SkGLContext(); + virtual ~SkGLContext(); /** * Initializes the context and makes it current. @@ -81,6 +81,14 @@ 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 28349ddd88..ef0017180c 100644 --- a/include/gpu/gl/SkMesaGLContext.h +++ b/include/gpu/gl/SkMesaGLContext.h @@ -8,11 +8,11 @@ #ifndef SkMesaGLContext_DEFINED #define SkMesaGLContext_DEFINED -#include "SkGLContextHelper.h" +#include "SkGLContext.h" #if SK_MESA -class SkMesaGLContext : public SkGLContextHelper { +class SkMesaGLContext : public SkGLContext { private: typedef intptr_t Context; @@ -24,19 +24,6 @@ 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 deleted file mode 100644 index 93b5b4183a..0000000000 --- a/include/gpu/gl/SkNativeGLContext.h +++ /dev/null @@ -1,111 +0,0 @@ - -/* - * 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 6c2a1d7e59..16621fc696 100644 --- a/include/gpu/gl/SkNullGLContext.h +++ b/include/gpu/gl/SkNullGLContext.h @@ -8,9 +8,9 @@ #ifndef SkNullGLContext_DEFINED #define SkNullGLContext_DEFINED -#include "SkGLContextHelper.h" +#include "SkGLContext.h" -class SK_API SkNullGLContext : public SkGLContextHelper { +class SK_API SkNullGLContext : public SkGLContext { public: SkNullGLContext() {}; diff --git a/src/gpu/gl/SkGLContextHelper.cpp b/src/gpu/gl/SkGLContext.cpp index 03b70c38f7..92f65cd924 100644 --- a/src/gpu/gl/SkGLContextHelper.cpp +++ b/src/gpu/gl/SkGLContext.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/SkGLContextHelper.h" +#include "gl/SkGLContext.h" #include "GrGLUtil.h" -SkGLContextHelper::SkGLContextHelper() +SkGLContext::SkGLContext() : fFBO(0) , fColorBufferID(0) , fDepthStencilBufferID(0) , fGL(NULL) { } -SkGLContextHelper::~SkGLContextHelper() { +SkGLContext::~SkGLContext() { if (fGL) { // TODO: determine why DeleteFramebuffers is generating a GL error in tests @@ -27,7 +27,7 @@ SkGLContextHelper::~SkGLContextHelper() { SkSafeUnref(fGL); } -bool SkGLContextHelper::init(GrGLStandard forcedGpuAPI, int width, +bool SkGLContext::init(GrGLStandard forcedGpuAPI, int width, int height) { if (fGL) { fGL->unref(); @@ -135,7 +135,7 @@ bool SkGLContextHelper::init(GrGLStandard forcedGpuAPI, int width, return false; } -void SkGLContextHelper::testAbandon() { +void SkGLContext::testAbandon() { if (fGL) { fGL->abandon(); } diff --git a/src/gpu/gl/angle/SkANGLEGLContext.cpp b/src/gpu/gl/angle/SkANGLEGLContext.cpp index 81fccebba0..4914ba5533 100644 --- a/src/gpu/gl/angle/SkANGLEGLContext.cpp +++ b/src/gpu/gl/angle/SkANGLEGLContext.cpp @@ -8,21 +8,6 @@ #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 4bd8f99e22..287a43fad0 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 SkGLContextHelper's) to let it switch between the active + // multiple SkGLContext'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/SkNativeGLContext_egl.cpp b/src/gpu/gl/egl/SkCreatePlatformGLContext_egl.cpp index d4d7219b5b..f33e84abc4 100644 --- a/src/gpu/gl/egl/SkNativeGLContext_egl.cpp +++ b/src/gpu/gl/egl/SkCreatePlatformGLContext_egl.cpp @@ -5,34 +5,42 @@ * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ -#include "gl/SkNativeGLContext.h" +#include "gl/SkGLContext.h" -SkNativeGLContext::AutoContextRestore::AutoContextRestore() { - fOldEGLContext = eglGetCurrentContext(); - fOldDisplay = eglGetCurrentDisplay(); - fOldSurface = eglGetCurrentSurface(EGL_DRAW); +#include <GLES2/gl2.h> +#include <EGL/egl.h> -} +namespace { -SkNativeGLContext::AutoContextRestore::~AutoContextRestore() { - if (fOldDisplay) { - eglMakeCurrent(fOldDisplay, fOldSurface, fOldSurface, fOldEGLContext); - } -} +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; -/////////////////////////////////////////////////////////////////////////////// +private: + EGLContext fContext; + EGLDisplay fDisplay; + EGLSurface fSurface; +}; -SkNativeGLContext::SkNativeGLContext() +EGLGLContext::EGLGLContext() : fContext(EGL_NO_CONTEXT) , fDisplay(EGL_NO_DISPLAY) , fSurface(EGL_NO_SURFACE) { } -SkNativeGLContext::~SkNativeGLContext() { +EGLGLContext::~EGLGLContext() { this->destroyGLContext(); } -void SkNativeGLContext::destroyGLContext() { +void EGLGLContext::destroyGLContext() { if (fDisplay) { eglMakeCurrent(fDisplay, 0, 0, 0); @@ -51,7 +59,7 @@ void SkNativeGLContext::destroyGLContext() { } } -const GrGLInterface* SkNativeGLContext::createGLContext(GrGLStandard forcedGpuAPI) { +const GrGLInterface* EGLGLContext::createGLContext(GrGLStandard forcedGpuAPI) { static const EGLint kEGLContextAttribsForOpenGL[] = { EGL_NONE }; @@ -169,14 +177,21 @@ const GrGLInterface* SkNativeGLContext::createGLContext(GrGLStandard forcedGpuAP return interface; } -void SkNativeGLContext::makeCurrent() const { +void EGLGLContext::makeCurrent() const { if (!eglMakeCurrent(fDisplay, fSurface, fSurface, fContext)) { SkDebugf("Could not set the context.\n"); } } -void SkNativeGLContext::swapBuffers() const { +void EGLGLContext::swapBuffers() const { if (!eglSwapBuffers(fDisplay, fSurface)) { SkDebugf("Could not complete eglSwapBuffers.\n"); } } + +} // anonymous namespace + +SkGLContext* SkCreatePlatformGLContext() { + return SkNEW(EGLGLContext); +} + diff --git a/src/gpu/gl/glx/SkNativeGLContext_glx.cpp b/src/gpu/gl/glx/SkCreatePlatformGLContext_glx.cpp index bd130b545c..794cdb6f03 100644 --- a/src/gpu/gl/glx/SkNativeGLContext_glx.cpp +++ b/src/gpu/gl/glx/SkCreatePlatformGLContext_glx.cpp @@ -5,25 +5,38 @@ * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ -#include "gl/SkNativeGLContext.h" +#include "gl/SkGLContext.h" +#include <X11/Xlib.h> +#include <GL/glx.h> #include <GL/glu.h> -/* Note: Skia requires glx 1.3 or newer */ - -SkNativeGLContext::AutoContextRestore::AutoContextRestore() { - fOldGLXContext = glXGetCurrentContext(); - fOldDisplay = glXGetCurrentDisplay(); - fOldDrawable = glXGetCurrentDrawable(); -} +namespace { -SkNativeGLContext::AutoContextRestore::~AutoContextRestore() { - if (fOldDisplay) { - glXMakeCurrent(fOldDisplay, fOldDrawable, fOldGLXContext); - } -} +/* 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) static bool ctxErrorOccurred = false; static int ctxErrorHandler(Display *dpy, XErrorEvent *ev) { @@ -31,18 +44,37 @@ static int ctxErrorHandler(Display *dpy, XErrorEvent *ev) { return 0; } -SkNativeGLContext::SkNativeGLContext() +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() : fContext(NULL) , fDisplay(NULL) , fPixmap(0) , fGlxPixmap(0) { } -SkNativeGLContext::~SkNativeGLContext() { +GLXGLContext::~GLXGLContext() { this->destroyGLContext(); } -void SkNativeGLContext::destroyGLContext() { +void GLXGLContext::destroyGLContext() { if (fDisplay) { glXMakeCurrent(fDisplay, 0, 0); @@ -66,7 +98,7 @@ void SkNativeGLContext::destroyGLContext() { } } -const GrGLInterface* SkNativeGLContext::createGLContext(GrGLStandard forcedGpuAPI) { +const GrGLInterface* GLXGLContext::createGLContext(GrGLStandard forcedGpuAPI) { fDisplay = XOpenDisplay(0); if (!fDisplay) { @@ -277,12 +309,18 @@ const GrGLInterface* SkNativeGLContext::createGLContext(GrGLStandard forcedGpuAP return interface; } -void SkNativeGLContext::makeCurrent() const { +void GLXGLContext::makeCurrent() const { if (!glXMakeCurrent(fDisplay, fGlxPixmap, fContext)) { SkDebugf("Could not set the context.\n"); } } -void SkNativeGLContext::swapBuffers() const { +void GLXGLContext::swapBuffers() const { glXSwapBuffers(fDisplay, fGlxPixmap); } + +} // anonymous namespace + +SkGLContext* SkCreatePlatformGLContext() { + return SkNEW(GLXGLContext); +} diff --git a/src/gpu/gl/iOS/SkNativeGLContext_iOS.mm b/src/gpu/gl/iOS/SkCreatePlatformGLContext_iOS.mm index 1bdaf70f1c..9989957ac9 100644 --- a/src/gpu/gl/iOS/SkNativeGLContext_iOS.mm +++ b/src/gpu/gl/iOS/SkCreatePlatformGLContext_iOS.mm @@ -6,36 +6,38 @@ * found in the LICENSE file. */ -#include "gl/SkNativeGLContext.h" +#include "gl/SkGLContext.h" #import <OpenGLES/EAGL.h> #define EAGLCTX ((EAGLContext*)(fEAGLContext)) -SkNativeGLContext::AutoContextRestore::AutoContextRestore() { - fEAGLContext = [EAGLContext currentContext]; - if (EAGLCTX) { - [EAGLCTX retain]; - } -} +namespace { -SkNativeGLContext::AutoContextRestore::~AutoContextRestore() { - if (EAGLCTX) { - [EAGLContext setCurrentContext:EAGLCTX]; - [EAGLCTX release]; - } -} +class IOSGLContext : public SkGLContext { +public: + IOSGLContext(); + + virtual ~IOSGLContext(); -/////////////////////////////////////////////////////////////////////////////// + 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::SkNativeGLContext() +private: + void* fEAGLContext; +}; + +IOSGLContext::IOSGLContext() : fEAGLContext(NULL) { } -SkNativeGLContext::~SkNativeGLContext() { +IOSGLContext::~IOSGLContext() { this->destroyGLContext(); } -void SkNativeGLContext::destroyGLContext() { +void IOSGLContext::destroyGLContext() { if (fEAGLContext) { if ([EAGLContext currentContext] == EAGLCTX) { [EAGLContext setCurrentContext:nil]; @@ -45,7 +47,7 @@ void SkNativeGLContext::destroyGLContext() { } } -const GrGLInterface* SkNativeGLContext::createGLContext(GrGLStandard forcedGpuAPI) { +const GrGLInterface* IOSGLContext::createGLContext(GrGLStandard forcedGpuAPI) { if (kGL_GrGLStandard == forcedGpuAPI) { return NULL; } @@ -62,10 +64,18 @@ const GrGLInterface* SkNativeGLContext::createGLContext(GrGLStandard forcedGpuAP return interface; } -void SkNativeGLContext::makeCurrent() const { +void IOSGLContext::makeCurrent() const { if (![EAGLContext setCurrentContext:EAGLCTX]) { SkDebugf("Could not set the context.\n"); } } -void SkNativeGLContext::swapBuffers() const { } +void IOSGLContext::swapBuffers() const { } + +} // anonymous namespace + + +SkGLContext* SkCreatePlatformGLContext() { + return SkNEW(IOSGLContext); +} + diff --git a/src/gpu/gl/mac/SkNativeGLContext_mac.cpp b/src/gpu/gl/mac/SkCreatePlatformGLContext_mac.cpp index f63471c16a..35ec276296 100644 --- a/src/gpu/gl/mac/SkNativeGLContext_mac.cpp +++ b/src/gpu/gl/mac/SkCreatePlatformGLContext_mac.cpp @@ -5,34 +5,43 @@ * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ -#include "gl/SkNativeGLContext.h" +#include "gl/SkGLContext.h" #include "AvailabilityMacros.h" -SkNativeGLContext::AutoContextRestore::AutoContextRestore() { - fOldCGLContext = CGLGetCurrentContext(); -} +#include <OpenGL/OpenGL.h> -SkNativeGLContext::AutoContextRestore::~AutoContextRestore() { - CGLSetCurrentContext(fOldCGLContext); -} +namespace { +class MacGLContext : public SkGLContext { +public: + MacGLContext(); + + virtual ~MacGLContext(); + + 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: + CGLContextObj fContext; +}; -SkNativeGLContext::SkNativeGLContext() +MacGLContext::MacGLContext() : fContext(NULL) { } -SkNativeGLContext::~SkNativeGLContext() { +MacGLContext::~MacGLContext() { this->destroyGLContext(); } -void SkNativeGLContext::destroyGLContext() { +void MacGLContext::destroyGLContext() { if (fContext) { CGLReleaseContext(fContext); } } -const GrGLInterface* SkNativeGLContext::createGLContext(GrGLStandard forcedGpuAPI) { +const GrGLInterface* MacGLContext::createGLContext(GrGLStandard forcedGpuAPI) { SkASSERT(NULL == fContext); if (kGLES_GrGLStandard == forcedGpuAPI) { return NULL; @@ -75,10 +84,16 @@ const GrGLInterface* SkNativeGLContext::createGLContext(GrGLStandard forcedGpuAP return interface; } -void SkNativeGLContext::makeCurrent() const { +void MacGLContext::makeCurrent() const { CGLSetCurrentContext(fContext); } -void SkNativeGLContext::swapBuffers() const { +void MacGLContext::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 31402c5a3c..8c339c7fac 100644 --- a/src/gpu/gl/mesa/SkMesaGLContext.cpp +++ b/src/gpu/gl/mesa/SkMesaGLContext.cpp @@ -11,24 +11,6 @@ #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 new file mode 100644 index 0000000000..5e4b2e4917 --- /dev/null +++ b/src/gpu/gl/nacl/SkCreatePlatformGLContext_nacl.cpp @@ -0,0 +1,60 @@ + +/* + * 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 deleted file mode 100644 index 334be1d954..0000000000 --- a/src/gpu/gl/nacl/SkNativeGLContext_nacl.cpp +++ /dev/null @@ -1,37 +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/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/SkNativeGLContext_win.cpp b/src/gpu/gl/win/SkCreatePlatformGLContext_win.cpp index ab66ba4d55..d362556a4e 100644 --- a/src/gpu/gl/win/SkNativeGLContext_win.cpp +++ b/src/gpu/gl/win/SkCreatePlatformGLContext_win.cpp @@ -6,36 +6,51 @@ * found in the LICENSE file. */ -#include "gl/SkNativeGLContext.h" +#include "gl/SkGLContext.h" + +#include <windows.h> +#include <GL/GL.h> +#include "SkWGL.h" #define WIN32_LEAN_AND_MEAN #include <windows.h> -SkNativeGLContext::AutoContextRestore::AutoContextRestore() { - fOldHGLRC = wglGetCurrentContext(); - fOldHDC = wglGetCurrentDC(); -} +namespace { -SkNativeGLContext::AutoContextRestore::~AutoContextRestore() { - wglMakeCurrent(fOldHDC, fOldHGLRC); -} +class WinGLContext : public SkGLContext { +public: + WinGLContext(); + + virtual ~WinGLContext(); -/////////////////////////////////////////////////////////////////////////////// + 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; -ATOM SkNativeGLContext::gWC = 0; +private: + HWND fWindow; + HDC fDeviceContext; + HGLRC fGlRenderContext; + static ATOM gWC; + SkWGLPbufferContext* fPbufferContext; +}; -SkNativeGLContext::SkNativeGLContext() +ATOM WinGLContext::gWC = 0; + +WinGLContext::WinGLContext() : fWindow(NULL) , fDeviceContext(NULL) , fGlRenderContext(0) , fPbufferContext(NULL) { } -SkNativeGLContext::~SkNativeGLContext() { +WinGLContext::~WinGLContext() { this->destroyGLContext(); } -void SkNativeGLContext::destroyGLContext() { +void WinGLContext::destroyGLContext() { SkSafeSetNull(fPbufferContext); if (fGlRenderContext) { wglDeleteContext(fGlRenderContext); @@ -51,7 +66,7 @@ void SkNativeGLContext::destroyGLContext() { } } -const GrGLInterface* SkNativeGLContext::createGLContext(GrGLStandard forcedGpuAPI) { +const GrGLInterface* WinGLContext::createGLContext(GrGLStandard forcedGpuAPI) { HINSTANCE hInstance = (HINSTANCE)GetModuleHandle(NULL); if (!gWC) { @@ -134,7 +149,7 @@ const GrGLInterface* SkNativeGLContext::createGLContext(GrGLStandard forcedGpuAP return interface; } -void SkNativeGLContext::makeCurrent() const { +void WinGLContext::makeCurrent() const { HDC dc; HGLRC glrc; @@ -151,7 +166,7 @@ void SkNativeGLContext::makeCurrent() const { } } -void SkNativeGLContext::swapBuffers() const { +void WinGLContext::swapBuffers() const { HDC dc; if (NULL == fPbufferContext) { @@ -163,3 +178,10 @@ void SkNativeGLContext::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 797ba72cc0..83f9e2eae2 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); - SkGLContextHelper* glCtxHelper = factory->getGLContext(glCtxType); + SkGLContext* glCtx = 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 == glCtxHelper); + REPORTER_ASSERT(reporter, NULL == glCtx); continue; } - REPORTER_ASSERT(reporter, glCtxHelper); - if (glCtxHelper) { - const GrGLInterface* interface = glCtxHelper->gl(); + REPORTER_ASSERT(reporter, glCtx); + if (glCtx) { + const GrGLInterface* interface = glCtx->gl(); REPORTER_ASSERT(reporter, interface->validate()); } } diff --git a/tests/Test.cpp b/tests/Test.cpp index d0147e1e4a..c458f897fb 100644 --- a/tests/Test.cpp +++ b/tests/Test.cpp @@ -15,7 +15,7 @@ #if SK_SUPPORT_GPU #include "GrContext.h" -#include "gl/SkNativeGLContext.h" +#include "gl/SkGLContext.h" #else class GrContext; #endif diff --git a/tools/PictureRenderer.cpp b/tools/PictureRenderer.cpp index 89f2cda3dd..b9b01e4cf9 100644 --- a/tools/PictureRenderer.cpp +++ b/tools/PictureRenderer.cpp @@ -232,7 +232,7 @@ void PictureRenderer::buildBBoxHierarchy() { void PictureRenderer::resetState(bool callFinish) { #if SK_SUPPORT_GPU - SkGLContextHelper* glContext = this->getGLContext(); + SkGLContext* glContext = this->getGLContext(); if (NULL == glContext) { SkASSERT(kBitmap_DeviceType == fDeviceType); return; @@ -252,7 +252,7 @@ void PictureRenderer::purgeTextures() { pool->dumpPool(); #if SK_SUPPORT_GPU - SkGLContextHelper* glContext = this->getGLContext(); + SkGLContext* glContext = this->getGLContext(); if (NULL == glContext) { SkASSERT(kBitmap_DeviceType == fDeviceType); return; diff --git a/tools/PictureRenderer.h b/tools/PictureRenderer.h index 3f58b18121..e82eb7fb8a 100644 --- a/tools/PictureRenderer.h +++ b/tools/PictureRenderer.h @@ -30,7 +30,7 @@ class SkBitmap; class SkCanvas; -class SkGLContextHelper; +class SkGLContext; class SkThread; namespace sk_tools { @@ -371,7 +371,7 @@ public: } } - SkGLContextHelper* getGLContext() { + SkGLContext* getGLContext() { GrContextFactory::GLContextType glContextType = GrContextFactory::kNull_GLContextType; switch(fDeviceType) { diff --git a/tools/timer/GpuTimer.cpp b/tools/timer/GpuTimer.cpp index aac10a3b07..0fdd999922 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/SkGLContextHelper.h" +#include "gl/SkGLContext.h" #include "gl/GrGLUtil.h" -GpuTimer::GpuTimer(const SkGLContextHelper* glctx) : fContext(glctx) { +GpuTimer::GpuTimer(const SkGLContext* glctx) : fContext(glctx) { if (fContext) { fContext->ref(); fContext->makeCurrent(); diff --git a/tools/timer/GpuTimer.h b/tools/timer/GpuTimer.h index 2100312a21..da1fdab5c0 100644 --- a/tools/timer/GpuTimer.h +++ b/tools/timer/GpuTimer.h @@ -7,18 +7,18 @@ #ifndef GpuTimer_DEFINED #define GpuTimer_DEFINED -class SkGLContextHelper; +class SkGLContext; class GpuTimer { public: - GpuTimer(const SkGLContextHelper*); + GpuTimer(const SkGLContext*); ~GpuTimer(); void start(); double end(); private: unsigned fQuery; int fStarted; - const SkGLContextHelper* fContext; + const SkGLContext* fContext; bool fSupported; }; diff --git a/tools/timer/Timer.cpp b/tools/timer/Timer.cpp index 4f3fc85cff..a9f04afe75 100644 --- a/tools/timer/Timer.cpp +++ b/tools/timer/Timer.cpp @@ -6,7 +6,7 @@ */ #include "Timer.h" -Timer::Timer(SkGLContextHelper* gl) +Timer::Timer(SkGLContext* gl) : fCpu(-1.0) , fWall(-1.0) , fTruncatedCpu(-1.0) diff --git a/tools/timer/Timer.h b/tools/timer/Timer.h index 15c93f5603..81d1ca50ef 100644 --- a/tools/timer/Timer.h +++ b/tools/timer/Timer.h @@ -21,7 +21,7 @@ #include "GpuTimer.h" #endif -class SkGLContextHelper; +class SkGLContext; /** * SysTimers and GpuTimers are implemented orthogonally. @@ -34,7 +34,7 @@ class SkGLContextHelper; */ class Timer { public: - explicit Timer(SkGLContextHelper* gl = NULL); + explicit Timer(SkGLContext* gl = NULL); void start(); void truncatedEnd(); |