Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/gl/gl_surface.h" | 5 #include "ui/gl/gl_surface.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/callback.h" | 10 #include "base/callback.h" |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 25 #include "ui/gl/gl_surface_osmesa.h" | 25 #include "ui/gl/gl_surface_osmesa.h" |
| 26 #include "ui/gl/gl_surface_overlay.h" | 26 #include "ui/gl/gl_surface_overlay.h" |
| 27 #include "ui/gl/gl_surface_stub.h" | 27 #include "ui/gl/gl_surface_stub.h" |
| 28 #include "ui/gl/scoped_binders.h" | 28 #include "ui/gl/scoped_binders.h" |
| 29 #include "ui/gl/scoped_make_current.h" | 29 #include "ui/gl/scoped_make_current.h" |
| 30 #include "ui/ozone/public/native_pixmap.h" | 30 #include "ui/ozone/public/native_pixmap.h" |
| 31 #include "ui/ozone/public/ozone_platform.h" | 31 #include "ui/ozone/public/ozone_platform.h" |
| 32 #include "ui/ozone/public/surface_factory_ozone.h" | 32 #include "ui/ozone/public/surface_factory_ozone.h" |
| 33 #include "ui/ozone/public/surface_ozone_egl.h" | 33 #include "ui/ozone/public/surface_ozone_egl.h" |
| 34 | 34 |
| 35 #if defined(USE_GLX) | |
| 36 #include <X11/Xlib.h> | |
| 37 | |
| 38 #include "ui/events/platform/x11/x11_event_source_libevent.h" | |
| 39 #include "ui/gl/gl_surface_glx.h" | |
| 40 #endif | |
| 41 | |
| 35 using gl::GLImage; | 42 using gl::GLImage; |
| 36 | 43 |
| 37 namespace gfx { | 44 namespace gfx { |
| 38 | 45 |
| 39 namespace { | 46 namespace { |
| 40 | 47 |
| 41 // Helper function for base::Bind to create callback to eglChooseConfig. | 48 // Helper function for base::Bind to create callback to eglChooseConfig. |
| 42 bool EglChooseConfig(EGLDisplay display, | 49 bool EglChooseConfig(EGLDisplay display, |
| 43 const int32_t* attribs, | 50 const int32_t* attribs, |
| 44 EGLConfig* configs, | 51 EGLConfig* configs, |
| (...skipping 599 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 644 images_[i]->Destroy(true); | 651 images_[i]->Destroy(true); |
| 645 images_[i] = image; | 652 images_[i] = image; |
| 646 // Bind image to texture. | 653 // Bind image to texture. |
| 647 ScopedTextureBinder binder(GL_TEXTURE_2D, textures_[i]); | 654 ScopedTextureBinder binder(GL_TEXTURE_2D, textures_[i]); |
| 648 if (!images_[i]->BindTexImage(GL_TEXTURE_2D)) | 655 if (!images_[i]->BindTexImage(GL_TEXTURE_2D)) |
| 649 return false; | 656 return false; |
| 650 } | 657 } |
| 651 return true; | 658 return true; |
| 652 } | 659 } |
| 653 | 660 |
| 661 #if defined(USE_GLX) | |
| 662 | |
| 663 // Ozone specific implementation of GLX surface. Registers as XEventDispatcher | |
| 664 // to handle XEvents. | |
| 665 class GL_EXPORT NativeViewGLSurfaceGLXOzone : public NativeViewGLSurfaceGLX, | |
| 666 public ui::XEventDispatcher { | |
|
sadrul
2016/04/19 14:49:49
Can this not use the PlatformEventDispatcher inter
kylechar
2016/04/19 16:00:20
No, Expose events are platform specific and we don
| |
| 667 public: | |
| 668 explicit NativeViewGLSurfaceGLXOzone(gfx::AcceleratedWidget window); | |
| 669 | |
| 670 // XEventDispatcher implementation: | |
| 671 bool DispatchXEvent(XEvent* xevent) override; | |
| 672 | |
| 673 protected: | |
| 674 ~NativeViewGLSurfaceGLXOzone() override; | |
| 675 | |
| 676 // NativeViewGLSurfaceGLX implementation: | |
| 677 void RegisterEvents() override; | |
| 678 void UnregisterEvents() override; | |
| 679 | |
| 680 private: | |
| 681 DISALLOW_COPY_AND_ASSIGN(NativeViewGLSurfaceGLXOzone); | |
| 682 }; | |
| 683 | |
| 684 NativeViewGLSurfaceGLXOzone::NativeViewGLSurfaceGLXOzone( | |
| 685 gfx::AcceleratedWidget window) | |
| 686 : NativeViewGLSurfaceGLX(window) {} | |
| 687 | |
| 688 bool NativeViewGLSurfaceGLXOzone::DispatchXEvent(XEvent* event) { | |
| 689 if (!CanHandleEvent(event)) | |
| 690 return false; | |
| 691 | |
| 692 ForwardExposeEvent(event); | |
| 693 return true; | |
| 694 } | |
| 695 | |
| 696 NativeViewGLSurfaceGLXOzone::~NativeViewGLSurfaceGLXOzone() { | |
| 697 Destroy(); | |
| 698 } | |
| 699 | |
| 700 void NativeViewGLSurfaceGLXOzone::RegisterEvents() { | |
| 701 ui::X11EventSourceLibevent* event_source = | |
| 702 ui::X11EventSourceLibevent::GetInstance(); | |
| 703 // Can be nullptr in tests, when we don't care about Exposes. | |
| 704 if (event_source) { | |
| 705 XSelectInput(gfx::GetXDisplay(), window(), ExposureMask); | |
| 706 event_source->AddXEventDispatcher(this); | |
| 707 } | |
| 708 } | |
| 709 | |
| 710 void NativeViewGLSurfaceGLXOzone::UnregisterEvents() { | |
| 711 ui::X11EventSourceLibevent* event_source = | |
| 712 ui::X11EventSourceLibevent::GetInstance(); | |
| 713 if (event_source) | |
| 714 event_source->RemoveXEventDispatcher(this); | |
| 715 } | |
| 716 | |
| 717 #endif // defined(USE_GLX) | |
| 718 | |
| 654 scoped_refptr<GLSurface> CreateViewGLSurfaceOzone( | 719 scoped_refptr<GLSurface> CreateViewGLSurfaceOzone( |
| 655 gfx::AcceleratedWidget window) { | 720 gfx::AcceleratedWidget window) { |
| 656 scoped_ptr<ui::SurfaceOzoneEGL> surface_ozone = | 721 scoped_ptr<ui::SurfaceOzoneEGL> surface_ozone = |
| 657 ui::OzonePlatform::GetInstance() | 722 ui::OzonePlatform::GetInstance() |
| 658 ->GetSurfaceFactoryOzone() | 723 ->GetSurfaceFactoryOzone() |
| 659 ->CreateEGLSurfaceForWidget(window); | 724 ->CreateEGLSurfaceForWidget(window); |
| 660 if (!surface_ozone) | 725 if (!surface_ozone) |
| 661 return nullptr; | 726 return nullptr; |
| 662 scoped_refptr<GLSurface> surface = | 727 scoped_refptr<GLSurface> surface = |
| 663 new GLSurfaceOzoneEGL(std::move(surface_ozone), window); | 728 new GLSurfaceOzoneEGL(std::move(surface_ozone), window); |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 679 if (!surface->Initialize()) | 744 if (!surface->Initialize()) |
| 680 return nullptr; | 745 return nullptr; |
| 681 return surface; | 746 return surface; |
| 682 } | 747 } |
| 683 | 748 |
| 684 } // namespace | 749 } // namespace |
| 685 | 750 |
| 686 // static | 751 // static |
| 687 bool GLSurface::InitializeOneOffInternal() { | 752 bool GLSurface::InitializeOneOffInternal() { |
| 688 switch (GetGLImplementation()) { | 753 switch (GetGLImplementation()) { |
| 754 #if defined(USE_GLX) | |
| 755 case kGLImplementationDesktopGL: | |
| 756 if (!GLSurfaceGLX::InitializeOneOff()) { | |
| 757 LOG(ERROR) << "GLSurfaceGLX::InitializeOneOff failed."; | |
| 758 return false; | |
| 759 } | |
| 760 | |
| 761 return true; | |
| 762 #endif | |
| 689 case kGLImplementationEGLGLES2: | 763 case kGLImplementationEGLGLES2: |
| 690 if (!GLSurfaceEGL::InitializeOneOff()) { | 764 if (!GLSurfaceEGL::InitializeOneOff()) { |
| 691 LOG(ERROR) << "GLSurfaceEGL::InitializeOneOff failed."; | 765 LOG(ERROR) << "GLSurfaceEGL::InitializeOneOff failed."; |
| 692 return false; | 766 return false; |
| 693 } | 767 } |
| 694 | 768 |
| 695 return true; | 769 return true; |
| 696 case kGLImplementationOSMesaGL: | 770 case kGLImplementationOSMesaGL: |
| 697 case kGLImplementationMockGL: | 771 case kGLImplementationMockGL: |
| 698 return true; | 772 return true; |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 718 if (surface->Initialize()) | 792 if (surface->Initialize()) |
| 719 return surface; | 793 return surface; |
| 720 } | 794 } |
| 721 | 795 |
| 722 return nullptr; | 796 return nullptr; |
| 723 } | 797 } |
| 724 | 798 |
| 725 // static | 799 // static |
| 726 scoped_refptr<GLSurface> GLSurface::CreateViewGLSurface( | 800 scoped_refptr<GLSurface> GLSurface::CreateViewGLSurface( |
| 727 gfx::AcceleratedWidget window) { | 801 gfx::AcceleratedWidget window) { |
| 802 #if defined(USE_GLX) | |
| 803 if (GetGLImplementation() == kGLImplementationDesktopGL) { | |
| 804 scoped_refptr<GLSurface> surface(new NativeViewGLSurfaceGLXOzone(window)); | |
| 805 if (!surface->Initialize()) | |
| 806 return nullptr; | |
| 807 return surface; | |
| 808 } | |
| 809 #endif | |
| 728 if (GetGLImplementation() == kGLImplementationOSMesaGL) { | 810 if (GetGLImplementation() == kGLImplementationOSMesaGL) { |
| 729 scoped_refptr<GLSurface> surface(new GLSurfaceOSMesaHeadless()); | 811 scoped_refptr<GLSurface> surface(new GLSurfaceOSMesaHeadless()); |
| 730 if (!surface->Initialize()) | 812 if (!surface->Initialize()) |
| 731 return nullptr; | 813 return nullptr; |
| 732 return surface; | 814 return surface; |
| 733 } | 815 } |
| 734 DCHECK(GetGLImplementation() == kGLImplementationEGLGLES2); | 816 DCHECK(GetGLImplementation() == kGLImplementationEGLGLES2); |
| 735 if (window != kNullAcceleratedWidget) { | 817 if (window != kNullAcceleratedWidget) { |
| 736 scoped_refptr<GLSurface> surface; | 818 scoped_refptr<GLSurface> surface; |
| 737 if (GLSurfaceEGL::IsEGLSurfacelessContextSupported()) | 819 if (GLSurfaceEGL::IsEGLSurfacelessContextSupported()) |
| 738 surface = CreateViewGLSurfaceOzoneSurfacelessSurfaceImpl(window); | 820 surface = CreateViewGLSurfaceOzoneSurfacelessSurfaceImpl(window); |
| 739 if (!surface) | 821 if (!surface) |
| 740 surface = CreateViewGLSurfaceOzone(window); | 822 surface = CreateViewGLSurfaceOzone(window); |
| 741 return surface; | 823 return surface; |
| 742 } else { | 824 } else { |
| 743 scoped_refptr<GLSurface> surface = new GLSurfaceStub(); | 825 scoped_refptr<GLSurface> surface = new GLSurfaceStub(); |
| 744 if (surface->Initialize()) | 826 if (surface->Initialize()) |
| 745 return surface; | 827 return surface; |
| 746 } | 828 } |
| 747 return nullptr; | 829 return nullptr; |
| 748 } | 830 } |
| 749 | 831 |
| 750 // static | 832 // static |
| 751 scoped_refptr<GLSurface> GLSurface::CreateOffscreenGLSurface( | 833 scoped_refptr<GLSurface> GLSurface::CreateOffscreenGLSurface( |
| 752 const gfx::Size& size) { | 834 const gfx::Size& size) { |
| 753 switch (GetGLImplementation()) { | 835 switch (GetGLImplementation()) { |
| 836 #if defined(USE_GLX) | |
| 837 case kGLImplementationDesktopGL: { | |
| 838 scoped_refptr<GLSurface> surface( | |
| 839 new UnmappedNativeViewGLSurfaceGLX(size)); | |
| 840 if (!surface->Initialize()) | |
| 841 return nullptr; | |
| 842 | |
| 843 return surface; | |
| 844 } | |
| 845 #endif | |
| 754 case kGLImplementationOSMesaGL: { | 846 case kGLImplementationOSMesaGL: { |
| 755 scoped_refptr<GLSurface> surface( | 847 scoped_refptr<GLSurface> surface( |
| 756 new GLSurfaceOSMesa(SURFACE_OSMESA_BGRA, size)); | 848 new GLSurfaceOSMesa(SURFACE_OSMESA_BGRA, size)); |
| 757 if (!surface->Initialize()) | 849 if (!surface->Initialize()) |
| 758 return nullptr; | 850 return nullptr; |
| 759 | 851 |
| 760 return surface; | 852 return surface; |
| 761 } | 853 } |
| 762 case kGLImplementationEGLGLES2: { | 854 case kGLImplementationEGLGLES2: { |
| 763 scoped_refptr<GLSurface> surface; | 855 scoped_refptr<GLSurface> surface; |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 780 } | 872 } |
| 781 } | 873 } |
| 782 | 874 |
| 783 EGLNativeDisplayType GetPlatformDefaultEGLNativeDisplay() { | 875 EGLNativeDisplayType GetPlatformDefaultEGLNativeDisplay() { |
| 784 return ui::OzonePlatform::GetInstance() | 876 return ui::OzonePlatform::GetInstance() |
| 785 ->GetSurfaceFactoryOzone() | 877 ->GetSurfaceFactoryOzone() |
| 786 ->GetNativeDisplay(); | 878 ->GetNativeDisplay(); |
| 787 } | 879 } |
| 788 | 880 |
| 789 } // namespace gfx | 881 } // namespace gfx |
| OLD | NEW |