Commit c35c9d13 authored by Emircan Uysaler's avatar Emircan Uysaler Committed by Commit Bot

[Fuchsia] Don't hold ptr to ScenicSurface from ScenicOverlayView

This CL addresses the crash that occurs when ScenicSurface is
destructed before ScenicOverlayView. When that occurs raw pointer
held by ScenicOverlayView is invalid, so we should check
ScenicSurfaceFactory for a reference instead.

Bug: 1148797
Change-Id: I7972a09227e72c212254044f8e6800d50cbe470f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2536775
Commit-Queue: Emircan Uysaler <emircan@chromium.org>
Reviewed-by: default avatarSergey Ulanov <sergeyu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#827559}
parent 8f60186c
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <lib/ui/scenic/cpp/view_token_pair.h> #include <lib/ui/scenic/cpp/view_token_pair.h>
#include "base/fuchsia/fuchsia_logging.h" #include "base/fuchsia/fuchsia_logging.h"
#include "ui/ozone/platform/scenic/scenic_surface_factory.h"
namespace ui { namespace ui {
...@@ -28,8 +29,10 @@ fuchsia::ui::views::ViewToken CreateViewToken( ...@@ -28,8 +29,10 @@ fuchsia::ui::views::ViewToken CreateViewToken(
} // namespace } // namespace
ScenicOverlayView::ScenicOverlayView( ScenicOverlayView::ScenicOverlayView(
scenic::SessionPtrAndListenerRequest session_and_listener_request) scenic::SessionPtrAndListenerRequest session_and_listener_request,
ScenicSurfaceFactory* scenic_surface_factory)
: scenic_session_(std::move(session_and_listener_request)), : scenic_session_(std::move(session_and_listener_request)),
scenic_surface_factory_(scenic_surface_factory),
view_(&scenic_session_, view_(&scenic_session_,
CreateViewToken(&view_holder_token_), CreateViewToken(&view_holder_token_),
kSessionDebugName) { kSessionDebugName) {
...@@ -40,14 +43,20 @@ ScenicOverlayView::ScenicOverlayView( ...@@ -40,14 +43,20 @@ ScenicOverlayView::ScenicOverlayView(
} }
ScenicOverlayView::~ScenicOverlayView() { ScenicOverlayView::~ScenicOverlayView() {
if (surface_) DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
surface_->RemoveOverlayView(buffer_collection_id_);
ScenicSurface* surface = scenic_surface_factory_->GetSurface(widget_);
if (surface) {
surface->AssertBelongsToCurrentThread();
surface->RemoveOverlayView(buffer_collection_id_);
}
} }
void ScenicOverlayView::Initialize( void ScenicOverlayView::Initialize(
fidl::InterfaceHandle<fuchsia::sysmem::BufferCollectionToken> fidl::InterfaceHandle<fuchsia::sysmem::BufferCollectionToken>
collection_token) { collection_token) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
uint32_t image_pipe_id = scenic_session_.AllocResourceId(); uint32_t image_pipe_id = scenic_session_.AllocResourceId();
scenic_session_.Enqueue( scenic_session_.Enqueue(
scenic::NewCreateImagePipe2Cmd(image_pipe_id, image_pipe_.NewRequest())); scenic::NewCreateImagePipe2Cmd(image_pipe_id, image_pipe_.NewRequest()));
...@@ -78,6 +87,8 @@ void ScenicOverlayView::Initialize( ...@@ -78,6 +87,8 @@ void ScenicOverlayView::Initialize(
bool ScenicOverlayView::AddImages(uint32_t buffer_count, bool ScenicOverlayView::AddImages(uint32_t buffer_count,
const gfx::Size& size) { const gfx::Size& size) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
fuchsia::sysmem::ImageFormat_2 image_format = {}; fuchsia::sysmem::ImageFormat_2 image_format = {};
image_format.coded_width = size.width(); image_format.coded_width = size.width();
image_format.coded_height = size.height(); image_format.coded_height = size.height();
...@@ -91,6 +102,8 @@ bool ScenicOverlayView::AddImages(uint32_t buffer_count, ...@@ -91,6 +102,8 @@ bool ScenicOverlayView::AddImages(uint32_t buffer_count,
bool ScenicOverlayView::PresentImage(uint32_t buffer_index, bool ScenicOverlayView::PresentImage(uint32_t buffer_index,
std::vector<zx::event> acquire_fences, std::vector<zx::event> acquire_fences,
std::vector<zx::event> release_fences) { std::vector<zx::event> release_fences) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
image_pipe_->PresentImage(buffer_index + 1, zx_clock_get_monotonic(), image_pipe_->PresentImage(buffer_index + 1, zx_clock_get_monotonic(),
std::move(acquire_fences), std::move(acquire_fences),
std::move(release_fences), [](auto) {}); std::move(release_fences), [](auto) {});
...@@ -98,6 +111,8 @@ bool ScenicOverlayView::PresentImage(uint32_t buffer_index, ...@@ -98,6 +111,8 @@ bool ScenicOverlayView::PresentImage(uint32_t buffer_index,
} }
void ScenicOverlayView::SetBlendMode(bool enable_blend) { void ScenicOverlayView::SetBlendMode(bool enable_blend) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
if (enable_blend_ == enable_blend) if (enable_blend_ == enable_blend)
return; return;
...@@ -117,10 +132,11 @@ bool ScenicOverlayView::CanAttachToAcceleratedWidget( ...@@ -117,10 +132,11 @@ bool ScenicOverlayView::CanAttachToAcceleratedWidget(
} }
bool ScenicOverlayView::AttachToScenicSurface( bool ScenicOverlayView::AttachToScenicSurface(
ScenicSurface* surface,
gfx::AcceleratedWidget widget, gfx::AcceleratedWidget widget,
gfx::SysmemBufferCollectionId id) { gfx::SysmemBufferCollectionId id) {
if (surface_ && surface_ == surface) DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
if (widget_ != gfx::kNullAcceleratedWidget && widget_ == widget)
return true; return true;
if (!view_holder_token_.value.is_valid()) { if (!view_holder_token_.value.is_valid()) {
...@@ -128,11 +144,13 @@ bool ScenicOverlayView::AttachToScenicSurface( ...@@ -128,11 +144,13 @@ bool ScenicOverlayView::AttachToScenicSurface(
return false; return false;
} }
surface_ = surface;
buffer_collection_id_ = id; buffer_collection_id_ = id;
widget_ = widget; widget_ = widget;
return surface_->PresentOverlayView(buffer_collection_id_,
std::move(view_holder_token_)); ScenicSurface* surface = scenic_surface_factory_->GetSurface(widget_);
DCHECK(surface);
return surface->PresentOverlayView(buffer_collection_id_,
std::move(view_holder_token_));
} }
} // namespace ui } // namespace ui
...@@ -24,7 +24,8 @@ namespace ui { ...@@ -24,7 +24,8 @@ namespace ui {
class ScenicOverlayView { class ScenicOverlayView {
public: public:
ScenicOverlayView( ScenicOverlayView(
scenic::SessionPtrAndListenerRequest session_and_listener_request); scenic::SessionPtrAndListenerRequest session_and_listener_request,
ScenicSurfaceFactory* scenic_surface_factory);
~ScenicOverlayView(); ~ScenicOverlayView();
ScenicOverlayView(const ScenicOverlayView&) = delete; ScenicOverlayView(const ScenicOverlayView&) = delete;
ScenicOverlayView& operator=(const ScenicOverlayView&) = delete; ScenicOverlayView& operator=(const ScenicOverlayView&) = delete;
...@@ -53,21 +54,20 @@ class ScenicOverlayView { ...@@ -53,21 +54,20 @@ class ScenicOverlayView {
bool CanAttachToAcceleratedWidget(gfx::AcceleratedWidget widget); bool CanAttachToAcceleratedWidget(gfx::AcceleratedWidget widget);
// Return true if |view_holder_token_| is attached to the scene graph of // Return true if |view_holder_token_| is attached to the scene graph of
// |surface|. // surface corresponding to |widget|.
bool AttachToScenicSurface(ScenicSurface* surface, bool AttachToScenicSurface(gfx::AcceleratedWidget widget,
gfx::AcceleratedWidget widget,
gfx::SysmemBufferCollectionId id); gfx::SysmemBufferCollectionId id);
private: private:
scenic::Session scenic_session_; scenic::Session scenic_session_;
ScenicSurfaceFactory* const scenic_surface_factory_;
fuchsia::ui::views::ViewHolderToken view_holder_token_; fuchsia::ui::views::ViewHolderToken view_holder_token_;
scenic::View view_; scenic::View view_;
fuchsia::images::ImagePipe2Ptr image_pipe_; fuchsia::images::ImagePipe2Ptr image_pipe_;
std::unique_ptr<scenic::Material> image_material_; std::unique_ptr<scenic::Material> image_material_;
bool enable_blend_ = false; bool enable_blend_ = false;
ScenicSurface* surface_ = nullptr; gfx::AcceleratedWidget widget_ = gfx::kNullAcceleratedWidget;
gfx::AcceleratedWidget widget_;
gfx::SysmemBufferCollectionId buffer_collection_id_; gfx::SysmemBufferCollectionId buffer_collection_id_;
THREAD_CHECKER(thread_checker_); THREAD_CHECKER(thread_checker_);
......
...@@ -271,7 +271,9 @@ void ScenicSurfaceFactory::RemoveSurface(gfx::AcceleratedWidget widget) { ...@@ -271,7 +271,9 @@ void ScenicSurfaceFactory::RemoveSurface(gfx::AcceleratedWidget widget) {
ScenicSurface* ScenicSurfaceFactory::GetSurface(gfx::AcceleratedWidget widget) { ScenicSurface* ScenicSurfaceFactory::GetSurface(gfx::AcceleratedWidget widget) {
base::AutoLock lock(surface_lock_); base::AutoLock lock(surface_lock_);
auto it = surface_map_.find(widget); auto it = surface_map_.find(widget);
DCHECK(it != surface_map_.end()); if (it == surface_map_.end())
return nullptr;
ScenicSurface* surface = it->second; ScenicSurface* surface = it->second;
surface->AssertBelongsToCurrentThread(); surface->AssertBelongsToCurrentThread();
return surface; return surface;
......
...@@ -140,7 +140,8 @@ bool SysmemBufferCollection::Initialize( ...@@ -140,7 +140,8 @@ bool SysmemBufferCollection::Initialize(
is_protected_ = force_protected; is_protected_ = force_protected;
if (register_with_image_pipe) { if (register_with_image_pipe) {
scenic_overlay_view_.emplace(scenic_surface_factory->CreateScenicSession()); scenic_overlay_view_.emplace(scenic_surface_factory->CreateScenicSession(),
scenic_surface_factory);
surface_factory_ = scenic_surface_factory; surface_factory_ = scenic_surface_factory;
} }
......
...@@ -106,8 +106,7 @@ bool SysmemNativePixmap::ScheduleOverlayPlane( ...@@ -106,8 +106,7 @@ bool SysmemNativePixmap::ScheduleOverlayPlane(
DCHECK(collection_->scenic_overlay_view()); DCHECK(collection_->scenic_overlay_view());
ScenicOverlayView* overlay_view = collection_->scenic_overlay_view(); ScenicOverlayView* overlay_view = collection_->scenic_overlay_view();
const auto& buffer_collection_id = handle_.buffer_collection_id.value(); const auto& buffer_collection_id = handle_.buffer_collection_id.value();
if (!overlay_view->AttachToScenicSurface(surface, widget, if (!overlay_view->AttachToScenicSurface(widget, buffer_collection_id)) {
buffer_collection_id)) {
DLOG(ERROR) << "Failed to attach to surface."; DLOG(ERROR) << "Failed to attach to surface.";
return false; return false;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment