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

Side by Side Diff: ui/ozone/platform/x11/x11_surface_factory.cc

Issue 2156503003: Have Ozone X11 directly create GLSurfaces. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@new_ozone_gl
Patch Set: Rebase. Created 4 years, 5 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
« no previous file with comments | « ui/ozone/platform/x11/x11_surface_factory.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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/ozone/platform/x11/x11_surface_factory.h" 5 #include "ui/ozone/platform/x11/x11_surface_factory.h"
6 6
7 #include <X11/Xlib.h> 7 #include <X11/Xlib.h>
8 8
9 #include "base/macros.h"
10 #include "base/memory/ptr_util.h"
11 #include "third_party/khronos/EGL/egl.h" 9 #include "third_party/khronos/EGL/egl.h"
12 #include "ui/gfx/vsync_provider.h"
13 #include "ui/gfx/x/x11_types.h" 10 #include "ui/gfx/x/x11_types.h"
11 #include "ui/gl/egl_util.h"
12 #include "ui/gl/gl_surface_egl.h"
14 #include "ui/ozone/common/egl_util.h" 13 #include "ui/ozone/common/egl_util.h"
15 #include "ui/ozone/public/surface_ozone_egl.h"
16 14
17 namespace ui { 15 namespace ui {
18 16
19 namespace { 17 namespace {
20 18
21 class X11SurfaceEGL : public SurfaceOzoneEGL { 19 // GLSurface implementation for Ozone X11 EGL.
20 class GLSurfaceEGLOzoneX11 : public gl::NativeViewGLSurfaceEGL {
22 public: 21 public:
23 explicit X11SurfaceEGL(gfx::AcceleratedWidget widget) : widget_(widget) {} 22 explicit GLSurfaceEGLOzoneX11(EGLNativeWindowType window);
24 ~X11SurfaceEGL() override {}
25 23
26 intptr_t GetNativeWindow() override { return widget_; } 24 // gl::NativeViewGLSurfaceEGL:
27 25 EGLConfig GetConfig() override;
28 bool OnSwapBuffers() override { return true; } 26 bool Resize(const gfx::Size& size,
29 27 float scale_factor,
30 void OnSwapBuffersAsync(const SwapCompletionCallback& callback) override { 28 bool has_alpha) override;
31 NOTREACHED();
32 }
33
34 bool ResizeNativeWindow(const gfx::Size& viewport_size) override {
35 return true;
36 }
37
38 std::unique_ptr<gfx::VSyncProvider> CreateVSyncProvider() override {
39 return nullptr;
40 }
41
42 void* /* EGLConfig */ GetEGLSurfaceConfig(
43 const EglConfigCallbacks& egl) override;
44 29
45 private: 30 private:
46 gfx::AcceleratedWidget widget_; 31 ~GLSurfaceEGLOzoneX11() override;
47 32
48 DISALLOW_COPY_AND_ASSIGN(X11SurfaceEGL); 33 DISALLOW_COPY_AND_ASSIGN(GLSurfaceEGLOzoneX11);
49 }; 34 };
50 35
51 void* /* EGLConfig */ X11SurfaceEGL::GetEGLSurfaceConfig( 36 GLSurfaceEGLOzoneX11::GLSurfaceEGLOzoneX11(EGLNativeWindowType window)
52 const EglConfigCallbacks& egl) { 37 : NativeViewGLSurfaceEGL(window) {}
53 // Try matching the window depth with an alpha channel, 38
54 // because we're worried the destination alpha width could 39 EGLConfig GLSurfaceEGLOzoneX11::GetConfig() {
55 // constrain blending precision. 40 // Try matching the window depth with an alpha channel, because we're worried
56 EGLConfig config; 41 // the destination alpha width could constrain blending precision.
57 const int kBufferSizeOffset = 1; 42 const int kBufferSizeOffset = 1;
58 const int kAlphaSizeOffset = 3; 43 const int kAlphaSizeOffset = 3;
59 EGLint config_attribs[] = {EGL_BUFFER_SIZE, 44 EGLint config_attribs[] = {EGL_BUFFER_SIZE,
60 ~0, // To be replaced. 45 ~0, // To be replaced.
61 EGL_ALPHA_SIZE, 46 EGL_ALPHA_SIZE,
62 8, 47 8,
63 EGL_BLUE_SIZE, 48 EGL_BLUE_SIZE,
64 8, 49 8,
65 EGL_GREEN_SIZE, 50 EGL_GREEN_SIZE,
66 8, 51 8,
67 EGL_RED_SIZE, 52 EGL_RED_SIZE,
68 8, 53 8,
69 EGL_RENDERABLE_TYPE, 54 EGL_RENDERABLE_TYPE,
70 EGL_OPENGL_ES2_BIT, 55 EGL_OPENGL_ES2_BIT,
71 EGL_SURFACE_TYPE, 56 EGL_SURFACE_TYPE,
72 EGL_WINDOW_BIT, 57 EGL_WINDOW_BIT,
73 EGL_NONE}; 58 EGL_NONE};
74 59
75 // Get the depth of XWindow for surface 60 // Get the depth of XWindow for surface.
76 XWindowAttributes win_attribs; 61 XWindowAttributes win_attribs;
77 if (XGetWindowAttributes(gfx::GetXDisplay(), widget_, &win_attribs)) { 62 if (XGetWindowAttributes(gfx::GetXDisplay(), window_, &win_attribs)) {
78 config_attribs[kBufferSizeOffset] = win_attribs.depth; 63 config_attribs[kBufferSizeOffset] = win_attribs.depth;
79 } 64 }
80 65
66 EGLDisplay display = GetDisplay();
67
68 EGLConfig config;
81 EGLint num_configs; 69 EGLint num_configs;
82 if (!egl.choose_config.Run(config_attribs, &config, 1, &num_configs)) { 70 if (!eglChooseConfig(display, config_attribs, &config, 1, &num_configs)) {
83 LOG(ERROR) << "eglChooseConfig failed with error " 71 LOG(ERROR) << "eglChooseConfig failed with error "
84 << egl.get_last_error_string.Run(); 72 << GetLastEGLErrorString();
85 return nullptr; 73 return nullptr;
86 } 74 }
75
87 if (num_configs > 0) { 76 if (num_configs > 0) {
88 EGLint config_depth; 77 EGLint config_depth;
89 if (!egl.get_config_attribute.Run(config, EGL_BUFFER_SIZE, &config_depth)) { 78 if (!eglGetConfigAttrib(display, config, EGL_BUFFER_SIZE, &config_depth)) {
90 LOG(ERROR) << "eglGetConfigAttrib failed with error " 79 LOG(ERROR) << "eglGetConfigAttrib failed with error "
91 << egl.get_last_error_string.Run(); 80 << GetLastEGLErrorString();
92 return nullptr; 81 return nullptr;
93 } 82 }
94 if (config_depth == config_attribs[kBufferSizeOffset]) { 83 if (config_depth == config_attribs[kBufferSizeOffset]) {
95 return config; 84 return config;
96 } 85 }
97 } 86 }
98 87
99 // Try without an alpha channel. 88 // Try without an alpha channel.
100 config_attribs[kAlphaSizeOffset] = 0; 89 config_attribs[kAlphaSizeOffset] = 0;
101 if (!egl.choose_config.Run(config_attribs, &config, 1, &num_configs)) { 90 if (!eglChooseConfig(display, config_attribs, &config, 1, &num_configs)) {
102 LOG(ERROR) << "eglChooseConfig failed with error " 91 LOG(ERROR) << "eglChooseConfig failed with error "
103 << egl.get_last_error_string.Run(); 92 << GetLastEGLErrorString();
104 return nullptr; 93 return nullptr;
105 } 94 }
95
106 if (num_configs == 0) { 96 if (num_configs == 0) {
107 LOG(ERROR) << "No suitable EGL configs found."; 97 LOG(ERROR) << "No suitable EGL configs found.";
108 return nullptr; 98 return nullptr;
109 } 99 }
110 return config; 100 return config;
111 } 101 }
112 102
103 bool GLSurfaceEGLOzoneX11::Resize(const gfx::Size& size,
104 float scale_factor,
105 bool has_alpha) {
106 if (size == GetSize())
107 return true;
108
109 size_ = size;
110
111 eglWaitGL();
112 XResizeWindow(gfx::GetXDisplay(), window_, size.width(), size.height());
113 eglWaitNative(EGL_CORE_NATIVE_ENGINE);
114
115 return true;
116 }
117
118 GLSurfaceEGLOzoneX11::~GLSurfaceEGLOzoneX11() {
119 Destroy();
120 }
121
113 } // namespace 122 } // namespace
114 123
115 X11SurfaceFactory::X11SurfaceFactory() {} 124 X11SurfaceFactory::X11SurfaceFactory() {}
116 125
117 X11SurfaceFactory::~X11SurfaceFactory() {} 126 X11SurfaceFactory::~X11SurfaceFactory() {}
118 127
119 std::unique_ptr<SurfaceOzoneEGL> X11SurfaceFactory::CreateEGLSurfaceForWidget( 128 bool X11SurfaceFactory::UseNewSurfaceAPI() {
129 return true;
130 }
131
132 scoped_refptr<gl::GLSurface> X11SurfaceFactory::CreateViewGLSurface(
133 gl::GLImplementation implementation,
120 gfx::AcceleratedWidget widget) { 134 gfx::AcceleratedWidget widget) {
121 return base::WrapUnique(new X11SurfaceEGL(widget)); 135 if (implementation != gl::kGLImplementationEGLGLES2) {
136 NOTREACHED();
137 return nullptr;
138 }
139
140 return gl::InitializeGLSurface(new GLSurfaceEGLOzoneX11(widget));
141 }
142
143 scoped_refptr<gl::GLSurface> X11SurfaceFactory::CreateOffscreenGLSurface(
144 gl::GLImplementation implementation,
145 const gfx::Size& size) {
146 if (implementation != gl::kGLImplementationEGLGLES2) {
147 NOTREACHED();
148 return nullptr;
149 }
150
151 return gl::InitializeGLSurface(new gl::PbufferGLSurfaceEGL(size));
122 } 152 }
123 153
124 bool X11SurfaceFactory::LoadEGLGLES2Bindings( 154 bool X11SurfaceFactory::LoadEGLGLES2Bindings(
125 AddGLLibraryCallback add_gl_library, 155 AddGLLibraryCallback add_gl_library,
126 SetGLGetProcAddressProcCallback set_gl_get_proc_address) { 156 SetGLGetProcAddressProcCallback set_gl_get_proc_address) {
127 return LoadDefaultEGLGLES2Bindings(add_gl_library, set_gl_get_proc_address); 157 return LoadDefaultEGLGLES2Bindings(add_gl_library, set_gl_get_proc_address);
128 } 158 }
129 159
130 intptr_t X11SurfaceFactory::GetNativeDisplay() { 160 intptr_t X11SurfaceFactory::GetNativeDisplay() {
131 return reinterpret_cast<intptr_t>(gfx::GetXDisplay()); 161 return reinterpret_cast<intptr_t>(gfx::GetXDisplay());
132 } 162 }
133 163
134 } // namespace ui 164 } // namespace ui
OLDNEW
« no previous file with comments | « ui/ozone/platform/x11/x11_surface_factory.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698