summaryrefslogtreecommitdiffstats
path: root/chrome/renderer
diff options
context:
space:
mode:
authorderat@chromium.org <derat@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-05 17:34:35 +0000
committerderat@chromium.org <derat@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-05 17:34:35 +0000
commitb4d084526b73c9fdff84101259c12b0e88478dc2 (patch)
tree4da6ee92862eb6b60fbbec109decee9af3165757 /chrome/renderer
parentd63df7f8c5f2f875632fea866376b6762ae5e481 (diff)
downloadchromium_src-b4d084526b73c9fdff84101259c12b0e88478dc2.zip
chromium_src-b4d084526b73c9fdff84101259c12b0e88478dc2.tar.gz
chromium_src-b4d084526b73c9fdff84101259c12b0e88478dc2.tar.bz2
Revert asynchronous backing store changes.
This reverts http://codereview.chromium.org/3506007 (r61225 -- the original change) and http://codereview.chromium.org/3616005 (r61446 -- a fix for a double-free in Pepper caused by the original change). Doing asynchronous copying to the backing store in the browser requires some large changes to Pepper that I'm not going to have time to work on anytime soon. A cache of in-flight TransportDIBs would need to be added (similar to what the renderer already does), and we'd also need to do copy-on-write when a plugin wants to draw on top of a previous frame that's currently held by the browser. It seems safer to revert the early part of the asynchronous copying change instead of leaving it partially checked in. BUG=none TEST=ran it Review URL: http://codereview.chromium.org/3583012 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@61525 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer')
-rw-r--r--chrome/renderer/render_widget.cc39
-rw-r--r--chrome/renderer/render_widget.h8
2 files changed, 16 insertions, 31 deletions
diff --git a/chrome/renderer/render_widget.cc b/chrome/renderer/render_widget.cc
index 90447c4..f5a7ebe 100644
--- a/chrome/renderer/render_widget.cc
+++ b/chrome/renderer/render_widget.cc
@@ -4,8 +4,6 @@
#include "chrome/renderer/render_widget.h"
-#include <utility>
-
#include "app/surface/transport_dib.h"
#include "base/command_line.h"
#include "base/logging.h"
@@ -63,6 +61,7 @@ RenderWidget::RenderWidget(RenderThreadBase* render_thread,
opener_id_(MSG_ROUTING_NONE),
render_thread_(render_thread),
host_window_(0),
+ current_paint_buf_(NULL),
next_paint_flags_(0),
update_reply_pending_(false),
did_show_(false),
@@ -83,9 +82,9 @@ RenderWidget::RenderWidget(RenderThreadBase* render_thread,
RenderWidget::~RenderWidget() {
DCHECK(!webwidget_) << "Leaking our WebWidget!";
- for (TransportDIBMap::iterator it = current_paint_bufs_.begin();
- it != current_paint_bufs_.end(); ++it) {
- RenderProcess::current()->ReleaseTransportDIB(it->second);
+ if (current_paint_buf_) {
+ RenderProcess::current()->ReleaseTransportDIB(current_paint_buf_);
+ current_paint_buf_ = NULL;
}
RenderProcess::current()->ReleaseProcess();
}
@@ -170,7 +169,6 @@ IPC_DEFINE_MESSAGE_MAP(RenderWidget)
IPC_MESSAGE_HANDLER(ViewMsg_Resize, OnResize)
IPC_MESSAGE_HANDLER(ViewMsg_WasHidden, OnWasHidden)
IPC_MESSAGE_HANDLER(ViewMsg_WasRestored, OnWasRestored)
- IPC_MESSAGE_HANDLER(ViewMsg_DoneUsingBitmap, OnDoneUsingBitmap)
IPC_MESSAGE_HANDLER(ViewMsg_UpdateRect_ACK, OnUpdateRectAck)
IPC_MESSAGE_HANDLER(ViewMsg_CreateVideo_ACK, OnCreateVideoAck)
IPC_MESSAGE_HANDLER(ViewMsg_UpdateVideo_ACK, OnUpdateVideoAck)
@@ -301,26 +299,17 @@ void RenderWidget::OnRequestMoveAck() {
pending_window_rect_count_--;
}
-void RenderWidget::OnDoneUsingBitmap(TransportDIB::Id id) {
- // If we sent an UpdateRect message with a zero-sized bitmap, then we should
- // get an empty bitmap in response.
- // TODO(derat): Don't send the "done using bitmap" message at all in this
- // case.
- if (id == TransportDIB::Id())
- return;
-
- TransportDIBMap::iterator it = current_paint_bufs_.find(id);
- if (it != current_paint_bufs_.end()) {
- RenderProcess::current()->ReleaseTransportDIB(it->second);
- current_paint_bufs_.erase(it);
- return;
- }
-}
-
void RenderWidget::OnUpdateRectAck() {
DCHECK(update_reply_pending());
update_reply_pending_ = false;
+ // If we sent an UpdateRect message with a zero-sized bitmap, then we should
+ // have no current paint buffer.
+ if (current_paint_buf_) {
+ RenderProcess::current()->ReleaseTransportDIB(current_paint_buf_);
+ current_paint_buf_ = NULL;
+ }
+
// Notify subclasses.
DidFlushPaint();
@@ -532,12 +521,12 @@ void RenderWidget::DoDeferredUpdate() {
} else if (!is_gpu_rendering_active_) {
// Compute a buffer for painting and cache it.
scoped_ptr<skia::PlatformCanvas> canvas(
- RenderProcess::current()->GetDrawingCanvas(&dib, bounds));
+ RenderProcess::current()->GetDrawingCanvas(&current_paint_buf_,
+ bounds));
if (!canvas.get()) {
NOTREACHED();
return;
}
- current_paint_bufs_.insert(std::make_pair(dib->id(), dib));
// We may get back a smaller canvas than we asked for.
// TODO(darin): This seems like it could cause painting problems!
@@ -563,7 +552,7 @@ void RenderWidget::DoDeferredUpdate() {
for (size_t i = 0; i < copy_rects.size(); ++i)
PaintRect(copy_rects[i], bounds.origin(), canvas.get());
- dib_id = dib->id();
+ dib_id = current_paint_buf_->id();
} else { // Accelerated compositing path
// Begin painting.
bool finish = next_paint_is_resize_ack();
diff --git a/chrome/renderer/render_widget.h b/chrome/renderer/render_widget.h
index 8aede6c..47bdf38 100644
--- a/chrome/renderer/render_widget.h
+++ b/chrome/renderer/render_widget.h
@@ -6,7 +6,6 @@
#define CHROME_RENDERER_RENDER_WIDGET_H_
#pragma once
-#include <map>
#include <vector>
#include "app/surface/transport_dib.h"
@@ -130,8 +129,6 @@ class RenderWidget : public IPC::Channel::Listener,
// without ref-counting is an error.
friend class base::RefCounted<RenderWidget>;
- typedef std::map<TransportDIB::Id, TransportDIB*> TransportDIBMap;
-
RenderWidget(RenderThreadBase* render_thread,
WebKit::WebPopupType popup_type);
virtual ~RenderWidget();
@@ -174,7 +171,6 @@ class RenderWidget : public IPC::Channel::Listener,
const gfx::Rect& resizer_rect);
virtual void OnWasHidden();
virtual void OnWasRestored(bool needs_repainting);
- void OnDoneUsingBitmap(TransportDIB::Id id);
void OnUpdateRectAck();
void OnCreateVideoAck(int32 video_id);
void OnUpdateVideoAck(int32 video_id);
@@ -292,8 +288,8 @@ class RenderWidget : public IPC::Channel::Listener,
// The size of the RenderWidget.
gfx::Size size_;
- // TransportDIBs currently being used to transfer images to the browser.
- TransportDIBMap current_paint_bufs_;
+ // The TransportDIB that is being used to transfer an image to the browser.
+ TransportDIB* current_paint_buf_;
PaintAggregator paint_aggregator_;