Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 // This include must be here so that the includes provided transitively | 5 // This include must be here so that the includes provided transitively |
| 6 // by gl_surface_egl.h don't make it impossible to compile this code. | 6 // by gl_surface_egl.h don't make it impossible to compile this code. |
| 7 #include "third_party/mesa/src/include/GL/osmesa.h" | 7 #include "third_party/mesa/src/include/GL/osmesa.h" |
| 8 | 8 |
| 9 #include "ui/gl/gl_surface_egl.h" | 9 #include "ui/gl/gl_surface_egl.h" |
| 10 | 10 |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 31 #if defined(USE_X11) | 31 #if defined(USE_X11) |
| 32 extern "C" { | 32 extern "C" { |
| 33 #include <X11/Xlib.h> | 33 #include <X11/Xlib.h> |
| 34 } | 34 } |
| 35 #endif | 35 #endif |
| 36 | 36 |
| 37 #if defined (USE_OZONE) | 37 #if defined (USE_OZONE) |
| 38 #include "ui/gfx/ozone/surface_factory_ozone.h" | 38 #include "ui/gfx/ozone/surface_factory_ozone.h" |
| 39 #endif | 39 #endif |
| 40 | 40 |
| 41 // From ANGLE's egl/eglext.h. | |
| 42 #if !defined(EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE) | |
| 43 #define EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE \ | |
| 44 reinterpret_cast<EGLNativeDisplayType>(-2) | |
| 45 #endif | |
| 46 #if !defined(EGL_FIXED_SIZE_ANGLE) | 41 #if !defined(EGL_FIXED_SIZE_ANGLE) |
| 47 #define EGL_FIXED_SIZE_ANGLE 0x3201 | 42 #define EGL_FIXED_SIZE_ANGLE 0x3201 |
| 48 #endif | 43 #endif |
| 49 | 44 |
| 50 using ui::GetLastEGLErrorString; | 45 using ui::GetLastEGLErrorString; |
| 51 | 46 |
| 52 namespace gfx { | 47 namespace gfx { |
| 53 | 48 |
| 54 namespace { | 49 namespace { |
| 55 | 50 |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 115 LOG(ERROR) << "No suitable EGL configs found."; | 110 LOG(ERROR) << "No suitable EGL configs found."; |
| 116 return false; | 111 return false; |
| 117 } | 112 } |
| 118 return true; | 113 return true; |
| 119 } | 114 } |
| 120 | 115 |
| 121 } // namespace | 116 } // namespace |
| 122 | 117 |
| 123 GLSurfaceEGL::GLSurfaceEGL() {} | 118 GLSurfaceEGL::GLSurfaceEGL() {} |
| 124 | 119 |
| 125 bool GLSurfaceEGL::InitializeOneOff() { | 120 bool GLSurfaceEGL::InitializeOneOff(EGLNativeDisplayType native_display) { |
|
rjkroege
2014/03/24 15:27:25
I like this transformation of pulling the platform
spang
2014/03/24 18:17:08
Per our discussion, I added GetPlatformDefaultEGLD
| |
| 126 static bool initialized = false; | 121 static bool initialized = false; |
| 127 if (initialized) | 122 if (initialized) |
| 128 return true; | 123 return true; |
| 129 | 124 |
| 130 #if defined(USE_X11) | 125 g_native_display = native_display; |
| 131 g_native_display = base::MessagePumpForUI::GetDefaultXDisplay(); | |
| 132 #elif defined(OS_WIN) | |
| 133 g_native_display = EGL_DEFAULT_DISPLAY; | |
| 134 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kDisableD3D11) && | |
| 135 CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableD3D11)) { | |
| 136 g_native_display = EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE; | |
| 137 } | |
| 138 #elif defined(USE_OZONE) | |
| 139 gfx::SurfaceFactoryOzone* surface_factory = | |
| 140 gfx::SurfaceFactoryOzone::GetInstance(); | |
| 141 if (surface_factory->InitializeHardware() != | |
| 142 gfx::SurfaceFactoryOzone::INITIALIZED) { | |
| 143 LOG(ERROR) << "OZONE failed to initialize hardware"; | |
| 144 return false; | |
| 145 } | |
| 146 g_native_display = surface_factory->GetNativeDisplay(); | |
| 147 #else | |
| 148 g_native_display = EGL_DEFAULT_DISPLAY; | |
| 149 #endif | |
| 150 g_display = eglGetDisplay(g_native_display); | 126 g_display = eglGetDisplay(g_native_display); |
| 151 if (!g_display) { | 127 if (!g_display) { |
| 152 LOG(ERROR) << "eglGetDisplay failed with error " << GetLastEGLErrorString(); | 128 LOG(ERROR) << "eglGetDisplay failed with error " << GetLastEGLErrorString(); |
| 153 return false; | 129 return false; |
| 154 } | 130 } |
| 155 | 131 |
| 156 if (!eglInitialize(g_display, NULL, NULL)) { | 132 if (!eglInitialize(g_display, NULL, NULL)) { |
| 157 LOG(ERROR) << "eglInitialize failed with error " << GetLastEGLErrorString(); | 133 LOG(ERROR) << "eglInitialize failed with error " << GetLastEGLErrorString(); |
| 158 return false; | 134 return false; |
| 159 } | 135 } |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 185 EGLint* choose_attributes = config_attribs_8888; | 161 EGLint* choose_attributes = config_attribs_8888; |
| 186 | 162 |
| 187 #if defined(OS_ANDROID) | 163 #if defined(OS_ANDROID) |
| 188 if (base::android::SysUtils::IsLowEndDevice()) { | 164 if (base::android::SysUtils::IsLowEndDevice()) { |
| 189 choose_attributes = config_attribs_565; | 165 choose_attributes = config_attribs_565; |
| 190 } | 166 } |
| 191 #endif | 167 #endif |
| 192 | 168 |
| 193 #if defined(USE_OZONE) | 169 #if defined(USE_OZONE) |
| 194 const EGLint* config_attribs = | 170 const EGLint* config_attribs = |
| 195 surface_factory->GetEGLSurfaceProperties(choose_attributes); | 171 SurfaceFactoryOzone::GetInstance()->GetEGLSurfaceProperties( |
| 172 choose_attributes); | |
| 196 #else | 173 #else |
| 197 const EGLint* config_attribs = choose_attributes; | 174 const EGLint* config_attribs = choose_attributes; |
| 198 #endif | 175 #endif |
| 199 | 176 |
| 200 EGLint num_configs; | 177 EGLint num_configs; |
| 201 EGLint config_size = 1; | 178 EGLint config_size = 1; |
| 202 EGLConfig* config_data = &g_config; | 179 EGLConfig* config_data = &g_config; |
| 203 // Validate if there are any configs for given atrribs. | 180 // Validate if there are any configs for given atrribs. |
| 204 if (!ValidateEglConfig(g_display, | 181 if (!ValidateEglConfig(g_display, |
| 205 config_attribs, | 182 config_attribs, |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 321 } | 298 } |
| 322 | 299 |
| 323 bool GLSurfaceEGL::HasEGLExtension(const char* name) { | 300 bool GLSurfaceEGL::HasEGLExtension(const char* name) { |
| 324 return ExtensionsContain(GetEGLExtensions(), name); | 301 return ExtensionsContain(GetEGLExtensions(), name); |
| 325 } | 302 } |
| 326 | 303 |
| 327 bool GLSurfaceEGL::IsCreateContextRobustnessSupported() { | 304 bool GLSurfaceEGL::IsCreateContextRobustnessSupported() { |
| 328 return g_egl_create_context_robustness_supported; | 305 return g_egl_create_context_robustness_supported; |
| 329 } | 306 } |
| 330 | 307 |
| 308 bool GLSurfaceEGL::IsEGLSurfacelessContextSupported() { | |
| 309 return g_egl_surfaceless_context_supported; | |
| 310 } | |
| 311 | |
| 331 GLSurfaceEGL::~GLSurfaceEGL() {} | 312 GLSurfaceEGL::~GLSurfaceEGL() {} |
| 332 | 313 |
| 333 NativeViewGLSurfaceEGL::NativeViewGLSurfaceEGL(EGLNativeWindowType window) | 314 NativeViewGLSurfaceEGL::NativeViewGLSurfaceEGL(EGLNativeWindowType window) |
| 334 : window_(window), | 315 : window_(window), |
| 335 surface_(NULL), | 316 surface_(NULL), |
| 336 supports_post_sub_buffer_(false), | 317 supports_post_sub_buffer_(false), |
| 337 config_(NULL), | 318 config_(NULL), |
| 338 size_(1, 1) { | 319 size_(1, 1) { |
| 339 #if defined(OS_ANDROID) | 320 #if defined(OS_ANDROID) |
| 340 if (window) | 321 if (window) |
| (...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 754 return EGL_NO_SURFACE; | 735 return EGL_NO_SURFACE; |
| 755 } | 736 } |
| 756 | 737 |
| 757 void* SurfacelessEGL::GetShareHandle() { | 738 void* SurfacelessEGL::GetShareHandle() { |
| 758 return NULL; | 739 return NULL; |
| 759 } | 740 } |
| 760 | 741 |
| 761 SurfacelessEGL::~SurfacelessEGL() { | 742 SurfacelessEGL::~SurfacelessEGL() { |
| 762 } | 743 } |
| 763 | 744 |
| 764 #if defined(ANDROID) || defined(USE_OZONE) | |
| 765 | |
| 766 // A thin subclass of |GLSurfaceOSMesa| that can be used in place | |
| 767 // of a native hardware-provided surface when a native surface | |
| 768 // provider is not available. | |
| 769 class GLSurfaceOSMesaHeadless : public GLSurfaceOSMesa { | |
| 770 public: | |
| 771 explicit GLSurfaceOSMesaHeadless(); | |
| 772 | |
| 773 virtual bool IsOffscreen() OVERRIDE; | |
| 774 virtual bool SwapBuffers() OVERRIDE; | |
| 775 | |
| 776 protected: | |
| 777 virtual ~GLSurfaceOSMesaHeadless(); | |
| 778 | |
| 779 private: | |
| 780 | |
| 781 DISALLOW_COPY_AND_ASSIGN(GLSurfaceOSMesaHeadless); | |
| 782 }; | |
| 783 | |
| 784 bool GLSurfaceOSMesaHeadless::IsOffscreen() { return false; } | |
| 785 | |
| 786 bool GLSurfaceOSMesaHeadless::SwapBuffers() { return true; } | |
| 787 | |
| 788 GLSurfaceOSMesaHeadless::GLSurfaceOSMesaHeadless() | |
| 789 : GLSurfaceOSMesa(OSMESA_BGRA, gfx::Size(1, 1)) {} | |
| 790 | |
| 791 GLSurfaceOSMesaHeadless::~GLSurfaceOSMesaHeadless() { Destroy(); } | |
| 792 | |
| 793 // static | |
| 794 bool GLSurface::InitializeOneOffInternal() { | |
| 795 switch (GetGLImplementation()) { | |
| 796 case kGLImplementationEGLGLES2: | |
| 797 if (!GLSurfaceEGL::InitializeOneOff()) { | |
| 798 LOG(ERROR) << "GLSurfaceEGL::InitializeOneOff failed."; | |
| 799 return false; | |
| 800 } | |
| 801 default: | |
| 802 break; | |
| 803 } | |
| 804 return true; | |
| 805 } | |
| 806 | |
| 807 // static | |
| 808 scoped_refptr<GLSurface> | |
| 809 GLSurface::CreateViewGLSurface(gfx::AcceleratedWidget window) { | |
| 810 | |
| 811 if (GetGLImplementation() == kGLImplementationOSMesaGL) { | |
| 812 scoped_refptr<GLSurface> surface(new GLSurfaceOSMesaHeadless()); | |
| 813 if (!surface->Initialize()) | |
| 814 return NULL; | |
| 815 return surface; | |
| 816 } | |
| 817 DCHECK(GetGLImplementation() == kGLImplementationEGLGLES2); | |
| 818 if (window != kNullAcceleratedWidget) { | |
| 819 EGLNativeWindowType egl_window; | |
| 820 scoped_refptr<NativeViewGLSurfaceEGL> surface; | |
| 821 scoped_ptr<VSyncProvider> sync_provider; | |
| 822 #if defined(USE_OZONE) | |
| 823 egl_window = | |
| 824 gfx::SurfaceFactoryOzone::GetInstance()->RealizeAcceleratedWidget( | |
| 825 window); | |
| 826 sync_provider = | |
| 827 gfx::SurfaceFactoryOzone::GetInstance()->CreateVSyncProvider( | |
| 828 egl_window); | |
| 829 #else | |
| 830 egl_window = window; | |
| 831 #endif | |
| 832 surface = new NativeViewGLSurfaceEGL(egl_window); | |
| 833 if(surface->Initialize(sync_provider.Pass())) | |
| 834 return surface; | |
| 835 } else { | |
| 836 scoped_refptr<GLSurface> surface = new GLSurfaceStub(); | |
| 837 if (surface->Initialize()) | |
| 838 return surface; | |
| 839 } | |
| 840 return NULL; | |
| 841 } | |
| 842 | |
| 843 // static | |
| 844 scoped_refptr<GLSurface> | |
| 845 GLSurface::CreateOffscreenGLSurface(const gfx::Size& size) { | |
| 846 switch (GetGLImplementation()) { | |
| 847 case kGLImplementationOSMesaGL: { | |
| 848 scoped_refptr<GLSurface> surface(new GLSurfaceOSMesa(1, size)); | |
| 849 if (!surface->Initialize()) | |
| 850 return NULL; | |
| 851 | |
| 852 return surface; | |
| 853 } | |
| 854 case kGLImplementationEGLGLES2: { | |
| 855 scoped_refptr<GLSurface> surface; | |
| 856 if (g_egl_surfaceless_context_supported && | |
| 857 (size.width() == 0 && size.height() == 0)) { | |
| 858 surface = new SurfacelessEGL(size); | |
| 859 } else | |
| 860 surface = new PbufferGLSurfaceEGL(size); | |
| 861 | |
| 862 if (!surface->Initialize()) | |
| 863 return NULL; | |
| 864 return surface; | |
| 865 } | |
| 866 default: | |
| 867 NOTREACHED(); | |
| 868 return NULL; | |
| 869 } | |
| 870 } | |
| 871 | |
| 872 #endif | |
| 873 | |
| 874 } // namespace gfx | 745 } // namespace gfx |
| OLD | NEW |