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

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

Powered by Google App Engine
This is Rietveld 408576698