Index: src/gpu/gl/win/SkCreatePlatformGLContext_win.cpp |
diff --git a/src/gpu/gl/win/SkCreatePlatformGLContext_win.cpp b/src/gpu/gl/win/SkCreatePlatformGLContext_win.cpp |
index d362556a4e96271e4846f560785bd0acc4173c5c..b53d46ced3fc9d8228d43a090f48d116c4a458b9 100644 |
--- a/src/gpu/gl/win/SkCreatePlatformGLContext_win.cpp |
+++ b/src/gpu/gl/win/SkCreatePlatformGLContext_win.cpp |
@@ -19,17 +19,14 @@ namespace { |
class WinGLContext : public SkGLContext { |
public: |
- WinGLContext(); |
- |
- virtual ~WinGLContext(); |
- |
+ WinGLContext(GrGLStandard forcedGpuAPI); |
+ virtual ~WinGLContext() SK_OVERRIDE; |
virtual void makeCurrent() const SK_OVERRIDE; |
virtual void swapBuffers() const SK_OVERRIDE; |
-protected: |
- virtual const GrGLInterface* createGLContext(GrGLStandard forcedGpuAPI) SK_OVERRIDE; |
- virtual void destroyGLContext() SK_OVERRIDE; |
private: |
+ void destroyGLContext(); |
+ |
HWND fWindow; |
HDC fDeviceContext; |
HGLRC fGlRenderContext; |
@@ -39,34 +36,11 @@ private: |
ATOM WinGLContext::gWC = 0; |
-WinGLContext::WinGLContext() |
+WinGLContext::WinGLContext(GrGLStandard forcedGpuAPI) |
: fWindow(NULL) |
, fDeviceContext(NULL) |
, fGlRenderContext(0) |
, fPbufferContext(NULL) { |
-} |
- |
-WinGLContext::~WinGLContext() { |
- this->destroyGLContext(); |
-} |
- |
-void WinGLContext::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* WinGLContext::createGLContext(GrGLStandard forcedGpuAPI) { |
HINSTANCE hInstance = (HINSTANCE)GetModuleHandle(NULL); |
if (!gWC) { |
@@ -85,7 +59,7 @@ const GrGLInterface* WinGLContext::createGLContext(GrGLStandard forcedGpuAPI) { |
gWC = RegisterClass(&wc); |
if (!gWC) { |
SkDebugf("Could not register window class.\n"); |
- return NULL; |
+ return; |
} |
} |
@@ -96,13 +70,13 @@ const GrGLInterface* WinGLContext::createGLContext(GrGLStandard forcedGpuAPI) { |
NULL, NULL, |
hInstance, NULL))) { |
SkDebugf("Could not create window.\n"); |
- return NULL; |
+ return; |
} |
if (!(fDeviceContext = GetDC(fWindow))) { |
SkDebugf("Could not get device context.\n"); |
this->destroyGLContext(); |
- return NULL; |
+ return; |
} |
// Requesting a Core profile would bar us from using NVPR. So we request |
// compatibility profile or GL ES. |
@@ -119,7 +93,7 @@ const GrGLInterface* WinGLContext::createGLContext(GrGLStandard forcedGpuAPI) { |
if (!(fGlRenderContext = SkCreateWGLContext(fDeviceContext, 0, contextType))) { |
SkDebugf("Could not create rendering context.\n"); |
this->destroyGLContext(); |
- return NULL; |
+ return; |
} |
dc = fDeviceContext; |
glrc = fGlRenderContext; |
@@ -136,17 +110,41 @@ const GrGLInterface* WinGLContext::createGLContext(GrGLStandard forcedGpuAPI) { |
if (!(wglMakeCurrent(dc, glrc))) { |
SkDebugf("Could not set the context.\n"); |
this->destroyGLContext(); |
- return NULL; |
+ return; |
} |
- const GrGLInterface* interface = GrGLCreateNativeInterface(); |
- if (NULL == interface) { |
+ fGL.reset(GrGLCreateNativeInterface()); |
+ if (NULL == fGL.get()) { |
SkDebugf("Could not create GL interface.\n"); |
this->destroyGLContext(); |
- return NULL; |
+ return; |
} |
+ if (!fGL->validate()) { |
+ SkDebugf("Could not validate GL interface.\n"); |
+ this->destroyGLContext(); |
+ return; |
+ } |
+} |
- return interface; |
+WinGLContext::~WinGLContext() { |
+ this->destroyGLContext(); |
+} |
+ |
+void WinGLContext::destroyGLContext() { |
+ fGL.reset(NULL); |
+ SkSafeSetNull(fPbufferContext); |
+ if (fGlRenderContext) { |
+ wglDeleteContext(fGlRenderContext); |
+ fGlRenderContext = 0; |
+ } |
+ if (fWindow && fDeviceContext) { |
+ ReleaseDC(fWindow, fDeviceContext); |
+ fDeviceContext = 0; |
+ } |
+ if (fWindow) { |
+ DestroyWindow(fWindow); |
+ fWindow = 0; |
+ } |
} |
void WinGLContext::makeCurrent() const { |
@@ -181,7 +179,12 @@ void WinGLContext::swapBuffers() const { |
} // anonymous namespace |
-SkGLContext* SkCreatePlatformGLContext() { |
- return SkNEW(WinGLContext); |
+SkGLContext* SkCreatePlatformGLContext(GrGLStandard forcedGpuAPI) { |
+ WinGLContext* ctx = SkNEW_ARGS(WinGLContext, (forcedGpuAPI)); |
+ if (!ctx->isValid()) { |
+ SkDELETE(ctx); |
+ return NULL; |
+ } |
+ return ctx; |
} |