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

Unified Diff: content/browser/renderer_host/render_widget_host_view_aura.cc

Issue 120913004: aura: Ensure OwnedMailbox not used with invalid or destroyed GLHelper. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: ownedmailbox: test Created 6 years, 11 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/renderer_host/render_widget_host_view_aura.cc
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc
index a8eb716f9c55ebab17abd807fac033fecef3795b..b24565cacd6da13afd2ab9d087fd53e91dcd78bb 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura.cc
+++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
@@ -725,6 +725,11 @@ scoped_ptr<ResizeLock> RenderWidgetHostViewAura::CreateResizeLock(
base::TimeDelta::FromMilliseconds(kResizeLockTimeoutMs)));
}
+void RenderWidgetHostViewAura::RequestCopyOfOutput(
+ scoped_ptr<cc::CopyOutputRequest> request) {
+ window_->layer()->RequestCopyOfOutput(request.Pass());
+}
+
gfx::NativeView RenderWidgetHostViewAura::GetNativeView() const {
return window_;
}
@@ -1064,7 +1069,7 @@ void RenderWidgetHostViewAura::CopyFromCompositingSurface(
gfx::Rect src_subrect_in_pixel =
ConvertRectToPixel(current_device_scale_factor_, src_subrect);
request->set_area(src_subrect_in_pixel);
- window_->layer()->RequestCopyOfOutput(request.Pass());
+ RequestCopyOfOutput(request.Pass());
}
void RenderWidgetHostViewAura::CopyFromCompositingSurfaceToVideoFrame(
@@ -1086,6 +1091,8 @@ void RenderWidgetHostViewAura::CopyFromCompositingSurfaceToVideoFrame(
ImageTransportFactory::GetInstance()->GetGLHelper()) {
subscriber_texture = new OwnedMailbox(helper);
}
+ if (subscriber_texture.get())
+ active_frame_subscriber_textures_.insert(subscriber_texture.get());
}
scoped_ptr<cc::CopyOutputRequest> request =
@@ -1099,11 +1106,11 @@ void RenderWidgetHostViewAura::CopyFromCompositingSurfaceToVideoFrame(
gfx::Rect src_subrect_in_pixel =
ConvertRectToPixel(current_device_scale_factor_, src_subrect);
request->set_area(src_subrect_in_pixel);
- if (subscriber_texture) {
+ if (subscriber_texture.get()) {
request->SetTextureMailbox(cc::TextureMailbox(
subscriber_texture->mailbox(), subscriber_texture->sync_point()));
}
- window_->layer()->RequestCopyOfOutput(request.Pass());
+ RequestCopyOfOutput(request.Pass());
}
bool RenderWidgetHostViewAura::CanCopyToBitmap() const {
@@ -1905,6 +1912,26 @@ void RenderWidgetHostViewAura::PrepareBitmapCopyOutputResult(
callback.Run(true, bitmap);
}
+// static
+void RenderWidgetHostViewAura::ReturnSubscriberTexture(
+ base::WeakPtr<RenderWidgetHostViewAura> rwhva,
+ scoped_refptr<OwnedMailbox> subscriber_texture,
+ uint32 sync_point) {
+ if (!subscriber_texture.get())
+ return;
+ if (!rwhva)
+ return;
+ DCHECK_NE(
+ rwhva->active_frame_subscriber_textures_.count(subscriber_texture.get()),
+ 0u);
+
+ subscriber_texture->UpdateSyncPoint(sync_point);
+
+ rwhva->active_frame_subscriber_textures_.erase(subscriber_texture.get());
+ if (rwhva->frame_subscriber_ && subscriber_texture->texture_id())
+ rwhva->idle_frame_subscriber_textures_.push_back(subscriber_texture);
+}
+
void RenderWidgetHostViewAura::CopyFromCompositingSurfaceFinishedForVideo(
base::WeakPtr<RenderWidgetHostViewAura> rwhva,
const base::Callback<void(bool)>& callback,
@@ -1916,17 +1943,12 @@ void RenderWidgetHostViewAura::CopyFromCompositingSurfaceFinishedForVideo(
GLHelper* gl_helper = ImageTransportFactory::GetInstance()->GetGLHelper();
uint32 sync_point = gl_helper ? gl_helper->InsertSyncPoint() : 0;
if (release_callback) {
+ // A release callback means the texture came from the compositor, so there
+ // should be no |subscriber_texture|.
DCHECK(!subscriber_texture);
release_callback->Run(sync_point, false);
- } else {
- // If there's no release callback, then the texture is from
- // idle_frame_subscriber_textures_ and we can put it back there.
- DCHECK(subscriber_texture);
- subscriber_texture->UpdateSyncPoint(sync_point);
- if (rwhva && rwhva->frame_subscriber_ && subscriber_texture->texture_id())
- rwhva->idle_frame_subscriber_textures_.push_back(subscriber_texture);
- subscriber_texture = NULL;
}
+ ReturnSubscriberTexture(rwhva, subscriber_texture, sync_point);
}
// static
@@ -1937,6 +1959,8 @@ void RenderWidgetHostViewAura::CopyFromCompositingSurfaceHasResultForVideo(
const base::Callback<void(bool)>& callback,
scoped_ptr<cc::CopyOutputResult> result) {
base::ScopedClosureRunner scoped_callback_runner(base::Bind(callback, false));
+ base::ScopedClosureRunner scoped_return_subscriber_texture(
+ base::Bind(&ReturnSubscriberTexture, rwhva, subscriber_texture, 0));
if (!rwhva)
return;
@@ -1961,8 +1985,6 @@ void RenderWidgetHostViewAura::CopyFromCompositingSurfaceHasResultForVideo(
if (region_in_frame.IsEmpty())
return;
- // We only handle texture readbacks for now. If the compositor is in software
- // mode, we could produce a software-backed VideoFrame here as well.
if (!result->HasTexture()) {
DCHECK(result->HasBitmap());
scoped_ptr<SkBitmap> bitmap = result->TakeBitmap();
@@ -1997,6 +2019,8 @@ void RenderWidgetHostViewAura::CopyFromCompositingSurfaceHasResultForVideo(
GLHelper* gl_helper = factory->GetGLHelper();
if (!gl_helper)
return;
+ if (subscriber_texture.get() && !subscriber_texture->texture_id())
+ return;
cc::TextureMailbox texture_mailbox;
scoped_ptr<cc::SingleReleaseCallback> release_callback;
@@ -2041,6 +2065,7 @@ void RenderWidgetHostViewAura::CopyFromCompositingSurfaceHasResultForVideo(
}
ignore_result(scoped_callback_runner.Release());
+ ignore_result(scoped_return_subscriber_texture.Release());
base::Callback<void(bool result)> finished_callback = base::Bind(
&RenderWidgetHostViewAura::CopyFromCompositingSurfaceFinishedForVideo,
rwhva->AsWeakPtr(),
@@ -3224,6 +3249,7 @@ void RenderWidgetHostViewAura::OnLostResources() {
UpdateExternalTexture();
idle_frame_subscriber_textures_.clear();
+ yuv_readback_pipeline_.reset();
// Make sure all ImageTransportClients are deleted now that the context those
// are using is becoming invalid. This sends pending ACKs and needs to happen
@@ -3276,6 +3302,16 @@ RenderWidgetHostViewAura::~RenderWidgetHostViewAura() {
if (resource_collection_.get())
resource_collection_->SetClient(NULL);
+ // An OwnedMailbox should not refer to the GLHelper anymore once the RWHVA is
+ // destroyed, as it may then outlive the GLHelper.
+ for (std::set<OwnedMailbox*>::iterator it =
+ active_frame_subscriber_textures_.begin();
+ it != active_frame_subscriber_textures_.end();
+ ++it) {
+ (*it)->Destroy();
+ }
+ active_frame_subscriber_textures_.clear();
+
#if defined(OS_WIN)
if (::IsWindow(plugin_parent_window_))
::DestroyWindow(plugin_parent_window_);

Powered by Google App Engine
This is Rietveld 408576698