Chromium Code Reviews| Index: src/utils/win/SkWGL_win.cpp |
| =================================================================== |
| --- src/utils/win/SkWGL_win.cpp (revision 7977) |
| +++ src/utils/win/SkWGL_win.cpp (working copy) |
| @@ -263,3 +263,108 @@ |
| wglMakeCurrent(prevDC, prevGLRC); |
| } |
| + |
| +HGLRC SkCreateWGLContext(HDC dc, int msaaSampleCount, bool preferCoreProfile) { |
| + SkWGLExtensions extensions; |
| + if (!extensions.hasExtension(dc, "WGL_ARB_pixel_format")) { |
| + return NULL; |
| + } |
| + |
| + HDC prevDC = wglGetCurrentDC(); |
| + HGLRC prevGLRC = wglGetCurrentContext(); |
| + PIXELFORMATDESCRIPTOR pfd; |
| + |
| + int format = 0; |
| + |
| + static const int iAttrs[] = { |
| + SK_WGL_DRAW_TO_WINDOW, TRUE, |
| + SK_WGL_DOUBLE_BUFFER, TRUE, |
| + SK_WGL_ACCELERATION, SK_WGL_FULL_ACCELERATION, |
| + SK_WGL_SUPPORT_OPENGL, TRUE, |
| + SK_WGL_COLOR_BITS, 24, |
| + SK_WGL_ALPHA_BITS, 8, |
| + SK_WGL_STENCIL_BITS, 8, |
| + 0, 0 |
| + }; |
| + |
| + float fAttrs[] = {0, 0}; |
| + |
| + if (msaaSampleCount > 0 && |
| + extensions.hasExtension(dc, "WGL_ARB_multisample")) { |
| + static const int kIAttrsCount = SK_ARRAY_COUNT(iAttrs); |
| + int msaaIAttrs[kIAttrsCount + 6]; |
| + memcpy(msaaIAttrs, iAttrs, sizeof(int) * kIAttrsCount); |
| + SkASSERT(0 == msaaIAttrs[kIAttrsCount - 2] && |
| + 0 == msaaIAttrs[kIAttrsCount - 1]); |
| + msaaIAttrs[kIAttrsCount - 2] = SK_WGL_SAMPLE_BUFFERS; |
| + msaaIAttrs[kIAttrsCount - 1] = TRUE; |
| + msaaIAttrs[kIAttrsCount + 0] = SK_WGL_SAMPLES; |
| + msaaIAttrs[kIAttrsCount + 1] = msaaSampleCount; |
| + if (extensions.hasExtension(dc, "WGL_NV_multisample_coverage")) { |
| + msaaIAttrs[kIAttrsCount + 2] = SK_WGL_COLOR_SAMPLES; |
| + // We want the fewest number of color samples possible. |
| + // Passing 0 gives only the formats where all samples are color |
| + // samples. |
| + msaaIAttrs[kIAttrsCount + 3] = 1; |
| + msaaIAttrs[kIAttrsCount + 4] = 0; |
| + msaaIAttrs[kIAttrsCount + 5] = 0; |
| + } else { |
| + msaaIAttrs[kIAttrsCount + 2] = 0; |
| + msaaIAttrs[kIAttrsCount + 3] = 0; |
| + } |
| + unsigned int num; |
| + int formats[64]; |
| + extensions.choosePixelFormat(dc, msaaIAttrs, fAttrs, 64, formats, &num); |
| + num = min(num,64); |
| + int formatToTry = extensions.selectFormat(formats, |
| + num, |
| + dc, |
| + msaaSampleCount); |
| + DescribePixelFormat(dc, formatToTry, sizeof(pfd), &pfd); |
| + if (SetPixelFormat(dc, formatToTry, &pfd)) { |
| + format = formatToTry; |
| + } |
| + } |
| + |
| + if (0 == format) { |
|
robertphillips
2013/03/05 18:46:22
// Either MSAA wasn't requested or creation failed
bsalomon
2013/03/05 18:52:21
Done.
|
| + unsigned int num; |
| + extensions.choosePixelFormat(dc, iAttrs, fAttrs, 1, &format, &num); |
| + DescribePixelFormat(dc, format, sizeof(pfd), &pfd); |
| + BOOL set = SetPixelFormat(dc, format, &pfd); |
| + SkASSERT(TRUE == set); |
| + } |
| + |
| + HGLRC glrc = NULL; |
| + if (preferCoreProfile && 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, NULL, coreProfileAttribs); |
| + if (NULL != glrc) { |
| + break; |
| + } |
| + } |
| + } |
| + |
| + if (NULL == glrc) { |
| + glrc = wglCreateContext(dc); |
| + } |
| + SkASSERT(glrc); |
| + |
| + wglMakeCurrent(prevDC, prevGLRC); |
| + return glrc; |
| +} |