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

Side by Side Diff: trunk/src/cc/layers/texture_layer.cc

Issue 19463010: Revert 212008 "cc: Remove TextureLayer::SetTextureId and Texture..." (Closed) Base URL: svn://svn.chromium.org/chrome/
Patch Set: Created 7 years, 5 months 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « trunk/src/cc/layers/texture_layer.h ('k') | trunk/src/cc/layers/texture_layer_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2010 The Chromium Authors. All rights reserved. 1 // Copyright 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/layers/texture_layer.h" 5 #include "cc/layers/texture_layer.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/location.h" 8 #include "base/location.h"
9 #include "base/message_loop/message_loop_proxy.h" 9 #include "base/message_loop/message_loop_proxy.h"
10 #include "cc/layers/texture_layer_client.h" 10 #include "cc/layers/texture_layer_client.h"
(...skipping 15 matching lines...) Expand all
26 TextureLayer::TextureLayer(TextureLayerClient* client, bool uses_mailbox) 26 TextureLayer::TextureLayer(TextureLayerClient* client, bool uses_mailbox)
27 : Layer(), 27 : Layer(),
28 client_(client), 28 client_(client),
29 uses_mailbox_(uses_mailbox), 29 uses_mailbox_(uses_mailbox),
30 flipped_(true), 30 flipped_(true),
31 uv_top_left_(0.f, 0.f), 31 uv_top_left_(0.f, 0.f),
32 uv_bottom_right_(1.f, 1.f), 32 uv_bottom_right_(1.f, 1.f),
33 premultiplied_alpha_(true), 33 premultiplied_alpha_(true),
34 blend_background_color_(false), 34 blend_background_color_(false),
35 rate_limit_context_(false), 35 rate_limit_context_(false),
36 impl_may_draw_client_data_(false), 36 content_committed_(false),
37 texture_id_(0), 37 texture_id_(0),
38 needs_set_mailbox_(false) { 38 needs_set_mailbox_(false) {
39 vertex_opacity_[0] = 1.0f; 39 vertex_opacity_[0] = 1.0f;
40 vertex_opacity_[1] = 1.0f; 40 vertex_opacity_[1] = 1.0f;
41 vertex_opacity_[2] = 1.0f; 41 vertex_opacity_[2] = 1.0f;
42 vertex_opacity_[3] = 1.0f; 42 vertex_opacity_[3] = 1.0f;
43 } 43 }
44 44
45 TextureLayer::~TextureLayer() { 45 TextureLayer::~TextureLayer() {
46 } 46 }
47 47
48 void TextureLayer::ClearClient() { 48 void TextureLayer::ClearClient() {
49 if (rate_limit_context_ && client_ && layer_tree_host()) 49 if (rate_limit_context_ && client_ && layer_tree_host())
50 layer_tree_host()->StopRateLimiter(client_->Context3d()); 50 layer_tree_host()->StopRateLimiter(client_->Context3d());
51 client_ = NULL; 51 client_ = NULL;
52 ClearTexture(); 52 if (uses_mailbox_)
53 }
54
55 void TextureLayer::ClearTexture() {
56 if (impl_may_draw_client_data_) {
57 DCHECK(layer_tree_host());
58 layer_tree_host()->AcquireLayerTextures();
59 impl_may_draw_client_data_ = false;
60 }
61 if (uses_mailbox_) {
62 SetTextureMailbox(TextureMailbox()); 53 SetTextureMailbox(TextureMailbox());
63 } else { 54 else
64 texture_id_ = 0; 55 SetTextureId(0);
65 SetNeedsCommit();
66 }
67 } 56 }
68 57
69 scoped_ptr<LayerImpl> TextureLayer::CreateLayerImpl(LayerTreeImpl* tree_impl) { 58 scoped_ptr<LayerImpl> TextureLayer::CreateLayerImpl(LayerTreeImpl* tree_impl) {
70 return TextureLayerImpl::Create(tree_impl, id(), uses_mailbox_). 59 return TextureLayerImpl::Create(tree_impl, id(), uses_mailbox_).
71 PassAs<LayerImpl>(); 60 PassAs<LayerImpl>();
72 } 61 }
73 62
74 void TextureLayer::SetFlipped(bool flipped) { 63 void TextureLayer::SetFlipped(bool flipped) {
75 if (flipped_ == flipped) 64 if (flipped_ == flipped)
76 return; 65 return;
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 SetNeedsCommit(); 109 SetNeedsCommit();
121 } 110 }
122 111
123 void TextureLayer::SetRateLimitContext(bool rate_limit) { 112 void TextureLayer::SetRateLimitContext(bool rate_limit) {
124 if (!rate_limit && rate_limit_context_ && client_ && layer_tree_host()) 113 if (!rate_limit && rate_limit_context_ && client_ && layer_tree_host())
125 layer_tree_host()->StopRateLimiter(client_->Context3d()); 114 layer_tree_host()->StopRateLimiter(client_->Context3d());
126 115
127 rate_limit_context_ = rate_limit; 116 rate_limit_context_ = rate_limit;
128 } 117 }
129 118
119 void TextureLayer::SetTextureId(unsigned id) {
120 DCHECK(!uses_mailbox_);
121 if (texture_id_ == id)
122 return;
123 if (texture_id_ && layer_tree_host())
124 layer_tree_host()->AcquireLayerTextures();
125 texture_id_ = id;
126 SetNeedsCommit();
127 }
128
130 void TextureLayer::SetTextureMailbox(const TextureMailbox& mailbox) { 129 void TextureLayer::SetTextureMailbox(const TextureMailbox& mailbox) {
131 DCHECK(uses_mailbox_); 130 DCHECK(uses_mailbox_);
132 DCHECK(!mailbox.IsValid() || !holder_ref_ || 131 DCHECK(!mailbox.IsValid() || !holder_ref_ ||
133 !mailbox.Equals(holder_ref_->holder()->mailbox())); 132 !mailbox.Equals(holder_ref_->holder()->mailbox()));
134 // If we never commited the mailbox, we need to release it here. 133 // If we never commited the mailbox, we need to release it here.
135 if (mailbox.IsValid()) 134 if (mailbox.IsValid())
136 holder_ref_ = MailboxHolder::Create(mailbox); 135 holder_ref_ = MailboxHolder::Create(mailbox);
137 else 136 else
138 holder_ref_.reset(); 137 holder_ref_.reset();
139 needs_set_mailbox_ = true; 138 needs_set_mailbox_ = true;
140 SetNeedsCommit(); 139 SetNeedsCommit();
141 } 140 }
142 141
142 void TextureLayer::WillModifyTexture() {
143 if (layer_tree_host() && (DrawsContent() || content_committed_)) {
144 layer_tree_host()->AcquireLayerTextures();
145 content_committed_ = false;
146 }
147 }
148
143 void TextureLayer::SetNeedsDisplayRect(const gfx::RectF& dirty_rect) { 149 void TextureLayer::SetNeedsDisplayRect(const gfx::RectF& dirty_rect) {
144 Layer::SetNeedsDisplayRect(dirty_rect); 150 Layer::SetNeedsDisplayRect(dirty_rect);
145 151
146 if (rate_limit_context_ && client_ && layer_tree_host() && DrawsContent()) 152 if (rate_limit_context_ && client_ && layer_tree_host() && DrawsContent())
147 layer_tree_host()->StartRateLimiter(client_->Context3d()); 153 layer_tree_host()->StartRateLimiter(client_->Context3d());
148 } 154 }
149 155
150 void TextureLayer::SetLayerTreeHost(LayerTreeHost* host) { 156 void TextureLayer::SetLayerTreeHost(LayerTreeHost* host) {
151 if (layer_tree_host() == host) { 157 if (layer_tree_host() == host) {
152 Layer::SetLayerTreeHost(host); 158 Layer::SetLayerTreeHost(host);
153 return; 159 return;
154 } 160 }
155 161
156 if (layer_tree_host()) { 162 if (layer_tree_host()) {
157 if (impl_may_draw_client_data_) { 163 if (texture_id_)
158 layer_tree_host()->AcquireLayerTextures(); 164 layer_tree_host()->AcquireLayerTextures();
159 impl_may_draw_client_data_ = false;
160 }
161 if (rate_limit_context_ && client_) 165 if (rate_limit_context_ && client_)
162 layer_tree_host()->StopRateLimiter(client_->Context3d()); 166 layer_tree_host()->StopRateLimiter(client_->Context3d());
163 } 167 }
164 // If we're removed from the tree, the TextureLayerImpl will be destroyed, and 168 // If we're removed from the tree, the TextureLayerImpl will be destroyed, and
165 // we will need to set the mailbox again on a new TextureLayerImpl the next 169 // we will need to set the mailbox again on a new TextureLayerImpl the next
166 // time we push. 170 // time we push.
167 if (!host && uses_mailbox_ && holder_ref_) 171 if (!host && uses_mailbox_ && holder_ref_)
168 needs_set_mailbox_ = true; 172 needs_set_mailbox_ = true;
169 Layer::SetLayerTreeHost(host); 173 Layer::SetLayerTreeHost(host);
170 } 174 }
171 175
172 bool TextureLayer::DrawsContent() const { 176 bool TextureLayer::DrawsContent() const {
173 return (client_ || texture_id_ || holder_ref_) && Layer::DrawsContent(); 177 return (client_ || texture_id_ || holder_ref_) && Layer::DrawsContent();
174 } 178 }
175 179
176 bool TextureLayer::DrawsClientData() const {
177 if (!Layer::DrawsContent() || !client_)
178 return false;
179 return texture_id_ || holder_ref_;
180 }
181
182 bool TextureLayer::Update(ResourceUpdateQueue* queue, 180 bool TextureLayer::Update(ResourceUpdateQueue* queue,
183 const OcclusionTracker* occlusion) { 181 const OcclusionTracker* occlusion) {
184 bool updated = false; 182 bool updated = false;
185 if (client_) { 183 if (client_) {
186 if (uses_mailbox_) { 184 if (uses_mailbox_) {
187 TextureMailbox mailbox; 185 TextureMailbox mailbox;
188 if (client_->PrepareTextureMailbox( 186 if (client_->PrepareTextureMailbox(
189 &mailbox, layer_tree_host()->UsingSharedMemoryResources())) { 187 &mailbox, layer_tree_host()->UsingSharedMemoryResources())) {
190 SetTextureMailbox(mailbox); 188 SetTextureMailbox(mailbox);
191 updated = true; 189 updated = true;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
224 MailboxHolder* holder = holder_ref_->holder(); 222 MailboxHolder* holder = holder_ref_->holder();
225 TextureMailbox::ReleaseCallback callback = 223 TextureMailbox::ReleaseCallback callback =
226 holder->GetCallbackForImplThread(); 224 holder->GetCallbackForImplThread();
227 texture_mailbox = holder->mailbox().CopyWithNewCallback(callback); 225 texture_mailbox = holder->mailbox().CopyWithNewCallback(callback);
228 } 226 }
229 texture_layer->SetTextureMailbox(texture_mailbox); 227 texture_layer->SetTextureMailbox(texture_mailbox);
230 needs_set_mailbox_ = false; 228 needs_set_mailbox_ = false;
231 } else { 229 } else {
232 texture_layer->set_texture_id(texture_id_); 230 texture_layer->set_texture_id(texture_id_);
233 } 231 }
234 impl_may_draw_client_data_ = DrawsClientData(); 232 content_committed_ = DrawsContent();
235 } 233 }
236 234
237 bool TextureLayer::BlocksPendingCommit() const { 235 bool TextureLayer::BlocksPendingCommit() const {
238 // Double-buffered texture layers need to be blocked until they can be made 236 // Double-buffered texture layers need to be blocked until they can be made
239 // triple-buffered. Single-buffered layers already prevent draws, so 237 // triple-buffered. Single-buffered layers already prevent draws, so
240 // can block too for simplicity. 238 // can block too for simplicity.
241 return DrawsContent(); 239 return DrawsContent();
242 } 240 }
243 241
244 bool TextureLayer::CanClipSelf() const { 242 bool TextureLayer::CanClipSelf() const {
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
307 } 305 }
308 306
309 void TextureLayer::MailboxHolder::ReturnAndReleaseOnImplThread( 307 void TextureLayer::MailboxHolder::ReturnAndReleaseOnImplThread(
310 unsigned sync_point, bool is_lost) { 308 unsigned sync_point, bool is_lost) {
311 message_loop_->PostTask(FROM_HERE, base::Bind( 309 message_loop_->PostTask(FROM_HERE, base::Bind(
312 &MailboxHolder::ReturnAndReleaseOnMainThread, 310 &MailboxHolder::ReturnAndReleaseOnMainThread,
313 this, sync_point, is_lost)); 311 this, sync_point, is_lost));
314 } 312 }
315 313
316 } // namespace cc 314 } // namespace cc
OLDNEW
« no previous file with comments | « trunk/src/cc/layers/texture_layer.h ('k') | trunk/src/cc/layers/texture_layer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698