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

Side by Side Diff: ui/gl/gl_surface_ozone.cc

Issue 1723303002: Implement GLX for Ozone X11. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Move refactor to new CL. Created 4 years, 8 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 // 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
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 601 matching lines...) Expand 10 before | Expand all | Expand 10 after
646 images_[i]->Destroy(true); 653 images_[i]->Destroy(true);
647 images_[i] = image; 654 images_[i] = image;
648 // Bind image to texture. 655 // Bind image to texture.
649 ScopedTextureBinder binder(GL_TEXTURE_2D, textures_[i]); 656 ScopedTextureBinder binder(GL_TEXTURE_2D, textures_[i]);
650 if (!images_[i]->BindTexImage(GL_TEXTURE_2D)) 657 if (!images_[i]->BindTexImage(GL_TEXTURE_2D))
651 return false; 658 return false;
652 } 659 }
653 return true; 660 return true;
654 } 661 }
655 662
663 #if defined(USE_GLX)
664
665 // Ozone specific implementation of GLX surface. Registers as XEventDispatcher
666 // to handle XEvents.
667 class GL_EXPORT NativeViewGLSurfaceGLXOzone : public NativeViewGLSurfaceGLX,
668 public ui::XEventDispatcher {
669 public:
670 explicit NativeViewGLSurfaceGLXOzone(gfx::AcceleratedWidget window);
671
672 // XEventDispatcher implementation:
673 bool DispatchXEvent(XEvent* xevent) override;
674
675 protected:
676 ~NativeViewGLSurfaceGLXOzone() override;
677
678 // NativeViewGLSurfaceGLX implementation:
679 void RegisterEvents() override;
680 void UnregisterEvents() override;
681
682 private:
683 DISALLOW_COPY_AND_ASSIGN(NativeViewGLSurfaceGLXOzone);
684 };
685
686 NativeViewGLSurfaceGLXOzone::NativeViewGLSurfaceGLXOzone(
687 gfx::AcceleratedWidget window)
688 : NativeViewGLSurfaceGLX(window) {}
689
690 bool NativeViewGLSurfaceGLXOzone::DispatchXEvent(XEvent* event) {
691 if (!CanHandleEvent(event))
692 return false;
693
694 ForwardExposeEvent(event);
695 return true;
696 }
697
698 NativeViewGLSurfaceGLXOzone::~NativeViewGLSurfaceGLXOzone() {
699 Destroy();
700 }
701
702 void NativeViewGLSurfaceGLXOzone::RegisterEvents() {
703 ui::X11EventSourceLibevent* event_source =
704 ui::X11EventSourceLibevent::GetInstance();
705 // Can be nullptr in tests, when we don't care about Exposes.
706 if (event_source) {
707 XSelectInput(gfx::GetXDisplay(), window(), ExposureMask);
708 event_source->AddXEventDispatcher(this);
709 }
710 }
711
712 void NativeViewGLSurfaceGLXOzone::UnregisterEvents() {
713 ui::X11EventSourceLibevent* event_source =
714 ui::X11EventSourceLibevent::GetInstance();
715 if (event_source)
716 event_source->RemoveXEventDispatcher(this);
717 }
718
719 #endif // defined(USE_GLX)
720
656 scoped_refptr<GLSurface> CreateViewGLSurfaceOzone( 721 scoped_refptr<GLSurface> CreateViewGLSurfaceOzone(
657 gfx::AcceleratedWidget window) { 722 gfx::AcceleratedWidget window) {
658 std::unique_ptr<ui::SurfaceOzoneEGL> surface_ozone = 723 std::unique_ptr<ui::SurfaceOzoneEGL> surface_ozone =
659 ui::OzonePlatform::GetInstance() 724 ui::OzonePlatform::GetInstance()
660 ->GetSurfaceFactoryOzone() 725 ->GetSurfaceFactoryOzone()
661 ->CreateEGLSurfaceForWidget(window); 726 ->CreateEGLSurfaceForWidget(window);
662 if (!surface_ozone) 727 if (!surface_ozone)
663 return nullptr; 728 return nullptr;
664 scoped_refptr<GLSurface> surface = 729 scoped_refptr<GLSurface> surface =
665 new GLSurfaceOzoneEGL(std::move(surface_ozone), window); 730 new GLSurfaceOzoneEGL(std::move(surface_ozone), window);
(...skipping 15 matching lines...) Expand all
681 if (!surface->Initialize()) 746 if (!surface->Initialize())
682 return nullptr; 747 return nullptr;
683 return surface; 748 return surface;
684 } 749 }
685 750
686 } // namespace 751 } // namespace
687 752
688 // static 753 // static
689 bool GLSurface::InitializeOneOffInternal() { 754 bool GLSurface::InitializeOneOffInternal() {
690 switch (GetGLImplementation()) { 755 switch (GetGLImplementation()) {
756 #if defined(USE_GLX)
757 case kGLImplementationDesktopGL:
758 if (!GLSurfaceGLX::InitializeOneOff()) {
759 LOG(ERROR) << "GLSurfaceGLX::InitializeOneOff failed.";
760 return false;
761 }
762
763 return true;
764 #endif
691 case kGLImplementationEGLGLES2: 765 case kGLImplementationEGLGLES2:
692 if (!GLSurfaceEGL::InitializeOneOff()) { 766 if (!GLSurfaceEGL::InitializeOneOff()) {
693 LOG(ERROR) << "GLSurfaceEGL::InitializeOneOff failed."; 767 LOG(ERROR) << "GLSurfaceEGL::InitializeOneOff failed.";
694 return false; 768 return false;
695 } 769 }
696 770
697 return true; 771 return true;
698 case kGLImplementationOSMesaGL: 772 case kGLImplementationOSMesaGL:
699 case kGLImplementationMockGL: 773 case kGLImplementationMockGL:
700 return true; 774 return true;
(...skipping 19 matching lines...) Expand all
720 if (surface->Initialize()) 794 if (surface->Initialize())
721 return surface; 795 return surface;
722 } 796 }
723 797
724 return nullptr; 798 return nullptr;
725 } 799 }
726 800
727 // static 801 // static
728 scoped_refptr<GLSurface> GLSurface::CreateViewGLSurface( 802 scoped_refptr<GLSurface> GLSurface::CreateViewGLSurface(
729 gfx::AcceleratedWidget window) { 803 gfx::AcceleratedWidget window) {
804 #if defined(USE_GLX)
805 if (GetGLImplementation() == kGLImplementationDesktopGL) {
806 scoped_refptr<GLSurface> surface(new NativeViewGLSurfaceGLXOzone(window));
807 if (!surface->Initialize())
808 return nullptr;
809 return surface;
810 }
811 #endif
730 if (GetGLImplementation() == kGLImplementationOSMesaGL) { 812 if (GetGLImplementation() == kGLImplementationOSMesaGL) {
731 scoped_refptr<GLSurface> surface(new GLSurfaceOSMesaHeadless()); 813 scoped_refptr<GLSurface> surface(new GLSurfaceOSMesaHeadless());
732 if (!surface->Initialize()) 814 if (!surface->Initialize())
733 return nullptr; 815 return nullptr;
734 return surface; 816 return surface;
735 } 817 }
736 DCHECK(GetGLImplementation() == kGLImplementationEGLGLES2); 818 DCHECK(GetGLImplementation() == kGLImplementationEGLGLES2);
737 if (window != kNullAcceleratedWidget) { 819 if (window != kNullAcceleratedWidget) {
738 scoped_refptr<GLSurface> surface; 820 scoped_refptr<GLSurface> surface;
739 if (GLSurfaceEGL::IsEGLSurfacelessContextSupported()) 821 if (GLSurfaceEGL::IsEGLSurfacelessContextSupported())
740 surface = CreateViewGLSurfaceOzoneSurfacelessSurfaceImpl(window); 822 surface = CreateViewGLSurfaceOzoneSurfacelessSurfaceImpl(window);
741 if (!surface) 823 if (!surface)
742 surface = CreateViewGLSurfaceOzone(window); 824 surface = CreateViewGLSurfaceOzone(window);
743 return surface; 825 return surface;
744 } else { 826 } else {
745 scoped_refptr<GLSurface> surface = new GLSurfaceStub(); 827 scoped_refptr<GLSurface> surface = new GLSurfaceStub();
746 if (surface->Initialize()) 828 if (surface->Initialize())
747 return surface; 829 return surface;
748 } 830 }
749 return nullptr; 831 return nullptr;
750 } 832 }
751 833
752 // static 834 // static
753 scoped_refptr<GLSurface> GLSurface::CreateOffscreenGLSurface( 835 scoped_refptr<GLSurface> GLSurface::CreateOffscreenGLSurface(
754 const gfx::Size& size) { 836 const gfx::Size& size) {
755 switch (GetGLImplementation()) { 837 switch (GetGLImplementation()) {
838 #if defined(USE_GLX)
839 case kGLImplementationDesktopGL: {
840 scoped_refptr<GLSurface> surface(
841 new UnmappedNativeViewGLSurfaceGLX(size));
842 if (!surface->Initialize())
843 return nullptr;
844
845 return surface;
846 }
847 #endif
756 case kGLImplementationOSMesaGL: { 848 case kGLImplementationOSMesaGL: {
757 scoped_refptr<GLSurface> surface( 849 scoped_refptr<GLSurface> surface(
758 new GLSurfaceOSMesa(SURFACE_OSMESA_BGRA, size)); 850 new GLSurfaceOSMesa(SURFACE_OSMESA_BGRA, size));
759 if (!surface->Initialize()) 851 if (!surface->Initialize())
760 return nullptr; 852 return nullptr;
761 853
762 return surface; 854 return surface;
763 } 855 }
764 case kGLImplementationEGLGLES2: { 856 case kGLImplementationEGLGLES2: {
765 scoped_refptr<GLSurface> surface; 857 scoped_refptr<GLSurface> surface;
(...skipping 16 matching lines...) Expand all
782 } 874 }
783 } 875 }
784 876
785 EGLNativeDisplayType GetPlatformDefaultEGLNativeDisplay() { 877 EGLNativeDisplayType GetPlatformDefaultEGLNativeDisplay() {
786 return ui::OzonePlatform::GetInstance() 878 return ui::OzonePlatform::GetInstance()
787 ->GetSurfaceFactoryOzone() 879 ->GetSurfaceFactoryOzone()
788 ->GetNativeDisplay(); 880 ->GetNativeDisplay();
789 } 881 }
790 882
791 } // namespace gfx 883 } // namespace gfx
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698