| Index: src/gpu/gl/win/SkNativeGLContext_win.cpp
|
| diff --git a/src/gpu/gl/win/SkNativeGLContext_win.cpp b/src/gpu/gl/win/SkNativeGLContext_win.cpp
|
| index f085fdc6eedef859328fb983a756c8821ec5d851..ab66ba4d55ce3e61a715692e015d3453ca5e0909 100644
|
| --- a/src/gpu/gl/win/SkNativeGLContext_win.cpp
|
| +++ b/src/gpu/gl/win/SkNativeGLContext_win.cpp
|
| @@ -7,7 +7,6 @@
|
| */
|
|
|
| #include "gl/SkNativeGLContext.h"
|
| -#include "SkWGL.h"
|
|
|
| #define WIN32_LEAN_AND_MEAN
|
| #include <windows.h>
|
| @@ -28,7 +27,8 @@ ATOM SkNativeGLContext::gWC = 0;
|
| SkNativeGLContext::SkNativeGLContext()
|
| : fWindow(NULL)
|
| , fDeviceContext(NULL)
|
| - , fGlRenderContext(0) {
|
| + , fGlRenderContext(0)
|
| + , fPbufferContext(NULL) {
|
| }
|
|
|
| SkNativeGLContext::~SkNativeGLContext() {
|
| @@ -36,14 +36,18 @@ SkNativeGLContext::~SkNativeGLContext() {
|
| }
|
|
|
| void SkNativeGLContext::destroyGLContext() {
|
| + SkSafeSetNull(fPbufferContext);
|
| if (fGlRenderContext) {
|
| wglDeleteContext(fGlRenderContext);
|
| + fGlRenderContext = 0;
|
| }
|
| if (fWindow && fDeviceContext) {
|
| ReleaseDC(fWindow, fDeviceContext);
|
| + fDeviceContext = 0;
|
| }
|
| if (fWindow) {
|
| DestroyWindow(fWindow);
|
| + fWindow = 0;
|
| }
|
| }
|
|
|
| @@ -91,17 +95,35 @@ const GrGLInterface* SkNativeGLContext::createGLContext(GrGLStandard forcedGpuAP
|
| kGLES_GrGLStandard == forcedGpuAPI ?
|
| kGLES_SkWGLContextRequest : kGLPreferCompatibilityProfile_SkWGLContextRequest;
|
|
|
| - if (!(fGlRenderContext = SkCreateWGLContext(fDeviceContext, 0, contextType))) {
|
| - SkDebugf("Could not create rendering context.\n");
|
| - this->destroyGLContext();
|
| - return NULL;
|
| + fPbufferContext = SkWGLPbufferContext::Create(fDeviceContext, 0, contextType);
|
| +
|
| + HDC dc;
|
| + HGLRC glrc;
|
| +
|
| + if (NULL == fPbufferContext) {
|
| + if (!(fGlRenderContext = SkCreateWGLContext(fDeviceContext, 0, contextType))) {
|
| + SkDebugf("Could not create rendering context.\n");
|
| + this->destroyGLContext();
|
| + return NULL;
|
| + }
|
| + dc = fDeviceContext;
|
| + glrc = fGlRenderContext;
|
| + } else {
|
| + ReleaseDC(fWindow, fDeviceContext);
|
| + fDeviceContext = 0;
|
| + DestroyWindow(fWindow);
|
| + fWindow = 0;
|
| +
|
| + dc = fPbufferContext->getDC();
|
| + glrc = fPbufferContext->getGLRC();
|
| }
|
|
|
| - if (!(wglMakeCurrent(fDeviceContext, fGlRenderContext))) {
|
| + if (!(wglMakeCurrent(dc, glrc))) {
|
| SkDebugf("Could not set the context.\n");
|
| this->destroyGLContext();
|
| return NULL;
|
| }
|
| +
|
| const GrGLInterface* interface = GrGLCreateNativeInterface();
|
| if (NULL == interface) {
|
| SkDebugf("Could not create GL interface.\n");
|
| @@ -113,13 +135,31 @@ const GrGLInterface* SkNativeGLContext::createGLContext(GrGLStandard forcedGpuAP
|
| }
|
|
|
| void SkNativeGLContext::makeCurrent() const {
|
| - if (!wglMakeCurrent(fDeviceContext, fGlRenderContext)) {
|
| + HDC dc;
|
| + HGLRC glrc;
|
| +
|
| + if (NULL == fPbufferContext) {
|
| + dc = fDeviceContext;
|
| + glrc = fGlRenderContext;
|
| + } else {
|
| + dc = fPbufferContext->getDC();
|
| + glrc = fPbufferContext->getGLRC();
|
| + }
|
| +
|
| + if (!wglMakeCurrent(dc, glrc)) {
|
| SkDebugf("Could not create rendering context.\n");
|
| }
|
| }
|
|
|
| void SkNativeGLContext::swapBuffers() const {
|
| - if (!SwapBuffers(fDeviceContext)) {
|
| + HDC dc;
|
| +
|
| + if (NULL == fPbufferContext) {
|
| + dc = fDeviceContext;
|
| + } else {
|
| + dc = fPbufferContext->getDC();
|
| + }
|
| + if (!SwapBuffers(dc)) {
|
| SkDebugf("Could not complete SwapBuffers.\n");
|
| }
|
| }
|
|
|