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

Side by Side Diff: ui/gfx/gl/gl_surface_glx.cc

Issue 8873018: Less X connections. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address reviewer comments. Created 9 years 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 | Annotate | Revision Log
« no previous file with comments | « ui/gfx/gl/gl_surface_egl.cc ('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 (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 extern "C" { 5 extern "C" {
6 #include <X11/Xlib.h> 6 #include <X11/Xlib.h>
7 } 7 }
8 8
9 #include "ui/gfx/gl/gl_surface_glx.h" 9 #include "ui/gfx/gl/gl_surface_glx.h"
10 10
(...skipping 13 matching lines...) Expand all
24 // scoped_ptr functor for XFree(). Use as follows: 24 // scoped_ptr functor for XFree(). Use as follows:
25 // scoped_ptr_malloc<XVisualInfo, ScopedPtrXFree> foo(...); 25 // scoped_ptr_malloc<XVisualInfo, ScopedPtrXFree> foo(...);
26 // where "XVisualInfo" is any X type that is freed with XFree. 26 // where "XVisualInfo" is any X type that is freed with XFree.
27 class ScopedPtrXFree { 27 class ScopedPtrXFree {
28 public: 28 public:
29 void operator()(void* x) const { 29 void operator()(void* x) const {
30 ::XFree(x); 30 ::XFree(x);
31 } 31 }
32 }; 32 };
33 33
34 Display* g_display;
35 const char* g_glx_extensions = NULL; 34 const char* g_glx_extensions = NULL;
36 bool g_glx_create_context_robustness_supported = false; 35 bool g_glx_create_context_robustness_supported = false;
37 36
38 } // namespace anonymous 37 } // namespace anonymous
39 38
40 GLSurfaceGLX::GLSurfaceGLX() { 39 GLSurfaceGLX::GLSurfaceGLX() {
41 } 40 }
42 41
43 GLSurfaceGLX::~GLSurfaceGLX() { 42 GLSurfaceGLX::~GLSurfaceGLX() {
44 } 43 }
45 44
46 bool GLSurfaceGLX::InitializeOneOff() { 45 bool GLSurfaceGLX::InitializeOneOff() {
47 static bool initialized = false; 46 static bool initialized = false;
48 if (initialized) 47 if (initialized)
49 return true; 48 return true;
50 49
51 g_display = XOpenDisplay(NULL); 50 if (!ui::GetXDisplay()) {
52 if (!g_display) {
53 LOG(ERROR) << "XOpenDisplay failed."; 51 LOG(ERROR) << "XOpenDisplay failed.";
54 return false; 52 return false;
55 } 53 }
56 54
57 int major, minor; 55 int major, minor;
58 if (!glXQueryVersion(g_display, &major, &minor)) { 56 if (!glXQueryVersion(ui::GetXDisplay(), &major, &minor)) {
59 LOG(ERROR) << "glxQueryVersion failed"; 57 LOG(ERROR) << "glxQueryVersion failed";
60 return false; 58 return false;
61 } 59 }
62 60
63 if (major == 1 && minor < 3) { 61 if (major == 1 && minor < 3) {
64 LOG(ERROR) << "GLX 1.3 or later is required."; 62 LOG(ERROR) << "GLX 1.3 or later is required.";
65 return false; 63 return false;
66 } 64 }
67 65
68 g_glx_extensions = glXQueryExtensionsString(g_display, 0); 66 g_glx_extensions = glXQueryExtensionsString(ui::GetXDisplay(), 0);
69 g_glx_create_context_robustness_supported = 67 g_glx_create_context_robustness_supported =
70 HasGLXExtension("GLX_ARB_create_context_robustness"); 68 HasGLXExtension("GLX_ARB_create_context_robustness");
71 69
72 initialized = true; 70 initialized = true;
73 return true; 71 return true;
74 } 72 }
75 73
76 // static 74 // static
77 const char* GLSurfaceGLX::GetGLXExtensions() { 75 const char* GLSurfaceGLX::GetGLXExtensions() {
78 return g_glx_extensions; 76 return g_glx_extensions;
(...skipping 13 matching lines...) Expand all
92 90
93 return extensions.find(delimited_name) != std::string::npos; 91 return extensions.find(delimited_name) != std::string::npos;
94 } 92 }
95 93
96 // static 94 // static
97 bool GLSurfaceGLX::IsCreateContextRobustnessSupported() { 95 bool GLSurfaceGLX::IsCreateContextRobustnessSupported() {
98 return g_glx_create_context_robustness_supported; 96 return g_glx_create_context_robustness_supported;
99 } 97 }
100 98
101 void* GLSurfaceGLX::GetDisplay() { 99 void* GLSurfaceGLX::GetDisplay() {
102 return g_display; 100 return ui::GetXDisplay();
103 } 101 }
104 102
105 NativeViewGLSurfaceGLX::NativeViewGLSurfaceGLX(gfx::PluginWindowHandle window) 103 NativeViewGLSurfaceGLX::NativeViewGLSurfaceGLX(gfx::PluginWindowHandle window)
106 : window_(window), 104 : window_(window),
107 config_(NULL) { 105 config_(NULL) {
108 } 106 }
109 107
110 NativeViewGLSurfaceGLX::NativeViewGLSurfaceGLX() 108 NativeViewGLSurfaceGLX::NativeViewGLSurfaceGLX()
111 : window_(0), 109 : window_(0),
112 config_(NULL) { 110 config_(NULL) {
113 } 111 }
114 112
115 NativeViewGLSurfaceGLX::~NativeViewGLSurfaceGLX() { 113 NativeViewGLSurfaceGLX::~NativeViewGLSurfaceGLX() {
116 Destroy(); 114 Destroy();
117 } 115 }
118 116
119 bool NativeViewGLSurfaceGLX::Initialize() { 117 bool NativeViewGLSurfaceGLX::Initialize() {
120 return true; 118 return true;
121 } 119 }
122 120
123 void NativeViewGLSurfaceGLX::Destroy() { 121 void NativeViewGLSurfaceGLX::Destroy() {
124 } 122 }
125 123
126 bool NativeViewGLSurfaceGLX::IsOffscreen() { 124 bool NativeViewGLSurfaceGLX::IsOffscreen() {
127 return false; 125 return false;
128 } 126 }
129 127
130 bool NativeViewGLSurfaceGLX::SwapBuffers() { 128 bool NativeViewGLSurfaceGLX::SwapBuffers() {
131 glXSwapBuffers(g_display, window_); 129 glXSwapBuffers(ui::GetXDisplay(), window_);
132 return true; 130 return true;
133 } 131 }
134 132
135 gfx::Size NativeViewGLSurfaceGLX::GetSize() { 133 gfx::Size NativeViewGLSurfaceGLX::GetSize() {
136 XWindowAttributes attributes; 134 XWindowAttributes attributes;
137 if (!XGetWindowAttributes(g_display, window_, &attributes)) { 135 if (!XGetWindowAttributes(ui::GetXDisplay(), window_, &attributes)) {
138 LOG(ERROR) << "XGetWindowAttributes failed for window " << window_ << "."; 136 LOG(ERROR) << "XGetWindowAttributes failed for window " << window_ << ".";
139 return gfx::Size(); 137 return gfx::Size();
140 } 138 }
141 return gfx::Size(attributes.width, attributes.height); 139 return gfx::Size(attributes.width, attributes.height);
142 } 140 }
143 141
144 void* NativeViewGLSurfaceGLX::GetHandle() { 142 void* NativeViewGLSurfaceGLX::GetHandle() {
145 return reinterpret_cast<void*>(window_); 143 return reinterpret_cast<void*>(window_);
146 } 144 }
147 145
(...skipping 15 matching lines...) Expand all
163 // 161 //
164 // TODO(kbr): this is not a reliable code path. On platforms which 162 // TODO(kbr): this is not a reliable code path. On platforms which
165 // support it, we should use glXChooseFBConfig in the browser 163 // support it, we should use glXChooseFBConfig in the browser
166 // process to choose the FBConfig and from there the X Visual to 164 // process to choose the FBConfig and from there the X Visual to
167 // use when creating the window in the first place. Then we can 165 // use when creating the window in the first place. Then we can
168 // pass that FBConfig down rather than attempting to reconstitute 166 // pass that FBConfig down rather than attempting to reconstitute
169 // it. 167 // it.
170 168
171 XWindowAttributes attributes; 169 XWindowAttributes attributes;
172 if (!XGetWindowAttributes( 170 if (!XGetWindowAttributes(
173 g_display, 171 ui::GetXDisplay(),
174 reinterpret_cast<GLXDrawable>(GetHandle()), 172 reinterpret_cast<GLXDrawable>(GetHandle()),
175 &attributes)) { 173 &attributes)) {
176 LOG(ERROR) << "XGetWindowAttributes failed for window " << 174 LOG(ERROR) << "XGetWindowAttributes failed for window " <<
177 reinterpret_cast<GLXDrawable>(GetHandle()) << "."; 175 reinterpret_cast<GLXDrawable>(GetHandle()) << ".";
178 return NULL; 176 return NULL;
179 } 177 }
180 178
181 int visual_id = XVisualIDFromVisual(attributes.visual); 179 int visual_id = XVisualIDFromVisual(attributes.visual);
182 180
183 int num_elements = 0; 181 int num_elements = 0;
184 scoped_ptr_malloc<GLXFBConfig, ScopedPtrXFree> configs( 182 scoped_ptr_malloc<GLXFBConfig, ScopedPtrXFree> configs(
185 glXGetFBConfigs(g_display, 183 glXGetFBConfigs(ui::GetXDisplay(),
186 DefaultScreen(g_display), 184 DefaultScreen(ui::GetXDisplay()),
187 &num_elements)); 185 &num_elements));
188 if (!configs.get()) { 186 if (!configs.get()) {
189 LOG(ERROR) << "glXGetFBConfigs failed."; 187 LOG(ERROR) << "glXGetFBConfigs failed.";
190 return NULL; 188 return NULL;
191 } 189 }
192 if (!num_elements) { 190 if (!num_elements) {
193 LOG(ERROR) << "glXGetFBConfigs returned 0 elements."; 191 LOG(ERROR) << "glXGetFBConfigs returned 0 elements.";
194 return NULL; 192 return NULL;
195 } 193 }
196 bool found = false; 194 bool found = false;
197 int i; 195 int i;
198 for (i = 0; i < num_elements; ++i) { 196 for (i = 0; i < num_elements; ++i) {
199 int value; 197 int value;
200 if (glXGetFBConfigAttrib( 198 if (glXGetFBConfigAttrib(
201 g_display, configs.get()[i], GLX_VISUAL_ID, &value)) { 199 ui::GetXDisplay(), configs.get()[i], GLX_VISUAL_ID, &value)) {
202 LOG(ERROR) << "glXGetFBConfigAttrib failed."; 200 LOG(ERROR) << "glXGetFBConfigAttrib failed.";
203 return NULL; 201 return NULL;
204 } 202 }
205 if (value == visual_id) { 203 if (value == visual_id) {
206 found = true; 204 found = true;
207 break; 205 break;
208 } 206 }
209 } 207 }
210 if (found) { 208 if (found) {
211 config_ = configs.get()[i]; 209 config_ = configs.get()[i];
212 } 210 }
213 } 211 }
214 212
215 return config_; 213 return config_;
216 } 214 }
217 215
218 bool NativeViewGLSurfaceGLX::PostSubBuffer( 216 bool NativeViewGLSurfaceGLX::PostSubBuffer(
219 int x, int y, int width, int height) { 217 int x, int y, int width, int height) {
220 DCHECK(g_GLX_MESA_copy_sub_buffer); 218 DCHECK(g_GLX_MESA_copy_sub_buffer);
221 glXCopySubBufferMESA(g_display, window_, x, y, width, height); 219 glXCopySubBufferMESA(ui::GetXDisplay(), window_, x, y, width, height);
222 return true; 220 return true;
223 } 221 }
224 222
225 PbufferGLSurfaceGLX::PbufferGLSurfaceGLX(const gfx::Size& size) 223 PbufferGLSurfaceGLX::PbufferGLSurfaceGLX(const gfx::Size& size)
226 : size_(size), 224 : size_(size),
227 config_(NULL), 225 config_(NULL),
228 pbuffer_(0) { 226 pbuffer_(0) {
229 } 227 }
230 228
231 PbufferGLSurfaceGLX::~PbufferGLSurfaceGLX() { 229 PbufferGLSurfaceGLX::~PbufferGLSurfaceGLX() {
(...skipping 10 matching lines...) Expand all
242 GLX_GREEN_SIZE, 8, 240 GLX_GREEN_SIZE, 8,
243 GLX_RED_SIZE, 8, 241 GLX_RED_SIZE, 8,
244 GLX_RENDER_TYPE, GLX_RGBA_BIT, 242 GLX_RENDER_TYPE, GLX_RGBA_BIT,
245 GLX_DRAWABLE_TYPE, GLX_PBUFFER_BIT, 243 GLX_DRAWABLE_TYPE, GLX_PBUFFER_BIT,
246 GLX_DOUBLEBUFFER, False, 244 GLX_DOUBLEBUFFER, False,
247 0 245 0
248 }; 246 };
249 247
250 int num_elements = 0; 248 int num_elements = 0;
251 scoped_ptr_malloc<GLXFBConfig, ScopedPtrXFree> configs( 249 scoped_ptr_malloc<GLXFBConfig, ScopedPtrXFree> configs(
252 glXChooseFBConfig(g_display, 250 glXChooseFBConfig(ui::GetXDisplay(),
253 DefaultScreen(g_display), 251 DefaultScreen(ui::GetXDisplay()),
254 config_attributes, 252 config_attributes,
255 &num_elements)); 253 &num_elements));
256 if (!configs.get()) { 254 if (!configs.get()) {
257 LOG(ERROR) << "glXChooseFBConfig failed."; 255 LOG(ERROR) << "glXChooseFBConfig failed.";
258 return false; 256 return false;
259 } 257 }
260 if (!num_elements) { 258 if (!num_elements) {
261 LOG(ERROR) << "glXChooseFBConfig returned 0 elements."; 259 LOG(ERROR) << "glXChooseFBConfig returned 0 elements.";
262 return false; 260 return false;
263 } 261 }
264 262
265 config_ = configs.get()[0]; 263 config_ = configs.get()[0];
266 264
267 const int pbuffer_attributes[] = { 265 const int pbuffer_attributes[] = {
268 GLX_PBUFFER_WIDTH, size_.width(), 266 GLX_PBUFFER_WIDTH, size_.width(),
269 GLX_PBUFFER_HEIGHT, size_.height(), 267 GLX_PBUFFER_HEIGHT, size_.height(),
270 0 268 0
271 }; 269 };
272 pbuffer_ = glXCreatePbuffer(g_display, 270 pbuffer_ = glXCreatePbuffer(ui::GetXDisplay(),
273 static_cast<GLXFBConfig>(config_), 271 static_cast<GLXFBConfig>(config_),
274 pbuffer_attributes); 272 pbuffer_attributes);
275 if (!pbuffer_) { 273 if (!pbuffer_) {
276 Destroy(); 274 Destroy();
277 LOG(ERROR) << "glXCreatePbuffer failed."; 275 LOG(ERROR) << "glXCreatePbuffer failed.";
278 return false; 276 return false;
279 } 277 }
280 278
281 return true; 279 return true;
282 } 280 }
283 281
284 void PbufferGLSurfaceGLX::Destroy() { 282 void PbufferGLSurfaceGLX::Destroy() {
285 if (pbuffer_) { 283 if (pbuffer_) {
286 glXDestroyPbuffer(g_display, pbuffer_); 284 glXDestroyPbuffer(ui::GetXDisplay(), pbuffer_);
287 pbuffer_ = 0; 285 pbuffer_ = 0;
288 } 286 }
289 287
290 config_ = NULL; 288 config_ = NULL;
291 } 289 }
292 290
293 bool PbufferGLSurfaceGLX::IsOffscreen() { 291 bool PbufferGLSurfaceGLX::IsOffscreen() {
294 return true; 292 return true;
295 } 293 }
296 294
297 bool PbufferGLSurfaceGLX::SwapBuffers() { 295 bool PbufferGLSurfaceGLX::SwapBuffers() {
298 NOTREACHED() << "Attempted to call SwapBuffers on a pbuffer."; 296 NOTREACHED() << "Attempted to call SwapBuffers on a pbuffer.";
299 return false; 297 return false;
300 } 298 }
301 299
302 gfx::Size PbufferGLSurfaceGLX::GetSize() { 300 gfx::Size PbufferGLSurfaceGLX::GetSize() {
303 return size_; 301 return size_;
304 } 302 }
305 303
306 void* PbufferGLSurfaceGLX::GetHandle() { 304 void* PbufferGLSurfaceGLX::GetHandle() {
307 return reinterpret_cast<void*>(pbuffer_); 305 return reinterpret_cast<void*>(pbuffer_);
308 } 306 }
309 307
310 void* PbufferGLSurfaceGLX::GetConfig() { 308 void* PbufferGLSurfaceGLX::GetConfig() {
311 return config_; 309 return config_;
312 } 310 }
313 311
314 } // namespace gfx 312 } // namespace gfx
OLDNEW
« no previous file with comments | « ui/gfx/gl/gl_surface_egl.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698