| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkTypes.h" | 8 #include "SkTypes.h" |
| 9 #if defined(SK_BUILD_FOR_WIN32) | 9 #if defined(SK_BUILD_FOR_WIN32) |
| 10 | 10 |
| (...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 281 wglDeleteContext(dummyGLRC); | 281 wglDeleteContext(dummyGLRC); |
| 282 destroy_dummy_window(dummyWND); | 282 destroy_dummy_window(dummyWND); |
| 283 } | 283 } |
| 284 | 284 |
| 285 wglMakeCurrent(prevDC, prevGLRC); | 285 wglMakeCurrent(prevDC, prevGLRC); |
| 286 } | 286 } |
| 287 | 287 |
| 288 /////////////////////////////////////////////////////////////////////////////// | 288 /////////////////////////////////////////////////////////////////////////////// |
| 289 | 289 |
| 290 static void get_pixel_formats_to_try(HDC dc, const SkWGLExtensions& extensions, | 290 static void get_pixel_formats_to_try(HDC dc, const SkWGLExtensions& extensions, |
| 291 bool doubleBuffered, int msaaSampleCount, | 291 bool doubleBuffered, int msaaSampleCount, b
ool deepColor, |
| 292 int formatsToTry[2]) { | 292 int formatsToTry[2]) { |
| 293 int iAttrs[] = { | 293 auto appendAttr = [](SkTDArray<int>& attrs, int attr, int value) { |
| 294 SK_WGL_DRAW_TO_WINDOW, TRUE, | 294 attrs.push(attr); |
| 295 SK_WGL_DOUBLE_BUFFER, (doubleBuffered ? TRUE : FALSE), | 295 attrs.push(value); |
| 296 SK_WGL_ACCELERATION, SK_WGL_FULL_ACCELERATION, | |
| 297 SK_WGL_SUPPORT_OPENGL, TRUE, | |
| 298 SK_WGL_COLOR_BITS, 24, | |
| 299 SK_WGL_ALPHA_BITS, 8, | |
| 300 SK_WGL_STENCIL_BITS, 8, | |
| 301 0, 0 | |
| 302 }; | 296 }; |
| 303 | 297 |
| 298 SkTDArray<int> iAttrs; |
| 299 appendAttr(iAttrs, SK_WGL_DRAW_TO_WINDOW, TRUE); |
| 300 appendAttr(iAttrs, SK_WGL_DOUBLE_BUFFER, (doubleBuffered ? TRUE : FALSE)); |
| 301 appendAttr(iAttrs, SK_WGL_ACCELERATION, SK_WGL_FULL_ACCELERATION); |
| 302 appendAttr(iAttrs, SK_WGL_SUPPORT_OPENGL, TRUE); |
| 303 if (deepColor) { |
| 304 appendAttr(iAttrs, SK_WGL_RED_BITS, 10); |
| 305 appendAttr(iAttrs, SK_WGL_GREEN_BITS, 10); |
| 306 appendAttr(iAttrs, SK_WGL_BLUE_BITS, 10); |
| 307 appendAttr(iAttrs, SK_WGL_ALPHA_BITS, 2); |
| 308 } else { |
| 309 appendAttr(iAttrs, SK_WGL_COLOR_BITS, 24); |
| 310 appendAttr(iAttrs, SK_WGL_ALPHA_BITS, 8); |
| 311 } |
| 312 appendAttr(iAttrs, SK_WGL_STENCIL_BITS, 8); |
| 313 |
| 304 float fAttrs[] = {0, 0}; | 314 float fAttrs[] = {0, 0}; |
| 305 | 315 |
| 306 // Get a MSAA format if requested and possible. | 316 // Get a MSAA format if requested and possible. |
| 307 if (msaaSampleCount > 0 && | 317 if (msaaSampleCount > 0 && |
| 308 extensions.hasExtension(dc, "WGL_ARB_multisample")) { | 318 extensions.hasExtension(dc, "WGL_ARB_multisample")) { |
| 309 static const int kIAttrsCount = SK_ARRAY_COUNT(iAttrs); | 319 SkTDArray<int> msaaIAttrs = iAttrs; |
| 310 int msaaIAttrs[kIAttrsCount + 4]; | 320 appendAttr(msaaIAttrs, SK_WGL_SAMPLE_BUFFERS, TRUE); |
| 311 memcpy(msaaIAttrs, iAttrs, sizeof(int) * kIAttrsCount); | 321 appendAttr(msaaIAttrs, SK_WGL_SAMPLES, msaaSampleCount); |
| 312 SkASSERT(0 == msaaIAttrs[kIAttrsCount - 2] && | 322 appendAttr(msaaIAttrs, 0, 0); |
| 313 0 == msaaIAttrs[kIAttrsCount - 1]); | |
| 314 msaaIAttrs[kIAttrsCount - 2] = SK_WGL_SAMPLE_BUFFERS; | |
| 315 msaaIAttrs[kIAttrsCount - 1] = TRUE; | |
| 316 msaaIAttrs[kIAttrsCount + 0] = SK_WGL_SAMPLES; | |
| 317 msaaIAttrs[kIAttrsCount + 1] = msaaSampleCount; | |
| 318 msaaIAttrs[kIAttrsCount + 2] = 0; | |
| 319 msaaIAttrs[kIAttrsCount + 3] = 0; | |
| 320 unsigned int num; | 323 unsigned int num; |
| 321 int formats[64]; | 324 int formats[64]; |
| 322 extensions.choosePixelFormat(dc, msaaIAttrs, fAttrs, 64, formats, &num); | 325 extensions.choosePixelFormat(dc, msaaIAttrs.begin(), fAttrs, 64, formats
, &num); |
| 323 num = SkTMin(num, 64U); | 326 num = SkTMin(num, 64U); |
| 324 formatsToTry[0] = extensions.selectFormat(formats, num, dc, msaaSampleCo
unt); | 327 formatsToTry[0] = extensions.selectFormat(formats, num, dc, msaaSampleCo
unt); |
| 325 } | 328 } |
| 326 | 329 |
| 327 // Get a non-MSAA format | 330 // Get a non-MSAA format |
| 328 int* format = -1 == formatsToTry[0] ? &formatsToTry[0] : &formatsToTry[1]; | 331 int* format = -1 == formatsToTry[0] ? &formatsToTry[0] : &formatsToTry[1]; |
| 329 unsigned int num; | 332 unsigned int num; |
| 330 extensions.choosePixelFormat(dc, iAttrs, fAttrs, 1, format, &num); | 333 appendAttr(iAttrs, 0, 0); |
| 334 extensions.choosePixelFormat(dc, iAttrs.begin(), fAttrs, 1, format, &num); |
| 331 } | 335 } |
| 332 | 336 |
| 333 static HGLRC create_gl_context(HDC dc, SkWGLExtensions extensions, SkWGLContextR
equest contextType) { | 337 static HGLRC create_gl_context(HDC dc, SkWGLExtensions extensions, SkWGLContextR
equest contextType) { |
| 334 HDC prevDC = wglGetCurrentDC(); | 338 HDC prevDC = wglGetCurrentDC(); |
| 335 HGLRC prevGLRC = wglGetCurrentContext(); | 339 HGLRC prevGLRC = wglGetCurrentContext(); |
| 336 | 340 |
| 337 HGLRC glrc = nullptr; | 341 HGLRC glrc = nullptr; |
| 338 if (kGLES_SkWGLContextRequest == contextType) { | 342 if (kGLES_SkWGLContextRequest == contextType) { |
| 339 if (!extensions.hasExtension(dc, "WGL_EXT_create_context_es2_profile"))
{ | 343 if (!extensions.hasExtension(dc, "WGL_EXT_create_context_es2_profile"))
{ |
| 340 wglMakeCurrent(prevDC, prevGLRC); | 344 wglMakeCurrent(prevDC, prevGLRC); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 386 | 390 |
| 387 wglMakeCurrent(prevDC, prevGLRC); | 391 wglMakeCurrent(prevDC, prevGLRC); |
| 388 | 392 |
| 389 // This might help make the context non-vsynced. | 393 // This might help make the context non-vsynced. |
| 390 if (extensions.hasExtension(dc, "WGL_EXT_swap_control")) { | 394 if (extensions.hasExtension(dc, "WGL_EXT_swap_control")) { |
| 391 extensions.swapInterval(-1); | 395 extensions.swapInterval(-1); |
| 392 } | 396 } |
| 393 return glrc; | 397 return glrc; |
| 394 } | 398 } |
| 395 | 399 |
| 396 HGLRC SkCreateWGLContext(HDC dc, int msaaSampleCount, SkWGLContextRequest contex
tType) { | 400 HGLRC SkCreateWGLContext(HDC dc, int msaaSampleCount, bool deepColor, |
| 401 SkWGLContextRequest contextType) { |
| 397 SkWGLExtensions extensions; | 402 SkWGLExtensions extensions; |
| 398 if (!extensions.hasExtension(dc, "WGL_ARB_pixel_format")) { | 403 if (!extensions.hasExtension(dc, "WGL_ARB_pixel_format")) { |
| 399 return nullptr; | 404 return nullptr; |
| 400 } | 405 } |
| 401 | 406 |
| 402 BOOL set = FALSE; | 407 BOOL set = FALSE; |
| 403 | 408 |
| 404 int pixelFormatsToTry[] = { -1, -1 }; | 409 int pixelFormatsToTry[] = { -1, -1 }; |
| 405 get_pixel_formats_to_try(dc, extensions, true, msaaSampleCount, pixelFormats
ToTry); | 410 get_pixel_formats_to_try(dc, extensions, true, msaaSampleCount, deepColor, p
ixelFormatsToTry); |
| 406 for (int f = 0; | 411 for (int f = 0; |
| 407 !set && -1 != pixelFormatsToTry[f] && f < SK_ARRAY_COUNT(pixelFormatsTo
Try); | 412 !set && -1 != pixelFormatsToTry[f] && f < SK_ARRAY_COUNT(pixelFormatsTo
Try); |
| 408 ++f) { | 413 ++f) { |
| 409 PIXELFORMATDESCRIPTOR pfd; | 414 PIXELFORMATDESCRIPTOR pfd; |
| 410 DescribePixelFormat(dc, pixelFormatsToTry[f], sizeof(pfd), &pfd); | 415 DescribePixelFormat(dc, pixelFormatsToTry[f], sizeof(pfd), &pfd); |
| 411 set = SetPixelFormat(dc, pixelFormatsToTry[f], &pfd); | 416 set = SetPixelFormat(dc, pixelFormatsToTry[f], &pfd); |
| 412 } | 417 } |
| 413 | 418 |
| 414 if (!set) { | 419 if (!set) { |
| 415 return nullptr; | 420 return nullptr; |
| 416 } | 421 } |
| 417 | 422 |
| 418 return create_gl_context(dc, extensions, contextType);} | 423 return create_gl_context(dc, extensions, contextType);} |
| 419 | 424 |
| 420 SkWGLPbufferContext* SkWGLPbufferContext::Create(HDC parentDC, int msaaSampleCou
nt, | 425 SkWGLPbufferContext* SkWGLPbufferContext::Create(HDC parentDC, int msaaSampleCou
nt, |
| 421 SkWGLContextRequest contextType
) { | 426 SkWGLContextRequest contextType
) { |
| 422 SkWGLExtensions extensions; | 427 SkWGLExtensions extensions; |
| 423 if (!extensions.hasExtension(parentDC, "WGL_ARB_pixel_format") || | 428 if (!extensions.hasExtension(parentDC, "WGL_ARB_pixel_format") || |
| 424 !extensions.hasExtension(parentDC, "WGL_ARB_pbuffer")) { | 429 !extensions.hasExtension(parentDC, "WGL_ARB_pbuffer")) { |
| 425 return nullptr; | 430 return nullptr; |
| 426 } | 431 } |
| 427 | 432 |
| 428 // try for single buffer first | 433 // try for single buffer first |
| 429 for (int dblBuffer = 0; dblBuffer < 2; ++dblBuffer) { | 434 for (int dblBuffer = 0; dblBuffer < 2; ++dblBuffer) { |
| 430 int pixelFormatsToTry[] = { -1, -1 }; | 435 int pixelFormatsToTry[] = { -1, -1 }; |
| 431 get_pixel_formats_to_try(parentDC, extensions, (0 != dblBuffer), msaaSam
pleCount, | 436 get_pixel_formats_to_try(parentDC, extensions, (0 != dblBuffer), msaaSam
pleCount, |
| 432 pixelFormatsToTry); | 437 false, pixelFormatsToTry); |
| 433 for (int f = 0; -1 != pixelFormatsToTry[f] && f < SK_ARRAY_COUNT(pixelFo
rmatsToTry); ++f) { | 438 for (int f = 0; -1 != pixelFormatsToTry[f] && f < SK_ARRAY_COUNT(pixelFo
rmatsToTry); ++f) { |
| 434 HPBUFFER pbuf = extensions.createPbuffer(parentDC, pixelFormatsToTry
[f], 1, 1, nullptr); | 439 HPBUFFER pbuf = extensions.createPbuffer(parentDC, pixelFormatsToTry
[f], 1, 1, nullptr); |
| 435 if (0 != pbuf) { | 440 if (0 != pbuf) { |
| 436 HDC dc = extensions.getPbufferDC(pbuf); | 441 HDC dc = extensions.getPbufferDC(pbuf); |
| 437 if (dc) { | 442 if (dc) { |
| 438 HGLRC glrc = create_gl_context(dc, extensions, contextType); | 443 HGLRC glrc = create_gl_context(dc, extensions, contextType); |
| 439 if (glrc) { | 444 if (glrc) { |
| 440 return new SkWGLPbufferContext(pbuf, dc, glrc); | 445 return new SkWGLPbufferContext(pbuf, dc, glrc); |
| 441 } | 446 } |
| 442 extensions.releasePbufferDC(pbuf, dc); | 447 extensions.releasePbufferDC(pbuf, dc); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 455 fExtensions.destroyPbuffer(fPbuffer); | 460 fExtensions.destroyPbuffer(fPbuffer); |
| 456 } | 461 } |
| 457 | 462 |
| 458 SkWGLPbufferContext::SkWGLPbufferContext(HPBUFFER pbuffer, HDC dc, HGLRC glrc) | 463 SkWGLPbufferContext::SkWGLPbufferContext(HPBUFFER pbuffer, HDC dc, HGLRC glrc) |
| 459 : fPbuffer(pbuffer) | 464 : fPbuffer(pbuffer) |
| 460 , fDC(dc) | 465 , fDC(dc) |
| 461 , fGLRC(glrc) { | 466 , fGLRC(glrc) { |
| 462 } | 467 } |
| 463 | 468 |
| 464 #endif//defined(SK_BUILD_FOR_WIN32) | 469 #endif//defined(SK_BUILD_FOR_WIN32) |
| OLD | NEW |