| Index: cc/layers/texture_layer.cc
|
| diff --git a/cc/layers/texture_layer.cc b/cc/layers/texture_layer.cc
|
| deleted file mode 100644
|
| index cf1149b5161ac63a1f818d7c760cf4a938efbe74..0000000000000000000000000000000000000000
|
| --- a/cc/layers/texture_layer.cc
|
| +++ /dev/null
|
| @@ -1,351 +0,0 @@
|
| -// Copyright 2010 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "cc/layers/texture_layer.h"
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/callback_helpers.h"
|
| -#include "base/location.h"
|
| -#include "base/synchronization/lock.h"
|
| -#include "cc/base/simple_enclosed_region.h"
|
| -#include "cc/layers/texture_layer_client.h"
|
| -#include "cc/layers/texture_layer_impl.h"
|
| -#include "cc/resources/single_release_callback.h"
|
| -#include "cc/resources/single_release_callback_impl.h"
|
| -#include "cc/trees/blocking_task_runner.h"
|
| -#include "cc/trees/layer_tree_host.h"
|
| -
|
| -namespace cc {
|
| -
|
| -scoped_refptr<TextureLayer> TextureLayer::CreateForMailbox(
|
| - TextureLayerClient* client) {
|
| - return scoped_refptr<TextureLayer>(new TextureLayer(client));
|
| -}
|
| -
|
| -TextureLayer::TextureLayer(TextureLayerClient* client)
|
| - : Layer(),
|
| - client_(client),
|
| - flipped_(true),
|
| - nearest_neighbor_(false),
|
| - uv_top_left_(0.f, 0.f),
|
| - uv_bottom_right_(1.f, 1.f),
|
| - premultiplied_alpha_(true),
|
| - blend_background_color_(false),
|
| - rate_limit_context_(false),
|
| - needs_set_mailbox_(false) {
|
| - vertex_opacity_[0] = 1.0f;
|
| - vertex_opacity_[1] = 1.0f;
|
| - vertex_opacity_[2] = 1.0f;
|
| - vertex_opacity_[3] = 1.0f;
|
| -}
|
| -
|
| -TextureLayer::~TextureLayer() {
|
| -}
|
| -
|
| -void TextureLayer::ClearClient() {
|
| - if (rate_limit_context_ && client_ && layer_tree_host())
|
| - layer_tree_host()->StopRateLimiter();
|
| - client_ = nullptr;
|
| - ClearTexture();
|
| - UpdateDrawsContent(HasDrawableContent());
|
| -}
|
| -
|
| -void TextureLayer::ClearTexture() {
|
| - SetTextureMailbox(TextureMailbox(), nullptr);
|
| -}
|
| -
|
| -scoped_ptr<LayerImpl> TextureLayer::CreateLayerImpl(LayerTreeImpl* tree_impl) {
|
| - return TextureLayerImpl::Create(tree_impl, id());
|
| -}
|
| -
|
| -void TextureLayer::SetFlipped(bool flipped) {
|
| - if (flipped_ == flipped)
|
| - return;
|
| - flipped_ = flipped;
|
| - SetNeedsCommit();
|
| -}
|
| -
|
| -void TextureLayer::SetNearestNeighbor(bool nearest_neighbor) {
|
| - if (nearest_neighbor_ == nearest_neighbor)
|
| - return;
|
| - nearest_neighbor_ = nearest_neighbor;
|
| - SetNeedsCommit();
|
| -}
|
| -
|
| -void TextureLayer::SetUV(const gfx::PointF& top_left,
|
| - const gfx::PointF& bottom_right) {
|
| - if (uv_top_left_ == top_left && uv_bottom_right_ == bottom_right)
|
| - return;
|
| - uv_top_left_ = top_left;
|
| - uv_bottom_right_ = bottom_right;
|
| - SetNeedsCommit();
|
| -}
|
| -
|
| -void TextureLayer::SetVertexOpacity(float bottom_left,
|
| - float top_left,
|
| - float top_right,
|
| - float bottom_right) {
|
| - // Indexing according to the quad vertex generation:
|
| - // 1--2
|
| - // | |
|
| - // 0--3
|
| - if (vertex_opacity_[0] == bottom_left &&
|
| - vertex_opacity_[1] == top_left &&
|
| - vertex_opacity_[2] == top_right &&
|
| - vertex_opacity_[3] == bottom_right)
|
| - return;
|
| - vertex_opacity_[0] = bottom_left;
|
| - vertex_opacity_[1] = top_left;
|
| - vertex_opacity_[2] = top_right;
|
| - vertex_opacity_[3] = bottom_right;
|
| - SetNeedsCommit();
|
| -}
|
| -
|
| -void TextureLayer::SetPremultipliedAlpha(bool premultiplied_alpha) {
|
| - if (premultiplied_alpha_ == premultiplied_alpha)
|
| - return;
|
| - premultiplied_alpha_ = premultiplied_alpha;
|
| - SetNeedsCommit();
|
| -}
|
| -
|
| -void TextureLayer::SetBlendBackgroundColor(bool blend) {
|
| - if (blend_background_color_ == blend)
|
| - return;
|
| - blend_background_color_ = blend;
|
| - SetNeedsCommit();
|
| -}
|
| -
|
| -void TextureLayer::SetRateLimitContext(bool rate_limit) {
|
| - if (!rate_limit && rate_limit_context_ && client_ && layer_tree_host())
|
| - layer_tree_host()->StopRateLimiter();
|
| -
|
| - rate_limit_context_ = rate_limit;
|
| -}
|
| -
|
| -void TextureLayer::SetTextureMailboxInternal(
|
| - const TextureMailbox& mailbox,
|
| - scoped_ptr<SingleReleaseCallback> release_callback,
|
| - bool requires_commit,
|
| - bool allow_mailbox_reuse) {
|
| - DCHECK(!mailbox.IsValid() || !holder_ref_ ||
|
| - !mailbox.Equals(holder_ref_->holder()->mailbox()) ||
|
| - allow_mailbox_reuse);
|
| - DCHECK_EQ(mailbox.IsValid(), !!release_callback);
|
| -
|
| - // If we never commited the mailbox, we need to release it here.
|
| - if (mailbox.IsValid()) {
|
| - holder_ref_ =
|
| - TextureMailboxHolder::Create(mailbox, release_callback.Pass());
|
| - } else {
|
| - holder_ref_ = nullptr;
|
| - }
|
| - needs_set_mailbox_ = true;
|
| - // If we are within a commit, no need to do it again immediately after.
|
| - if (requires_commit)
|
| - SetNeedsCommit();
|
| - else
|
| - SetNeedsPushProperties();
|
| -
|
| - UpdateDrawsContent(HasDrawableContent());
|
| - // 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) {
|
| - bool requires_commit = true;
|
| - bool allow_mailbox_reuse = false;
|
| - SetTextureMailboxInternal(
|
| - mailbox, release_callback.Pass(), requires_commit, allow_mailbox_reuse);
|
| -}
|
| -
|
| -static void IgnoreReleaseCallback(uint32 sync_point, bool lost) {}
|
| -
|
| -void TextureLayer::SetTextureMailboxWithoutReleaseCallback(
|
| - const TextureMailbox& mailbox) {
|
| - // We allow reuse of the mailbox if there is a new sync point signalling new
|
| - // content, and the release callback goes nowhere since we'll be calling it
|
| - // multiple times for the same mailbox.
|
| - DCHECK(!mailbox.IsValid() || !holder_ref_ ||
|
| - !mailbox.Equals(holder_ref_->holder()->mailbox()) ||
|
| - mailbox.sync_point() != holder_ref_->holder()->mailbox().sync_point());
|
| - scoped_ptr<SingleReleaseCallback> release;
|
| - bool requires_commit = true;
|
| - bool allow_mailbox_reuse = true;
|
| - if (mailbox.IsValid())
|
| - release = SingleReleaseCallback::Create(base::Bind(&IgnoreReleaseCallback));
|
| - SetTextureMailboxInternal(
|
| - mailbox, release.Pass(), requires_commit, allow_mailbox_reuse);
|
| -}
|
| -
|
| -void TextureLayer::SetNeedsDisplayRect(const gfx::Rect& dirty_rect) {
|
| - Layer::SetNeedsDisplayRect(dirty_rect);
|
| -
|
| - if (rate_limit_context_ && client_ && layer_tree_host() && DrawsContent())
|
| - layer_tree_host()->StartRateLimiter();
|
| -}
|
| -
|
| -void TextureLayer::SetLayerTreeHost(LayerTreeHost* host) {
|
| - if (layer_tree_host() == host) {
|
| - Layer::SetLayerTreeHost(host);
|
| - return;
|
| - }
|
| -
|
| - if (layer_tree_host()) {
|
| - if (rate_limit_context_ && client_)
|
| - layer_tree_host()->StopRateLimiter();
|
| - }
|
| - // If we're removed from the tree, the TextureLayerImpl will be destroyed, and
|
| - // we will need to set the mailbox again on a new TextureLayerImpl the next
|
| - // time we push.
|
| - if (!host && holder_ref_) {
|
| - needs_set_mailbox_ = true;
|
| - // The active frame needs to be replaced and the mailbox returned before the
|
| - // commit is called complete.
|
| - SetNextCommitWaitsForActivation();
|
| - }
|
| - Layer::SetLayerTreeHost(host);
|
| -}
|
| -
|
| -bool TextureLayer::HasDrawableContent() const {
|
| - return (client_ || holder_ref_) && Layer::HasDrawableContent();
|
| -}
|
| -
|
| -bool TextureLayer::Update(ResourceUpdateQueue* queue,
|
| - const OcclusionTracker<Layer>* occlusion) {
|
| - bool updated = Layer::Update(queue, occlusion);
|
| - if (client_) {
|
| - TextureMailbox mailbox;
|
| - scoped_ptr<SingleReleaseCallback> release_callback;
|
| - if (client_->PrepareTextureMailbox(
|
| - &mailbox,
|
| - &release_callback,
|
| - layer_tree_host()->UsingSharedMemoryResources())) {
|
| - // Already within a commit, no need to do another one immediately.
|
| - bool requires_commit = false;
|
| - bool allow_mailbox_reuse = false;
|
| - SetTextureMailboxInternal(mailbox,
|
| - release_callback.Pass(),
|
| - requires_commit,
|
| - allow_mailbox_reuse);
|
| - updated = true;
|
| - }
|
| - }
|
| -
|
| - // SetTextureMailbox could be called externally and the same mailbox used for
|
| - // different textures. Such callers notify this layer that the texture has
|
| - // changed by calling SetNeedsDisplay, so check for that here.
|
| - return updated || !update_rect_.IsEmpty();
|
| -}
|
| -
|
| -void TextureLayer::PushPropertiesTo(LayerImpl* layer) {
|
| - Layer::PushPropertiesTo(layer);
|
| -
|
| - TextureLayerImpl* texture_layer = static_cast<TextureLayerImpl*>(layer);
|
| - texture_layer->SetFlipped(flipped_);
|
| - texture_layer->SetNearestNeighbor(nearest_neighbor_);
|
| - texture_layer->SetUVTopLeft(uv_top_left_);
|
| - texture_layer->SetUVBottomRight(uv_bottom_right_);
|
| - texture_layer->SetVertexOpacity(vertex_opacity_);
|
| - texture_layer->SetPremultipliedAlpha(premultiplied_alpha_);
|
| - texture_layer->SetBlendBackgroundColor(blend_background_color_);
|
| - if (needs_set_mailbox_) {
|
| - TextureMailbox texture_mailbox;
|
| - scoped_ptr<SingleReleaseCallbackImpl> release_callback_impl;
|
| - if (holder_ref_) {
|
| - TextureMailboxHolder* holder = holder_ref_->holder();
|
| - texture_mailbox = holder->mailbox();
|
| - release_callback_impl = holder->GetCallbackForImplThread();
|
| - }
|
| - texture_layer->SetTextureMailbox(texture_mailbox,
|
| - release_callback_impl.Pass());
|
| - needs_set_mailbox_ = false;
|
| - }
|
| -}
|
| -
|
| -SimpleEnclosedRegion TextureLayer::VisibleContentOpaqueRegion() const {
|
| - if (contents_opaque())
|
| - return SimpleEnclosedRegion(visible_content_rect());
|
| -
|
| - if (blend_background_color_ && (SkColorGetA(background_color()) == 0xFF))
|
| - return SimpleEnclosedRegion(visible_content_rect());
|
| -
|
| - return SimpleEnclosedRegion();
|
| -}
|
| -
|
| -TextureLayer::TextureMailboxHolder::MainThreadReference::MainThreadReference(
|
| - TextureMailboxHolder* holder)
|
| - : holder_(holder) {
|
| - holder_->InternalAddRef();
|
| -}
|
| -
|
| -TextureLayer::TextureMailboxHolder::MainThreadReference::
|
| - ~MainThreadReference() {
|
| - holder_->InternalRelease();
|
| -}
|
| -
|
| -TextureLayer::TextureMailboxHolder::TextureMailboxHolder(
|
| - const TextureMailbox& mailbox,
|
| - scoped_ptr<SingleReleaseCallback> release_callback)
|
| - : internal_references_(0),
|
| - mailbox_(mailbox),
|
| - release_callback_(release_callback.Pass()),
|
| - sync_point_(mailbox.sync_point()),
|
| - is_lost_(false) {
|
| -}
|
| -
|
| -TextureLayer::TextureMailboxHolder::~TextureMailboxHolder() {
|
| - DCHECK_EQ(0u, internal_references_);
|
| -}
|
| -
|
| -scoped_ptr<TextureLayer::TextureMailboxHolder::MainThreadReference>
|
| -TextureLayer::TextureMailboxHolder::Create(
|
| - const TextureMailbox& mailbox,
|
| - scoped_ptr<SingleReleaseCallback> release_callback) {
|
| - return make_scoped_ptr(new MainThreadReference(
|
| - new TextureMailboxHolder(mailbox, release_callback.Pass())));
|
| -}
|
| -
|
| -void TextureLayer::TextureMailboxHolder::Return(uint32 sync_point,
|
| - bool is_lost) {
|
| - base::AutoLock lock(arguments_lock_);
|
| - sync_point_ = sync_point;
|
| - is_lost_ = is_lost;
|
| -}
|
| -
|
| -scoped_ptr<SingleReleaseCallbackImpl>
|
| -TextureLayer::TextureMailboxHolder::GetCallbackForImplThread() {
|
| - // We can't call GetCallbackForImplThread if we released the main thread
|
| - // reference.
|
| - DCHECK_GT(internal_references_, 0u);
|
| - InternalAddRef();
|
| - return SingleReleaseCallbackImpl::Create(
|
| - base::Bind(&TextureMailboxHolder::ReturnAndReleaseOnImplThread, this));
|
| -}
|
| -
|
| -void TextureLayer::TextureMailboxHolder::InternalAddRef() {
|
| - ++internal_references_;
|
| -}
|
| -
|
| -void TextureLayer::TextureMailboxHolder::InternalRelease() {
|
| - DCHECK(main_thread_checker_.CalledOnValidThread());
|
| - if (!--internal_references_) {
|
| - release_callback_->Run(sync_point_, is_lost_);
|
| - mailbox_ = TextureMailbox();
|
| - release_callback_ = nullptr;
|
| - }
|
| -}
|
| -
|
| -void TextureLayer::TextureMailboxHolder::ReturnAndReleaseOnImplThread(
|
| - uint32 sync_point,
|
| - bool is_lost,
|
| - BlockingTaskRunner* main_thread_task_runner) {
|
| - Return(sync_point, is_lost);
|
| - main_thread_task_runner->PostTask(
|
| - FROM_HERE, base::Bind(&TextureMailboxHolder::InternalRelease, this));
|
| -}
|
| -
|
| -} // namespace cc
|
|
|