static void get_pixel_formats_to_try(HDC dc, const SkWGLExtensions& extensions, bool doubleBuffered, int msaaSampleCount, bool deepColor, int formatsToTry[2]) { auto appendAttr = [](SkTDArray<int>& attrs, int attr, int value) { attrs.push(attr); attrs.push(value); }; SkTDArray<int> iAttrs; appendAttr(iAttrs, SK_WGL_DRAW_TO_WINDOW, TRUE); appendAttr(iAttrs, SK_WGL_DOUBLE_BUFFER, (doubleBuffered ? TRUE : FALSE)); appendAttr(iAttrs, SK_WGL_ACCELERATION, SK_WGL_FULL_ACCELERATION); appendAttr(iAttrs, SK_WGL_SUPPORT_OPENGL, TRUE); if (deepColor) { appendAttr(iAttrs, SK_WGL_RED_BITS, 10); appendAttr(iAttrs, SK_WGL_GREEN_BITS, 10); appendAttr(iAttrs, SK_WGL_BLUE_BITS, 10); appendAttr(iAttrs, SK_WGL_ALPHA_BITS, 2); } else { appendAttr(iAttrs, SK_WGL_COLOR_BITS, 24); appendAttr(iAttrs, SK_WGL_ALPHA_BITS, 8); } appendAttr(iAttrs, SK_WGL_STENCIL_BITS, 8); float fAttrs[] = {0, 0}; // Get a MSAA format if requested and possible. if (msaaSampleCount > 0 && extensions.hasExtension(dc, "WGL_ARB_multisample")) { SkTDArray<int> msaaIAttrs = iAttrs; appendAttr(msaaIAttrs, SK_WGL_SAMPLE_BUFFERS, TRUE); appendAttr(msaaIAttrs, SK_WGL_SAMPLES, msaaSampleCount); appendAttr(msaaIAttrs, 0, 0); unsigned int num; int formats[64]; extensions.choosePixelFormat(dc, msaaIAttrs.begin(), fAttrs, 64, formats, &num); num = SkTMin(num, 64U); formatsToTry[0] = extensions.selectFormat(formats, num, dc, msaaSampleCount); } // Get a non-MSAA format int* format = -1 == formatsToTry[0] ? &formatsToTry[0] : &formatsToTry[1]; unsigned int num; appendAttr(iAttrs, 0, 0); extensions.choosePixelFormat(dc, iAttrs.begin(), fAttrs, 1, format, &num); }
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) { // Either MSAA wasn't requested or creation failed unsigned int num; extensions.choosePixelFormat(dc, iAttrs, fAttrs, 1, &format, &num); DescribePixelFormat(dc, format, sizeof(pfd), &pfd); SkDEBUGCODE(BOOL set =) SetPixelFormat(dc, format, &pfd); SkASSERT(TRUE == set); }