| OLD | NEW |
| 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 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 130 DCHECK(uses_mailbox_); | 130 DCHECK(uses_mailbox_); |
| 131 DCHECK(!mailbox.IsValid() || !holder_ref_ || | 131 DCHECK(!mailbox.IsValid() || !holder_ref_ || |
| 132 !mailbox.Equals(holder_ref_->holder()->mailbox())); | 132 !mailbox.Equals(holder_ref_->holder()->mailbox())); |
| 133 // 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. |
| 134 if (mailbox.IsValid()) | 134 if (mailbox.IsValid()) |
| 135 holder_ref_ = MailboxHolder::Create(mailbox); | 135 holder_ref_ = MailboxHolder::Create(mailbox); |
| 136 else | 136 else |
| 137 holder_ref_.reset(); | 137 holder_ref_.reset(); |
| 138 needs_set_mailbox_ = true; | 138 needs_set_mailbox_ = true; |
| 139 SetNeedsCommit(); | 139 SetNeedsCommit(); |
| 140 // The active frame needs to be replaced and the mailbox returned before the |
| 141 // commit is called complete. |
| 142 SetNextCommitWaitsForActivation(); |
| 140 } | 143 } |
| 141 | 144 |
| 142 void TextureLayer::WillModifyTexture() { | 145 void TextureLayer::WillModifyTexture() { |
| 143 if (layer_tree_host() && (DrawsContent() || content_committed_)) { | 146 if (layer_tree_host() && (DrawsContent() || content_committed_)) { |
| 144 layer_tree_host()->AcquireLayerTextures(); | 147 layer_tree_host()->AcquireLayerTextures(); |
| 145 content_committed_ = false; | 148 content_committed_ = false; |
| 146 } | 149 } |
| 147 } | 150 } |
| 148 | 151 |
| 149 void TextureLayer::SetNeedsDisplayRect(const gfx::RectF& dirty_rect) { | 152 void TextureLayer::SetNeedsDisplayRect(const gfx::RectF& dirty_rect) { |
| 150 Layer::SetNeedsDisplayRect(dirty_rect); | 153 Layer::SetNeedsDisplayRect(dirty_rect); |
| 151 | 154 |
| 152 if (rate_limit_context_ && client_ && layer_tree_host() && DrawsContent()) | 155 if (rate_limit_context_ && client_ && layer_tree_host() && DrawsContent()) |
| 153 layer_tree_host()->StartRateLimiter(client_->Context3d()); | 156 layer_tree_host()->StartRateLimiter(client_->Context3d()); |
| 154 } | 157 } |
| 155 | 158 |
| 156 void TextureLayer::SetLayerTreeHost(LayerTreeHost* host) { | 159 void TextureLayer::SetLayerTreeHost(LayerTreeHost* host) { |
| 157 if (layer_tree_host() == host) { | 160 if (layer_tree_host() == host) { |
| 158 Layer::SetLayerTreeHost(host); | 161 Layer::SetLayerTreeHost(host); |
| 159 return; | 162 return; |
| 160 } | 163 } |
| 161 | 164 |
| 162 if (layer_tree_host()) { | 165 if (layer_tree_host()) { |
| 163 if (texture_id_) | 166 if (texture_id_) { |
| 164 layer_tree_host()->AcquireLayerTextures(); | 167 layer_tree_host()->AcquireLayerTextures(); |
| 168 // The active frame needs to be replaced and the mailbox returned before |
| 169 // the commit is called complete. |
| 170 SetNextCommitWaitsForActivation(); |
| 171 } |
| 165 if (rate_limit_context_ && client_) | 172 if (rate_limit_context_ && client_) |
| 166 layer_tree_host()->StopRateLimiter(client_->Context3d()); | 173 layer_tree_host()->StopRateLimiter(client_->Context3d()); |
| 167 } | 174 } |
| 168 // If we're removed from the tree, the TextureLayerImpl will be destroyed, and | 175 // If we're removed from the tree, the TextureLayerImpl will be destroyed, and |
| 169 // we will need to set the mailbox again on a new TextureLayerImpl the next | 176 // we will need to set the mailbox again on a new TextureLayerImpl the next |
| 170 // time we push. | 177 // time we push. |
| 171 if (!host && uses_mailbox_ && holder_ref_) | 178 if (!host && uses_mailbox_ && holder_ref_) { |
| 172 needs_set_mailbox_ = true; | 179 needs_set_mailbox_ = true; |
| 180 // The active frame needs to be replaced and the mailbox returned before the |
| 181 // commit is called complete. |
| 182 SetNextCommitWaitsForActivation(); |
| 183 } |
| 173 Layer::SetLayerTreeHost(host); | 184 Layer::SetLayerTreeHost(host); |
| 174 } | 185 } |
| 175 | 186 |
| 176 bool TextureLayer::DrawsContent() const { | 187 bool TextureLayer::DrawsContent() const { |
| 177 return (client_ || texture_id_ || holder_ref_) && Layer::DrawsContent(); | 188 return (client_ || texture_id_ || holder_ref_) && Layer::DrawsContent(); |
| 178 } | 189 } |
| 179 | 190 |
| 180 bool TextureLayer::Update(ResourceUpdateQueue* queue, | 191 bool TextureLayer::Update(ResourceUpdateQueue* queue, |
| 181 const OcclusionTracker* occlusion) { | 192 const OcclusionTracker* occlusion) { |
| 182 bool updated = Layer::Update(queue, occlusion); | 193 bool updated = Layer::Update(queue, occlusion); |
| 183 if (client_) { | 194 if (client_) { |
| 184 if (uses_mailbox_) { | 195 if (uses_mailbox_) { |
| 185 TextureMailbox mailbox; | 196 TextureMailbox mailbox; |
| 186 if (client_->PrepareTextureMailbox( | 197 if (client_->PrepareTextureMailbox( |
| 187 &mailbox, layer_tree_host()->UsingSharedMemoryResources())) { | 198 &mailbox, layer_tree_host()->UsingSharedMemoryResources())) { |
| 188 SetTextureMailbox(mailbox); | 199 SetTextureMailbox(mailbox); |
| 189 updated = true; | 200 updated = true; |
| 190 } | 201 } |
| 191 } else { | 202 } else { |
| 192 texture_id_ = client_->PrepareTexture(); | 203 texture_id_ = client_->PrepareTexture(); |
| 193 DCHECK_EQ(!!texture_id_, !!client_->Context3d()); | 204 DCHECK_EQ(!!texture_id_, !!client_->Context3d()); |
| 194 if (client_->Context3d() && | 205 if (client_->Context3d() && |
| 195 client_->Context3d()->getGraphicsResetStatusARB() != GL_NO_ERROR) | 206 client_->Context3d()->getGraphicsResetStatusARB() != GL_NO_ERROR) |
| 196 texture_id_ = 0; | 207 texture_id_ = 0; |
| 197 updated = true; | 208 updated = true; |
| 209 SetNextCommitWaitsForActivation(); |
| 198 } | 210 } |
| 199 } | 211 } |
| 200 | 212 |
| 201 // SetTextureMailbox could be called externally and the same mailbox used for | 213 // SetTextureMailbox could be called externally and the same mailbox used for |
| 202 // different textures. Such callers notify this layer that the texture has | 214 // different textures. Such callers notify this layer that the texture has |
| 203 // changed by calling SetNeedsDisplay, so check for that here. | 215 // changed by calling SetNeedsDisplay, so check for that here. |
| 204 return updated || !update_rect_.IsEmpty(); | 216 return updated || !update_rect_.IsEmpty(); |
| 205 } | 217 } |
| 206 | 218 |
| 207 void TextureLayer::PushPropertiesTo(LayerImpl* layer) { | 219 void TextureLayer::PushPropertiesTo(LayerImpl* layer) { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 233 Region TextureLayer::VisibleContentOpaqueRegion() const { | 245 Region TextureLayer::VisibleContentOpaqueRegion() const { |
| 234 if (contents_opaque()) | 246 if (contents_opaque()) |
| 235 return visible_content_rect(); | 247 return visible_content_rect(); |
| 236 | 248 |
| 237 if (blend_background_color_ && (SkColorGetA(background_color()) == 0xFF)) | 249 if (blend_background_color_ && (SkColorGetA(background_color()) == 0xFF)) |
| 238 return visible_content_rect(); | 250 return visible_content_rect(); |
| 239 | 251 |
| 240 return Region(); | 252 return Region(); |
| 241 } | 253 } |
| 242 | 254 |
| 243 bool TextureLayer::BlocksPendingCommit() const { | |
| 244 // Double-buffered texture layers need to be blocked until they can be made | |
| 245 // triple-buffered. Single-buffered layers already prevent draws, so | |
| 246 // can block too for simplicity. | |
| 247 return DrawsContent(); | |
| 248 } | |
| 249 | |
| 250 bool TextureLayer::CanClipSelf() const { | 255 bool TextureLayer::CanClipSelf() const { |
| 251 return true; | 256 return true; |
| 252 } | 257 } |
| 253 | 258 |
| 254 TextureLayer::MailboxHolder::MainThreadReference::MainThreadReference( | 259 TextureLayer::MailboxHolder::MainThreadReference::MainThreadReference( |
| 255 MailboxHolder* holder) | 260 MailboxHolder* holder) |
| 256 : holder_(holder) { | 261 : holder_(holder) { |
| 257 holder_->InternalAddRef(); | 262 holder_->InternalAddRef(); |
| 258 } | 263 } |
| 259 | 264 |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 313 } | 318 } |
| 314 | 319 |
| 315 void TextureLayer::MailboxHolder::ReturnAndReleaseOnImplThread( | 320 void TextureLayer::MailboxHolder::ReturnAndReleaseOnImplThread( |
| 316 unsigned sync_point, bool is_lost) { | 321 unsigned sync_point, bool is_lost) { |
| 317 message_loop_->PostTask(FROM_HERE, base::Bind( | 322 message_loop_->PostTask(FROM_HERE, base::Bind( |
| 318 &MailboxHolder::ReturnAndReleaseOnMainThread, | 323 &MailboxHolder::ReturnAndReleaseOnMainThread, |
| 319 this, sync_point, is_lost)); | 324 this, sync_point, is_lost)); |
| 320 } | 325 } |
| 321 | 326 |
| 322 } // namespace cc | 327 } // namespace cc |
| OLD | NEW |