Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(426)

Side by Side Diff: src/views/win/SkOSWindow_win.cpp

Issue 1306823003: skia: add ability to load command_buffer_gles2 (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: delete the display Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 12 matching lines...) Expand all
23 #if SK_ANGLE 23 #if SK_ANGLE
24 #include "gl/angle/SkANGLEGLContext.h" 24 #include "gl/angle/SkANGLEGLContext.h"
25 #include "gl/GrGLInterface.h" 25 #include "gl/GrGLInterface.h"
26 #include "GLES2/gl2.h" 26 #include "GLES2/gl2.h"
27 27
28 #define ANGLE_GL_CALL(IFACE, X) \ 28 #define ANGLE_GL_CALL(IFACE, X) \
29 do { \ 29 do { \
30 (IFACE)->fFunctions.f##X; \ 30 (IFACE)->fFunctions.f##X; \
31 } while (false) 31 } while (false)
32 32
33 #endif 33 #endif // SK_ANGLE
34
35 #if SK_COMMAND_BUFFER
36 #include "gl/command_buffer/SkCommandBufferGLContext.h"
37
38 #define COMMAND_BUFFER_GL_CALL(IFACE, X) \
39 do { \
40 (IFACE)->fFunctions.f##X; \
41 } while (false)
42
43 #endif // SK_COMMAND_BUFFER
34 44
35 #define WM_EVENT_CALLBACK (WM_USER+0) 45 #define WM_EVENT_CALLBACK (WM_USER+0)
36 46
37 void post_skwinevent(HWND hwnd) 47 void post_skwinevent(HWND hwnd)
38 { 48 {
39 PostMessage(hwnd, WM_EVENT_CALLBACK, 0, 0); 49 PostMessage(hwnd, WM_EVENT_CALLBACK, 0, 0);
40 } 50 }
41 51
42 SkTHashMap<void*, SkOSWindow*> SkOSWindow::gHwndToOSWindowMap; 52 SkTHashMap<void*, SkOSWindow*> SkOSWindow::gHwndToOSWindowMap;
43 53
44 SkOSWindow::SkOSWindow(const void* winInit) { 54 SkOSWindow::SkOSWindow(const void* winInit) {
45 fWinInit = *(const WindowInit*)winInit; 55 fWinInit = *(const WindowInit*)winInit;
46 56
47 fHWND = CreateWindow(fWinInit.fClass, NULL, WS_OVERLAPPEDWINDOW, 57 fHWND = CreateWindow(fWinInit.fClass, NULL, WS_OVERLAPPEDWINDOW,
48 CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, fWinIni t.fInstance, NULL); 58 CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, fWinIni t.fInstance, NULL);
49 gHwndToOSWindowMap.set(fHWND, this); 59 gHwndToOSWindowMap.set(fHWND, this);
50 #if SK_SUPPORT_GPU 60 #if SK_SUPPORT_GPU
51 #if SK_ANGLE 61 #if SK_ANGLE || SK_COMMAND_BUFFER
52 fDisplay = EGL_NO_DISPLAY; 62 fDisplay = EGL_NO_DISPLAY;
53 fContext = EGL_NO_CONTEXT; 63 fContext = EGL_NO_CONTEXT;
54 fSurface = EGL_NO_SURFACE; 64 fSurface = EGL_NO_SURFACE;
55 #endif 65 #endif
56 fHGLRC = NULL; 66 fHGLRC = NULL;
57 #endif 67 #endif
58 fAttached = kNone_BackEndType; 68 fAttached = kNone_BackEndType;
59 fFullscreen = false; 69 fFullscreen = false;
60 } 70 }
61 71
62 SkOSWindow::~SkOSWindow() { 72 SkOSWindow::~SkOSWindow() {
63 #if SK_SUPPORT_GPU 73 #if SK_SUPPORT_GPU
64 if (fHGLRC) { 74 if (fHGLRC) {
65 wglDeleteContext((HGLRC)fHGLRC); 75 wglDeleteContext((HGLRC)fHGLRC);
66 } 76 }
67 #if SK_ANGLE 77 #if SK_ANGLE || SK_COMMAND_BUFFER
68 if (EGL_NO_CONTEXT != fContext) { 78 if (EGL_NO_CONTEXT != fContext) {
69 eglDestroyContext(fDisplay, fContext); 79 eglDestroyContext(fDisplay, fContext);
70 fContext = EGL_NO_CONTEXT; 80 fContext = EGL_NO_CONTEXT;
71 } 81 }
72 82
73 if (EGL_NO_SURFACE != fSurface) { 83 if (EGL_NO_SURFACE != fSurface) {
74 eglDestroySurface(fDisplay, fSurface); 84 eglDestroySurface(fDisplay, fSurface);
75 fSurface = EGL_NO_SURFACE; 85 fSurface = EGL_NO_SURFACE;
76 } 86 }
77 87
78 if (EGL_NO_DISPLAY != fDisplay) { 88 if (EGL_NO_DISPLAY != fDisplay) {
79 eglTerminate(fDisplay); 89 eglTerminate(fDisplay);
80 fDisplay = EGL_NO_DISPLAY; 90 fDisplay = EGL_NO_DISPLAY;
81 } 91 }
82 #endif // SK_ANGLE 92 #endif // SK_ANGLE || SK_COMMAND_BUFFER
83 #endif // SK_SUPPORT_GPU 93 #endif // SK_SUPPORT_GPU
84 this->closeWindow(); 94 this->closeWindow();
85 } 95 }
86 96
87 static SkKey winToskKey(WPARAM vk) { 97 static SkKey winToskKey(WPARAM vk) {
88 static const struct { 98 static const struct {
89 WPARAM fVK; 99 WPARAM fVK;
90 SkKey fKey; 100 SkKey fKey;
91 } gPair[] = { 101 } gPair[] = {
92 { VK_BACK, kBack_SkKey }, 102 { VK_BACK, kBack_SkKey },
(...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after
523 void SkOSWindow::presentANGLE() { 533 void SkOSWindow::presentANGLE() {
524 SkAutoTUnref<const GrGLInterface> intf(GrGLCreateANGLEInterface()); 534 SkAutoTUnref<const GrGLInterface> intf(GrGLCreateANGLEInterface());
525 535
526 if (intf) { 536 if (intf) {
527 ANGLE_GL_CALL(intf, Flush()); 537 ANGLE_GL_CALL(intf, Flush());
528 } 538 }
529 539
530 eglSwapBuffers(fDisplay, fSurface); 540 eglSwapBuffers(fDisplay, fSurface);
531 } 541 }
532 #endif // SK_ANGLE 542 #endif // SK_ANGLE
543
544 #if SK_COMMAND_BUFFER
545
546 bool create_CommandBuffer(EGLNativeWindowType hWnd,
bsalomon 2015/08/26 18:19:55 Can a lot of this be shared with the ANGLE functio
hendrikw 2015/08/27 01:28:35 All this code is bogus, I'm replacing it with the
547 int msaaSampleCount,
548 EGLDisplay* eglDisplay,
549 EGLContext* eglContext,
550 EGLSurface* eglSurface,
551 EGLConfig* eglConfig) {
552 static const EGLint contextAttribs[] = {
553 EGL_CONTEXT_CLIENT_VERSION, 2,
554 EGL_NONE, EGL_NONE
555 };
556 static const EGLint configAttribList[] = {
557 EGL_RED_SIZE, 8,
558 EGL_GREEN_SIZE, 8,
559 EGL_BLUE_SIZE, 8,
560 EGL_ALPHA_SIZE, 8,
561 EGL_DEPTH_SIZE, 8,
562 EGL_STENCIL_SIZE, 8,
563 EGL_NONE
564 };
565 static const EGLint surfaceAttribList[] = {
566 EGL_NONE, EGL_NONE
567 };
568
569 EGLDisplay display = SkANGLEGLContext::GetD3DEGLDisplay(GetDC(hWnd));
bsalomon 2015/08/26 18:19:55 Seems a bit weird to use angle here to get the dis
hendrikw 2015/08/27 01:28:35 All of this code is gone, yay.
570
571 if (EGL_NO_DISPLAY == display) {
572 SkDebugf("Could not create Command Buffer egl display!\n");
573 return false;
574 }
575
576 // Initialize EGL
577 EGLint majorVersion, minorVersion;
578 if (!eglInitialize(display, &majorVersion, &minorVersion)) {
579 return false;
580 }
581
582 EGLint numConfigs;
583 if (!eglGetConfigs(display, NULL, 0, &numConfigs)) {
584 return false;
585 }
586
587 // Choose config
588 bool foundConfig = false;
589 if (msaaSampleCount) {
590 static const int kConfigAttribListCnt =
591 SK_ARRAY_COUNT(configAttribList);
592 EGLint msaaConfigAttribList[kConfigAttribListCnt + 4];
593 memcpy(msaaConfigAttribList,
594 configAttribList,
595 sizeof(configAttribList));
596 SkASSERT(EGL_NONE == msaaConfigAttribList[kConfigAttribListCnt - 1]);
597 msaaConfigAttribList[kConfigAttribListCnt - 1] = EGL_SAMPLE_BUFFERS;
598 msaaConfigAttribList[kConfigAttribListCnt + 0] = 1;
599 msaaConfigAttribList[kConfigAttribListCnt + 1] = EGL_SAMPLES;
600 msaaConfigAttribList[kConfigAttribListCnt + 2] = msaaSampleCount;
601 msaaConfigAttribList[kConfigAttribListCnt + 3] = EGL_NONE;
602 if (eglChooseConfig(display, configAttribList, eglConfig, 1, &numConfigs )) {
603 SkASSERT(numConfigs > 0);
604 foundConfig = true;
605 }
606 }
607 if (!foundConfig) {
608 if (!eglChooseConfig(display, configAttribList, eglConfig, 1, &numConfig s)) {
609 return false;
610 }
611 }
612
613 // Create a surface
614 EGLSurface surface = eglCreateWindowSurface(display, *eglConfig,
615 (EGLNativeWindowType)hWnd,
616 surfaceAttribList);
617 if (surface == EGL_NO_SURFACE) {
618 return false;
619 }
620
621 // Create a GL context
622 EGLContext context = eglCreateContext(display, *eglConfig,
623 EGL_NO_CONTEXT,
624 contextAttribs );
625 if (context == EGL_NO_CONTEXT ) {
626 return false;
627 }
628
629 // Make the context current
630 if (!eglMakeCurrent(display, surface, surface, context)) {
631 return false;
632 }
633
634 *eglDisplay = display;
635 *eglContext = context;
636 *eglSurface = surface;
637 return true;
638 }
639
640 bool SkOSWindow::attachCommandBuffer(int msaaSampleCount, AttachmentInfo* info) {
641 if (EGL_NO_DISPLAY == fDisplay) {
642 bool bResult = create_CommandBuffer((HWND)fHWND,
643 msaaSampleCount,
644 &fDisplay,
645 &fContext,
646 &fSurface,
647 &fConfig);
648 if (false == bResult) {
649 return false;
650 }
651 SkAutoTUnref<const GrGLInterface> intf(GrGLCreateANGLEInterface());
652
653 if (intf) {
654 COMMAND_BUFFER_GL_CALL(intf, ClearStencil(0));
655 COMMAND_BUFFER_GL_CALL(intf, ClearColor(0, 0, 0, 0));
656 COMMAND_BUFFER_GL_CALL(intf, StencilMask(0xffffffff));
657 COMMAND_BUFFER_GL_CALL(intf, Clear(GL_STENCIL_BUFFER_BIT |GL_COLOR_B UFFER_BIT));
658 }
659 }
660 if (eglMakeCurrent(fDisplay, fSurface, fSurface, fContext)) {
661 eglGetConfigAttrib(fDisplay, fConfig, EGL_STENCIL_SIZE, &info->fStencilB its);
662 eglGetConfigAttrib(fDisplay, fConfig, EGL_SAMPLES, &info->fSampleCount);
663
664 SkAutoTUnref<const GrGLInterface> intf(GrGLCreateANGLEInterface());
665
666 if (intf ) {
667 COMMAND_BUFFER_GL_CALL(intf, Viewport(0, 0,
668 SkScalarRoundToInt(this->width()),
669 SkScalarRoundToInt(this->height())));
670 }
671 return true;
672 }
673 return false;
674 }
675
676 void SkOSWindow::detachCommandBuffer() {
677 eglMakeCurrent(fDisplay, EGL_NO_SURFACE , EGL_NO_SURFACE , EGL_NO_CONTEXT);
678
679 eglDestroyContext(fDisplay, fContext);
680 fContext = EGL_NO_CONTEXT;
681
682 eglDestroySurface(fDisplay, fSurface);
683 fSurface = EGL_NO_SURFACE;
684
685 eglTerminate(fDisplay);
686 fDisplay = EGL_NO_DISPLAY;
687 }
688
689 void SkOSWindow::presentCommandBuffer() {
690 SkAutoTUnref<const GrGLInterface> intf(GrGLCreateANGLEInterface());
691
692 if (intf) {
693 COMMAND_BUFFER_GL_CALL(intf, Flush());
694 }
695
696 eglSwapBuffers(fDisplay, fSurface);
697 }
698 #endif // SK_COMMAND_BUFFER
699
533 #endif // SK_SUPPORT_GPU 700 #endif // SK_SUPPORT_GPU
534 701
535 // return true on success 702 // return true on success
536 bool SkOSWindow::attach(SkBackEndTypes attachType, int msaaSampleCount, Attachme ntInfo* info) { 703 bool SkOSWindow::attach(SkBackEndTypes attachType, int msaaSampleCount, Attachme ntInfo* info) {
537 704
538 // attach doubles as "windowResize" so we need to allo 705 // attach doubles as "windowResize" so we need to allo
539 // already bound states to pass through again 706 // already bound states to pass through again
540 // TODO: split out the resize functionality 707 // TODO: split out the resize functionality
541 // SkASSERT(kNone_BackEndType == fAttached); 708 // SkASSERT(kNone_BackEndType == fAttached);
542 bool result = true; 709 bool result = true;
543 710
544 switch (attachType) { 711 switch (attachType) {
545 case kNone_BackEndType: 712 case kNone_BackEndType:
546 // nothing to do 713 // nothing to do
547 break; 714 break;
548 #if SK_SUPPORT_GPU 715 #if SK_SUPPORT_GPU
549 case kNativeGL_BackEndType: 716 case kNativeGL_BackEndType:
550 result = attachGL(msaaSampleCount, info); 717 result = attachGL(msaaSampleCount, info);
551 break; 718 break;
552 #if SK_ANGLE 719 #if SK_ANGLE
553 case kANGLE_BackEndType: 720 case kANGLE_BackEndType:
554 result = attachANGLE(msaaSampleCount, info); 721 result = attachANGLE(msaaSampleCount, info);
555 break; 722 break;
556 #endif // SK_ANGLE 723 #endif // SK_ANGLE
724 #if SK_COMMAND_BUFFER
725 case kCommandBuffer_BackEndType:
726 result = attachCommandBuffer(msaaSampleCount, info);
727 break;
728 #endif // SK_COMMAND_BUFFER
557 #endif // SK_SUPPORT_GPU 729 #endif // SK_SUPPORT_GPU
558 default: 730 default:
559 SkASSERT(false); 731 SkASSERT(false);
560 result = false; 732 result = false;
561 break; 733 break;
562 } 734 }
563 735
564 if (result) { 736 if (result) {
565 fAttached = attachType; 737 fAttached = attachType;
566 } 738 }
567 739
568 return result; 740 return result;
569 } 741 }
570 742
571 void SkOSWindow::detach() { 743 void SkOSWindow::detach() {
572 switch (fAttached) { 744 switch (fAttached) {
573 case kNone_BackEndType: 745 case kNone_BackEndType:
574 // nothing to do 746 // nothing to do
575 break; 747 break;
576 #if SK_SUPPORT_GPU 748 #if SK_SUPPORT_GPU
577 case kNativeGL_BackEndType: 749 case kNativeGL_BackEndType:
578 detachGL(); 750 detachGL();
579 break; 751 break;
580 #if SK_ANGLE 752 #if SK_ANGLE
581 case kANGLE_BackEndType: 753 case kANGLE_BackEndType:
582 detachANGLE(); 754 detachANGLE();
583 break; 755 break;
584 #endif // SK_ANGLE 756 #endif // SK_ANGLE
757 #if SK_COMMAND_BUFFER
758 case kCommandBuffer_BackEndType:
759 detachCommandBuffer();
760 break;
761 #endif // SK_COMMAND_BUFFER
585 #endif // SK_SUPPORT_GPU 762 #endif // SK_SUPPORT_GPU
586 default: 763 default:
587 SkASSERT(false); 764 SkASSERT(false);
588 break; 765 break;
589 } 766 }
590 fAttached = kNone_BackEndType; 767 fAttached = kNone_BackEndType;
591 } 768 }
592 769
593 void SkOSWindow::present() { 770 void SkOSWindow::present() {
594 switch (fAttached) { 771 switch (fAttached) {
595 case kNone_BackEndType: 772 case kNone_BackEndType:
596 // nothing to do 773 // nothing to do
597 return; 774 return;
598 #if SK_SUPPORT_GPU 775 #if SK_SUPPORT_GPU
599 case kNativeGL_BackEndType: 776 case kNativeGL_BackEndType:
600 presentGL(); 777 presentGL();
601 break; 778 break;
602 #if SK_ANGLE 779 #if SK_ANGLE
603 case kANGLE_BackEndType: 780 case kANGLE_BackEndType:
604 presentANGLE(); 781 presentANGLE();
605 break; 782 break;
606 #endif // SK_ANGLE 783 #endif // SK_ANGLE
784 #if SK_COMMAND_BUFFER
785 case kCommandBuffer_BackEndType:
786 presentCommandBuffer();
787 break;
788 #endif // SK_COMMAND_BUFFER
607 #endif // SK_SUPPORT_GPU 789 #endif // SK_SUPPORT_GPU
608 default: 790 default:
609 SkASSERT(false); 791 SkASSERT(false);
610 break; 792 break;
611 } 793 }
612 } 794 }
613 795
614 bool SkOSWindow::makeFullscreen() { 796 bool SkOSWindow::makeFullscreen() {
615 if (fFullscreen) { 797 if (fFullscreen) {
616 return true; 798 return true;
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
691 } 873 }
692 874
693 void SkOSWindow::closeWindow() { 875 void SkOSWindow::closeWindow() {
694 DestroyWindow((HWND)fHWND); 876 DestroyWindow((HWND)fHWND);
695 if (fFullscreen) { 877 if (fFullscreen) {
696 DestroyWindow((HWND)fSavedWindowState.fHWND); 878 DestroyWindow((HWND)fSavedWindowState.fHWND);
697 } 879 }
698 gHwndToOSWindowMap.remove(fHWND); 880 gHwndToOSWindowMap.remove(fHWND);
699 } 881 }
700 #endif 882 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698