summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app/surface/accelerated_surface_mac.cc2
-rw-r--r--app/surface/transport_dib.h21
-rw-r--r--app/surface/transport_dib_linux.cc24
-rw-r--r--app/surface/transport_dib_mac.cc9
-rw-r--r--app/surface/transport_dib_win.cc9
-rw-r--r--chrome/browser/renderer_host/browser_render_process_host.cc5
-rw-r--r--content/browser/renderer_host/accelerated_surface_container_mac.cc2
-rw-r--r--content/browser/renderer_host/mock_render_process_host.cc2
-rw-r--r--content/common/common_param_traits.h18
-rw-r--r--content/plugin/webplugin_accelerated_surface_proxy_mac.cc2
-rw-r--r--content/plugin/webplugin_proxy.cc2
-rw-r--r--content/renderer/pepper_plugin_delegate_impl.cc2
-rw-r--r--content/renderer/render_widget.cc11
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);