aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools/sk_app/GLWindowContext.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/sk_app/GLWindowContext.cpp')
-rw-r--r--tools/sk_app/GLWindowContext.cpp108
1 files changed, 108 insertions, 0 deletions
diff --git a/tools/sk_app/GLWindowContext.cpp b/tools/sk_app/GLWindowContext.cpp
new file mode 100644
index 0000000000..bdfa12a8ec
--- /dev/null
+++ b/tools/sk_app/GLWindowContext.cpp
@@ -0,0 +1,108 @@
+
+/*
+ * Copyright 2015 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "GrBackendSurface.h"
+#include "GrContext.h"
+#include "GLWindowContext.h"
+
+#include "gl/GrGLDefines.h"
+#include "gl/GrGLUtil.h"
+
+#include "SkCanvas.h"
+#include "SkImage_Base.h"
+#include "SkMathPriv.h"
+#include "SkSurface.h"
+
+namespace sk_app {
+
+GLWindowContext::GLWindowContext(const DisplayParams& params)
+ : WindowContext(params)
+ , fBackendContext(nullptr)
+ , fSurface(nullptr) {
+ fDisplayParams.fMSAASampleCount = fDisplayParams.fMSAASampleCount ?
+ GrNextPow2(fDisplayParams.fMSAASampleCount) :
+ 0;
+}
+
+void GLWindowContext::initializeContext() {
+ SkASSERT(!fContext);
+
+ fBackendContext = this->onInitializeContext();
+ fContext = GrContext::MakeGL(fBackendContext.get(), fDisplayParams.fGrContextOptions);
+ if (!fContext && fDisplayParams.fMSAASampleCount) {
+ fDisplayParams.fMSAASampleCount /= 2;
+ this->initializeContext();
+ return;
+ }
+
+ if (fContext) {
+ // We may not have real sRGB support (ANGLE, in particular), so check for
+ // that, and fall back to L32:
+ fPixelConfig = fContext->caps()->srgbSupport() && fDisplayParams.fColorSpace
+ ? kSRGBA_8888_GrPixelConfig : kRGBA_8888_GrPixelConfig;
+ } else {
+ fPixelConfig = kUnknown_GrPixelConfig;
+ }
+}
+
+void GLWindowContext::destroyContext() {
+ fSurface.reset(nullptr);
+
+ if (fContext) {
+ // in case we have outstanding refs to this guy (lua?)
+ fContext->abandonContext();
+ fContext.reset();
+ }
+
+ fBackendContext.reset(nullptr);
+
+ this->onDestroyContext();
+}
+
+sk_sp<SkSurface> GLWindowContext::getBackbufferSurface() {
+ if (nullptr == fSurface) {
+ if (fContext) {
+ GrGLFramebufferInfo fbInfo;
+ GrGLint buffer;
+ GR_GL_CALL(fBackendContext.get(), GetIntegerv(GR_GL_FRAMEBUFFER_BINDING,
+ &buffer));
+ fbInfo.fFBOID = buffer;
+
+ GrBackendRenderTarget backendRT(fWidth,
+ fHeight,
+ fSampleCount,
+ fStencilBits,
+ fPixelConfig,
+ fbInfo);
+
+ fSurface = SkSurface::MakeFromBackendRenderTarget(fContext.get(), backendRT,
+ kBottomLeft_GrSurfaceOrigin,
+ fDisplayParams.fColorSpace,
+ &fSurfaceProps);
+ }
+ }
+
+ return fSurface;
+}
+
+void GLWindowContext::swapBuffers() {
+ this->onSwapBuffers();
+}
+
+void GLWindowContext::resize(int w, int h) {
+ this->destroyContext();
+ this->initializeContext();
+}
+
+void GLWindowContext::setDisplayParams(const DisplayParams& params) {
+ this->destroyContext();
+ fDisplayParams = params;
+ this->initializeContext();
+}
+
+} //namespace sk_app