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:
parent
ffa11bbbed
commit
d47fafe057
@ -30,6 +30,7 @@
|
|||||||
'../tests/FillPathTest.cpp',
|
'../tests/FillPathTest.cpp',
|
||||||
'../tests/FlateTest.cpp',
|
'../tests/FlateTest.cpp',
|
||||||
'../tests/GeometryTest.cpp',
|
'../tests/GeometryTest.cpp',
|
||||||
|
'../tests/GLInterfaceValidation.cpp',
|
||||||
'../tests/GLProgramsTest.cpp',
|
'../tests/GLProgramsTest.cpp',
|
||||||
'../tests/InfRectTest.cpp',
|
'../tests/InfRectTest.cpp',
|
||||||
'../tests/MathTest.cpp',
|
'../tests/MathTest.cpp',
|
||||||
|
@ -69,8 +69,17 @@ struct GrGLInterface;
|
|||||||
|
|
||||||
const GrGLInterface* GrGLDefaultInterface();
|
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();
|
const GrGLInterface* GrGLCreateNativeInterface();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a GrGLInterface for an OSMesa context.
|
||||||
|
*/
|
||||||
const GrGLInterface* GrGLCreateMesaInterface();
|
const GrGLInterface* GrGLCreateMesaInterface();
|
||||||
|
|
||||||
typedef unsigned int GrGLenum;
|
typedef unsigned int GrGLenum;
|
||||||
|
@ -20,6 +20,9 @@ public:
|
|||||||
SkGLContext();
|
SkGLContext();
|
||||||
virtual ~SkGLContext();
|
virtual ~SkGLContext();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes the context and makes it current.
|
||||||
|
*/
|
||||||
bool init(const int width, const int height);
|
bool init(const int width, const int height);
|
||||||
|
|
||||||
int getFBOID() const { return fFBO; }
|
int getFBOID() const { return fFBO; }
|
||||||
|
@ -13,6 +13,9 @@
|
|||||||
#if SK_MESA
|
#if SK_MESA
|
||||||
|
|
||||||
class SkMesaGLContext : public SkGLContext {
|
class SkMesaGLContext : public SkGLContext {
|
||||||
|
private:
|
||||||
|
typedef intptr_t Context;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SkMesaGLContext();
|
SkMesaGLContext();
|
||||||
|
|
||||||
@ -20,16 +23,28 @@ public:
|
|||||||
|
|
||||||
virtual void makeCurrent() const SK_OVERRIDE;
|
virtual void makeCurrent() const SK_OVERRIDE;
|
||||||
|
|
||||||
|
class AutoContextRestore {
|
||||||
|
public:
|
||||||
|
AutoContextRestore();
|
||||||
|
~AutoContextRestore();
|
||||||
|
|
||||||
|
private:
|
||||||
|
Context fOldContext;
|
||||||
|
GLint fOldWidth;
|
||||||
|
GLint fOldHeight;
|
||||||
|
GLint fOldFormat;
|
||||||
|
void* fOldImage;
|
||||||
|
};
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual const GrGLInterface* createGLContext() SK_OVERRIDE;
|
virtual const GrGLInterface* createGLContext() SK_OVERRIDE;
|
||||||
void destroyGLContext() SK_OVERRIDE;
|
void destroyGLContext() SK_OVERRIDE;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
typedef intptr_t Context;
|
|
||||||
Context fContext;
|
Context fContext;
|
||||||
GrGLubyte *fImage;
|
GrGLubyte *fImage;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -28,6 +28,24 @@ public:
|
|||||||
|
|
||||||
virtual void makeCurrent() const SK_OVERRIDE;
|
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:
|
protected:
|
||||||
virtual const GrGLInterface* createGLContext() SK_OVERRIDE;
|
virtual const GrGLInterface* createGLContext() SK_OVERRIDE;
|
||||||
void destroyGLContext() SK_OVERRIDE;
|
void destroyGLContext() SK_OVERRIDE;
|
||||||
|
@ -7,6 +7,16 @@
|
|||||||
*/
|
*/
|
||||||
#include "SkNativeGLContext.h"
|
#include "SkNativeGLContext.h"
|
||||||
|
|
||||||
|
SkNativeGLContext::AutoContextRestore::AutoContextRestore() {
|
||||||
|
fOldAGLContext = aglGetCurrentContext();
|
||||||
|
}
|
||||||
|
|
||||||
|
SkNativeGLContext::AutoContextRestore::~AutoContextRestore() {
|
||||||
|
aglSetCurrentContext(fOldAGLContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
SkNativeGLContext::SkNativeGLContext()
|
SkNativeGLContext::SkNativeGLContext()
|
||||||
: fContext(NULL) {
|
: fContext(NULL) {
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,23 @@
|
|||||||
|
|
||||||
#include "SkMesaGLContext.h"
|
#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()
|
SkMesaGLContext::SkMesaGLContext()
|
||||||
: fContext(NULL)
|
: fContext(NULL)
|
||||||
|
@ -9,6 +9,19 @@
|
|||||||
|
|
||||||
#include <GL/glu.h>
|
#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 bool ctxErrorOccurred = false;
|
||||||
static int ctxErrorHandler(Display *dpy, XErrorEvent *ev) {
|
static int ctxErrorHandler(Display *dpy, XErrorEvent *ev) {
|
||||||
|
@ -11,12 +11,23 @@
|
|||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
#include <Windows.h>
|
#include <Windows.h>
|
||||||
|
|
||||||
|
SkNativeGLContext::AutoContextRestore::AutoContextRestore() {
|
||||||
|
fOldHGLRC = wglGetCurrentContext();
|
||||||
|
fOldHDC = wglGetCurrentDC();
|
||||||
|
}
|
||||||
|
|
||||||
|
SkNativeGLContext::AutoContextRestore::~AutoContextRestore() {
|
||||||
|
wglMakeCurrent(fOldHDC, fOldHGLRC);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
ATOM SkNativeGLContext::gWC = 0;
|
ATOM SkNativeGLContext::gWC = 0;
|
||||||
|
|
||||||
SkNativeGLContext::SkNativeGLContext()
|
SkNativeGLContext::SkNativeGLContext()
|
||||||
: fWindow(NULL)
|
: fWindow(NULL)
|
||||||
, fDeviceContext(NULL)
|
, fDeviceContext(NULL)
|
||||||
, fGlRenderContext(0) {
|
, fGlRenderContext(0) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SkNativeGLContext::~SkNativeGLContext() {
|
SkNativeGLContext::~SkNativeGLContext() {
|
||||||
|
55
tests/GLInterfaceValidation.cpp
Executable file
55
tests/GLInterfaceValidation.cpp
Executable 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)
|
||||||
|
|
@ -89,6 +89,9 @@ GrContext* GpuTest::GetContext() {
|
|||||||
gGrContext.reset(GrContext::Create(kOpenGL_Shaders_GrEngine, ctx));
|
gGrContext.reset(GrContext::Create(kOpenGL_Shaders_GrEngine, ctx));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (gGLContext.get()) {
|
||||||
|
gGLContext.get()->makeCurrent();
|
||||||
|
}
|
||||||
return gGrContext.get();
|
return gGrContext.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user