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; |
} |