diff options
-rw-r--r-- | app/surface/accelerated_surface_mac.cc | 2 | ||||
-rw-r--r-- | app/surface/transport_dib.h | 21 | ||||
-rw-r--r-- | app/surface/transport_dib_linux.cc | 24 | ||||
-rw-r--r-- | app/surface/transport_dib_mac.cc | 9 | ||||
-rw-r--r-- | app/surface/transport_dib_win.cc | 9 | ||||
-rw-r--r-- | chrome/browser/renderer_host/browser_render_process_host.cc | 5 | ||||
-rw-r--r-- | content/browser/renderer_host/accelerated_surface_container_mac.cc | 2 | ||||
-rw-r--r-- | content/browser/renderer_host/mock_render_process_host.cc | 2 | ||||
-rw-r--r-- | content/common/common_param_traits.h | 18 | ||||
-rw-r--r-- | content/plugin/webplugin_accelerated_surface_proxy_mac.cc | 2 | ||||
-rw-r--r-- | content/plugin/webplugin_proxy.cc | 2 | ||||
-rw-r--r-- | content/renderer/pepper_plugin_delegate_impl.cc | 2 | ||||
-rw-r--r-- | content/renderer/render_widget.cc | 11 |
13 files changed, 80 insertions, 29 deletions
diff --git a/app/surface/accelerated_surface_mac.cc b/app/surface/accelerated_surface_mac.cc index ab5529e..6322603 100644 --- a/app/surface/accelerated_surface_mac.cc +++ b/app/surface/accelerated_surface_mac.cc @@ -307,7 +307,7 @@ TransportDIB::Handle AcceleratedSurface::SetTransportDIBSize( if (dib_alloc_callback_.get()) { dib_alloc_callback_->Run(dib_size, &dib_handle); } - if (!TransportDIB::is_valid(dib_handle)) { + if (!TransportDIB::is_valid_handle(dib_handle)) { // If the allocator fails, it means the DIB was not created in the browser, // so there is no need to run the deallocator here. return TransportDIB::DefaultHandleValue(); diff --git a/app/surface/transport_dib.h b/app/surface/transport_dib.h index a55f624..d13168a 100644 --- a/app/surface/transport_dib.h +++ b/app/surface/transport_dib.h @@ -56,7 +56,7 @@ class TransportDIB { sequence_num(seq_num) { } - bool operator< (const HandleAndSequenceNum& other) const { + bool operator<(const HandleAndSequenceNum& other) const { // Use the lexicographic order on the tuple <handle, sequence_num>. if (other.handle != handle) return other.handle < handle; @@ -95,7 +95,17 @@ class TransportDIB { } #elif defined(USE_X11) typedef int Handle; // These two ints are SysV IPC shared memory keys - typedef int Id; + struct Id { + // Ensure that default initialized Ids are invalid. + Id() : shmkey(-1) { + } + + bool operator<(const Id& other) const { + return shmkey < other.shmkey; + } + + int shmkey; + }; // Returns a default, invalid handle, that is meant to indicate a missing // Transport DIB. @@ -129,7 +139,10 @@ class TransportDIB { static TransportDIB* CreateWithHandle(Handle handle); // Returns true if the handle is valid. - static bool is_valid(Handle dib); + static bool is_valid_handle(Handle dib); + + // Returns true if the ID refers to a valid dib. + static bool is_valid_id(Id id); // Returns a canvas using the memory of this TransportDIB. The returned // pointer will be owned by the caller. The bitmap will be of the given size, @@ -176,7 +189,7 @@ class TransportDIB { base::SharedMemory shared_memory_; uint32 sequence_num_; #elif defined(USE_X11) - int key_; // SysV shared memory id + Id key_; // SysV shared memory id void* address_; // mapped address XSharedMemoryId x_shm_; // X id for the shared segment Display* display_; // connection to the X server diff --git a/app/surface/transport_dib_linux.cc b/app/surface/transport_dib_linux.cc index 69fabff..614cdb0 100644 --- a/app/surface/transport_dib_linux.cc +++ b/app/surface/transport_dib_linux.cc @@ -18,8 +18,7 @@ static void *const kInvalidAddress = (void*) -1; TransportDIB::TransportDIB() - : key_(-1), - address_(kInvalidAddress), + : address_(kInvalidAddress), x_shm_(0), display_(NULL), size_(0) { @@ -59,7 +58,7 @@ TransportDIB* TransportDIB::Create(size_t size, uint32 sequence_num) { TransportDIB* dib = new TransportDIB; - dib->key_ = shmkey; + dib->key_.shmkey = shmkey; dib->address_ = address; dib->size_ = size; return dib; @@ -76,15 +75,20 @@ TransportDIB* TransportDIB::Map(Handle handle) { // static TransportDIB* TransportDIB::CreateWithHandle(Handle shmkey) { TransportDIB* dib = new TransportDIB; - dib->key_ = shmkey; + dib->key_.shmkey = shmkey; return dib; } // static -bool TransportDIB::is_valid(Handle dib) { +bool TransportDIB::is_valid_handle(Handle dib) { return dib >= 0; } +// static +bool TransportDIB::is_valid_id(Id id) { + return id.shmkey != -1; +} + skia::PlatformCanvas* TransportDIB::GetPlatformCanvas(int w, int h) { if (address_ == kInvalidAddress && !Map()) return NULL; @@ -95,16 +99,16 @@ skia::PlatformCanvas* TransportDIB::GetPlatformCanvas(int w, int h) { } bool TransportDIB::Map() { - if (!is_valid(key_)) + if (!is_valid_id(key_)) return false; if (address_ != kInvalidAddress) return true; struct shmid_ds shmst; - if (shmctl(key_, IPC_STAT, &shmst) == -1) + if (shmctl(key_.shmkey, IPC_STAT, &shmst) == -1) return false; - void* address = shmat(key_, NULL /* desired address */, 0 /* flags */); + void* address = shmat(key_.shmkey, NULL /* desired address */, 0 /* flags */); if (address == kInvalidAddress) return false; @@ -123,12 +127,12 @@ TransportDIB::Id TransportDIB::id() const { } TransportDIB::Handle TransportDIB::handle() const { - return key_; + return key_.shmkey; } XID TransportDIB::MapToX(Display* display) { if (!x_shm_) { - x_shm_ = ui::AttachSharedMemory(display, key_); + x_shm_ = ui::AttachSharedMemory(display, key_.shmkey); display_ = display; } diff --git a/app/surface/transport_dib_mac.cc b/app/surface/transport_dib_mac.cc index 8ea81ae..c0dd457 100644 --- a/app/surface/transport_dib_mac.cc +++ b/app/surface/transport_dib_mac.cc @@ -51,10 +51,15 @@ TransportDIB* TransportDIB::CreateWithHandle(Handle handle) { } // static -bool TransportDIB::is_valid(Handle dib) { +bool TransportDIB::is_valid_handle(Handle dib) { return dib.fd >= 0; } +// static +bool TransportDIB::is_valid_id(Id id) { + return id != 0; +} + skia::PlatformCanvas* TransportDIB::GetPlatformCanvas(int w, int h) { if (!memory() && !Map()) return NULL; @@ -65,7 +70,7 @@ skia::PlatformCanvas* TransportDIB::GetPlatformCanvas(int w, int h) { } bool TransportDIB::Map() { - if (!is_valid(handle())) + if (!is_valid_handle(handle())) return false; if (memory()) return true; diff --git a/app/surface/transport_dib_win.cc b/app/surface/transport_dib_win.cc index 22812c9..3de7fab 100644 --- a/app/surface/transport_dib_win.cc +++ b/app/surface/transport_dib_win.cc @@ -56,10 +56,15 @@ TransportDIB* TransportDIB::CreateWithHandle(Handle handle) { } // static -bool TransportDIB::is_valid(Handle dib) { +bool TransportDIB::is_valid_handle(Handle dib) { return dib != NULL; } +// static +bool TransportDIB::is_valid_id(TransportDIB::Id id) { + return is_valid_handle(id.handle); +} + skia::PlatformCanvas* TransportDIB::GetPlatformCanvas(int w, int h) { // This DIB already mapped the file into this process, but PlatformCanvas // will map it again. @@ -72,7 +77,7 @@ skia::PlatformCanvas* TransportDIB::GetPlatformCanvas(int w, int h) { } bool TransportDIB::Map() { - if (!is_valid(handle())) + if (!is_valid_handle(handle())) return false; if (memory()) return true; diff --git a/chrome/browser/renderer_host/browser_render_process_host.cc b/chrome/browser/renderer_host/browser_render_process_host.cc index 2ffa5f2..b6af6e2 100644 --- a/chrome/browser/renderer_host/browser_render_process_host.cc +++ b/chrome/browser/renderer_host/browser_render_process_host.cc @@ -922,12 +922,15 @@ TransportDIB* BrowserRenderProcessHost::MapTransportDIB( // for each. return widget_helper_->MapTransportDIB(dib_id); #elif defined(OS_POSIX) - return TransportDIB::Map(dib_id); + return TransportDIB::Map(dib_id.shmkey); #endif // defined(OS_POSIX) } TransportDIB* BrowserRenderProcessHost::GetTransportDIB( TransportDIB::Id dib_id) { + if (!TransportDIB::is_valid_id(dib_id)) + return NULL; + const std::map<TransportDIB::Id, TransportDIB*>::iterator i = cached_dibs_.find(dib_id); if (i != cached_dibs_.end()) { diff --git a/content/browser/renderer_host/accelerated_surface_container_mac.cc b/content/browser/renderer_host/accelerated_surface_container_mac.cc index a661c92..5bd23a95 100644 --- a/content/browser/renderer_host/accelerated_surface_container_mac.cc +++ b/content/browser/renderer_host/accelerated_surface_container_mac.cc @@ -42,7 +42,7 @@ void AcceleratedSurfaceContainerMac::SetSizeAndTransportDIB( int32 width, int32 height, TransportDIB::Handle transport_dib) { - if (TransportDIB::is_valid(transport_dib)) { + if (TransportDIB::is_valid_handle(transport_dib)) { transport_dib_.reset(TransportDIB::Map(transport_dib)); EnqueueTextureForDeletion(); width_ = width; diff --git a/content/browser/renderer_host/mock_render_process_host.cc b/content/browser/renderer_host/mock_render_process_host.cc index 84dda0f..ff179ff 100644 --- a/content/browser/renderer_host/mock_render_process_host.cc +++ b/content/browser/renderer_host/mock_render_process_host.cc @@ -111,7 +111,7 @@ TransportDIB* MockRenderProcessHost::GetTransportDIB(TransportDIB::Id dib_id) { // one from a dib_id. transport_dib_ = TransportDIB::Create(100 * 100 * 4, 0); #elif defined(OS_POSIX) - transport_dib_ = TransportDIB::Map(dib_id); + transport_dib_ = TransportDIB::Map(dib_id.shmkey); #endif return transport_dib_; diff --git a/content/common/common_param_traits.h b/content/common/common_param_traits.h index 8a09924..1689cb1 100644 --- a/content/common/common_param_traits.h +++ b/content/common/common_param_traits.h @@ -383,6 +383,24 @@ struct ParamTraits<TransportDIB::Id> { }; #endif +#if defined(USE_X11) +template<> +struct ParamTraits<TransportDIB::Id> { + typedef TransportDIB::Id param_type; + static void Write(Message* m, const param_type& p) { + WriteParam(m, p.shmkey); + } + static bool Read(const Message* m, void** iter, param_type* r) { + return ReadParam(m, iter, &r->shmkey); + } + static void Log(const param_type& p, std::string* l) { + l->append("TransportDIB("); + LogParam(p.shmkey, l); + l->append(")"); + } +}; +#endif + template <> struct SimilarTypeTraits<WebKit::WebTextDirection> { typedef int Type; diff --git a/content/plugin/webplugin_accelerated_surface_proxy_mac.cc b/content/plugin/webplugin_accelerated_surface_proxy_mac.cc index 7f5d486..ec4571d 100644 --- a/content/plugin/webplugin_accelerated_surface_proxy_mac.cc +++ b/content/plugin/webplugin_accelerated_surface_proxy_mac.cc @@ -51,7 +51,7 @@ void WebPluginAcceleratedSurfaceProxy::SetSize(const gfx::Size& size) { plugin_proxy_->SetAcceleratedSurface(window_handle_, size, io_surface_id); } else { TransportDIB::Handle transport_dib = surface_->SetTransportDIBSize(size); - if (TransportDIB::is_valid(transport_dib)) { + if (TransportDIB::is_valid_handle(transport_dib)) { plugin_proxy_->SetAcceleratedDIB(window_handle_, size, transport_dib); } } diff --git a/content/plugin/webplugin_proxy.cc b/content/plugin/webplugin_proxy.cc index 57e61b2..108d455 100644 --- a/content/plugin/webplugin_proxy.cc +++ b/content/plugin/webplugin_proxy.cc @@ -412,7 +412,7 @@ void WebPluginProxy::UpdateGeometry( // Update the buffers before doing anything that could call into plugin code, // so that we don't process buffer changes out of order if plugins make // synchronous calls that lead to nested UpdateGeometry calls. - if (TransportDIB::is_valid(windowless_buffer)) { + if (TransportDIB::is_valid_handle(windowless_buffer)) { // The plugin's rect changed, so now we have a new buffer to draw into. SetWindowlessBuffer(windowless_buffer, background_buffer, window_rect); } diff --git a/content/renderer/pepper_plugin_delegate_impl.cc b/content/renderer/pepper_plugin_delegate_impl.cc index e4ccc96..c5f50e8 100644 --- a/content/renderer/pepper_plugin_delegate_impl.cc +++ b/content/renderer/pepper_plugin_delegate_impl.cc @@ -564,7 +564,7 @@ PepperPluginDelegateImpl::CreateImage2D(int width, int height) { &dib_handle); if (!RenderThread::current()->Send(msg)) return NULL; - if (!TransportDIB::is_valid(dib_handle)) + if (!TransportDIB::is_valid_handle(dib_handle)) return NULL; TransportDIB* dib = TransportDIB::Map(dib_handle); diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc index 901fbee..9723588 100644 --- a/content/renderer/render_widget.cc +++ b/content/renderer/render_widget.cc @@ -581,6 +581,9 @@ void RenderWidget::DoDeferredUpdate() { gfx::Rect scroll_damage = update.GetScrollDamage(); gfx::Rect bounds = update.GetPaintBounds().Union(scroll_damage); + // Compositing the page may disable accelerated compositing. + bool accelerated_compositing_was_active = is_accelerated_compositing_active_; + // A plugin may be able to do an optimized paint. First check this, in which // case we can skip all of the bitmap generation and regular paint code. // This optimization allows PPAPI plugins that declare themselves on top of @@ -592,7 +595,7 @@ void RenderWidget::DoDeferredUpdate() { // This optimization only works when the entire invalid region is contained // within the plugin. There is a related optimization in PaintRect for the // case where there may be multiple invalid regions. - TransportDIB::Id dib_id = TransportDIB::Id(); + TransportDIB::Id dib_id; TransportDIB* dib = NULL; std::vector<gfx::Rect> copy_rects; gfx::Rect optimized_copy_rect, optimized_copy_location; @@ -644,7 +647,7 @@ void RenderWidget::DoDeferredUpdate() { params.bitmap_rect = bounds; params.dx = update.scroll_delta.x(); params.dy = update.scroll_delta.y(); - if (is_accelerated_compositing_active_) { + if (accelerated_compositing_was_active) { // If painting is done via the gpu process then we clear out all damage // rects to save the browser process from doing unecessary work. params.scroll_rect = gfx::Rect(); @@ -902,8 +905,8 @@ void RenderWidget::OnMsgPaintAtSize(const TransportDIB::Handle& dib_handle, int tag, const gfx::Size& page_size, const gfx::Size& desired_size) { - if (!webwidget_ || !TransportDIB::is_valid(dib_handle)) { - if (TransportDIB::is_valid(dib_handle)) { + if (!webwidget_ || !TransportDIB::is_valid_handle(dib_handle)) { + if (TransportDIB::is_valid_handle(dib_handle)) { // Close our unused handle. #if defined(OS_WIN) ::CloseHandle(dib_handle); |