Home | History | Annotate | Download | only in win
      1 
      2 /*
      3  * Copyright 2011 Google Inc.
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 
      9 #include "gl/SkNativeGLContext.h"
     10 
     11 #define WIN32_LEAN_AND_MEAN
     12 #include <Windows.h>
     13 
     14 SkNativeGLContext::AutoContextRestore::AutoContextRestore() {
     15     fOldHGLRC = wglGetCurrentContext();
     16     fOldHDC = wglGetCurrentDC();
     17 }
     18 
     19 SkNativeGLContext::AutoContextRestore::~AutoContextRestore() {
     20     wglMakeCurrent(fOldHDC, fOldHGLRC);
     21 }
     22 
     23 ///////////////////////////////////////////////////////////////////////////////
     24 
     25 ATOM SkNativeGLContext::gWC = 0;
     26 
     27 SkNativeGLContext::SkNativeGLContext()
     28     : fWindow(NULL)
     29     , fDeviceContext(NULL)
     30     , fGlRenderContext(0) {
     31 }
     32 
     33 SkNativeGLContext::~SkNativeGLContext() {
     34     this->destroyGLContext();
     35 }
     36 
     37 void SkNativeGLContext::destroyGLContext() {
     38     if (fGlRenderContext) {
     39         wglDeleteContext(fGlRenderContext);
     40     }
     41     if (fWindow && fDeviceContext) {
     42         ReleaseDC(fWindow, fDeviceContext);
     43     }
     44     if (fWindow) {
     45         DestroyWindow(fWindow);
     46     }
     47 }
     48 
     49 const GrGLInterface* SkNativeGLContext::createGLContext() {
     50     HINSTANCE hInstance = (HINSTANCE)GetModuleHandle(NULL);
     51 
     52     if (!gWC) {
     53         WNDCLASS wc;
     54         wc.cbClsExtra = 0;
     55         wc.cbWndExtra = 0;
     56         wc.hbrBackground = NULL;
     57         wc.hCursor = LoadCursor(NULL, IDC_ARROW);
     58         wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
     59         wc.hInstance = hInstance;
     60         wc.lpfnWndProc = (WNDPROC) DefWindowProc;
     61         wc.lpszClassName = TEXT("Griffin");
     62         wc.lpszMenuName = NULL;
     63         wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
     64 
     65         gWC = RegisterClass(&wc);
     66         if (!gWC) {
     67             SkDebugf("Could not register window class.\n");
     68             return NULL;
     69         }
     70     }
     71 
     72     if (!(fWindow = CreateWindow(TEXT("Griffin"),
     73                                  TEXT("The Invisible Man"),
     74                                  WS_OVERLAPPEDWINDOW,
     75                                  0, 0, 1, 1,
     76                                  NULL, NULL,
     77                                  hInstance, NULL))) {
     78         SkDebugf("Could not create window.\n");
     79         return NULL;
     80     }
     81 
     82     if (!(fDeviceContext = GetDC(fWindow))) {
     83         SkDebugf("Could not get device context.\n");
     84         this->destroyGLContext();
     85         return NULL;
     86     }
     87 
     88     PIXELFORMATDESCRIPTOR pfd;
     89     ZeroMemory(&pfd, sizeof(pfd));
     90     pfd.nSize = sizeof(pfd);
     91     pfd.nVersion = 1;
     92     pfd.dwFlags = PFD_SUPPORT_OPENGL;
     93     pfd.iPixelType = PFD_TYPE_RGBA;
     94     pfd.cColorBits = 32;
     95     pfd.cDepthBits = 0;
     96     pfd.cStencilBits = 0;
     97     pfd.iLayerType = PFD_MAIN_PLANE;
     98 
     99     int pixelFormat = 0;
    100     if (!(pixelFormat = ChoosePixelFormat(fDeviceContext, &pfd))) {
    101         SkDebugf("No matching pixel format descriptor.\n");
    102         this->destroyGLContext();
    103         return NULL;
    104     }
    105 
    106     if (!SetPixelFormat(fDeviceContext, pixelFormat, &pfd)) {
    107         SkDebugf("Could not set the pixel format %d.\n", pixelFormat);
    108         this->destroyGLContext();
    109         return NULL;
    110     }
    111 
    112     if (!(fGlRenderContext = wglCreateContext(fDeviceContext))) {
    113         SkDebugf("Could not create rendering context.\n");
    114         this->destroyGLContext();
    115         return NULL;
    116     }
    117 
    118     if (!(wglMakeCurrent(fDeviceContext, fGlRenderContext))) {
    119         SkDebugf("Could not set the context.\n");
    120         this->destroyGLContext();
    121         return NULL;
    122     }
    123     const GrGLInterface* interface = GrGLCreateNativeInterface();
    124     if (NULL == interface) {
    125         SkDebugf("Could not create GL interface.\n");
    126         this->destroyGLContext();
    127         return NULL;
    128     }
    129 
    130     return interface;
    131 }
    132 
    133 void SkNativeGLContext::makeCurrent() const {
    134     if (!wglMakeCurrent(fDeviceContext, fGlRenderContext)) {
    135         SkDebugf("Could not create rendering context.\n");
    136     }
    137 }
    138