| Index: experimental/SkV8Example/SkV8Example.cpp
|
| diff --git a/experimental/SkV8Example/SkV8Example.cpp b/experimental/SkV8Example/SkV8Example.cpp
|
| index 7dc7db0b4e309e5132edcedd146aaef3374df5c9..6eb8d89e047fa403dfdbac9a28d839595034175f 100644
|
| --- a/experimental/SkV8Example/SkV8Example.cpp
|
| +++ b/experimental/SkV8Example/SkV8Example.cpp
|
| @@ -18,6 +18,8 @@ using namespace v8;
|
| #include "gl/GrGLUtil.h"
|
| #include "gl/GrGLDefines.h"
|
| #include "gl/GrGLInterface.h"
|
| +#include "GrRenderTarget.h"
|
| +#include "GrContext.h"
|
| #include "SkApplication.h"
|
| #include "SkCommandLineFlags.h"
|
| #include "SkData.h"
|
| @@ -28,6 +30,7 @@ using namespace v8;
|
|
|
|
|
| DEFINE_string2(infile, i, NULL, "Name of file to load JS from.\n");
|
| +DEFINE_bool(gpu, true, "Use the GPU for rendering.");
|
|
|
| void application_init() {
|
| SkGraphics::Init();
|
| @@ -39,14 +42,78 @@ void application_term() {
|
| SkGraphics::Term();
|
| }
|
|
|
| -
|
| SkV8ExampleWindow::SkV8ExampleWindow(void* hwnd, JsContext* context)
|
| : INHERITED(hwnd)
|
| , fJsContext(context)
|
| +#if SK_SUPPORT_GPU
|
| + , fCurContext(NULL)
|
| + , fCurIntf(NULL)
|
| + , fCurRenderTarget(NULL)
|
| +#endif
|
| {
|
| this->setConfig(SkBitmap::kARGB_8888_Config);
|
| this->setVisibleP(true);
|
| this->setClipToBounds(false);
|
| +
|
| +#if SK_SUPPORT_GPU
|
| + this->windowSizeChanged();
|
| +#endif
|
| +}
|
| +
|
| +#if SK_SUPPORT_GPU
|
| +void SkV8ExampleWindow::windowSizeChanged() {
|
| + if (FLAGS_gpu) {
|
| + SkOSWindow::AttachmentInfo attachmentInfo;
|
| + bool result = this->attach(
|
| + SkOSWindow::kNativeGL_BackEndType, 0, &attachmentInfo);
|
| + if (!result) {
|
| + printf("Failed to attach.");
|
| + exit(1);
|
| + }
|
| +
|
| + fCurIntf = GrGLCreateNativeInterface();
|
| + fCurContext = GrContext::Create(
|
| + kOpenGL_GrBackend, (GrBackendContext) fCurIntf);
|
| + if (NULL == fCurIntf || NULL == fCurContext) {
|
| + printf("Failed to initialize GL.");
|
| + exit(1);
|
| + }
|
| +
|
| + GrBackendRenderTargetDesc desc;
|
| + desc.fWidth = SkScalarRoundToInt(this->width());
|
| + desc.fHeight = SkScalarRoundToInt(this->height());
|
| + desc.fConfig = kSkia8888_GrPixelConfig;
|
| + desc.fOrigin = kBottomLeft_GrSurfaceOrigin;
|
| + desc.fSampleCnt = attachmentInfo.fSampleCount;
|
| + desc.fStencilBits = attachmentInfo.fStencilBits;
|
| + GrGLint buffer;
|
| + GR_GL_GetIntegerv(fCurIntf, GR_GL_FRAMEBUFFER_BINDING, &buffer);
|
| + desc.fRenderTargetHandle = buffer;
|
| +
|
| + SkSafeUnref(fCurRenderTarget);
|
| + fCurRenderTarget = fCurContext->wrapBackendRenderTarget(desc);
|
| + }
|
| +}
|
| +#endif
|
| +
|
| +#if SK_SUPPORT_GPU
|
| +SkCanvas* SkV8ExampleWindow::createCanvas() {
|
| + if (FLAGS_gpu) {
|
| + SkAutoTUnref<SkBaseDevice> device(
|
| + new SkGpuDevice(fCurContext, fCurRenderTarget));
|
| + return new SkCanvas(device);
|
| + } else {
|
| + return this->INHERITED::createCanvas();
|
| + }
|
| +}
|
| +#endif
|
| +
|
| +void SkV8ExampleWindow::onSizeChange() {
|
| + this->INHERITED::onSizeChange();
|
| +
|
| +#if SK_SUPPORT_GPU
|
| + this->windowSizeChanged();
|
| +#endif
|
| }
|
|
|
| void SkV8ExampleWindow::onDraw(SkCanvas* canvas) {
|
| @@ -59,9 +126,15 @@ void SkV8ExampleWindow::onDraw(SkCanvas* canvas) {
|
|
|
| canvas->restore();
|
|
|
| - INHERITED::onDraw(canvas);
|
| -}
|
| + this->INHERITED::onDraw(canvas);
|
|
|
| +#if SK_SUPPORT_GPU
|
| + if (FLAGS_gpu) {
|
| + fCurContext->flush();
|
| + this->present();
|
| + }
|
| +#endif
|
| +}
|
|
|
| #ifdef SK_BUILD_FOR_WIN
|
| void SkV8ExampleWindow::onHandleInval(const SkIRect& rect) {
|
| @@ -114,5 +187,6 @@ SkOSWindow* create_sk_window(void* hwnd, int argc, char** argv) {
|
| }
|
| SkV8ExampleWindow* win = new SkV8ExampleWindow(hwnd, jsContext);
|
| global->setWindow(win);
|
| +
|
| return win;
|
| }
|
|
|