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

Unified Diff: components/exo/surface.cc

Issue 2562263002: [ABANDONED] Revert of Change exo::SurfaceFactoryOwner to exo::ExoCompositorFrameSink (Closed)
Patch Set: Created 4 years 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
« no previous file with comments | « components/exo/surface.h ('k') | components/exo/surface_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: components/exo/surface.cc
diff --git a/components/exo/surface.cc b/components/exo/surface.cc
index 2c23fc3b970315845e196b8bd4f84ae73ddfbd5b..8c5ed61a34fbf8d36487c17dee035e2b90c4db1a 100644
--- a/components/exo/surface.cc
+++ b/components/exo/surface.cc
@@ -18,7 +18,9 @@
#include "cc/quads/texture_draw_quad.h"
#include "cc/resources/single_release_callback.h"
#include "cc/surfaces/surface.h"
+#include "cc/surfaces/surface_factory.h"
#include "cc/surfaces/surface_id_allocator.h"
+#include "cc/surfaces/surface_manager.h"
#include "components/exo/buffer.h"
#include "components/exo/surface_delegate.h"
#include "components/exo/surface_observer.h"
@@ -139,24 +141,73 @@
DISALLOW_COPY_AND_ASSIGN(CustomWindowTargeter);
};
+void SatisfyCallback(cc::SurfaceManager* manager,
+ const cc::SurfaceSequence& sequence) {
+ std::vector<uint32_t> sequences;
+ sequences.push_back(sequence.sequence);
+ manager->DidSatisfySequences(sequence.frame_sink_id, &sequences);
+}
+
+void RequireCallback(cc::SurfaceManager* manager,
+ const cc::SurfaceId& id,
+ const cc::SurfaceSequence& sequence) {
+ cc::Surface* surface = manager->GetSurfaceForId(id);
+ if (!surface) {
+ LOG(ERROR) << "Attempting to require callback on nonexistent surface";
+ return;
+ }
+ surface->AddDestructionDependency(sequence);
+}
+
} // namespace
+
+////////////////////////////////////////////////////////////////////////////////
+// SurfaceFactoryOwner, public:
+
+SurfaceFactoryOwner::SurfaceFactoryOwner() {}
+
+////////////////////////////////////////////////////////////////////////////////
+// cc::SurfaceFactoryClient overrides:
+
+void SurfaceFactoryOwner::ReturnResources(
+ const cc::ReturnedResourceArray& resources) {
+ scoped_refptr<SurfaceFactoryOwner> holder(this);
+ for (auto& resource : resources) {
+ auto it = release_callbacks_.find(resource.id);
+ DCHECK(it != release_callbacks_.end());
+ it->second.second->Run(resource.sync_token, resource.lost);
+ release_callbacks_.erase(it);
+ }
+}
+
+void SurfaceFactoryOwner::WillDrawSurface(const cc::LocalFrameId& id,
+ const gfx::Rect& damage_rect) {
+ if (surface_)
+ surface_->WillDraw();
+}
+
+void SurfaceFactoryOwner::SetBeginFrameSource(
+ cc::BeginFrameSource* begin_frame_source) {
+ if (surface_)
+ surface_->SetBeginFrameSource(begin_frame_source);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// SurfaceFactoryOwner, private:
+
+SurfaceFactoryOwner::~SurfaceFactoryOwner() {
+ if (surface_factory_->manager())
+ surface_factory_->manager()->InvalidateFrameSinkId(frame_sink_id_);
+}
////////////////////////////////////////////////////////////////////////////////
// Surface, public:
Surface::Surface()
: window_(new aura::Window(new CustomWindowDelegate(this))),
- frame_sink_id_(
- aura::Env::GetInstance()->context_factory()->AllocateFrameSinkId()) {
- cc::mojom::MojoCompositorFrameSinkClientPtr frame_sink_holder_ptr;
- cc::mojom::MojoCompositorFrameSinkClientRequest frame_sink_client_request =
- mojo::GetProxy(&frame_sink_holder_ptr);
- std::unique_ptr<CompositorFrameSink> frame_sink(new CompositorFrameSink(
- frame_sink_id_,
- aura::Env::GetInstance()->context_factory()->GetSurfaceManager(),
- std::move(frame_sink_holder_ptr)));
- compositor_frame_sink_holder_ = new CompositorFrameSinkHolder(
- this, std::move(frame_sink), std::move(frame_sink_client_request));
+ surface_manager_(
+ aura::Env::GetInstance()->context_factory()->GetSurfaceManager()),
+ factory_owner_(new SurfaceFactoryOwner) {
window_->SetType(ui::wm::WINDOW_TYPE_CONTROL);
window_->SetName("ExoSurface");
window_->SetProperty(kSurfaceKey, this);
@@ -164,6 +215,15 @@
window_->SetEventTargeter(base::WrapUnique(new CustomWindowTargeter));
window_->set_owned_by_parent(false);
window_->AddObserver(this);
+ factory_owner_->surface_ = this;
+ factory_owner_->frame_sink_id_ =
+ aura::Env::GetInstance()->context_factory()->AllocateFrameSinkId();
+ factory_owner_->id_allocator_.reset(new cc::SurfaceIdAllocator());
+ surface_manager_->RegisterFrameSinkId(factory_owner_->frame_sink_id_);
+ surface_manager_->RegisterSurfaceFactoryClient(factory_owner_->frame_sink_id_,
+ factory_owner_.get());
+ factory_owner_->surface_factory_.reset(new cc::SurfaceFactory(
+ factory_owner_->frame_sink_id_, surface_manager_, factory_owner_.get()));
aura::Env::GetInstance()->context_factory()->AddObserver(this);
}
@@ -175,11 +235,22 @@
window_->RemoveObserver(this);
window_->layer()->SetShowSolidColorContent();
+ factory_owner_->surface_ = nullptr;
+
+ // Call pending frame callbacks with a null frame time to indicate that they
+ // have been cancelled.
frame_callbacks_.splice(frame_callbacks_.end(), pending_frame_callbacks_);
- compositor_frame_sink_holder_->ActivateFrameCallbacks(&frame_callbacks_);
- compositor_frame_sink_holder_->CancelFrameCallbacks();
-
- compositor_frame_sink_holder_->GetCompositorFrameSink()->EvictFrame();
+ active_frame_callbacks_.splice(active_frame_callbacks_.end(),
+ frame_callbacks_);
+ for (const auto& frame_callback : active_frame_callbacks_)
+ frame_callback.Run(base::TimeTicks());
+ if (begin_frame_source_ && needs_begin_frame_)
+ begin_frame_source_->RemoveObserver(this);
+
+ factory_owner_->surface_factory_->EvictSurface();
+
+ surface_manager_->UnregisterSurfaceFactoryClient(
+ factory_owner_->frame_sink_id_);
}
// static
@@ -188,7 +259,7 @@
}
cc::SurfaceId Surface::GetSurfaceId() const {
- return cc::SurfaceId(frame_sink_id_, local_frame_id_);
+ return cc::SurfaceId(factory_owner_->frame_sink_id_, local_frame_id_);
}
void Surface::Attach(Buffer* buffer) {
@@ -405,7 +476,7 @@
cc::LocalFrameId old_local_frame_id = local_frame_id_;
if (needs_commit_to_new_surface_ || !local_frame_id_.is_valid()) {
needs_commit_to_new_surface_ = false;
- local_frame_id_ = id_allocator_.GenerateId();
+ local_frame_id_ = factory_owner_->id_allocator_->GenerateId();
}
UpdateSurface(true);
@@ -418,11 +489,9 @@
window_->layer()->SetBounds(
gfx::Rect(window_->layer()->bounds().origin(), content_size_));
window_->layer()->SetShowSurface(
- cc::SurfaceId(frame_sink_id_, local_frame_id_),
- base::Bind(&CompositorFrameSinkHolder::Satisfy,
- compositor_frame_sink_holder_),
- base::Bind(&CompositorFrameSinkHolder::Require,
- compositor_frame_sink_holder_),
+ cc::SurfaceId(factory_owner_->frame_sink_id_, local_frame_id_),
+ base::Bind(&SatisfyCallback, base::Unretained(surface_manager_)),
+ base::Bind(&RequireCallback, base::Unretained(surface_manager_)),
content_size_, contents_surface_to_layer_scale, content_size_);
window_->layer()->SetFillsBoundsOpaquely(
state_.blend_mode == SkBlendMode::kSrc ||
@@ -434,8 +503,7 @@
pending_damage_.setEmpty();
DCHECK(!current_resource_.id ||
- compositor_frame_sink_holder_->HasReleaseCallbackForResource(
- current_resource_.id));
+ factory_owner_->release_callbacks_.count(current_resource_.id));
// Move pending frame callbacks to the end of frame_callbacks_.
frame_callbacks_.splice(frame_callbacks_.end(), pending_frame_callbacks_);
@@ -540,7 +608,18 @@
}
void Surface::WillDraw() {
- compositor_frame_sink_holder_->ActivateFrameCallbacks(&frame_callbacks_);
+ active_frame_callbacks_.splice(active_frame_callbacks_.end(),
+ frame_callbacks_);
+ UpdateNeedsBeginFrame();
+}
+
+void Surface::SetBeginFrameSource(cc::BeginFrameSource* begin_frame_source) {
+ if (begin_frame_source_ && needs_begin_frame_) {
+ begin_frame_source_->RemoveObserver(this);
+ needs_begin_frame_ = false;
+ }
+ begin_frame_source_ = begin_frame_source;
+ UpdateNeedsBeginFrame();
}
void Surface::CheckIfSurfaceHierarchyNeedsCommitToNewSurfaces() {
@@ -557,12 +636,26 @@
}
void Surface::OnWindowAddedToRootWindow(aura::Window* window) {
- window->layer()->GetCompositor()->AddFrameSink(frame_sink_id_);
+ window->layer()->GetCompositor()->AddFrameSink(
+ factory_owner_->frame_sink_id_);
}
void Surface::OnWindowRemovingFromRootWindow(aura::Window* window,
aura::Window* new_root) {
- window->layer()->GetCompositor()->RemoveFrameSink(frame_sink_id_);
+ window->layer()->GetCompositor()->RemoveFrameSink(
+ factory_owner_->frame_sink_id_);
+}
+
+void Surface::OnBeginFrame(const cc::BeginFrameArgs& args) {
+ while (!active_frame_callbacks_.empty()) {
+ active_frame_callbacks_.front().Run(args.frame_time);
+ active_frame_callbacks_.pop_front();
+ }
+ last_begin_frame_args_ = args;
+}
+
+const cc::BeginFrameArgs& Surface::LastUsedBeginFrameArgs() const {
+ return last_begin_frame_args_;
}
Surface::State::State() : input_region(SkIRect::MakeLargest()) {}
@@ -650,8 +743,8 @@
texture_mailbox.target());
resource.is_overlay_candidate = texture_mailbox.is_overlay_candidate();
- compositor_frame_sink_holder_->AddResourceReleaseCallback(
- resource.id, std::move(texture_mailbox_release_callback));
+ factory_owner_->release_callbacks_[resource.id] = std::make_pair(
+ factory_owner_, std::move(texture_mailbox_release_callback));
current_resource_ = resource;
} else {
current_resource_.id = 0;
@@ -741,8 +834,24 @@
}
frame.render_pass_list.push_back(std::move(render_pass));
- compositor_frame_sink_holder_->GetCompositorFrameSink()
- ->SubmitCompositorFrame(local_frame_id_, std::move(frame));
+
+ factory_owner_->surface_factory_->SubmitCompositorFrame(
+ local_frame_id_, std::move(frame), cc::SurfaceFactory::DrawCallback());
+}
+
+void Surface::UpdateNeedsBeginFrame() {
+ if (!begin_frame_source_)
+ return;
+
+ bool needs_begin_frame = !active_frame_callbacks_.empty();
+ if (needs_begin_frame == needs_begin_frame_)
+ return;
+
+ needs_begin_frame_ = needs_begin_frame;
+ if (needs_begin_frame)
+ begin_frame_source_->AddObserver(this);
+ else
+ begin_frame_source_->RemoveObserver(this);
}
int64_t Surface::SetPropertyInternal(const void* key,
« no previous file with comments | « components/exo/surface.h ('k') | components/exo/surface_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698