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

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

Issue 23653049: (not for review) Fix composited-to-non-composited corruption on Linux. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 3 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 | Annotate | Revision Log
« no previous file with comments | « ui/gl/gl_surface_glx.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 (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 extern "C" { 5 extern "C" {
6 #include <X11/Xlib.h> 6 #include <X11/Xlib.h>
7 } 7 }
8 8
9 #include "ui/gl/gl_surface_glx.h" 9 #include "ui/gl/gl_surface_glx.h"
10 10
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 // A mechanism for forwarding XExpose events from one window to another. 304 // A mechanism for forwarding XExpose events from one window to another.
305 // Because in the workaround for http://crbug.com/145600 the child window 305 // Because in the workaround for http://crbug.com/145600 the child window
306 // is placed on top of the parent window, only the child window will receive 306 // is placed on top of the parent window, only the child window will receive
307 // all expose events. These need to be forwared to the parent window to inform 307 // all expose events. These need to be forwared to the parent window to inform
308 // it that it should paint. 308 // it that it should paint.
309 class XExposeEventForwarder : public base::MessagePumpObserver { 309 class XExposeEventForwarder : public base::MessagePumpObserver {
310 public: 310 public:
311 XExposeEventForwarder() {} 311 XExposeEventForwarder() {}
312 virtual ~XExposeEventForwarder() { 312 virtual ~XExposeEventForwarder() {
313 DCHECK(child_to_parent_map_.empty()); 313 DCHECK(child_to_parent_map_.empty());
314 DCHECK(parent_to_child_map_.empty());
314 } 315 }
315 void AddParentChildPair(gfx::AcceleratedWidget parent_window, 316 void AddParentChildPair(gfx::AcceleratedWidget parent_window,
316 gfx::AcceleratedWidget child_window) { 317 gfx::AcceleratedWidget child_window) {
317 if (child_to_parent_map_.empty()) 318 if (child_to_parent_map_.empty())
318 base::MessagePumpX11::Current()->AddObserver(this); 319 base::MessagePumpX11::Current()->AddObserver(this);
319 320
320 DCHECK(child_to_parent_map_.find(child_window) == 321 DCHECK(child_to_parent_map_.find(child_window) ==
321 child_to_parent_map_.end()); 322 child_to_parent_map_.end());
322 child_to_parent_map_.insert(std::make_pair( 323 child_to_parent_map_.insert(std::make_pair(
323 child_window, parent_window)); 324 child_window, parent_window));
325 parent_to_child_map_.insert(std::make_pair(
326 parent_window, child_window));
324 } 327 }
325 void RemoveParentChildPair(gfx::AcceleratedWidget parent_window, 328 void RemoveParentChildPair(gfx::AcceleratedWidget parent_window,
326 gfx::AcceleratedWidget child_window) { 329 gfx::AcceleratedWidget child_window) {
327 DCHECK(child_to_parent_map_.find(child_window) != 330 DCHECK(child_to_parent_map_.find(child_window) !=
328 child_to_parent_map_.end()); 331 child_to_parent_map_.end());
332 DCHECK(parent_to_child_map_.find(parent_window) !=
333 parent_to_child_map_.end());
329 child_to_parent_map_.erase(child_window); 334 child_to_parent_map_.erase(child_window);
335 parent_to_child_map_.erase(parent_window);
330 336
331 if (child_to_parent_map_.empty()) 337 if (child_to_parent_map_.empty())
332 base::MessagePumpX11::Current()->RemoveObserver(this); 338 base::MessagePumpX11::Current()->RemoveObserver(this);
333 } 339 }
340 void SetChildWindowVisible(gfx::AcceleratedWidget parent_window,
341 bool visible) {
342 WindowMap::const_iterator found = parent_to_child_map_.find(parent_window);
343 if (found == parent_to_child_map_.end())
344 return;
345 gfx::AcceleratedWidget child_window = found->second;
346 if (visible)
347 XMapWindow(g_display, child_window);
348 else
349 XUnmapWindow(g_display, child_window);
350 // XFlush(g_display);
351 }
334 352
335 private: 353 private:
336 virtual base::EventStatus WillProcessEvent ( 354 virtual base::EventStatus WillProcessEvent (
337 const base::NativeEvent& xevent) OVERRIDE { 355 const base::NativeEvent& xevent) OVERRIDE {
338 if (xevent->type != Expose) 356 if (xevent->type != Expose)
339 return base::EVENT_CONTINUE; 357 return base::EVENT_CONTINUE;
340 358
341 WindowMap::const_iterator found = child_to_parent_map_.find( 359 WindowMap::const_iterator found = child_to_parent_map_.find(
342 xevent->xexpose.window); 360 xevent->xexpose.window);
343 if (found == child_to_parent_map_.end()) 361 if (found == child_to_parent_map_.end())
344 return base::EVENT_CONTINUE; 362 return base::EVENT_CONTINUE;
345 363
346 gfx::AcceleratedWidget target_window = found->second; 364 gfx::AcceleratedWidget target_window = found->second;
347 XEvent forwarded_event = *xevent; 365 XEvent forwarded_event = *xevent;
348 forwarded_event.xexpose.window = target_window; 366 forwarded_event.xexpose.window = target_window;
349 XSendEvent(g_display, target_window, False, ExposureMask, 367 XSendEvent(g_display, target_window, False, ExposureMask,
350 &forwarded_event); 368 &forwarded_event);
351 return base::EVENT_CONTINUE; 369 return base::EVENT_CONTINUE;
352 } 370 }
353 virtual void DidProcessEvent(const base::NativeEvent& xevent) OVERRIDE { 371 virtual void DidProcessEvent(const base::NativeEvent& xevent) OVERRIDE {
354 } 372 }
355 373
356 typedef std::map<gfx::AcceleratedWidget, gfx::AcceleratedWidget> WindowMap; 374 typedef std::map<gfx::AcceleratedWidget, gfx::AcceleratedWidget> WindowMap;
357 WindowMap child_to_parent_map_; 375 WindowMap child_to_parent_map_;
376 WindowMap parent_to_child_map_;
358 377
359 DISALLOW_COPY_AND_ASSIGN(XExposeEventForwarder); 378 DISALLOW_COPY_AND_ASSIGN(XExposeEventForwarder);
360 }; 379 };
361 380
362 static base::LazyInstance<XExposeEventForwarder> g_xexpose_event_forwarder = 381 static base::LazyInstance<XExposeEventForwarder> g_xexpose_event_forwarder =
363 LAZY_INSTANCE_INITIALIZER; 382 LAZY_INSTANCE_INITIALIZER;
364 383
365 // Do not use this workaround when running in test harnesses that do not have 384 // Do not use this workaround when running in test harnesses that do not have
366 // a message loop or do not have a TYPE_GPU message loop. 385 // a message loop or do not have a TYPE_GPU message loop.
367 bool g_create_child_windows = false; 386 bool g_create_child_windows = false;
(...skipping 15 matching lines...) Expand all
383 // it's own thread. 402 // it's own thread.
384 XInitThreads(); 403 XInitThreads();
385 404
386 #if defined(TOOLKIT_GTK) 405 #if defined(TOOLKIT_GTK)
387 // Be sure to use the X display handle and not the GTK display handle if this 406 // Be sure to use the X display handle and not the GTK display handle if this
388 // is the GPU process. 407 // is the GPU process.
389 g_create_child_windows = 408 g_create_child_windows =
390 base::MessageLoop::current() && 409 base::MessageLoop::current() &&
391 base::MessageLoop::current()->type() == base::MessageLoop::TYPE_GPU; 410 base::MessageLoop::current()->type() == base::MessageLoop::TYPE_GPU;
392 411
393 // Disable this path because it is causing window contents to disappear.
394 // http://crbug.com/292655
395 g_create_child_windows = false;
396
397 if (g_create_child_windows) 412 if (g_create_child_windows)
398 g_display = base::MessagePumpX11::GetDefaultXDisplay(); 413 g_display = base::MessagePumpX11::GetDefaultXDisplay();
399 else 414 else
400 g_display = base::MessagePumpForUI::GetDefaultXDisplay(); 415 g_display = base::MessagePumpForUI::GetDefaultXDisplay();
401 #else 416 #else
402 g_display = base::MessagePumpForUI::GetDefaultXDisplay(); 417 g_display = base::MessagePumpForUI::GetDefaultXDisplay();
403 #endif 418 #endif
404 419
405 if (!g_display) { 420 if (!g_display) {
406 LOG(ERROR) << "XOpenDisplay failed."; 421 LOG(ERROR) << "XOpenDisplay failed.";
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after
690 int x, int y, int width, int height) { 705 int x, int y, int width, int height) {
691 DCHECK(gfx::g_driver_glx.ext.b_GLX_MESA_copy_sub_buffer); 706 DCHECK(gfx::g_driver_glx.ext.b_GLX_MESA_copy_sub_buffer);
692 glXCopySubBufferMESA(g_display, GetDrawableHandle(), x, y, width, height); 707 glXCopySubBufferMESA(g_display, GetDrawableHandle(), x, y, width, height);
693 return true; 708 return true;
694 } 709 }
695 710
696 VSyncProvider* NativeViewGLSurfaceGLX::GetVSyncProvider() { 711 VSyncProvider* NativeViewGLSurfaceGLX::GetVSyncProvider() {
697 return vsync_provider_.get(); 712 return vsync_provider_.get();
698 } 713 }
699 714
715 #if defined(TOOLKIT_GTK)
716 void NativeViewGLSurfaceGLX::AcceleratedCompositingStateChange(
717 int32 surface_id, bool compositing_active) {
718 g_xexpose_event_forwarder.Pointer()->SetChildWindowVisible(
719 surface_id, compositing_active);
720 }
721 #endif
722
700 NativeViewGLSurfaceGLX::NativeViewGLSurfaceGLX() 723 NativeViewGLSurfaceGLX::NativeViewGLSurfaceGLX()
701 : parent_window_(0), 724 : parent_window_(0),
702 #if defined(TOOLKIT_GTK) 725 #if defined(TOOLKIT_GTK)
703 child_window_(0), 726 child_window_(0),
704 dummy_window_(0), 727 dummy_window_(0),
705 backbuffer_allocated_(true), 728 backbuffer_allocated_(true),
706 frontbuffer_allocated_(true), 729 frontbuffer_allocated_(true),
707 #endif 730 #endif
708 config_(NULL) { 731 config_(NULL) {
709 } 732 }
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
795 818
796 void* PbufferGLSurfaceGLX::GetConfig() { 819 void* PbufferGLSurfaceGLX::GetConfig() {
797 return config_; 820 return config_;
798 } 821 }
799 822
800 PbufferGLSurfaceGLX::~PbufferGLSurfaceGLX() { 823 PbufferGLSurfaceGLX::~PbufferGLSurfaceGLX() {
801 Destroy(); 824 Destroy();
802 } 825 }
803 826
804 } // namespace gfx 827 } // namespace gfx
OLDNEW
« no previous file with comments | « ui/gl/gl_surface_glx.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698