Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 file implements the ViewGLContext and PbufferGLContext classes. | 5 // This file implements the ViewGLContext and PbufferGLContext classes. |
| 6 | 6 |
| 7 #include "app/gfx/gl/gl_context.h" | 7 #include "app/gfx/gl/gl_context.h" |
| 8 | 8 |
| 9 extern "C" { | |
| 10 #include <X11/Xlib.h> | |
| 11 } | |
| 12 | |
| 9 #include <GL/osmesa.h> | 13 #include <GL/osmesa.h> |
| 10 | 14 |
| 11 #include "app/gfx/gl/gl_bindings.h" | 15 #include "app/gfx/gl/gl_bindings.h" |
| 12 #include "app/gfx/gl/gl_context_egl.h" | 16 #include "app/gfx/gl/gl_context_egl.h" |
| 13 #include "app/gfx/gl/gl_context_osmesa.h" | 17 #include "app/gfx/gl/gl_context_osmesa.h" |
| 14 #include "app/gfx/gl/gl_context_stub.h" | 18 #include "app/gfx/gl/gl_context_stub.h" |
| 15 #include "app/gfx/gl/gl_implementation.h" | 19 #include "app/gfx/gl/gl_implementation.h" |
| 16 #include "app/x11_util.h" | 20 #include "app/x11_util.h" |
| 17 #include "base/basictypes.h" | 21 #include "base/basictypes.h" |
| 18 #include "base/logging.h" | 22 #include "base/logging.h" |
| 19 #include "base/scoped_ptr.h" | 23 #include "base/scoped_ptr.h" |
| 20 | 24 |
| 25 namespace { | |
| 26 | |
| 27 Display* GetXDisplayHelper() { | |
| 28 static Display* display = NULL; | |
|
greggman
2010/12/21 22:47:01
I'll assume this works with multiple display, as i
Ken Russell (switch to Gerrit)
2010/12/21 22:49:59
Not sure. It'll work as well as x11_util::GetXDisp
| |
| 29 | |
| 30 if (!display) { | |
| 31 if (x11_util::XDisplayExists()) { | |
| 32 display = x11_util::GetXDisplay(); | |
| 33 } else { | |
| 34 display = XOpenDisplay(NULL); | |
| 35 } | |
| 36 } | |
| 37 return display; | |
| 38 } | |
| 39 | |
| 40 } | |
| 41 | |
| 21 namespace gfx { | 42 namespace gfx { |
| 22 | 43 |
| 23 typedef GLXContext GLContextHandle; | 44 typedef GLXContext GLContextHandle; |
| 24 typedef GLXPbuffer PbufferHandle; | 45 typedef GLXPbuffer PbufferHandle; |
| 25 | 46 |
| 26 class BaseLinuxGLContext : public GLContext { | 47 class BaseLinuxGLContext : public GLContext { |
| 27 public: | 48 public: |
| 28 virtual std::string GetExtensions(); | 49 virtual std::string GetExtensions(); |
| 29 }; | 50 }; |
| 30 | 51 |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 176 kAllowedGLImplementations, | 197 kAllowedGLImplementations, |
| 177 kAllowedGLImplementations + arraysize(kAllowedGLImplementations))) { | 198 kAllowedGLImplementations + arraysize(kAllowedGLImplementations))) { |
| 178 LOG(ERROR) << "InitializeBestGLBindings failed."; | 199 LOG(ERROR) << "InitializeBestGLBindings failed."; |
| 179 return false; | 200 return false; |
| 180 } | 201 } |
| 181 | 202 |
| 182 switch (GetGLImplementation()) { | 203 switch (GetGLImplementation()) { |
| 183 case kGLImplementationDesktopGL: { | 204 case kGLImplementationDesktopGL: { |
| 184 // Only check the GLX version if we are in fact using GLX. We might | 205 // Only check the GLX version if we are in fact using GLX. We might |
| 185 // actually be using the mock GL implementation. | 206 // actually be using the mock GL implementation. |
| 186 Display* display = x11_util::GetXDisplay(); | 207 Display* display = GetXDisplayHelper(); |
| 187 int major, minor; | 208 int major, minor; |
| 188 if (!glXQueryVersion(display, &major, &minor)) { | 209 if (!glXQueryVersion(display, &major, &minor)) { |
| 189 LOG(ERROR) << "glxQueryVersion failed"; | 210 LOG(ERROR) << "glxQueryVersion failed"; |
| 190 return false; | 211 return false; |
| 191 } | 212 } |
| 192 | 213 |
| 193 if (major == 1 && minor < 3) { | 214 if (major == 1 && minor < 3) { |
| 194 LOG(WARNING) << "GLX 1.3 or later is recommended."; | 215 LOG(WARNING) << "GLX 1.3 or later is recommended."; |
| 195 } | 216 } |
| 196 | 217 |
| 197 break; | 218 break; |
| 198 } | 219 } |
| 199 case kGLImplementationEGLGLES2: | 220 case kGLImplementationEGLGLES2: |
| 200 if (!BaseEGLContext::InitializeOneOff()) { | 221 if (!BaseEGLContext::InitializeOneOff()) { |
| 201 LOG(ERROR) << "BaseEGLContext::InitializeOneOff failed."; | 222 LOG(ERROR) << "BaseEGLContext::InitializeOneOff failed."; |
| 202 return false; | 223 return false; |
| 203 } | 224 } |
| 204 break; | 225 break; |
| 205 default: | 226 default: |
| 206 break; | 227 break; |
| 207 } | 228 } |
| 208 | 229 |
| 209 initialized = true; | 230 initialized = true; |
| 210 return true; | 231 return true; |
| 211 } | 232 } |
| 212 | 233 |
| 213 std::string BaseLinuxGLContext::GetExtensions() { | 234 std::string BaseLinuxGLContext::GetExtensions() { |
| 214 Display* display = x11_util::GetXDisplay(); | 235 Display* display = GetXDisplayHelper(); |
| 215 const char* extensions = glXQueryExtensionsString(display, 0); | 236 const char* extensions = glXQueryExtensionsString(display, 0); |
| 216 if (extensions) { | 237 if (extensions) { |
| 217 return GLContext::GetExtensions() + " " + extensions; | 238 return GLContext::GetExtensions() + " " + extensions; |
| 218 } | 239 } |
| 219 | 240 |
| 220 return GLContext::GetExtensions(); | 241 return GLContext::GetExtensions(); |
| 221 } | 242 } |
| 222 | 243 |
| 223 bool ViewGLContext::Initialize(bool multisampled) { | 244 bool ViewGLContext::Initialize(bool multisampled) { |
| 224 if (multisampled) { | 245 if (multisampled) { |
| 225 LOG(WARNING) << "Multisampling not implemented."; | 246 LOG(WARNING) << "Multisampling not implemented."; |
| 226 } | 247 } |
| 227 | 248 |
| 228 Display* display = x11_util::GetXDisplay(); | 249 Display* display = GetXDisplayHelper(); |
| 229 XWindowAttributes attributes; | 250 XWindowAttributes attributes; |
| 230 XGetWindowAttributes(display, window_, &attributes); | 251 XGetWindowAttributes(display, window_, &attributes); |
| 231 XVisualInfo visual_info_template; | 252 XVisualInfo visual_info_template; |
| 232 visual_info_template.visualid = XVisualIDFromVisual(attributes.visual); | 253 visual_info_template.visualid = XVisualIDFromVisual(attributes.visual); |
| 233 int visual_info_count = 0; | 254 int visual_info_count = 0; |
| 234 scoped_ptr_malloc<XVisualInfo, ScopedPtrXFree> visual_info_list( | 255 scoped_ptr_malloc<XVisualInfo, ScopedPtrXFree> visual_info_list( |
| 235 XGetVisualInfo(display, VisualIDMask, | 256 XGetVisualInfo(display, VisualIDMask, |
| 236 &visual_info_template, | 257 &visual_info_template, |
| 237 &visual_info_count)); | 258 &visual_info_count)); |
| 238 DCHECK(visual_info_list.get()); | 259 DCHECK(visual_info_list.get()); |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 257 if (!InitializeCommon()) { | 278 if (!InitializeCommon()) { |
| 258 LOG(ERROR) << "GLContext::InitlializeCommon failed."; | 279 LOG(ERROR) << "GLContext::InitlializeCommon failed."; |
| 259 Destroy(); | 280 Destroy(); |
| 260 return false; | 281 return false; |
| 261 } | 282 } |
| 262 | 283 |
| 263 return true; | 284 return true; |
| 264 } | 285 } |
| 265 | 286 |
| 266 void ViewGLContext::Destroy() { | 287 void ViewGLContext::Destroy() { |
| 267 Display* display = x11_util::GetXDisplay(); | 288 Display* display = GetXDisplayHelper(); |
| 268 bool result = glXMakeCurrent(display, 0, 0); | 289 bool result = glXMakeCurrent(display, 0, 0); |
| 269 | 290 |
| 270 // glXMakeCurrent isn't supposed to fail when unsetting the context, unless | 291 // glXMakeCurrent isn't supposed to fail when unsetting the context, unless |
| 271 // we have pending draws on an invalid window - which shouldn't be the case | 292 // we have pending draws on an invalid window - which shouldn't be the case |
| 272 // here. | 293 // here. |
| 273 DCHECK(result); | 294 DCHECK(result); |
| 274 if (context_) { | 295 if (context_) { |
| 275 glXDestroyContext(display, context_); | 296 glXDestroyContext(display, context_); |
| 276 context_ = NULL; | 297 context_ = NULL; |
| 277 } | 298 } |
| 278 } | 299 } |
| 279 | 300 |
| 280 bool ViewGLContext::MakeCurrent() { | 301 bool ViewGLContext::MakeCurrent() { |
| 281 if (IsCurrent()) { | 302 if (IsCurrent()) { |
| 282 return true; | 303 return true; |
| 283 } | 304 } |
| 284 | 305 |
| 285 Display* display = x11_util::GetXDisplay(); | 306 Display* display = GetXDisplayHelper(); |
| 286 if (glXMakeCurrent(display, window_, context_) != True) { | 307 if (glXMakeCurrent(display, window_, context_) != True) { |
| 287 glXDestroyContext(display, context_); | 308 glXDestroyContext(display, context_); |
| 288 context_ = 0; | 309 context_ = 0; |
| 289 LOG(ERROR) << "Couldn't make context current."; | 310 LOG(ERROR) << "Couldn't make context current."; |
| 290 return false; | 311 return false; |
| 291 } | 312 } |
| 292 | 313 |
| 293 return true; | 314 return true; |
| 294 } | 315 } |
| 295 | 316 |
| 296 bool ViewGLContext::IsCurrent() { | 317 bool ViewGLContext::IsCurrent() { |
| 297 return glXGetCurrentDrawable() == window_ && | 318 return glXGetCurrentDrawable() == window_ && |
| 298 glXGetCurrentContext() == context_; | 319 glXGetCurrentContext() == context_; |
| 299 } | 320 } |
| 300 | 321 |
| 301 bool ViewGLContext::IsOffscreen() { | 322 bool ViewGLContext::IsOffscreen() { |
| 302 return false; | 323 return false; |
| 303 } | 324 } |
| 304 | 325 |
| 305 bool ViewGLContext::SwapBuffers() { | 326 bool ViewGLContext::SwapBuffers() { |
| 306 Display* display = x11_util::GetXDisplay(); | 327 Display* display = GetXDisplayHelper(); |
| 307 glXSwapBuffers(display, window_); | 328 glXSwapBuffers(display, window_); |
| 308 return true; | 329 return true; |
| 309 } | 330 } |
| 310 | 331 |
| 311 gfx::Size ViewGLContext::GetSize() { | 332 gfx::Size ViewGLContext::GetSize() { |
| 312 XWindowAttributes attributes; | 333 XWindowAttributes attributes; |
| 313 Display* display = x11_util::GetXDisplay(); | 334 Display* display = GetXDisplayHelper(); |
| 314 XGetWindowAttributes(display, window_, &attributes); | 335 XGetWindowAttributes(display, window_, &attributes); |
| 315 return gfx::Size(attributes.width, attributes.height); | 336 return gfx::Size(attributes.width, attributes.height); |
| 316 } | 337 } |
| 317 | 338 |
| 318 void* ViewGLContext::GetHandle() { | 339 void* ViewGLContext::GetHandle() { |
| 319 return context_; | 340 return context_; |
| 320 } | 341 } |
| 321 | 342 |
| 322 void ViewGLContext::SetSwapInterval(int interval) { | 343 void ViewGLContext::SetSwapInterval(int interval) { |
| 323 DCHECK(IsCurrent()); | 344 DCHECK(IsCurrent()); |
| 324 if (HasExtension("GLX_EXT_swap_control") && glXSwapIntervalEXT) { | 345 if (HasExtension("GLX_EXT_swap_control") && glXSwapIntervalEXT) { |
| 325 Display* display = x11_util::GetXDisplay(); | 346 Display* display = GetXDisplayHelper(); |
| 326 glXSwapIntervalEXT(display, window_, interval); | 347 glXSwapIntervalEXT(display, window_, interval); |
| 327 } | 348 } |
| 328 } | 349 } |
| 329 | 350 |
| 330 bool OSMesaViewGLContext::Initialize() { | 351 bool OSMesaViewGLContext::Initialize() { |
| 331 if (!osmesa_context_.Initialize(OSMESA_BGRA, NULL)) { | 352 if (!osmesa_context_.Initialize(OSMESA_BGRA, NULL)) { |
| 332 LOG(ERROR) << "OSMesaGLContext::Initialize failed."; | 353 LOG(ERROR) << "OSMesaGLContext::Initialize failed."; |
| 333 Destroy(); | 354 Destroy(); |
| 334 return false; | 355 return false; |
| 335 } | 356 } |
| 336 | 357 |
| 337 window_graphics_context_ = XCreateGC(x11_util::GetXDisplay(), | 358 window_graphics_context_ = XCreateGC(GetXDisplayHelper(), |
| 338 window_, | 359 window_, |
| 339 0, | 360 0, |
| 340 NULL); | 361 NULL); |
| 341 if (!window_graphics_context_) { | 362 if (!window_graphics_context_) { |
| 342 LOG(ERROR) << "XCreateGC failed."; | 363 LOG(ERROR) << "XCreateGC failed."; |
| 343 Destroy(); | 364 Destroy(); |
| 344 return false; | 365 return false; |
| 345 } | 366 } |
| 346 | 367 |
| 347 UpdateSize(); | 368 UpdateSize(); |
| 348 | 369 |
| 349 return true; | 370 return true; |
| 350 } | 371 } |
| 351 | 372 |
| 352 void OSMesaViewGLContext::Destroy() { | 373 void OSMesaViewGLContext::Destroy() { |
| 353 osmesa_context_.Destroy(); | 374 osmesa_context_.Destroy(); |
| 354 | 375 |
| 355 Display* display = x11_util::GetXDisplay(); | 376 Display* display = GetXDisplayHelper(); |
| 356 | 377 |
| 357 if (pixmap_graphics_context_) { | 378 if (pixmap_graphics_context_) { |
| 358 XFreeGC(display, pixmap_graphics_context_); | 379 XFreeGC(display, pixmap_graphics_context_); |
| 359 pixmap_graphics_context_ = NULL; | 380 pixmap_graphics_context_ = NULL; |
| 360 } | 381 } |
| 361 | 382 |
| 362 if (pixmap_) { | 383 if (pixmap_) { |
| 363 XFreePixmap(display, pixmap_); | 384 XFreePixmap(display, pixmap_); |
| 364 pixmap_ = 0; | 385 pixmap_ = 0; |
| 365 } | 386 } |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 389 bool OSMesaViewGLContext::SwapBuffers() { | 410 bool OSMesaViewGLContext::SwapBuffers() { |
| 390 // Update the size before blitting so that the blit size is exactly the same | 411 // Update the size before blitting so that the blit size is exactly the same |
| 391 // as the window. | 412 // as the window. |
| 392 if (!UpdateSize()) { | 413 if (!UpdateSize()) { |
| 393 LOG(ERROR) << "Failed to update size of OSMesaGLContext."; | 414 LOG(ERROR) << "Failed to update size of OSMesaGLContext."; |
| 394 return false; | 415 return false; |
| 395 } | 416 } |
| 396 | 417 |
| 397 gfx::Size size = osmesa_context_.GetSize(); | 418 gfx::Size size = osmesa_context_.GetSize(); |
| 398 | 419 |
| 399 Display* display = x11_util::GetXDisplay(); | 420 Display* display = GetXDisplayHelper(); |
| 400 | 421 |
| 401 // Copy the frame into the pixmap. | 422 // Copy the frame into the pixmap. |
| 402 XWindowAttributes attributes; | 423 XWindowAttributes attributes; |
| 403 XGetWindowAttributes(display, window_, &attributes); | 424 XGetWindowAttributes(display, window_, &attributes); |
| 404 x11_util::PutARGBImage(display, | 425 x11_util::PutARGBImage(display, |
| 405 attributes.visual, | 426 attributes.visual, |
| 406 attributes.depth, | 427 attributes.depth, |
| 407 pixmap_, | 428 pixmap_, |
| 408 pixmap_graphics_context_, | 429 pixmap_graphics_context_, |
| 409 static_cast<const uint8*>(osmesa_context_.buffer()), | 430 static_cast<const uint8*>(osmesa_context_.buffer()), |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 432 | 453 |
| 433 void OSMesaViewGLContext::SetSwapInterval(int interval) { | 454 void OSMesaViewGLContext::SetSwapInterval(int interval) { |
| 434 DCHECK(IsCurrent()); | 455 DCHECK(IsCurrent()); |
| 435 // Fail silently. It is legitimate to set the swap interval on a view context | 456 // Fail silently. It is legitimate to set the swap interval on a view context |
| 436 // but XLib does not have those semantics. | 457 // but XLib does not have those semantics. |
| 437 } | 458 } |
| 438 | 459 |
| 439 bool OSMesaViewGLContext::UpdateSize() { | 460 bool OSMesaViewGLContext::UpdateSize() { |
| 440 // Get the window size. | 461 // Get the window size. |
| 441 XWindowAttributes attributes; | 462 XWindowAttributes attributes; |
| 442 Display* display = x11_util::GetXDisplay(); | 463 Display* display = GetXDisplayHelper(); |
| 443 XGetWindowAttributes(display, window_, &attributes); | 464 XGetWindowAttributes(display, window_, &attributes); |
| 444 gfx::Size window_size = gfx::Size(std::max(1, attributes.width), | 465 gfx::Size window_size = gfx::Size(std::max(1, attributes.width), |
| 445 std::max(1, attributes.height)); | 466 std::max(1, attributes.height)); |
| 446 | 467 |
| 447 // Early out if the size has not changed. | 468 // Early out if the size has not changed. |
| 448 gfx::Size osmesa_size = osmesa_context_.GetSize(); | 469 gfx::Size osmesa_size = osmesa_context_.GetSize(); |
| 449 if (pixmap_graphics_context_ && pixmap_ && window_size == osmesa_size) | 470 if (pixmap_graphics_context_ && pixmap_ && window_size == osmesa_size) |
| 450 return true; | 471 return true; |
| 451 | 472 |
| 452 // Change osmesa surface size to that of window. | 473 // Change osmesa surface size to that of window. |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 522 static const int config_attributes[] = { | 543 static const int config_attributes[] = { |
| 523 GLX_DRAWABLE_TYPE, | 544 GLX_DRAWABLE_TYPE, |
| 524 GLX_PBUFFER_BIT, | 545 GLX_PBUFFER_BIT, |
| 525 GLX_RENDER_TYPE, | 546 GLX_RENDER_TYPE, |
| 526 GLX_RGBA_BIT, | 547 GLX_RGBA_BIT, |
| 527 GLX_DOUBLEBUFFER, | 548 GLX_DOUBLEBUFFER, |
| 528 0, | 549 0, |
| 529 0 | 550 0 |
| 530 }; | 551 }; |
| 531 | 552 |
| 532 Display* display = x11_util::GetXDisplay(); | 553 Display* display = GetXDisplayHelper(); |
| 533 | 554 |
| 534 int nelements = 0; | 555 int nelements = 0; |
| 535 // TODO(kbr): figure out whether hardcoding screen to 0 is sufficient. | 556 // TODO(kbr): figure out whether hardcoding screen to 0 is sufficient. |
| 536 scoped_ptr_malloc<GLXFBConfig, ScopedPtrXFree> config( | 557 scoped_ptr_malloc<GLXFBConfig, ScopedPtrXFree> config( |
| 537 glXChooseFBConfig(display, 0, config_attributes, &nelements)); | 558 glXChooseFBConfig(display, 0, config_attributes, &nelements)); |
| 538 if (!config.get()) { | 559 if (!config.get()) { |
| 539 LOG(ERROR) << "glXChooseFBConfig failed."; | 560 LOG(ERROR) << "glXChooseFBConfig failed."; |
| 540 return false; | 561 return false; |
| 541 } | 562 } |
| 542 if (!nelements) { | 563 if (!nelements) { |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 581 if (!InitializeCommon()) { | 602 if (!InitializeCommon()) { |
| 582 LOG(ERROR) << "GLContext::InitializeCommon failed."; | 603 LOG(ERROR) << "GLContext::InitializeCommon failed."; |
| 583 Destroy(); | 604 Destroy(); |
| 584 return false; | 605 return false; |
| 585 } | 606 } |
| 586 | 607 |
| 587 return true; | 608 return true; |
| 588 } | 609 } |
| 589 | 610 |
| 590 void PbufferGLContext::Destroy() { | 611 void PbufferGLContext::Destroy() { |
| 591 Display* display = x11_util::GetXDisplay(); | 612 Display* display = GetXDisplayHelper(); |
| 592 bool result = glXMakeCurrent(display, 0, 0); | 613 bool result = glXMakeCurrent(display, 0, 0); |
| 593 // glXMakeCurrent isn't supposed to fail when unsetting the context, unless | 614 // glXMakeCurrent isn't supposed to fail when unsetting the context, unless |
| 594 // we have pending draws on an invalid window - which shouldn't be the case | 615 // we have pending draws on an invalid window - which shouldn't be the case |
| 595 // here. | 616 // here. |
| 596 DCHECK(result); | 617 DCHECK(result); |
| 597 if (context_) { | 618 if (context_) { |
| 598 glXDestroyContext(display, context_); | 619 glXDestroyContext(display, context_); |
| 599 context_ = NULL; | 620 context_ = NULL; |
| 600 } | 621 } |
| 601 | 622 |
| 602 if (pbuffer_) { | 623 if (pbuffer_) { |
| 603 glXDestroyPbuffer(display, pbuffer_); | 624 glXDestroyPbuffer(display, pbuffer_); |
| 604 pbuffer_ = 0; | 625 pbuffer_ = 0; |
| 605 } | 626 } |
| 606 } | 627 } |
| 607 | 628 |
| 608 bool PbufferGLContext::MakeCurrent() { | 629 bool PbufferGLContext::MakeCurrent() { |
| 609 if (IsCurrent()) { | 630 if (IsCurrent()) { |
| 610 return true; | 631 return true; |
| 611 } | 632 } |
| 612 Display* display = x11_util::GetXDisplay(); | 633 Display* display = GetXDisplayHelper(); |
| 613 if (glXMakeCurrent(display, pbuffer_, context_) != True) { | 634 if (glXMakeCurrent(display, pbuffer_, context_) != True) { |
| 614 glXDestroyContext(display, context_); | 635 glXDestroyContext(display, context_); |
| 615 context_ = NULL; | 636 context_ = NULL; |
| 616 LOG(ERROR) << "Couldn't make context current."; | 637 LOG(ERROR) << "Couldn't make context current."; |
| 617 return false; | 638 return false; |
| 618 } | 639 } |
| 619 | 640 |
| 620 return true; | 641 return true; |
| 621 } | 642 } |
| 622 | 643 |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 649 } | 670 } |
| 650 | 671 |
| 651 bool PixmapGLContext::Initialize(GLContext* shared_context) { | 672 bool PixmapGLContext::Initialize(GLContext* shared_context) { |
| 652 VLOG(1) << "GL context: using pixmaps."; | 673 VLOG(1) << "GL context: using pixmaps."; |
| 653 | 674 |
| 654 static int attributes[] = { | 675 static int attributes[] = { |
| 655 GLX_RGBA, | 676 GLX_RGBA, |
| 656 0 | 677 0 |
| 657 }; | 678 }; |
| 658 | 679 |
| 659 Display* display = x11_util::GetXDisplay(); | 680 Display* display = GetXDisplayHelper(); |
| 660 int screen = DefaultScreen(display); | 681 int screen = DefaultScreen(display); |
| 661 | 682 |
| 662 scoped_ptr_malloc<XVisualInfo, ScopedPtrXFree> visual_info( | 683 scoped_ptr_malloc<XVisualInfo, ScopedPtrXFree> visual_info( |
| 663 glXChooseVisual(display, screen, attributes)); | 684 glXChooseVisual(display, screen, attributes)); |
| 664 | 685 |
| 665 if (!visual_info.get()) { | 686 if (!visual_info.get()) { |
| 666 LOG(ERROR) << "glXChooseVisual failed."; | 687 LOG(ERROR) << "glXChooseVisual failed."; |
| 667 return false; | 688 return false; |
| 668 } | 689 } |
| 669 | 690 |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 699 if (!InitializeCommon()) { | 720 if (!InitializeCommon()) { |
| 700 LOG(ERROR) << "GLContext::InitializeCommon failed."; | 721 LOG(ERROR) << "GLContext::InitializeCommon failed."; |
| 701 Destroy(); | 722 Destroy(); |
| 702 return false; | 723 return false; |
| 703 } | 724 } |
| 704 | 725 |
| 705 return true; | 726 return true; |
| 706 } | 727 } |
| 707 | 728 |
| 708 void PixmapGLContext::Destroy() { | 729 void PixmapGLContext::Destroy() { |
| 709 Display* display = x11_util::GetXDisplay(); | 730 Display* display = GetXDisplayHelper(); |
| 710 bool result = glXMakeCurrent(display, 0, 0); | 731 bool result = glXMakeCurrent(display, 0, 0); |
| 711 // glXMakeCurrent isn't supposed to fail when unsetting the context, unless | 732 // glXMakeCurrent isn't supposed to fail when unsetting the context, unless |
| 712 // we have pending draws on an invalid window - which shouldn't be the case | 733 // we have pending draws on an invalid window - which shouldn't be the case |
| 713 // here. | 734 // here. |
| 714 DCHECK(result); | 735 DCHECK(result); |
| 715 if (context_) { | 736 if (context_) { |
| 716 glXDestroyContext(display, context_); | 737 glXDestroyContext(display, context_); |
| 717 context_ = NULL; | 738 context_ = NULL; |
| 718 } | 739 } |
| 719 | 740 |
| 720 if (glx_pixmap_) { | 741 if (glx_pixmap_) { |
| 721 glXDestroyGLXPixmap(display, glx_pixmap_); | 742 glXDestroyGLXPixmap(display, glx_pixmap_); |
| 722 glx_pixmap_ = 0; | 743 glx_pixmap_ = 0; |
| 723 } | 744 } |
| 724 | 745 |
| 725 if (pixmap_) { | 746 if (pixmap_) { |
| 726 XFreePixmap(display, pixmap_); | 747 XFreePixmap(display, pixmap_); |
| 727 pixmap_ = 0; | 748 pixmap_ = 0; |
| 728 } | 749 } |
| 729 } | 750 } |
| 730 | 751 |
| 731 bool PixmapGLContext::MakeCurrent() { | 752 bool PixmapGLContext::MakeCurrent() { |
| 732 if (IsCurrent()) { | 753 if (IsCurrent()) { |
| 733 return true; | 754 return true; |
| 734 } | 755 } |
| 735 Display* display = x11_util::GetXDisplay(); | 756 Display* display = GetXDisplayHelper(); |
| 736 if (glXMakeCurrent(display, glx_pixmap_, context_) != True) { | 757 if (glXMakeCurrent(display, glx_pixmap_, context_) != True) { |
| 737 glXDestroyContext(display, context_); | 758 glXDestroyContext(display, context_); |
| 738 context_ = NULL; | 759 context_ = NULL; |
| 739 LOG(ERROR) << "Couldn't make context current."; | 760 LOG(ERROR) << "Couldn't make context current."; |
| 740 return false; | 761 return false; |
| 741 } | 762 } |
| 742 | 763 |
| 743 return true; | 764 return true; |
| 744 } | 765 } |
| 745 | 766 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 801 } | 822 } |
| 802 case kGLImplementationMockGL: | 823 case kGLImplementationMockGL: |
| 803 return new StubGLContext; | 824 return new StubGLContext; |
| 804 default: | 825 default: |
| 805 NOTREACHED(); | 826 NOTREACHED(); |
| 806 return NULL; | 827 return NULL; |
| 807 } | 828 } |
| 808 } | 829 } |
| 809 | 830 |
| 810 } // namespace gfx | 831 } // namespace gfx |
| OLD | NEW |