'../tests/FillPathTest.cpp',
'../tests/FlateTest.cpp',
'../tests/GeometryTest.cpp',
+ '../tests/GLInterfaceValidation.cpp',
'../tests/GLProgramsTest.cpp',
'../tests/InfRectTest.cpp',
'../tests/MathTest.cpp',
const GrGLInterface* GrGLDefaultInterface();
+/**
+ * Creates a GrGLInterface for a "native" GL context (e.g. WGL on windows,
+ * GLX on linux, AGL on Mac). On platforms that have context-specific function
+ * pointers for GL extensions (e.g. windows) the returned interface is only
+ * valid for the context that was current at creation.
+ */
const GrGLInterface* GrGLCreateNativeInterface();
+/**
+ * Creates a GrGLInterface for an OSMesa context.
+ */
const GrGLInterface* GrGLCreateMesaInterface();
typedef unsigned int GrGLenum;
SkGLContext();
virtual ~SkGLContext();
+ /**
+ * Initializes the context and makes it current.
+ */
bool init(const int width, const int height);
int getFBOID() const { return fFBO; }
#if SK_MESA
class SkMesaGLContext : public SkGLContext {
+private:
+ typedef intptr_t Context;
+
public:
SkMesaGLContext();
virtual void makeCurrent() const SK_OVERRIDE;
+ class AutoContextRestore {
+ public:
+ AutoContextRestore();
+ ~AutoContextRestore();
+
+ private:
+ Context fOldContext;
+ GLint fOldWidth;
+ GLint fOldHeight;
+ GLint fOldFormat;
+ void* fOldImage;
+ };
+
protected:
virtual const GrGLInterface* createGLContext() SK_OVERRIDE;
void destroyGLContext() SK_OVERRIDE;
private:
- typedef intptr_t Context;
Context fContext;
GrGLubyte *fImage;
};
#endif
-#endif
\ No newline at end of file
+#endif
virtual void makeCurrent() const SK_OVERRIDE;
+ class AutoContextRestore {
+ public:
+ AutoContextRestore();
+ ~AutoContextRestore();
+
+ private:
+ #if defined(SK_BUILD_FOR_MAC)
+ AGLContext fOldAGLContext;
+ #elif defined(SK_BUILD_FOR_UNIX)
+ GLXContext fOldGLXContext;
+ Display* fOldDisplay;
+ GLXDrawable fOldDrawable;
+ #elif defined(SK_BUILD_FOR_WIN32)
+ HDC fOldHDC;
+ HGLRC fOldHGLRC;
+ #endif
+ };
+
protected:
virtual const GrGLInterface* createGLContext() SK_OVERRIDE;
void destroyGLContext() SK_OVERRIDE;
*/
#include "SkNativeGLContext.h"
+SkNativeGLContext::AutoContextRestore::AutoContextRestore() {
+ fOldAGLContext = aglGetCurrentContext();
+}
+
+SkNativeGLContext::AutoContextRestore::~AutoContextRestore() {
+ aglSetCurrentContext(fOldAGLContext);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
SkNativeGLContext::SkNativeGLContext()
: fContext(NULL) {
}
#include "SkMesaGLContext.h"
+SkMesaGLContext::AutoContextRestore::AutoContextRestore() {
+ fOldContext = (Context)OSMesaGetCurrentContext();
+ if (NULL != (OSMesaContext)fOldContext) {
+ OSMesaGetColorBuffer((OSMesaContext)fOldContext,
+ &fOldWidth, &fOldHeight,
+ &fOldFormat, &fOldImage);
+ }
+}
+
+SkMesaGLContext::AutoContextRestore::~AutoContextRestore() {
+ if (NULL != fOldContext) {
+ OSMesaMakeCurrent((OSMesaContext)fOldContext, fOldImage,
+ fOldFormat, fOldWidth, fOldHeight);
+ }
+}
+
+///////////////////////////////////////////////////////////////////////////////
SkMesaGLContext::SkMesaGLContext()
: fContext(NULL)
#include <GL/glu.h>
+SkNativeGLContext::AutoContextRestore::AutoContextRestore() {
+ fOldGLXContext = glXGetCurrentContext();
+ fOldDisplay = glXGetCurrentDisplay();
+ fOldDrawable = glXGetCurrentDrawable();
+}
+
+SkNativeGLContext::AutoContextRestore::~AutoContextRestore() {
+ if (NULL != fOldDisplay) {
+ glXMakeCurrent(fOldDisplay, fOldDrawable, fOldGLXContext);
+ }
+}
+
+///////////////////////////////////////////////////////////////////////////////
static bool ctxErrorOccurred = false;
static int ctxErrorHandler(Display *dpy, XErrorEvent *ev) {
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
+SkNativeGLContext::AutoContextRestore::AutoContextRestore() {
+ fOldHGLRC = wglGetCurrentContext();
+ fOldHDC = wglGetCurrentDC();
+}
+
+SkNativeGLContext::AutoContextRestore::~AutoContextRestore() {
+ wglMakeCurrent(fOldHDC, fOldHGLRC);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
ATOM SkNativeGLContext::gWC = 0;
SkNativeGLContext::SkNativeGLContext()
- : fWindow(NULL)
- , fDeviceContext(NULL)
- , fGlRenderContext(0) {
+ : fWindow(NULL)
+ , fDeviceContext(NULL)
+ , fGlRenderContext(0) {
}
SkNativeGLContext::~SkNativeGLContext() {
--- /dev/null
+
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "Test.h"
+#include "SkNativeGLContext.h"
+#include "SkMesaGLContext.h"
+
+static void GLInterfaceValidationTest(skiatest::Reporter* reporter) {
+ typedef const GrGLInterface* (*interfaceFactory)();
+ struct {
+ interfaceFactory fFactory;
+ const char* fName;
+ } interfaceFactories[] = {
+ {GrGLCreateNativeInterface, "Native"},
+#if SK_MESA
+ {GrGLCreateMesaInterface, "Mesa"},
+#endif
+ };
+
+ // On some platforms GrGLCreateNativeInterface will fail unless an OpenGL
+ // context has been created. Also, preserve the current context that may
+ // be in use by outer test harness.
+ SkNativeGLContext::AutoContextRestore nglacr;
+ SkNativeGLContext nglctx;
+ static const int gBOGUS_SIZE = 16;
+ REPORTER_ASSERT(reporter, nglctx.init(gBOGUS_SIZE, gBOGUS_SIZE));
+#if SK_MESA
+ // We must have a current OSMesa context to initialize an OSMesa
+ // GrGLInterface
+ SkMesaGLContext::AutoContextRestore mglacr;
+ SkMesaGLContext mglctx;
+ REPORTER_ASSERT(reporter, mglctx.init(gBOGUS_SIZE, gBOGUS_SIZE));
+#endif
+
+ SkAutoTUnref<const GrGLInterface> iface;
+ for (size_t i = 0; i < SK_ARRAY_COUNT(interfaceFactories); ++i) {
+ iface.reset(interfaceFactories[i].fFactory());
+ REPORTER_ASSERT(reporter, NULL != iface.get());
+ if (iface.get()) {
+ REPORTER_ASSERT(reporter, iface.get()->validate(kOpenGL_Shaders_GrEngine));
+ }
+ }
+}
+
+
+#include "TestClassDef.h"
+DEFINE_TESTCLASS("GLInterfaceValidation",
+ GLInterfaceValidationTestClass,
+ GLInterfaceValidationTest)
+
gGrContext.reset(GrContext::Create(kOpenGL_Shaders_GrEngine, ctx));
}
}
+ if (gGLContext.get()) {
+ gGLContext.get()->makeCurrent();
+ }
return gGrContext.get();
}