static HGLRC create_gl_context(HDC dc, SkWGLExtensions extensions, SkWGLContextRequest contextType) { HDC prevDC = wglGetCurrentDC(); HGLRC prevGLRC = wglGetCurrentContext(); HGLRC glrc = nullptr; if (kGLES_SkWGLContextRequest == contextType) { if (!extensions.hasExtension(dc, "WGL_EXT_create_context_es2_profile")) { wglMakeCurrent(prevDC, prevGLRC); return nullptr; } static const int glesAttribs[] = { SK_WGL_CONTEXT_MAJOR_VERSION, 3, SK_WGL_CONTEXT_MINOR_VERSION, 0, SK_WGL_CONTEXT_PROFILE_MASK, SK_WGL_CONTEXT_ES2_PROFILE_BIT, 0, }; glrc = extensions.createContextAttribs(dc, nullptr, glesAttribs); if (nullptr == glrc) { wglMakeCurrent(prevDC, prevGLRC); return nullptr; } } else { if (kGLPreferCoreProfile_SkWGLContextRequest == contextType && extensions.hasExtension(dc, "WGL_ARB_create_context")) { static const int kCoreGLVersions[] = { 4, 3, 4, 2, 4, 1, 4, 0, 3, 3, 3, 2, }; int coreProfileAttribs[] = { SK_WGL_CONTEXT_MAJOR_VERSION, -1, SK_WGL_CONTEXT_MINOR_VERSION, -1, SK_WGL_CONTEXT_PROFILE_MASK, SK_WGL_CONTEXT_CORE_PROFILE_BIT, 0, }; for (int v = 0; v < SK_ARRAY_COUNT(kCoreGLVersions) / 2; ++v) { coreProfileAttribs[1] = kCoreGLVersions[2 * v]; coreProfileAttribs[3] = kCoreGLVersions[2 * v + 1]; glrc = extensions.createContextAttribs(dc, nullptr, coreProfileAttribs); if (glrc) { break; } } } } if (nullptr == glrc) { glrc = wglCreateContext(dc); } SkASSERT(glrc); wglMakeCurrent(prevDC, prevGLRC); // This might help make the context non-vsynced. if (extensions.hasExtension(dc, "WGL_EXT_swap_control")) { extensions.swapInterval(-1); } return glrc; }
void SkOSWindow::setVsync(bool enable) { SkWGLExtensions wgl; wgl.swapInterval(enable ? 1 : 0); }