| 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 #include "SkTypes.h" | 7 #include "SkTypes.h" |
| 8 | 8 |
| 9 #if defined(SK_BUILD_FOR_WIN) | 9 #if defined(SK_BUILD_FOR_WIN) |
| 10 | 10 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 #include "SkGraphics.h" | 22 #include "SkGraphics.h" |
| 23 | 23 |
| 24 #if SK_ANGLE | 24 #if SK_ANGLE |
| 25 #include "gl/GrGLAssembleInterface.h" | 25 #include "gl/GrGLAssembleInterface.h" |
| 26 #include "gl/GrGLInterface.h" | 26 #include "gl/GrGLInterface.h" |
| 27 #include "GLES2/gl2.h" | 27 #include "GLES2/gl2.h" |
| 28 #include <EGL/egl.h> | 28 #include <EGL/egl.h> |
| 29 #include <EGL/eglext.h> | 29 #include <EGL/eglext.h> |
| 30 #endif // SK_ANGLE | 30 #endif // SK_ANGLE |
| 31 | 31 |
| 32 #if SK_COMMAND_BUFFER | |
| 33 #include "gl/command_buffer/SkCommandBufferGLContext.h" | |
| 34 #endif // SK_COMMAND_BUFFER | |
| 35 | |
| 36 const int kDefaultWindowWidth = 500; | 32 const int kDefaultWindowWidth = 500; |
| 37 const int kDefaultWindowHeight = 500; | 33 const int kDefaultWindowHeight = 500; |
| 38 | 34 |
| 39 #define GL_CALL(IFACE, X) \ | 35 #define GL_CALL(IFACE, X) \ |
| 40 SkASSERT(IFACE); \ | 36 SkASSERT(IFACE); \ |
| 41 do { \ | 37 do { \ |
| 42 (IFACE)->fFunctions.f##X; \ | 38 (IFACE)->fFunctions.f##X; \ |
| 43 } while (false) | 39 } while (false) |
| 44 | 40 |
| 45 #define WM_EVENT_CALLBACK (WM_USER+0) | 41 #define WM_EVENT_CALLBACK (WM_USER+0) |
| (...skipping 11 matching lines...) Expand all Loading... |
| 57 fHWND = CreateWindow(fWinInit.fClass, NULL, WS_OVERLAPPEDWINDOW, | 53 fHWND = CreateWindow(fWinInit.fClass, NULL, WS_OVERLAPPEDWINDOW, |
| 58 CW_USEDEFAULT, 0, kDefaultWindowWidth, kDefaultWindowHe
ight, NULL, NULL, | 54 CW_USEDEFAULT, 0, kDefaultWindowWidth, kDefaultWindowHe
ight, NULL, NULL, |
| 59 fWinInit.fInstance, NULL); | 55 fWinInit.fInstance, NULL); |
| 60 gHwndToOSWindowMap.set(fHWND, this); | 56 gHwndToOSWindowMap.set(fHWND, this); |
| 61 #if SK_SUPPORT_GPU | 57 #if SK_SUPPORT_GPU |
| 62 #if SK_ANGLE | 58 #if SK_ANGLE |
| 63 fDisplay = EGL_NO_DISPLAY; | 59 fDisplay = EGL_NO_DISPLAY; |
| 64 fContext = EGL_NO_CONTEXT; | 60 fContext = EGL_NO_CONTEXT; |
| 65 fSurface = EGL_NO_SURFACE; | 61 fSurface = EGL_NO_SURFACE; |
| 66 #endif | 62 #endif |
| 67 #if SK_COMMAND_BUFFER | |
| 68 fCommandBuffer = nullptr; | |
| 69 #endif // SK_COMMAND_BUFFER | |
| 70 | 63 |
| 71 fHGLRC = NULL; | 64 fHGLRC = NULL; |
| 72 #endif | 65 #endif |
| 73 fAttached = kNone_BackEndType; | 66 fAttached = kNone_BackEndType; |
| 74 fFullscreen = false; | 67 fFullscreen = false; |
| 75 } | 68 } |
| 76 | 69 |
| 77 SkOSWindow::~SkOSWindow() { | 70 SkOSWindow::~SkOSWindow() { |
| 78 #if SK_SUPPORT_GPU | 71 #if SK_SUPPORT_GPU |
| 79 if (fHGLRC) { | 72 if (fHGLRC) { |
| 80 wglDeleteContext((HGLRC)fHGLRC); | 73 wglDeleteContext((HGLRC)fHGLRC); |
| 81 } | 74 } |
| 82 #if SK_ANGLE | 75 #if SK_ANGLE |
| 83 if (EGL_NO_CONTEXT != fContext) { | 76 if (EGL_NO_CONTEXT != fContext) { |
| 84 eglDestroyContext(fDisplay, fContext); | 77 eglDestroyContext(fDisplay, fContext); |
| 85 fContext = EGL_NO_CONTEXT; | 78 fContext = EGL_NO_CONTEXT; |
| 86 } | 79 } |
| 87 | 80 |
| 88 if (EGL_NO_SURFACE != fSurface) { | 81 if (EGL_NO_SURFACE != fSurface) { |
| 89 eglDestroySurface(fDisplay, fSurface); | 82 eglDestroySurface(fDisplay, fSurface); |
| 90 fSurface = EGL_NO_SURFACE; | 83 fSurface = EGL_NO_SURFACE; |
| 91 } | 84 } |
| 92 | 85 |
| 93 if (EGL_NO_DISPLAY != fDisplay) { | 86 if (EGL_NO_DISPLAY != fDisplay) { |
| 94 eglTerminate(fDisplay); | 87 eglTerminate(fDisplay); |
| 95 fDisplay = EGL_NO_DISPLAY; | 88 fDisplay = EGL_NO_DISPLAY; |
| 96 } | 89 } |
| 97 #endif // SK_ANGLE | 90 #endif // SK_ANGLE |
| 98 #if SK_COMMAND_BUFFER | |
| 99 delete fCommandBuffer; | |
| 100 #endif // SK_COMMAND_BUFFER | |
| 101 | |
| 102 #endif // SK_SUPPORT_GPU | 91 #endif // SK_SUPPORT_GPU |
| 103 this->closeWindow(); | 92 this->closeWindow(); |
| 104 } | 93 } |
| 105 | 94 |
| 106 static SkKey winToskKey(WPARAM vk) { | 95 static SkKey winToskKey(WPARAM vk) { |
| 107 static const struct { | 96 static const struct { |
| 108 WPARAM fVK; | 97 WPARAM fVK; |
| 109 SkKey fKey; | 98 SkKey fKey; |
| 110 } gPair[] = { | 99 } gPair[] = { |
| 111 { VK_BACK, kBack_SkKey }, | 100 { VK_BACK, kBack_SkKey }, |
| (...skipping 491 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 603 fDisplay = EGL_NO_DISPLAY; | 592 fDisplay = EGL_NO_DISPLAY; |
| 604 } | 593 } |
| 605 | 594 |
| 606 void SkOSWindow::presentANGLE() { | 595 void SkOSWindow::presentANGLE() { |
| 607 GL_CALL(fANGLEInterface, Flush()); | 596 GL_CALL(fANGLEInterface, Flush()); |
| 608 | 597 |
| 609 eglSwapBuffers(fDisplay, fSurface); | 598 eglSwapBuffers(fDisplay, fSurface); |
| 610 } | 599 } |
| 611 #endif // SK_ANGLE | 600 #endif // SK_ANGLE |
| 612 | 601 |
| 613 #if SK_COMMAND_BUFFER | |
| 614 | |
| 615 bool SkOSWindow::attachCommandBuffer(int msaaSampleCount, AttachmentInfo* info)
{ | |
| 616 if (!fCommandBuffer) { | |
| 617 fCommandBuffer = SkCommandBufferGLContext::Create((HWND)fHWND, msaaSampl
eCount); | |
| 618 if (!fCommandBuffer) | |
| 619 return false; | |
| 620 | |
| 621 SkAutoTUnref<const GrGLInterface> intf(GrGLCreateCommandBufferInterface(
)); | |
| 622 if (intf) { | |
| 623 GL_CALL(intf, ClearStencil(0)); | |
| 624 GL_CALL(intf, ClearColor(0, 0, 0, 0)); | |
| 625 GL_CALL(intf, StencilMask(0xffffffff)); | |
| 626 GL_CALL(intf, Clear(GL_STENCIL_BUFFER_BIT |GL_COLOR_BUFFER_BIT)); | |
| 627 } | |
| 628 } | |
| 629 | |
| 630 if (fCommandBuffer->makeCurrent()) { | |
| 631 info->fStencilBits = fCommandBuffer->getStencilBits(); | |
| 632 info->fSampleCount = fCommandBuffer->getSampleCount(); | |
| 633 | |
| 634 SkAutoTUnref<const GrGLInterface> intf(GrGLCreateCommandBufferInterface(
)); | |
| 635 | |
| 636 if (intf ) { | |
| 637 GL_CALL(intf, Viewport(0, 0, SkScalarRoundToInt(this->width()), | |
| 638 SkScalarRoundToInt(this->height()))); | |
| 639 } | |
| 640 return true; | |
| 641 } | |
| 642 return false; | |
| 643 } | |
| 644 | |
| 645 void SkOSWindow::detachCommandBuffer() { | |
| 646 delete fCommandBuffer; | |
| 647 fCommandBuffer = nullptr; | |
| 648 } | |
| 649 | |
| 650 void SkOSWindow::presentCommandBuffer() { | |
| 651 fCommandBuffer->presentCommandBuffer(); | |
| 652 } | |
| 653 #endif // SK_COMMAND_BUFFER | |
| 654 | |
| 655 #endif // SK_SUPPORT_GPU | 602 #endif // SK_SUPPORT_GPU |
| 656 | 603 |
| 657 // return true on success | 604 // return true on success |
| 658 bool SkOSWindow::attach(SkBackEndTypes attachType, int msaaSampleCount, bool dee
pColor, | 605 bool SkOSWindow::attach(SkBackEndTypes attachType, int msaaSampleCount, bool dee
pColor, |
| 659 AttachmentInfo* info) { | 606 AttachmentInfo* info) { |
| 660 | 607 |
| 661 // attach doubles as "windowResize" so we need to allo | 608 // attach doubles as "windowResize" so we need to allo |
| 662 // already bound states to pass through again | 609 // already bound states to pass through again |
| 663 // TODO: split out the resize functionality | 610 // TODO: split out the resize functionality |
| 664 // SkASSERT(kNone_BackEndType == fAttached); | 611 // SkASSERT(kNone_BackEndType == fAttached); |
| 665 bool result = true; | 612 bool result = true; |
| 666 | 613 |
| 667 switch (attachType) { | 614 switch (attachType) { |
| 668 case kNone_BackEndType: | 615 case kNone_BackEndType: |
| 669 // nothing to do | 616 // nothing to do |
| 670 break; | 617 break; |
| 671 #if SK_SUPPORT_GPU | 618 #if SK_SUPPORT_GPU |
| 672 case kNativeGL_BackEndType: | 619 case kNativeGL_BackEndType: |
| 673 result = attachGL(msaaSampleCount, deepColor, info); | 620 result = attachGL(msaaSampleCount, deepColor, info); |
| 674 break; | 621 break; |
| 675 #if SK_ANGLE | 622 #if SK_ANGLE |
| 676 case kANGLE_BackEndType: | 623 case kANGLE_BackEndType: |
| 677 result = attachANGLE(msaaSampleCount, info); | 624 result = attachANGLE(msaaSampleCount, info); |
| 678 break; | 625 break; |
| 679 #endif // SK_ANGLE | 626 #endif // SK_ANGLE |
| 680 #if SK_COMMAND_BUFFER | |
| 681 case kCommandBuffer_BackEndType: | |
| 682 result = attachCommandBuffer(msaaSampleCount, info); | |
| 683 break; | |
| 684 #endif // SK_COMMAND_BUFFER | |
| 685 #endif // SK_SUPPORT_GPU | 627 #endif // SK_SUPPORT_GPU |
| 686 default: | 628 default: |
| 687 SkASSERT(false); | 629 SkASSERT(false); |
| 688 result = false; | 630 result = false; |
| 689 break; | 631 break; |
| 690 } | 632 } |
| 691 | 633 |
| 692 if (result) { | 634 if (result) { |
| 693 fAttached = attachType; | 635 fAttached = attachType; |
| 694 } | 636 } |
| 695 | 637 |
| 696 return result; | 638 return result; |
| 697 } | 639 } |
| 698 | 640 |
| 699 void SkOSWindow::release() { | 641 void SkOSWindow::release() { |
| 700 switch (fAttached) { | 642 switch (fAttached) { |
| 701 case kNone_BackEndType: | 643 case kNone_BackEndType: |
| 702 // nothing to do | 644 // nothing to do |
| 703 break; | 645 break; |
| 704 #if SK_SUPPORT_GPU | 646 #if SK_SUPPORT_GPU |
| 705 case kNativeGL_BackEndType: | 647 case kNativeGL_BackEndType: |
| 706 detachGL(); | 648 detachGL(); |
| 707 break; | 649 break; |
| 708 #if SK_ANGLE | 650 #if SK_ANGLE |
| 709 case kANGLE_BackEndType: | 651 case kANGLE_BackEndType: |
| 710 detachANGLE(); | 652 detachANGLE(); |
| 711 break; | 653 break; |
| 712 #endif // SK_ANGLE | 654 #endif // SK_ANGLE |
| 713 #if SK_COMMAND_BUFFER | |
| 714 case kCommandBuffer_BackEndType: | |
| 715 detachCommandBuffer(); | |
| 716 break; | |
| 717 #endif // SK_COMMAND_BUFFER | |
| 718 #endif // SK_SUPPORT_GPU | 655 #endif // SK_SUPPORT_GPU |
| 719 default: | 656 default: |
| 720 SkASSERT(false); | 657 SkASSERT(false); |
| 721 break; | 658 break; |
| 722 } | 659 } |
| 723 fAttached = kNone_BackEndType; | 660 fAttached = kNone_BackEndType; |
| 724 } | 661 } |
| 725 | 662 |
| 726 void SkOSWindow::present() { | 663 void SkOSWindow::present() { |
| 727 switch (fAttached) { | 664 switch (fAttached) { |
| 728 case kNone_BackEndType: | 665 case kNone_BackEndType: |
| 729 // nothing to do | 666 // nothing to do |
| 730 return; | 667 return; |
| 731 #if SK_SUPPORT_GPU | 668 #if SK_SUPPORT_GPU |
| 732 case kNativeGL_BackEndType: | 669 case kNativeGL_BackEndType: |
| 733 presentGL(); | 670 presentGL(); |
| 734 break; | 671 break; |
| 735 #if SK_ANGLE | 672 #if SK_ANGLE |
| 736 case kANGLE_BackEndType: | 673 case kANGLE_BackEndType: |
| 737 presentANGLE(); | 674 presentANGLE(); |
| 738 break; | 675 break; |
| 739 #endif // SK_ANGLE | 676 #endif // SK_ANGLE |
| 740 #if SK_COMMAND_BUFFER | |
| 741 case kCommandBuffer_BackEndType: | |
| 742 presentCommandBuffer(); | |
| 743 break; | |
| 744 #endif // SK_COMMAND_BUFFER | |
| 745 #endif // SK_SUPPORT_GPU | 677 #endif // SK_SUPPORT_GPU |
| 746 default: | 678 default: |
| 747 SkASSERT(false); | 679 SkASSERT(false); |
| 748 break; | 680 break; |
| 749 } | 681 } |
| 750 } | 682 } |
| 751 | 683 |
| 752 bool SkOSWindow::makeFullscreen() { | 684 bool SkOSWindow::makeFullscreen() { |
| 753 if (fFullscreen) { | 685 if (fFullscreen) { |
| 754 return true; | 686 return true; |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 831 } | 763 } |
| 832 | 764 |
| 833 void SkOSWindow::closeWindow() { | 765 void SkOSWindow::closeWindow() { |
| 834 DestroyWindow((HWND)fHWND); | 766 DestroyWindow((HWND)fHWND); |
| 835 if (fFullscreen) { | 767 if (fFullscreen) { |
| 836 DestroyWindow((HWND)fSavedWindowState.fHWND); | 768 DestroyWindow((HWND)fSavedWindowState.fHWND); |
| 837 } | 769 } |
| 838 gHwndToOSWindowMap.remove(fHWND); | 770 gHwndToOSWindowMap.remove(fHWND); |
| 839 } | 771 } |
| 840 #endif | 772 #endif |
| OLD | NEW |