| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 #include "gl/SkGLContext.h" | 9 #include "gl/SkGLContext.h" |
| 10 | 10 |
| 11 #include <windows.h> | 11 #include <windows.h> |
| 12 #include <GL/GL.h> | 12 #include <GL/GL.h> |
| 13 #include "win/SkWGL.h" | 13 #include "win/SkWGL.h" |
| 14 | 14 |
| 15 #define WIN32_LEAN_AND_MEAN | 15 #define WIN32_LEAN_AND_MEAN |
| 16 #include <windows.h> | 16 #include <windows.h> |
| 17 | 17 |
| 18 namespace { | 18 namespace { |
| 19 | 19 |
| 20 class WinGLContext : public SkGLContext { | 20 class WinGLContext : public SkGLContext { |
| 21 public: | 21 public: |
| 22 WinGLContext(GrGLStandard forcedGpuAPI); | 22 WinGLContext(GrGLStandard forcedGpuAPI); |
| 23 ~WinGLContext() override; | 23 ~WinGLContext() override; |
| 24 void makeCurrent() const override; | |
| 25 void swapBuffers() const override; | |
| 26 | 24 |
| 27 private: | 25 private: |
| 28 void destroyGLContext(); | 26 void destroyGLContext(); |
| 29 | 27 |
| 28 void onPlatformMakeCurrent() const override; |
| 29 void onPlatformSwapBuffers() const override; |
| 30 GrGLFuncPtr onPlatformGetProcAddress(const char* name) const override; |
| 31 |
| 30 HWND fWindow; | 32 HWND fWindow; |
| 31 HDC fDeviceContext; | 33 HDC fDeviceContext; |
| 32 HGLRC fGlRenderContext; | 34 HGLRC fGlRenderContext; |
| 33 static ATOM gWC; | 35 static ATOM gWC; |
| 34 SkWGLPbufferContext* fPbufferContext; | 36 SkWGLPbufferContext* fPbufferContext; |
| 35 }; | 37 }; |
| 36 | 38 |
| 37 ATOM WinGLContext::gWC = 0; | 39 ATOM WinGLContext::gWC = 0; |
| 38 | 40 |
| 39 WinGLContext::WinGLContext(GrGLStandard forcedGpuAPI) | 41 WinGLContext::WinGLContext(GrGLStandard forcedGpuAPI) |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 106 dc = fPbufferContext->getDC(); | 108 dc = fPbufferContext->getDC(); |
| 107 glrc = fPbufferContext->getGLRC(); | 109 glrc = fPbufferContext->getGLRC(); |
| 108 } | 110 } |
| 109 | 111 |
| 110 if (!(wglMakeCurrent(dc, glrc))) { | 112 if (!(wglMakeCurrent(dc, glrc))) { |
| 111 SkDebugf("Could not set the context.\n"); | 113 SkDebugf("Could not set the context.\n"); |
| 112 this->destroyGLContext(); | 114 this->destroyGLContext(); |
| 113 return; | 115 return; |
| 114 } | 116 } |
| 115 | 117 |
| 116 fGL.reset(GrGLCreateNativeInterface()); | 118 SkAutoTUnref<const GrGLInterface> gl(GrGLCreateNativeInterface()); |
| 117 if (NULL == fGL.get()) { | 119 if (NULL == gl.get()) { |
| 118 SkDebugf("Could not create GL interface.\n"); | 120 SkDebugf("Could not create GL interface.\n"); |
| 119 this->destroyGLContext(); | 121 this->destroyGLContext(); |
| 120 return; | 122 return; |
| 121 } | 123 } |
| 122 if (!fGL->validate()) { | 124 if (!gl->validate()) { |
| 123 SkDebugf("Could not validate GL interface.\n"); | 125 SkDebugf("Could not validate GL interface.\n"); |
| 124 this->destroyGLContext(); | 126 this->destroyGLContext(); |
| 125 return; | 127 return; |
| 126 } | 128 } |
| 129 |
| 130 this->init(gl.detach()); |
| 127 } | 131 } |
| 128 | 132 |
| 129 WinGLContext::~WinGLContext() { | 133 WinGLContext::~WinGLContext() { |
| 134 this->teardown(); |
| 130 this->destroyGLContext(); | 135 this->destroyGLContext(); |
| 131 } | 136 } |
| 132 | 137 |
| 133 void WinGLContext::destroyGLContext() { | 138 void WinGLContext::destroyGLContext() { |
| 134 fGL.reset(NULL); | |
| 135 SkSafeSetNull(fPbufferContext); | 139 SkSafeSetNull(fPbufferContext); |
| 136 if (fGlRenderContext) { | 140 if (fGlRenderContext) { |
| 137 wglDeleteContext(fGlRenderContext); | 141 wglDeleteContext(fGlRenderContext); |
| 138 fGlRenderContext = 0; | 142 fGlRenderContext = 0; |
| 139 } | 143 } |
| 140 if (fWindow && fDeviceContext) { | 144 if (fWindow && fDeviceContext) { |
| 141 ReleaseDC(fWindow, fDeviceContext); | 145 ReleaseDC(fWindow, fDeviceContext); |
| 142 fDeviceContext = 0; | 146 fDeviceContext = 0; |
| 143 } | 147 } |
| 144 if (fWindow) { | 148 if (fWindow) { |
| 145 DestroyWindow(fWindow); | 149 DestroyWindow(fWindow); |
| 146 fWindow = 0; | 150 fWindow = 0; |
| 147 } | 151 } |
| 148 } | 152 } |
| 149 | 153 |
| 150 void WinGLContext::makeCurrent() const { | 154 void WinGLContext::onPlatformMakeCurrent() const { |
| 151 HDC dc; | 155 HDC dc; |
| 152 HGLRC glrc; | 156 HGLRC glrc; |
| 153 | 157 |
| 154 if (NULL == fPbufferContext) { | 158 if (NULL == fPbufferContext) { |
| 155 dc = fDeviceContext; | 159 dc = fDeviceContext; |
| 156 glrc = fGlRenderContext; | 160 glrc = fGlRenderContext; |
| 157 } else { | 161 } else { |
| 158 dc = fPbufferContext->getDC(); | 162 dc = fPbufferContext->getDC(); |
| 159 glrc = fPbufferContext->getGLRC(); | 163 glrc = fPbufferContext->getGLRC(); |
| 160 } | 164 } |
| 161 | 165 |
| 162 if (!wglMakeCurrent(dc, glrc)) { | 166 if (!wglMakeCurrent(dc, glrc)) { |
| 163 SkDebugf("Could not create rendering context.\n"); | 167 SkDebugf("Could not create rendering context.\n"); |
| 164 } | 168 } |
| 165 } | 169 } |
| 166 | 170 |
| 167 void WinGLContext::swapBuffers() const { | 171 void WinGLContext::onPlatformSwapBuffers() const { |
| 168 HDC dc; | 172 HDC dc; |
| 169 | 173 |
| 170 if (NULL == fPbufferContext) { | 174 if (NULL == fPbufferContext) { |
| 171 dc = fDeviceContext; | 175 dc = fDeviceContext; |
| 172 } else { | 176 } else { |
| 173 dc = fPbufferContext->getDC(); | 177 dc = fPbufferContext->getDC(); |
| 174 } | 178 } |
| 175 if (!SwapBuffers(dc)) { | 179 if (!SwapBuffers(dc)) { |
| 176 SkDebugf("Could not complete SwapBuffers.\n"); | 180 SkDebugf("Could not complete SwapBuffers.\n"); |
| 177 } | 181 } |
| 178 } | 182 } |
| 179 | 183 |
| 184 GrGLFuncPtr WinGLContext::onPlatformGetProcAddress(const char* name) const { |
| 185 return reinterpret_cast<GrGLFuncPtr>(wglGetProcAddress(name)); |
| 186 } |
| 187 |
| 180 } // anonymous namespace | 188 } // anonymous namespace |
| 181 | 189 |
| 182 SkGLContext* SkCreatePlatformGLContext(GrGLStandard forcedGpuAPI) { | 190 SkGLContext* SkCreatePlatformGLContext(GrGLStandard forcedGpuAPI) { |
| 183 WinGLContext* ctx = SkNEW_ARGS(WinGLContext, (forcedGpuAPI)); | 191 WinGLContext* ctx = SkNEW_ARGS(WinGLContext, (forcedGpuAPI)); |
| 184 if (!ctx->isValid()) { | 192 if (!ctx->isValid()) { |
| 185 SkDELETE(ctx); | 193 SkDELETE(ctx); |
| 186 return NULL; | 194 return NULL; |
| 187 } | 195 } |
| 188 return ctx; | 196 return ctx; |
| 189 } | 197 } |
| 190 | 198 |
| OLD | NEW |