summaryrefslogtreecommitdiffstats
path: root/cc/surfaces/surface_factory_unittest.cc
diff options
context:
space:
mode:
authorbrianderson <brianderson@chromium.org>2015-10-20 13:35:31 -0700
committerCommit bot <commit-bot@chromium.org>2015-10-20 20:36:33 +0000
commit877996b0753f32b67fac2835756d23f476e72f10 (patch)
treee33de9848de316fb45daa59de60eecf7b47d0d62 /cc/surfaces/surface_factory_unittest.cc
parente020927c5d71942748f67c25c347d1355dd11135 (diff)
downloadchromium_src-877996b0753f32b67fac2835756d23f476e72f10.zip
chromium_src-877996b0753f32b67fac2835756d23f476e72f10.tar.gz
chromium_src-877996b0753f32b67fac2835756d23f476e72f10.tar.bz2
cc: Plumbing for BeginFrameSource based on Surfaces
This patch makes a stable decision about which Display a Surface belongs to and notifies the corresponding SurfaceFactoryClient of the BeginFrameSource belonging to that Display. The stable decision is based on the sorted order of Display pointers that the Surface currently belongs to. This is only plumbing - the actual endpoints (BeginFrameSource to use and what to do with that BeginFrameSource) still need to be hooked up. R=jbauman,mithro BUG=401331, 471411 CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel Review URL: https://codereview.chromium.org/1304063014 Cr-Commit-Position: refs/heads/master@{#355140}
Diffstat (limited to 'cc/surfaces/surface_factory_unittest.cc')
-rw-r--r--cc/surfaces/surface_factory_unittest.cc115
1 files changed, 78 insertions, 37 deletions
diff --git a/cc/surfaces/surface_factory_unittest.cc b/cc/surfaces/surface_factory_unittest.cc
index 9629a4e..d516aa3 100644
--- a/cc/surfaces/surface_factory_unittest.cc
+++ b/cc/surfaces/surface_factory_unittest.cc
@@ -12,6 +12,7 @@
#include "cc/surfaces/surface_factory.h"
#include "cc/surfaces/surface_factory_client.h"
#include "cc/surfaces/surface_manager.h"
+#include "cc/test/scheduler_test_common.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gfx/geometry/size.h"
@@ -20,7 +21,7 @@ namespace {
class TestSurfaceFactoryClient : public SurfaceFactoryClient {
public:
- TestSurfaceFactoryClient() {}
+ TestSurfaceFactoryClient() : begin_frame_source_(nullptr) {}
~TestSurfaceFactoryClient() override {}
void ReturnResources(const ReturnedResourceArray& resources) override {
@@ -28,27 +29,36 @@ class TestSurfaceFactoryClient : public SurfaceFactoryClient {
returned_resources_.end(), resources.begin(), resources.end());
}
+ void SetBeginFrameSource(SurfaceId surface_id,
+ BeginFrameSource* begin_frame_source) override {
+ begin_frame_source_ = begin_frame_source;
+ }
+
const ReturnedResourceArray& returned_resources() const {
return returned_resources_;
}
void clear_returned_resources() { returned_resources_.clear(); }
+ BeginFrameSource* begin_frame_source() const { return begin_frame_source_; }
+
private:
ReturnedResourceArray returned_resources_;
+ BeginFrameSource* begin_frame_source_;
DISALLOW_COPY_AND_ASSIGN(TestSurfaceFactoryClient);
};
class SurfaceFactoryTest : public testing::Test {
public:
- SurfaceFactoryTest() : factory_(&manager_, &client_), surface_id_(3) {
- factory_.Create(surface_id_);
+ SurfaceFactoryTest()
+ : factory_(new SurfaceFactory(&manager_, &client_)), surface_id_(3) {
+ factory_->Create(surface_id_);
}
~SurfaceFactoryTest() override {
if (!surface_id_.is_null())
- factory_.Destroy(surface_id_);
+ factory_->Destroy(surface_id_);
}
void SubmitCompositorFrameWithResources(ResourceId* resource_ids,
@@ -62,8 +72,8 @@ class SurfaceFactoryTest : public testing::Test {
}
scoped_ptr<CompositorFrame> frame(new CompositorFrame);
frame->delegated_frame_data = frame_data.Pass();
- factory_.SubmitCompositorFrame(surface_id_, frame.Pass(),
- SurfaceFactory::DrawCallback());
+ factory_->SubmitCompositorFrame(surface_id_, frame.Pass(),
+ SurfaceFactory::DrawCallback());
}
void UnrefResources(ResourceId* ids_to_unref,
@@ -76,7 +86,7 @@ class SurfaceFactoryTest : public testing::Test {
resource.count = counts_to_unref[i];
unref_array.push_back(resource);
}
- factory_.UnrefResources(unref_array);
+ factory_->UnrefResources(unref_array);
}
void CheckReturnedResourcesMatchExpected(ResourceId* expected_returned_ids,
@@ -95,14 +105,14 @@ class SurfaceFactoryTest : public testing::Test {
void RefCurrentFrameResources() {
Surface* surface = manager_.GetSurfaceForId(surface_id_);
- factory_.RefResources(
+ factory_->RefResources(
surface->GetEligibleFrame()->delegated_frame_data->resource_list);
}
protected:
SurfaceManager manager_;
TestSurfaceFactoryClient client_;
- SurfaceFactory factory_;
+ scoped_ptr<SurfaceFactory> factory_;
SurfaceId surface_id_;
};
@@ -374,17 +384,17 @@ TEST_F(SurfaceFactoryTest, ResourceLifetime) {
TEST_F(SurfaceFactoryTest, BlankNoIndexIncrement) {
SurfaceId surface_id(6);
- factory_.Create(surface_id);
+ factory_->Create(surface_id);
Surface* surface = manager_.GetSurfaceForId(surface_id);
ASSERT_NE(nullptr, surface);
EXPECT_EQ(2, surface->frame_index());
scoped_ptr<CompositorFrame> frame(new CompositorFrame);
frame->delegated_frame_data.reset(new DelegatedFrameData);
- factory_.SubmitCompositorFrame(surface_id, frame.Pass(),
- SurfaceFactory::DrawCallback());
+ factory_->SubmitCompositorFrame(surface_id, frame.Pass(),
+ SurfaceFactory::DrawCallback());
EXPECT_EQ(2, surface->frame_index());
- factory_.Destroy(surface_id);
+ factory_->Destroy(surface_id);
}
void DrawCallback(uint32* execute_count,
@@ -397,7 +407,7 @@ void DrawCallback(uint32* execute_count,
// Tests doing a DestroyAll before shutting down the factory;
TEST_F(SurfaceFactoryTest, DestroyAll) {
SurfaceId id(7);
- factory_.Create(id);
+ factory_->Create(id);
scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData);
TransferableResource resource;
@@ -409,25 +419,25 @@ TEST_F(SurfaceFactoryTest, DestroyAll) {
uint32 execute_count = 0;
SurfaceDrawStatus drawn = SurfaceDrawStatus::DRAW_SKIPPED;
- factory_.SubmitCompositorFrame(
+ factory_->SubmitCompositorFrame(
id, frame.Pass(), base::Bind(&DrawCallback, &execute_count, &drawn));
surface_id_ = SurfaceId();
- factory_.DestroyAll();
+ factory_->DestroyAll();
EXPECT_EQ(1u, execute_count);
EXPECT_EQ(SurfaceDrawStatus::DRAW_SKIPPED, drawn);
}
TEST_F(SurfaceFactoryTest, DestroySequence) {
SurfaceId id2(5);
- factory_.Create(id2);
+ factory_->Create(id2);
manager_.RegisterSurfaceIdNamespace(0);
// Check that waiting before the sequence is satisfied works.
manager_.GetSurfaceForId(id2)
->AddDestructionDependency(SurfaceSequence(0, 4));
- factory_.Destroy(id2);
+ factory_->Destroy(id2);
scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData);
scoped_ptr<CompositorFrame> frame(new CompositorFrame);
@@ -435,16 +445,16 @@ TEST_F(SurfaceFactoryTest, DestroySequence) {
frame->metadata.satisfies_sequences.push_back(4);
frame->delegated_frame_data = frame_data.Pass();
DCHECK(manager_.GetSurfaceForId(id2));
- factory_.SubmitCompositorFrame(surface_id_, frame.Pass(),
- SurfaceFactory::DrawCallback());
+ factory_->SubmitCompositorFrame(surface_id_, frame.Pass(),
+ SurfaceFactory::DrawCallback());
DCHECK(!manager_.GetSurfaceForId(id2));
// Check that waiting after the sequence is satisfied works.
- factory_.Create(id2);
+ factory_->Create(id2);
DCHECK(manager_.GetSurfaceForId(id2));
manager_.GetSurfaceForId(id2)
->AddDestructionDependency(SurfaceSequence(0, 6));
- factory_.Destroy(id2);
+ factory_->Destroy(id2);
DCHECK(!manager_.GetSurfaceForId(id2));
}
@@ -453,12 +463,12 @@ TEST_F(SurfaceFactoryTest, DestroySequence) {
TEST_F(SurfaceFactoryTest, InvalidIdNamespace) {
uint32_t id_namespace = 9u;
SurfaceId id(5);
- factory_.Create(id);
+ factory_->Create(id);
manager_.RegisterSurfaceIdNamespace(id_namespace);
manager_.GetSurfaceForId(id)
->AddDestructionDependency(SurfaceSequence(id_namespace, 4));
- factory_.Destroy(id);
+ factory_->Destroy(id);
// Verify the dependency has prevented the surface from getting destroyed.
EXPECT_TRUE(manager_.GetSurfaceForId(id));
@@ -472,7 +482,7 @@ TEST_F(SurfaceFactoryTest, InvalidIdNamespace) {
TEST_F(SurfaceFactoryTest, DestroyCycle) {
SurfaceId id2(5);
- factory_.Create(id2);
+ factory_->Create(id2);
manager_.RegisterSurfaceIdNamespace(0);
@@ -487,10 +497,10 @@ TEST_F(SurfaceFactoryTest, DestroyCycle) {
frame_data->render_pass_list.push_back(render_pass.Pass());
scoped_ptr<CompositorFrame> frame(new CompositorFrame);
frame->delegated_frame_data = frame_data.Pass();
- factory_.SubmitCompositorFrame(id2, frame.Pass(),
- SurfaceFactory::DrawCallback());
+ factory_->SubmitCompositorFrame(id2, frame.Pass(),
+ SurfaceFactory::DrawCallback());
}
- factory_.Destroy(id2);
+ factory_->Destroy(id2);
// Give surface_id_ a frame that references id2.
{
@@ -500,10 +510,10 @@ TEST_F(SurfaceFactoryTest, DestroyCycle) {
frame_data->render_pass_list.push_back(render_pass.Pass());
scoped_ptr<CompositorFrame> frame(new CompositorFrame);
frame->delegated_frame_data = frame_data.Pass();
- factory_.SubmitCompositorFrame(surface_id_, frame.Pass(),
- SurfaceFactory::DrawCallback());
+ factory_->SubmitCompositorFrame(surface_id_, frame.Pass(),
+ SurfaceFactory::DrawCallback());
}
- factory_.Destroy(surface_id_);
+ factory_->Destroy(surface_id_);
EXPECT_TRUE(manager_.GetSurfaceForId(id2));
// surface_id_ should be retained by reference from id2.
EXPECT_TRUE(manager_.GetSurfaceForId(surface_id_));
@@ -534,8 +544,8 @@ TEST_F(SurfaceFactoryTest, DuplicateCopyRequest) {
frame_data->render_pass_list.push_back(render_pass.Pass());
scoped_ptr<CompositorFrame> frame(new CompositorFrame);
frame->delegated_frame_data = frame_data.Pass();
- factory_.SubmitCompositorFrame(surface_id_, frame.Pass(),
- SurfaceFactory::DrawCallback());
+ factory_->SubmitCompositorFrame(surface_id_, frame.Pass(),
+ SurfaceFactory::DrawCallback());
}
void* source1 = &source1;
void* source2 = &source2;
@@ -546,7 +556,7 @@ TEST_F(SurfaceFactoryTest, DuplicateCopyRequest) {
base::Bind(&CopyRequestTestCallback, &called1));
request->set_source(source1);
- factory_.RequestCopyOfSurface(surface_id_, request.Pass());
+ factory_->RequestCopyOfSurface(surface_id_, request.Pass());
EXPECT_FALSE(called1);
bool called2 = false;
@@ -554,7 +564,7 @@ TEST_F(SurfaceFactoryTest, DuplicateCopyRequest) {
base::Bind(&CopyRequestTestCallback, &called2));
request->set_source(source2);
- factory_.RequestCopyOfSurface(surface_id_, request.Pass());
+ factory_->RequestCopyOfSurface(surface_id_, request.Pass());
// Callbacks have different sources so neither should be called.
EXPECT_FALSE(called1);
EXPECT_FALSE(called2);
@@ -564,18 +574,49 @@ TEST_F(SurfaceFactoryTest, DuplicateCopyRequest) {
base::Bind(&CopyRequestTestCallback, &called3));
request->set_source(source1);
- factory_.RequestCopyOfSurface(surface_id_, request.Pass());
+ factory_->RequestCopyOfSurface(surface_id_, request.Pass());
// Two callbacks are from source1, so the first should be called.
EXPECT_TRUE(called1);
EXPECT_FALSE(called2);
EXPECT_FALSE(called3);
- factory_.Destroy(surface_id_);
+ factory_->Destroy(surface_id_);
surface_id_ = SurfaceId();
EXPECT_TRUE(called1);
EXPECT_TRUE(called2);
EXPECT_TRUE(called3);
}
+// Verifies BFS is forwarded to the client.
+TEST_F(SurfaceFactoryTest, SetBeginFrameSource) {
+ FakeBeginFrameSource bfs1;
+ FakeBeginFrameSource bfs2;
+ EXPECT_EQ(nullptr, client_.begin_frame_source());
+ factory_->SetBeginFrameSource(surface_id_, &bfs1);
+ EXPECT_EQ(&bfs1, client_.begin_frame_source());
+ factory_->SetBeginFrameSource(surface_id_, &bfs2);
+ EXPECT_EQ(&bfs2, client_.begin_frame_source());
+ factory_->SetBeginFrameSource(surface_id_, nullptr);
+ EXPECT_EQ(nullptr, client_.begin_frame_source());
+}
+
+TEST_F(SurfaceFactoryTest, BeginFrameSourceRemovedOnFactoryDestruction) {
+ FakeBeginFrameSource bfs;
+ factory_->SetBeginFrameSource(surface_id_, &bfs);
+ EXPECT_EQ(&bfs, client_.begin_frame_source());
+
+ // Prevent the Surface from being destroyed when we destroy the factory.
+ manager_.RegisterSurfaceIdNamespace(0);
+ manager_.GetSurfaceForId(surface_id_)
+ ->AddDestructionDependency(SurfaceSequence(0, 4));
+
+ surface_id_ = SurfaceId();
+ factory_->DestroyAll();
+
+ EXPECT_EQ(&bfs, client_.begin_frame_source());
+ factory_.reset();
+ EXPECT_EQ(nullptr, client_.begin_frame_source());
+}
+
} // namespace
} // namespace cc