OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 #include "SkTypes.h" | 8 #include "SkTypes.h" |
9 | 9 |
10 #if defined(SK_BUILD_FOR_WIN) | 10 #if defined(SK_BUILD_FOR_WIN) |
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
316 gTimer = NULL; | 316 gTimer = NULL; |
317 } | 317 } |
318 if (delay) | 318 if (delay) |
319 { | 319 { |
320 gTimer = SetTimer(NULL, 0, delay, sk_timer_proc); | 320 gTimer = SetTimer(NULL, 0, delay, sk_timer_proc); |
321 //SkDebugf("SetTimer of %d returned %d\n", delay, gTimer); | 321 //SkDebugf("SetTimer of %d returned %d\n", delay, gTimer); |
322 } | 322 } |
323 } | 323 } |
324 | 324 |
325 #if SK_SUPPORT_GPU | 325 #if SK_SUPPORT_GPU |
326 HGLRC create_gl(HWND hwnd, int msaaSampleCount) { | |
327 | |
328 HDC dc = GetDC(hwnd); | |
329 | |
330 SkWGLExtensions extensions; | |
331 if (!extensions.hasExtension(dc, "WGL_ARB_pixel_format")) { | |
332 return NULL; | |
333 } | |
334 | |
335 HDC prevDC = wglGetCurrentDC(); | |
336 HGLRC prevGLRC = wglGetCurrentContext(); | |
337 PIXELFORMATDESCRIPTOR pfd; | |
338 | |
339 int format = 0; | |
340 | |
341 static const GLint iAttrs[] = { | |
342 SK_WGL_DRAW_TO_WINDOW, TRUE, | |
343 SK_WGL_DOUBLE_BUFFER, TRUE, | |
344 SK_WGL_ACCELERATION, SK_WGL_FULL_ACCELERATION, | |
345 SK_WGL_SUPPORT_OPENGL, TRUE, | |
346 SK_WGL_COLOR_BITS, 24, | |
347 SK_WGL_ALPHA_BITS, 8, | |
348 SK_WGL_STENCIL_BITS, 8, | |
349 0, 0 | |
350 }; | |
351 | |
352 GLfloat fAttrs[] = {0, 0}; | |
353 | |
354 if (msaaSampleCount > 0 && | |
355 extensions.hasExtension(dc, "WGL_ARB_multisample")) { | |
356 static const int kIAttrsCount = SK_ARRAY_COUNT(iAttrs); | |
357 GLint msaaIAttrs[kIAttrsCount + 6]; | |
358 memcpy(msaaIAttrs, iAttrs, sizeof(GLint) * kIAttrsCount); | |
359 SkASSERT(0 == msaaIAttrs[kIAttrsCount - 2] && | |
360 0 == msaaIAttrs[kIAttrsCount - 1]); | |
361 msaaIAttrs[kIAttrsCount - 2] = SK_WGL_SAMPLE_BUFFERS; | |
362 msaaIAttrs[kIAttrsCount - 1] = TRUE; | |
363 msaaIAttrs[kIAttrsCount + 0] = SK_WGL_SAMPLES; | |
364 msaaIAttrs[kIAttrsCount + 1] = msaaSampleCount; | |
365 if (extensions.hasExtension(dc, "WGL_NV_multisample_coverage")) { | |
366 msaaIAttrs[kIAttrsCount + 2] = SK_WGL_COLOR_SAMPLES; | |
367 // We want the fewest number of color samples possible. | |
368 // Passing 0 gives only the formats where all samples are color | |
369 // samples. | |
370 msaaIAttrs[kIAttrsCount + 3] = 1; | |
371 msaaIAttrs[kIAttrsCount + 4] = 0; | |
372 msaaIAttrs[kIAttrsCount + 5] = 0; | |
373 } else { | |
374 msaaIAttrs[kIAttrsCount + 2] = 0; | |
375 msaaIAttrs[kIAttrsCount + 3] = 0; | |
376 } | |
377 GLuint num; | |
378 int formats[64]; | |
379 extensions.choosePixelFormat(dc, msaaIAttrs, fAttrs, 64, formats, &num); | |
380 num = min(num,64); | |
381 int formatToTry = extensions.selectFormat(formats, | |
382 num, | |
383 dc, | |
384 msaaSampleCount); | |
385 DescribePixelFormat(dc, formatToTry, sizeof(pfd), &pfd); | |
386 if (SetPixelFormat(dc, formatToTry, &pfd)) { | |
387 format = formatToTry; | |
388 } | |
389 } | |
390 | |
391 if (0 == format) { | |
392 GLuint num; | |
393 extensions.choosePixelFormat(dc, iAttrs, fAttrs, 1, &format, &num); | |
394 DescribePixelFormat(dc, format, sizeof(pfd), &pfd); | |
395 BOOL set = SetPixelFormat(dc, format, &pfd); | |
396 SkASSERT(TRUE == set); | |
397 } | |
398 | |
399 HGLRC glrc = NULL; | |
400 #if 0 // Change to 1 to attempt to create a core profile GL context of version 4
.3 or lower | |
401 if (extensions.hasExtension(dc, "WGL_ARB_create_context")) { | |
402 static const GLint kCoreGLVersions[] = { | |
403 4, 3, | |
404 4, 2, | |
405 4, 1, | |
406 4, 0, | |
407 3, 3, | |
408 3, 2, | |
409 }; | |
410 GLint coreProfileAttribs[] = { | |
411 SK_WGL_CONTEXT_MAJOR_VERSION, -1, | |
412 SK_WGL_CONTEXT_MINOR_VERSION, -1, | |
413 SK_WGL_CONTEXT_PROFILE_MASK, SK_WGL_CONTEXT_CORE_PROFILE_BIT, | |
414 0, | |
415 }; | |
416 for (int v = 0; v < SK_ARRAY_COUNT(kCoreGLVersions) / 2; ++v) { | |
417 coreProfileAttribs[1] = kCoreGLVersions[2 * v]; | |
418 coreProfileAttribs[3] = kCoreGLVersions[2 * v + 1]; | |
419 glrc = extensions.createContextAttribs(dc, NULL, coreProfileAttribs)
; | |
420 if (NULL != glrc) { | |
421 break; | |
422 } | |
423 } | |
424 } | |
425 #endif | |
426 | |
427 if (NULL == glrc) { | |
428 glrc = wglCreateContext(dc); | |
429 } | |
430 SkASSERT(glrc); | |
431 | |
432 wglMakeCurrent(prevDC, prevGLRC); | |
433 return glrc; | |
434 } | |
435 | 326 |
436 bool SkOSWindow::attachGL(int msaaSampleCount) { | 327 bool SkOSWindow::attachGL(int msaaSampleCount) { |
| 328 HDC dc = GetDC((HWND)fHWND); |
437 if (NULL == fHGLRC) { | 329 if (NULL == fHGLRC) { |
438 fHGLRC = create_gl((HWND)fHWND, msaaSampleCount); | 330 fHGLRC = SkCreateWGLContext(dc, msaaSampleCount, false); |
439 if (NULL == fHGLRC) { | 331 if (NULL == fHGLRC) { |
440 return false; | 332 return false; |
441 } | 333 } |
442 glClearStencil(0); | 334 glClearStencil(0); |
443 glClearColor(0, 0, 0, 0); | 335 glClearColor(0, 0, 0, 0); |
444 glStencilMask(0xffffffff); | 336 glStencilMask(0xffffffff); |
445 glClear(GL_STENCIL_BUFFER_BIT | GL_COLOR_BUFFER_BIT); | 337 glClear(GL_STENCIL_BUFFER_BIT | GL_COLOR_BUFFER_BIT); |
446 } | 338 } |
447 if (wglMakeCurrent(GetDC((HWND)fHWND), (HGLRC)fHGLRC)) { | 339 if (wglMakeCurrent(dc, (HGLRC)fHGLRC)) { |
448 glViewport(0, 0, SkScalarRound(this->width()), | 340 glViewport(0, 0, SkScalarRound(this->width()), |
449 SkScalarRound(this->height())); | 341 SkScalarRound(this->height())); |
450 return true; | 342 return true; |
451 } | 343 } |
452 return false; | 344 return false; |
453 } | 345 } |
454 | 346 |
455 void SkOSWindow::detachGL() { | 347 void SkOSWindow::detachGL() { |
456 wglMakeCurrent(GetDC((HWND)fHWND), 0); | 348 wglMakeCurrent(GetDC((HWND)fHWND), 0); |
457 wglDeleteContext((HGLRC)fHGLRC); | 349 wglDeleteContext((HGLRC)fHGLRC); |
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
687 break; | 579 break; |
688 #endif // SK_ANGLE | 580 #endif // SK_ANGLE |
689 #endif // SK_SUPPORT_GPU | 581 #endif // SK_SUPPORT_GPU |
690 default: | 582 default: |
691 SkASSERT(false); | 583 SkASSERT(false); |
692 break; | 584 break; |
693 } | 585 } |
694 } | 586 } |
695 | 587 |
696 #endif | 588 #endif |
OLD | NEW |