aboutsummaryrefslogtreecommitdiffhomepage
path: root/samplecode/SampleApp.cpp
diff options
context:
space:
mode:
authorGravatar robertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-03-30 14:47:53 +0000
committerGravatar robertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-03-30 14:47:53 +0000
commit53e96a14cac520c1fd071ad65d80b5bacc5c4e28 (patch)
tree291ffdaec5d66fdbcad78c5159f2ac71f24fbe99 /samplecode/SampleApp.cpp
parent10e04bf1c5025389d999f22467405782e9f9ffcc (diff)
Added run-time switching between OpenGL & ANGLE in SampleApp
Diffstat (limited to 'samplecode/SampleApp.cpp')
-rw-r--r--samplecode/SampleApp.cpp319
1 files changed, 163 insertions, 156 deletions
diff --git a/samplecode/SampleApp.cpp b/samplecode/SampleApp.cpp
index dc522b603a..92c9e6c984 100644
--- a/samplecode/SampleApp.cpp
+++ b/samplecode/SampleApp.cpp
@@ -53,7 +53,12 @@ SkTDArray<char> gTempDataStore;
#endif
#define USE_ARROWS_FOR_ZOOM true
-//#define DEFAULT_TO_GPU
+
+#if SK_ANGLE
+//#define DEFAULT_TO_ANGLE 1
+#else
+//#define DEFAULT_TO_GPU 1
+#endif
extern SkView* create_overview(int, const SkViewFactory*[]);
extern bool is_overview(SkView* view);
@@ -131,113 +136,129 @@ class SampleWindow::DefaultDeviceManager : public SampleWindow::DeviceManager {
public:
DefaultDeviceManager()
-#if SK_ANGLE
- : fUseAltContext(false)
-#endif
- {
- fGrRenderTarget = NULL;
- fGrContext = NULL;
- fGL = NULL;
- fNullGrContext = NULL;
- fNullGrRenderTarget = NULL;
+ : fCurContext(NULL)
+ , fCurIntf(NULL)
+ , fCurRenderTarget(NULL)
+ , fBackend(kNone_BackEndType) {
}
virtual ~DefaultDeviceManager() {
- SkSafeUnref(fGrRenderTarget);
- SkSafeUnref(fGrContext);
- SkSafeUnref(fGL);
- SkSafeUnref(fNullGrContext);
- SkSafeUnref(fNullGrRenderTarget);
+ SkSafeUnref(fCurContext);
+ SkSafeUnref(fCurIntf);
+ SkSafeUnref(fCurRenderTarget);
}
- virtual void init(SampleWindow* win, bool useAltContext) {
-#if SK_ANGLE
- fUseAltContext = useAltContext;
-#endif
- bool result;
+ virtual void setUpBackend(SampleWindow* win) {
+ SkASSERT(kNone_BackEndType == fBackend);
+
+ fBackend = kNone_BackEndType;
+ switch (win->getDeviceType()) {
+ case kRaster_DeviceType:
+ // fallthrough
+ case kPicture_DeviceType:
+ // fallthrough
+ case kGPU_DeviceType:
+ // fallthrough
+ case kNullGPU_DeviceType:
+ // all these guys use the native backend
+ fBackend = kNativeGL_BackEndType;
+ break;
#if SK_ANGLE
- if (useAltContext) {
- result = win->attachANGLE();
- } else
+ case kANGLE_DeviceType:
+ // ANGLE is really the only odd man out
+ fBackend = kANGLE_BackEndType;
+ break;
#endif
- {
- result = win->attachGL();
+ default:
+ SkASSERT(false);
+ break;
}
+
+ bool result = win->attach(fBackend);
if (!result) {
SkDebugf("Failed to initialize GL");
+ return;
}
- if (NULL == fGL) {
+
+ SkASSERT(NULL == fCurIntf);
+ switch (win->getDeviceType()) {
+ case kRaster_DeviceType:
+ // fallthrough
+ case kPicture_DeviceType:
+ // fallthrough
+ case kGPU_DeviceType:
+ // all these guys use the native interface
+ fCurIntf = GrGLCreateNativeInterface();
+ break;
#if SK_ANGLE
- if (useAltContext) {
- fGL = GrGLCreateANGLEInterface();
- } else
+ case kANGLE_DeviceType:
+ fCurIntf = GrGLCreateANGLEInterface();
+ break;
#endif
- {
- fGL = GrGLCreateNativeInterface();
- }
- GrAssert(NULL == fGrContext);
- fGrContext = GrContext::Create(kOpenGL_Shaders_GrEngine,
- (GrPlatform3DContext) fGL);
+ case kNullGPU_DeviceType:
+ fCurIntf = GrGLCreateNullInterface();
+ break;
+ default:
+ SkASSERT(false);
+ break;
}
- if (NULL == fGrContext || NULL == fGL) {
- SkSafeUnref(fGrContext);
- SkSafeUnref(fGL);
+
+ SkASSERT(NULL == fCurContext);
+ fCurContext = GrContext::Create(kOpenGL_Shaders_GrEngine,
+ (GrPlatform3DContext) fCurIntf);
+
+ if (NULL == fCurContext || NULL == fCurIntf) {
+ // We need some context and interface to see results
+ SkSafeUnref(fCurContext);
+ SkSafeUnref(fCurIntf);
SkDebugf("Failed to setup 3D");
-#if SK_ANGLE
- if (useAltContext) {
- win->detachANGLE();
- } else
-#endif
- {
- win->detachGL();
- }
- }
- if (NULL == fNullGrContext) {
- const GrGLInterface* nullGL = GrGLCreateNullInterface();
- fNullGrContext = GrContext::Create(kOpenGL_Shaders_GrEngine,
- (GrPlatform3DContext) nullGL);
- nullGL->unref();
+
+ win->detach();
}
+
+ // call windowSizeChanged to create the render target
+ windowSizeChanged(win);
}
- virtual bool supportsDeviceType(SampleWindow::DeviceType dType) {
- switch (dType) {
- case kRaster_DeviceType:
- case kPicture_DeviceType: // fallthru
- return true;
- case kGPU_DeviceType:
- return NULL != fGrContext && NULL != fGrRenderTarget;
- case kNullGPU_DeviceType:
- return NULL != fNullGrContext && NULL != fNullGrRenderTarget;
- default:
- return false;
- }
+ virtual void tearDownBackend(SampleWindow *win) {
+ win->detach();
+ fBackend = kNone_BackEndType;
+
+ SkSafeUnref(fCurContext);
+ fCurContext = NULL;
+
+ SkSafeUnref(fCurIntf);
+ fCurIntf = NULL;
+
+ SkSafeUnref(fCurRenderTarget);
+ fCurRenderTarget = NULL;
}
virtual bool prepareCanvas(SampleWindow::DeviceType dType,
SkCanvas* canvas,
SampleWindow* win) {
switch (dType) {
- case kGPU_DeviceType:
- if (fGrContext) {
- canvas->setDevice(new SkGpuDevice(fGrContext,
- fGrRenderTarget))->unref();
- } else {
- return false;
- }
+ case kRaster_DeviceType:
+ // fallthrough
+ case kPicture_DeviceType:
+ // fallthrough
+#if SK_ANGLE
+ case kANGLE_DeviceType:
+#endif
break;
+ case kGPU_DeviceType:
case kNullGPU_DeviceType:
- if (fNullGrContext) {
- canvas->setDevice(new SkGpuDevice(fNullGrContext,
- fNullGrRenderTarget))->unref();
+ if (fCurContext) {
+ canvas->setDevice(new SkGpuDevice(fCurContext,
+ fCurRenderTarget))->unref();
} else {
return false;
}
break;
- case kRaster_DeviceType:
- case kPicture_DeviceType:
- break;
+ default:
+ SkASSERT(false);
+ return false;
}
return true;
}
@@ -245,85 +266,55 @@ public:
virtual void publishCanvas(SampleWindow::DeviceType dType,
SkCanvas* canvas,
SampleWindow* win) {
- if (fGrContext) {
+ if (fCurContext) {
// in case we have queued drawing calls
- fGrContext->flush();
- if (NULL != fNullGrContext) {
- fNullGrContext->flush();
- }
- if (dType != kGPU_DeviceType &&
- dType != kNullGPU_DeviceType) {
+ fCurContext->flush();
+
+ if (kGPU_DeviceType != dType && kNullGPU_DeviceType != dType) {
// need to send the raster bits to the (gpu) window
- fGrContext->setRenderTarget(fGrRenderTarget);
+ fCurContext->setRenderTarget(fCurRenderTarget);
const SkBitmap& bm = win->getBitmap();
- fGrRenderTarget->writePixels(0, 0, bm.width(), bm.height(),
+ fCurRenderTarget->writePixels(0, 0, bm.width(), bm.height(),
kSkia8888_PM_GrPixelConfig,
bm.getPixels(),
bm.rowBytes());
}
}
-#if SK_ANGLE
- if (fUseAltContext) {
- win->presentANGLE();
- } else
-#endif
- {
- win->presentGL();
- }
+
+ win->present();
}
virtual void windowSizeChanged(SampleWindow* win) {
- if (fGrContext) {
-#if SK_ANGLE
- if (fUseAltContext) {
- win->attachANGLE();
- } else
-#endif
- {
- win->attachGL();
- }
+
+ if (fCurContext) {
+ win->attach(fBackend);
GrPlatformRenderTargetDesc desc;
desc.fWidth = SkScalarRound(win->width());
desc.fHeight = SkScalarRound(win->height());
desc.fConfig = kSkia8888_PM_GrPixelConfig;
- GR_GL_GetIntegerv(fGL, GR_GL_SAMPLES, &desc.fSampleCnt);
- GR_GL_GetIntegerv(fGL, GR_GL_STENCIL_BITS, &desc.fStencilBits);
+ GR_GL_GetIntegerv(fCurIntf, GR_GL_SAMPLES, &desc.fSampleCnt);
+ GR_GL_GetIntegerv(fCurIntf, GR_GL_STENCIL_BITS, &desc.fStencilBits);
GrGLint buffer;
- GR_GL_GetIntegerv(fGL, GR_GL_FRAMEBUFFER_BINDING, &buffer);
+ GR_GL_GetIntegerv(fCurIntf, GR_GL_FRAMEBUFFER_BINDING, &buffer);
desc.fRenderTargetHandle = buffer;
- SkSafeUnref(fGrRenderTarget);
- fGrRenderTarget = fGrContext->createPlatformRenderTarget(desc);
- }
- if (NULL != fNullGrContext) {
- GrPlatformRenderTargetDesc desc;
- desc.fWidth = SkScalarRound(win->width());
- desc.fHeight = SkScalarRound(win->height());
- desc.fConfig = kSkia8888_PM_GrPixelConfig;
- desc.fStencilBits = 8;
- desc.fSampleCnt = 0;
- desc.fRenderTargetHandle = 0;
- fNullGrRenderTarget = fNullGrContext->createPlatformRenderTarget(desc);
+ SkSafeUnref(fCurRenderTarget);
+ fCurRenderTarget = fCurContext->createPlatformRenderTarget(desc);
}
}
- virtual GrContext* getGrContext(SampleWindow::DeviceType dType) {
- if (kNullGPU_DeviceType == dType) {
- return fNullGrContext;
- } else {
- return fGrContext;
- }
+ virtual GrContext* getGrContext() {
+ return fCurContext;
}
private:
-#if SK_ANGLE
- bool fUseAltContext;
-#endif
- GrContext* fGrContext;
- const GrGLInterface* fGL;
- GrRenderTarget* fGrRenderTarget;
- GrContext* fNullGrContext;
- GrRenderTarget* fNullGrRenderTarget;
+ GrContext* fCurContext;
+ const GrGLInterface* fCurIntf;
+ GrRenderTarget* fCurRenderTarget;
+
+ SkOSWindow::SkBackEndTypes fBackend;
+
+ typedef SampleWindow::DeviceManager INHERITED;
};
///////////////
@@ -644,6 +635,9 @@ static inline SampleWindow::DeviceType cycle_devicetype(SampleWindow::DeviceType
static const SampleWindow::DeviceType gCT[] = {
SampleWindow::kPicture_DeviceType,
SampleWindow::kGPU_DeviceType,
+#if SK_ANGLE
+ SampleWindow::kANGLE_DeviceType,
+#endif
SampleWindow::kRaster_DeviceType, // skip the null gpu device in normal cycling
SampleWindow::kRaster_DeviceType
};
@@ -669,7 +663,6 @@ SampleWindow::SampleWindow(void* hwnd, int argc, char** argv, DeviceManager* dev
const char* resourcePath = NULL;
fCurrIndex = -1;
- bool useAltContext = false;
const char* const commandName = argv[0];
char* const* stop = argv + argc;
@@ -688,12 +681,6 @@ SampleWindow::SampleWindow(void* hwnd, int argc, char** argv, DeviceManager* dev
}
}
}
-#if SK_ANGLE
- else if (strcmp(*argv, "--angle") == 0) {
- argv++;
- useAltContext = true;
- }
-#endif
else {
usage(commandName);
}
@@ -720,11 +707,15 @@ SampleWindow::SampleWindow(void* hwnd, int argc, char** argv, DeviceManager* dev
fPicture = NULL;
-#ifdef DEFAULT_TO_GPU
- fDeviceType = kGPU_DeviceType;
-#else
fDeviceType = kRaster_DeviceType;
+
+#if DEFAULT_TO_GPU
+ fDeviceType = kGPU_DeviceType;
+#endif
+#if SK_ANGLE && DEFAULT_TO_ANGLE
+ fDeviceType = kANGLE_DeviceType;
#endif
+
fUseClip = false;
fNClip = false;
fAnimating = false;
@@ -764,7 +755,11 @@ SampleWindow::SampleWindow(void* hwnd, int argc, char** argv, DeviceManager* dev
int itemID;
itemID =fAppMenu.appendList("Device Type", "Device Type", sinkID, 0,
- "Raster", "Picture", "OpenGL", NULL);
+ "Raster", "Picture", "OpenGL",
+#if SK_ANGLE
+ "ANGLE",
+#endif
+ NULL);
fAppMenu.assignKeyEquivalentToItem(itemID, 'd');
itemID = fAppMenu.appendTriState("AA", "AA", sinkID, fAAState);
fAppMenu.assignKeyEquivalentToItem(itemID, 'b');
@@ -825,7 +820,7 @@ SampleWindow::SampleWindow(void* hwnd, int argc, char** argv, DeviceManager* dev
devManager->ref();
fDevManager = devManager;
}
- fDevManager->init(this, useAltContext);
+ fDevManager->setUpBackend(this);
// If another constructor set our dimensions, ensure that our
// onSizeChange gets called.
@@ -1133,7 +1128,12 @@ SkCanvas* SampleWindow::beforeChildren(SkCanvas* canvas) {
} else {
switch (fDeviceType) {
case kRaster_DeviceType:
+ // fallthrough
case kGPU_DeviceType:
+ // fallthrough
+#if SK_ANGLE
+ case kANGLE_DeviceType:
+#endif
canvas = this->INHERITED::beforeChildren(canvas);
break;
case kPicture_DeviceType:
@@ -1142,6 +1142,9 @@ SkCanvas* SampleWindow::beforeChildren(SkCanvas* canvas) {
break;
case kNullGPU_DeviceType:
break;
+ default:
+ SkASSERT(false);
+ break;
}
}
@@ -1628,11 +1631,9 @@ bool SampleWindow::onHandleChar(SkUnichar uni) {
this->updateTitle();
return true;
case '\\':
- if (fDevManager->supportsDeviceType(kNullGPU_DeviceType)) {
- fDeviceType= kNullGPU_DeviceType;
- this->inval(NULL);
- this->updateTitle();
- }
+ this->setDeviceType(kNullGPU_DeviceType);
+ this->inval(NULL);
+ this->updateTitle();
return true;
case 'p':
{
@@ -1663,8 +1664,15 @@ bool SampleWindow::onHandleChar(SkUnichar uni) {
}
void SampleWindow::setDeviceType(DeviceType type) {
- if (type != fDeviceType && fDevManager->supportsDeviceType(fDeviceType))
- fDeviceType = type;
+ if (type == fDeviceType)
+ return;
+
+ fDevManager->tearDownBackend(this);
+
+ fDeviceType = type;
+
+ fDevManager->setUpBackend(this);
+
this->updateTitle();
this->inval(NULL);
}
@@ -1676,11 +1684,7 @@ void SampleWindow::toggleSlideshow() {
}
void SampleWindow::toggleRendering() {
- DeviceType origDevType = fDeviceType;
- do {
- fDeviceType = cycle_devicetype(fDeviceType);
- } while (origDevType != fDeviceType &&
- !fDevManager->supportsDeviceType(fDeviceType));
+ this->setDeviceType(cycle_devicetype(fDeviceType));
this->updateTitle();
this->inval(NULL);
}
@@ -1857,6 +1861,9 @@ static const char* gDeviceTypePrefix[] = {
"raster: ",
"picture: ",
"opengl: ",
+#if SK_ANGLE
+ "angle: ",
+#endif
"null-gl: "
};