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 #if defined(OZONE_X11) | |
| 8 extern "C" { | |
| 9 #include <X11/Xlib.h> | |
| 10 } | |
| 11 #endif | |
| 12 | |
| 7 #include "base/logging.h" | 13 #include "base/logging.h" |
| 8 #include "base/memory/ref_counted.h" | 14 #include "base/memory/ref_counted.h" |
| 9 #include "ui/gfx/native_widget_types.h" | 15 #include "ui/gfx/native_widget_types.h" |
| 16 #include "ui/gl/egl_util.h" | |
| 10 #include "ui/gl/gl_context.h" | 17 #include "ui/gl/gl_context.h" |
| 11 #include "ui/gl/gl_image.h" | 18 #include "ui/gl/gl_image.h" |
| 12 #include "ui/gl/gl_implementation.h" | 19 #include "ui/gl/gl_implementation.h" |
| 13 #include "ui/gl/gl_surface_egl.h" | 20 #include "ui/gl/gl_surface_egl.h" |
| 14 #include "ui/gl/gl_surface_osmesa.h" | 21 #include "ui/gl/gl_surface_osmesa.h" |
| 15 #include "ui/gl/gl_surface_stub.h" | 22 #include "ui/gl/gl_surface_stub.h" |
| 16 #include "ui/gl/scoped_make_current.h" | 23 #include "ui/gl/scoped_make_current.h" |
| 17 #include "ui/ozone/public/surface_factory_ozone.h" | 24 #include "ui/ozone/public/surface_factory_ozone.h" |
| 18 #include "ui/ozone/public/surface_ozone_egl.h" | 25 #include "ui/ozone/public/surface_ozone_egl.h" |
| 19 | 26 |
| 27 using ui::GetLastEGLErrorString; | |
| 28 | |
| 20 namespace gfx { | 29 namespace gfx { |
| 21 | 30 |
| 22 namespace { | 31 namespace { |
| 23 | 32 |
| 24 // A thin wrapper around GLSurfaceEGL that owns the EGLNativeWindow | 33 // A thin wrapper around GLSurfaceEGL that owns the EGLNativeWindow |
| 25 class GL_EXPORT GLSurfaceOzoneEGL : public NativeViewGLSurfaceEGL { | 34 class GL_EXPORT GLSurfaceOzoneEGL : public NativeViewGLSurfaceEGL { |
| 26 public: | 35 public: |
| 27 GLSurfaceOzoneEGL(scoped_ptr<ui::SurfaceOzoneEGL> ozone_surface, | 36 GLSurfaceOzoneEGL(scoped_ptr<ui::SurfaceOzoneEGL> ozone_surface, |
| 28 AcceleratedWidget widget) | 37 AcceleratedWidget widget) |
| 29 : NativeViewGLSurfaceEGL(ozone_surface->GetNativeWindow()), | 38 : NativeViewGLSurfaceEGL(ozone_surface->GetNativeWindow()), |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 49 return ozone_surface_->OnSwapBuffers(); | 58 return ozone_surface_->OnSwapBuffers(); |
| 50 } | 59 } |
| 51 virtual bool ScheduleOverlayPlane(int z_order, | 60 virtual bool ScheduleOverlayPlane(int z_order, |
| 52 OverlayTransform transform, | 61 OverlayTransform transform, |
| 53 GLImage* image, | 62 GLImage* image, |
| 54 const Rect& bounds_rect, | 63 const Rect& bounds_rect, |
| 55 const RectF& crop_rect) override { | 64 const RectF& crop_rect) override { |
| 56 return image->ScheduleOverlayPlane( | 65 return image->ScheduleOverlayPlane( |
| 57 widget_, z_order, transform, bounds_rect, crop_rect); | 66 widget_, z_order, transform, bounds_rect, crop_rect); |
| 58 } | 67 } |
| 68 virtual bool SupportsPostSubBuffer() override { | |
| 69 return NativeViewGLSurfaceEGL::SupportsPostSubBuffer() && | |
| 70 ozone_surface_->SupportsPartialSwap(); | |
| 71 } | |
| 72 | |
| 73 #if defined(OZONE_X11) | |
|
spang
2014/11/24 18:56:54
please don't use an #ifdef for this, it is very wr
achaulk
2014/11/24 19:28:39
Well it won't work on non-X builds since XGetWindo
| |
| 74 EGLConfig GetConfig() override { | |
| 75 if (!config_) { | |
| 76 // Get a config compatible with the window | |
| 77 DCHECK(window_); | |
| 78 XWindowAttributes win_attribs; | |
| 79 if (!XGetWindowAttributes(reinterpret_cast<Display*>(GetNativeDisplay()), | |
| 80 window_, &win_attribs)) { | |
| 81 return NULL; | |
| 82 } | |
| 83 | |
| 84 // Try matching the window depth with an alpha channel, | |
| 85 // because we're worried the destination alpha width could | |
| 86 // constrain blending precision. | |
| 87 const int kBufferSizeOffset = 1; | |
| 88 const int kAlphaSizeOffset = 3; | |
| 89 EGLint config_attribs[] = {EGL_BUFFER_SIZE, | |
| 90 ~0, | |
| 91 EGL_ALPHA_SIZE, | |
| 92 8, | |
| 93 EGL_BLUE_SIZE, | |
| 94 8, | |
| 95 EGL_GREEN_SIZE, | |
| 96 8, | |
| 97 EGL_RED_SIZE, | |
| 98 8, | |
| 99 EGL_RENDERABLE_TYPE, | |
| 100 EGL_OPENGL_ES2_BIT, | |
| 101 EGL_SURFACE_TYPE, | |
| 102 EGL_WINDOW_BIT | EGL_PBUFFER_BIT, | |
| 103 EGL_NONE}; | |
| 104 config_attribs[kBufferSizeOffset] = win_attribs.depth; | |
| 105 | |
| 106 EGLint num_configs; | |
| 107 if (!eglChooseConfig(GetDisplay(), config_attribs, &config_, 1, | |
| 108 &num_configs)) { | |
| 109 LOG(ERROR) << "eglChooseConfig failed with error " | |
| 110 << GetLastEGLErrorString(); | |
| 111 return NULL; | |
| 112 } | |
| 113 | |
| 114 if (num_configs) { | |
| 115 EGLint config_depth; | |
| 116 if (!eglGetConfigAttrib(GetDisplay(), config_, EGL_BUFFER_SIZE, | |
| 117 &config_depth)) { | |
| 118 LOG(ERROR) << "eglGetConfigAttrib failed with error " | |
| 119 << GetLastEGLErrorString(); | |
| 120 return NULL; | |
| 121 } | |
| 122 | |
| 123 if (config_depth == win_attribs.depth) { | |
| 124 return config_; | |
| 125 } | |
| 126 } | |
| 127 | |
| 128 // Try without an alpha channel. | |
| 129 config_attribs[kAlphaSizeOffset] = 0; | |
| 130 if (!eglChooseConfig(GetDisplay(), config_attribs, &config_, 1, | |
| 131 &num_configs)) { | |
| 132 LOG(ERROR) << "eglChooseConfig failed with error " | |
| 133 << GetLastEGLErrorString(); | |
| 134 return NULL; | |
| 135 } | |
| 136 | |
| 137 if (num_configs == 0) { | |
| 138 LOG(ERROR) << "No suitable EGL configs found."; | |
| 139 return NULL; | |
| 140 } | |
| 141 } | |
| 142 return config_; | |
| 143 } | |
| 144 #endif | |
| 59 | 145 |
| 60 private: | 146 private: |
| 61 using NativeViewGLSurfaceEGL::Initialize; | 147 using NativeViewGLSurfaceEGL::Initialize; |
| 62 | 148 |
| 63 virtual ~GLSurfaceOzoneEGL() { | 149 virtual ~GLSurfaceOzoneEGL() { |
| 64 Destroy(); // EGL surface must be destroyed before SurfaceOzone | 150 Destroy(); // EGL surface must be destroyed before SurfaceOzone |
| 65 } | 151 } |
| 66 | 152 |
| 67 bool ReinitializeNativeSurface() { | 153 bool ReinitializeNativeSurface() { |
| 68 scoped_ptr<ui::ScopedMakeCurrent> scoped_make_current; | 154 scoped_ptr<ui::ScopedMakeCurrent> scoped_make_current; |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 131 GLImage* image, | 217 GLImage* image, |
| 132 const Rect& bounds_rect, | 218 const Rect& bounds_rect, |
| 133 const RectF& crop_rect) override { | 219 const RectF& crop_rect) override { |
| 134 return image->ScheduleOverlayPlane( | 220 return image->ScheduleOverlayPlane( |
| 135 widget_, z_order, transform, bounds_rect, crop_rect); | 221 widget_, z_order, transform, bounds_rect, crop_rect); |
| 136 } | 222 } |
| 137 virtual bool IsOffscreen() override { return false; } | 223 virtual bool IsOffscreen() override { return false; } |
| 138 virtual VSyncProvider* GetVSyncProvider() override { | 224 virtual VSyncProvider* GetVSyncProvider() override { |
| 139 return vsync_provider_.get(); | 225 return vsync_provider_.get(); |
| 140 } | 226 } |
| 141 virtual bool SupportsPostSubBuffer() override { return true; } | 227 virtual bool SupportsPostSubBuffer() override { |
| 228 return ozone_surface_->SupportsPartialSwap(); | |
| 229 } | |
| 142 virtual bool PostSubBuffer(int x, int y, int width, int height) override { | 230 virtual bool PostSubBuffer(int x, int y, int width, int height) override { |
| 143 // The actual sub buffer handling is handled at higher layers. | 231 // The actual sub buffer handling is handled at higher layers. |
| 144 SwapBuffers(); | 232 SwapBuffers(); |
| 145 return true; | 233 return true; |
| 146 } | 234 } |
| 147 | 235 |
| 148 private: | 236 private: |
| 149 virtual ~GLSurfaceOzoneSurfaceless() { | 237 virtual ~GLSurfaceOzoneSurfaceless() { |
| 150 Destroy(); // EGL surface must be destroyed before SurfaceOzone | 238 Destroy(); // EGL surface must be destroyed before SurfaceOzone |
| 151 } | 239 } |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 247 NOTREACHED(); | 335 NOTREACHED(); |
| 248 return NULL; | 336 return NULL; |
| 249 } | 337 } |
| 250 } | 338 } |
| 251 | 339 |
| 252 EGLNativeDisplayType GetPlatformDefaultEGLNativeDisplay() { | 340 EGLNativeDisplayType GetPlatformDefaultEGLNativeDisplay() { |
| 253 return ui::SurfaceFactoryOzone::GetInstance()->GetNativeDisplay(); | 341 return ui::SurfaceFactoryOzone::GetInstance()->GetNativeDisplay(); |
| 254 } | 342 } |
| 255 | 343 |
| 256 } // namespace gfx | 344 } // namespace gfx |
| OLD | NEW |