| 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
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ab66ba4d55ce3e61a715692e015d3453ca5e0909
|
| --- /dev/null
|
| +++ b/src/gpu/gl/win/SkNativeGLContext_win.cpp
|
| @@ -0,0 +1,165 @@
|
| +
|
| +/*
|
| + * Copyright 2011 Google Inc.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +
|
| +#include "gl/SkNativeGLContext.h"
|
| +
|
| +#define WIN32_LEAN_AND_MEAN
|
| +#include <windows.h>
|
| +
|
| +SkNativeGLContext::AutoContextRestore::AutoContextRestore() {
|
| + fOldHGLRC = wglGetCurrentContext();
|
| + fOldHDC = wglGetCurrentDC();
|
| +}
|
| +
|
| +SkNativeGLContext::AutoContextRestore::~AutoContextRestore() {
|
| + wglMakeCurrent(fOldHDC, fOldHGLRC);
|
| +}
|
| +
|
| +///////////////////////////////////////////////////////////////////////////////
|
| +
|
| +ATOM SkNativeGLContext::gWC = 0;
|
| +
|
| +SkNativeGLContext::SkNativeGLContext()
|
| + : fWindow(NULL)
|
| + , fDeviceContext(NULL)
|
| + , fGlRenderContext(0)
|
| + , fPbufferContext(NULL) {
|
| +}
|
| +
|
| +SkNativeGLContext::~SkNativeGLContext() {
|
| + this->destroyGLContext();
|
| +}
|
| +
|
| +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;
|
| + }
|
| +}
|
| +
|
| +const GrGLInterface* SkNativeGLContext::createGLContext(GrGLStandard forcedGpuAPI) {
|
| + HINSTANCE hInstance = (HINSTANCE)GetModuleHandle(NULL);
|
| +
|
| + if (!gWC) {
|
| + WNDCLASS wc;
|
| + wc.cbClsExtra = 0;
|
| + wc.cbWndExtra = 0;
|
| + wc.hbrBackground = NULL;
|
| + wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
| + wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
|
| + wc.hInstance = hInstance;
|
| + wc.lpfnWndProc = (WNDPROC) DefWindowProc;
|
| + wc.lpszClassName = TEXT("Griffin");
|
| + wc.lpszMenuName = NULL;
|
| + wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
|
| +
|
| + gWC = RegisterClass(&wc);
|
| + if (!gWC) {
|
| + SkDebugf("Could not register window class.\n");
|
| + return NULL;
|
| + }
|
| + }
|
| +
|
| + if (!(fWindow = CreateWindow(TEXT("Griffin"),
|
| + TEXT("The Invisible Man"),
|
| + WS_OVERLAPPEDWINDOW,
|
| + 0, 0, 1, 1,
|
| + NULL, NULL,
|
| + hInstance, NULL))) {
|
| + SkDebugf("Could not create window.\n");
|
| + return NULL;
|
| + }
|
| +
|
| + if (!(fDeviceContext = GetDC(fWindow))) {
|
| + SkDebugf("Could not get device context.\n");
|
| + this->destroyGLContext();
|
| + return NULL;
|
| + }
|
| + // Requesting a Core profile would bar us from using NVPR. So we request
|
| + // compatibility profile or GL ES.
|
| + SkWGLContextRequest contextType =
|
| + kGLES_GrGLStandard == forcedGpuAPI ?
|
| + kGLES_SkWGLContextRequest : kGLPreferCompatibilityProfile_SkWGLContextRequest;
|
| +
|
| + 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(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");
|
| + this->destroyGLContext();
|
| + return NULL;
|
| + }
|
| +
|
| + return interface;
|
| +}
|
| +
|
| +void SkNativeGLContext::makeCurrent() const {
|
| + 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 {
|
| + HDC dc;
|
| +
|
| + if (NULL == fPbufferContext) {
|
| + dc = fDeviceContext;
|
| + } else {
|
| + dc = fPbufferContext->getDC();
|
| + }
|
| + if (!SwapBuffers(dc)) {
|
| + SkDebugf("Could not complete SwapBuffers.\n");
|
| + }
|
| +}
|
|
|