summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkloveless@chromium.org <kloveless@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-24 01:27:29 +0000
committerkloveless@chromium.org <kloveless@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-24 01:27:29 +0000
commit4bad8b6c1fc0c250b77578343f396d136955a881 (patch)
treeca1c08a17363ce6084886e6842a4bf31f1fb6d1a
parent60b3ee87c91829366a589740131186ac0bce420e (diff)
downloadchromium_src-4bad8b6c1fc0c250b77578343f396d136955a881.zip
chromium_src-4bad8b6c1fc0c250b77578343f396d136955a881.tar.gz
chromium_src-4bad8b6c1fc0c250b77578343f396d136955a881.tar.bz2
Remove the extra, unneeded commits that TextureLayer::Update does.
BUG= Review URL: https://codereview.chromium.org/32193013 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@230587 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--cc/layers/texture_layer.cc27
-rw-r--r--cc/layers/texture_layer.h5
-rw-r--r--cc/layers/texture_layer_unittest.cc103
3 files changed, 131 insertions, 4 deletions
diff --git a/cc/layers/texture_layer.cc b/cc/layers/texture_layer.cc
index 18410fb..45a456e 100644
--- a/cc/layers/texture_layer.cc
+++ b/cc/layers/texture_layer.cc
@@ -132,9 +132,10 @@ void TextureLayer::SetTextureId(unsigned id) {
SetNextCommitWaitsForActivation();
}
-void TextureLayer::SetTextureMailbox(
+void TextureLayer::SetTextureMailboxInternal(
const TextureMailbox& mailbox,
- scoped_ptr<SingleReleaseCallback> release_callback) {
+ scoped_ptr<SingleReleaseCallback> release_callback,
+ bool requires_commit) {
DCHECK(uses_mailbox_);
DCHECK(!mailbox.IsValid() || !holder_ref_ ||
!mailbox.Equals(holder_ref_->holder()->mailbox()));
@@ -146,12 +147,26 @@ void TextureLayer::SetTextureMailbox(
else
holder_ref_.reset();
needs_set_mailbox_ = true;
- SetNeedsCommit();
+ // If we are within a commit, no need to do it again immediately after.
+ if (requires_commit)
+ SetNeedsCommit();
+ else
+ SetNeedsPushProperties();
+
// The active frame needs to be replaced and the mailbox returned before the
// commit is called complete.
SetNextCommitWaitsForActivation();
}
+void TextureLayer::SetTextureMailbox(
+ const TextureMailbox& mailbox,
+ scoped_ptr<SingleReleaseCallback> release_callback) {
+ SetTextureMailboxInternal(
+ mailbox,
+ release_callback.Pass(),
+ true /* requires_commit */);
+}
+
void TextureLayer::WillModifyTexture() {
if (layer_tree_host() && (DrawsContent() || content_committed_)) {
layer_tree_host()->AcquireLayerTextures();
@@ -209,7 +224,11 @@ bool TextureLayer::Update(ResourceUpdateQueue* queue,
&mailbox,
&release_callback,
layer_tree_host()->UsingSharedMemoryResources())) {
- SetTextureMailbox(mailbox, release_callback.Pass());
+ // Already within a commit, no need to do another one immediately.
+ SetTextureMailboxInternal(
+ mailbox,
+ release_callback.Pass(),
+ false /* requires_commit */);
updated = true;
}
} else {
diff --git a/cc/layers/texture_layer.h b/cc/layers/texture_layer.h
index b0edb22..0a7fd4e 100644
--- a/cc/layers/texture_layer.h
+++ b/cc/layers/texture_layer.h
@@ -148,6 +148,11 @@ class CC_EXPORT TextureLayer : public Layer {
virtual ~TextureLayer();
private:
+ void SetTextureMailboxInternal(
+ const TextureMailbox& mailbox,
+ scoped_ptr<SingleReleaseCallback> release_callback,
+ bool requires_commit);
+
TextureLayerClient* client_;
bool uses_mailbox_;
diff --git a/cc/layers/texture_layer_unittest.cc b/cc/layers/texture_layer_unittest.cc
index c576341..63cf132 100644
--- a/cc/layers/texture_layer_unittest.cc
+++ b/cc/layers/texture_layer_unittest.cc
@@ -1695,6 +1695,109 @@ class TextureLayerChangeInvisibleTest
// delegating renderer.
SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F(TextureLayerChangeInvisibleTest);
+// Checks that TextureLayer::Update does not cause an extra commit when setting
+// the texture mailbox.
+class TextureLayerNoExtraCommitForMailboxTest
+ : public LayerTreeTest,
+ public TextureLayerClient {
+ public:
+ TextureLayerNoExtraCommitForMailboxTest()
+ : prepare_mailbox_count_(0) {}
+
+ // TextureLayerClient implementation.
+ virtual unsigned PrepareTexture() OVERRIDE {
+ NOTREACHED();
+ return 0;
+ }
+
+ // TextureLayerClient implementation.
+ virtual WebKit::WebGraphicsContext3D* Context3d() OVERRIDE {
+ NOTREACHED();
+ return NULL;
+ }
+
+ virtual bool PrepareTextureMailbox(
+ cc::TextureMailbox* mailbox,
+ scoped_ptr<SingleReleaseCallback>* release_callback,
+ bool use_shared_memory) OVERRIDE {
+ prepare_mailbox_count_++;
+ // Alternate between two mailboxes to ensure that the TextureLayer updates
+ // and commits.
+ if (prepare_mailbox_count_ % 2 == 0)
+ *mailbox = MakeMailbox('1');
+ else
+ *mailbox = MakeMailbox('2');
+
+ // Non-zero mailboxes need a callback.
+ *release_callback = SingleReleaseCallback::Create(
+ base::Bind(&TextureLayerNoExtraCommitForMailboxTest::MailboxReleased,
+ base::Unretained(this)));
+ // If the test fails, this would cause an infinite number of commits.
+ return true;
+ }
+
+ TextureMailbox MakeMailbox(char name) {
+ return TextureMailbox(std::string(64, name));
+ }
+
+ void MailboxReleased(unsigned sync_point, bool lost_resource) {
+ }
+
+ virtual void SetupTree() OVERRIDE {
+ scoped_refptr<Layer> root = Layer::Create();
+ root->SetBounds(gfx::Size(10, 10));
+ root->SetAnchorPoint(gfx::PointF());
+ root->SetIsDrawable(true);
+
+ solid_layer_ = SolidColorLayer::Create();
+ solid_layer_->SetBounds(gfx::Size(10, 10));
+ solid_layer_->SetIsDrawable(true);
+ solid_layer_->SetBackgroundColor(SK_ColorWHITE);
+ root->AddChild(solid_layer_);
+
+ parent_layer_ = Layer::Create();
+ parent_layer_->SetBounds(gfx::Size(10, 10));
+ parent_layer_->SetIsDrawable(true);
+ root->AddChild(parent_layer_);
+
+ texture_layer_ = TextureLayer::CreateForMailbox(this);
+ texture_layer_->SetBounds(gfx::Size(10, 10));
+ texture_layer_->SetAnchorPoint(gfx::PointF());
+ texture_layer_->SetIsDrawable(true);
+ parent_layer_->AddChild(texture_layer_);
+
+ layer_tree_host()->SetRootLayer(root);
+ LayerTreeTest::SetupTree();
+ }
+
+ virtual void BeginTest() OVERRIDE {
+ PostSetNeedsCommitToMainThread();
+ }
+
+
+ virtual void DidCommit() OVERRIDE {
+ switch (layer_tree_host()->source_frame_number()) {
+ case 1:
+ EndTest();
+ break;
+ default:
+ NOTREACHED();
+ break;
+ }
+ }
+
+ virtual void AfterTest() OVERRIDE {}
+
+ private:
+ scoped_refptr<SolidColorLayer> solid_layer_;
+ scoped_refptr<Layer> parent_layer_;
+ scoped_refptr<TextureLayer> texture_layer_;
+
+ int prepare_mailbox_count_;
+};
+
+SINGLE_AND_MULTI_THREAD_TEST_F(TextureLayerNoExtraCommitForMailboxTest);
+
// Checks that changing a mailbox in the client for a TextureLayer that's
// invisible correctly works and uses the new mailbox as soon as the layer
// becomes visible (and returns the old one).