Add test that validates GrGLInterfaces

Review URL: http://codereview.appspot.com/5304048/



git-svn-id: http://skia.googlecode.com/svn/trunk@2510 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
bsalomon@google.com 2011-10-20 21:09:45 +00:00
parent ffa11bbbed
commit d47fafe057
11 changed files with 160 additions and 5 deletions

View File

@ -30,6 +30,7 @@
'../tests/FillPathTest.cpp',
'../tests/FlateTest.cpp',
'../tests/GeometryTest.cpp',
'../tests/GLInterfaceValidation.cpp',
'../tests/GLProgramsTest.cpp',
'../tests/InfRectTest.cpp',
'../tests/MathTest.cpp',

View File

@ -69,8 +69,17 @@ struct GrGLInterface;
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;

View File

@ -20,6 +20,9 @@ public:
SkGLContext();
virtual ~SkGLContext();
/**
* Initializes the context and makes it current.
*/
bool init(const int width, const int height);
int getFBOID() const { return fFBO; }

View File

@ -13,6 +13,9 @@
#if SK_MESA
class SkMesaGLContext : public SkGLContext {
private:
typedef intptr_t Context;
public:
SkMesaGLContext();
@ -20,16 +23,28 @@ public:
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
#endif

View File

@ -28,6 +28,24 @@ public:
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;

View File

@ -7,6 +7,16 @@
*/
#include "SkNativeGLContext.h"
SkNativeGLContext::AutoContextRestore::AutoContextRestore() {
fOldAGLContext = aglGetCurrentContext();
}
SkNativeGLContext::AutoContextRestore::~AutoContextRestore() {
aglSetCurrentContext(fOldAGLContext);
}
///////////////////////////////////////////////////////////////////////////////
SkNativeGLContext::SkNativeGLContext()
: fContext(NULL) {
}

View File

@ -10,6 +10,23 @@
#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)

View File

@ -9,6 +9,19 @@
#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) {

View File

@ -11,12 +11,23 @@
#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() {

55
tests/GLInterfaceValidation.cpp Executable file
View File

@ -0,0 +1,55 @@
/*
* 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)

View File

@ -89,6 +89,9 @@ GrContext* GpuTest::GetContext() {
gGrContext.reset(GrContext::Create(kOpenGL_Shaders_GrEngine, ctx));
}
}
if (gGLContext.get()) {
gGLContext.get()->makeCurrent();
}
return gGrContext.get();
}