1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "cc/blink/web_external_texture_layer_impl.h" 6 7 #include "cc/blink/web_external_bitmap_impl.h" 8 #include "cc/blink/web_layer_impl.h" 9 #include "cc/layers/texture_layer.h" 10 #include "cc/resources/resource_update_queue.h" 11 #include "cc/resources/single_release_callback.h" 12 #include "cc/resources/texture_mailbox.h" 13 #include "third_party/WebKit/public/platform/WebExternalTextureLayerClient.h" 14 #include "third_party/WebKit/public/platform/WebExternalTextureMailbox.h" 15 #include "third_party/WebKit/public/platform/WebFloatRect.h" 16 #include "third_party/WebKit/public/platform/WebGraphicsContext3D.h" 17 #include "third_party/WebKit/public/platform/WebSize.h" 18 #include "third_party/khronos/GLES2/gl2.h" 19 20 using cc::TextureLayer; 21 using cc::ResourceUpdateQueue; 22 23 namespace cc_blink { 24 25 WebExternalTextureLayerImpl::WebExternalTextureLayerImpl( 26 blink::WebExternalTextureLayerClient* client) 27 : client_(client) { 28 cc::TextureLayerClient* cc_client = client_ ? this : NULL; 29 scoped_refptr<TextureLayer> layer = TextureLayer::CreateForMailbox(cc_client); 30 layer->SetIsDrawable(true); 31 layer_.reset(new WebLayerImpl(layer)); 32 } 33 34 WebExternalTextureLayerImpl::~WebExternalTextureLayerImpl() { 35 static_cast<TextureLayer*>(layer_->layer())->ClearClient(); 36 } 37 38 blink::WebLayer* WebExternalTextureLayerImpl::layer() { 39 return layer_.get(); 40 } 41 42 void WebExternalTextureLayerImpl::clearTexture() { 43 TextureLayer* layer = static_cast<TextureLayer*>(layer_->layer()); 44 layer->ClearTexture(); 45 } 46 47 void WebExternalTextureLayerImpl::setOpaque(bool opaque) { 48 static_cast<TextureLayer*>(layer_->layer())->SetContentsOpaque(opaque); 49 } 50 51 void WebExternalTextureLayerImpl::setPremultipliedAlpha( 52 bool premultiplied_alpha) { 53 static_cast<TextureLayer*>(layer_->layer()) 54 ->SetPremultipliedAlpha(premultiplied_alpha); 55 } 56 57 void WebExternalTextureLayerImpl::setBlendBackgroundColor(bool blend) { 58 static_cast<TextureLayer*>(layer_->layer())->SetBlendBackgroundColor(blend); 59 } 60 61 void WebExternalTextureLayerImpl::setRateLimitContext(bool rate_limit) { 62 static_cast<TextureLayer*>(layer_->layer())->SetRateLimitContext(rate_limit); 63 } 64 65 bool WebExternalTextureLayerImpl::PrepareTextureMailbox( 66 cc::TextureMailbox* mailbox, 67 scoped_ptr<cc::SingleReleaseCallback>* release_callback, 68 bool use_shared_memory) { 69 blink::WebExternalTextureMailbox client_mailbox; 70 WebExternalBitmapImpl* bitmap = NULL; 71 72 if (use_shared_memory) 73 bitmap = AllocateBitmap(); 74 if (!client_->prepareMailbox(&client_mailbox, bitmap)) { 75 if (bitmap) 76 free_bitmaps_.push_back(bitmap); 77 return false; 78 } 79 gpu::Mailbox name; 80 name.SetName(client_mailbox.name); 81 if (bitmap) { 82 *mailbox = cc::TextureMailbox(bitmap->shared_memory(), bitmap->size()); 83 } else { 84 *mailbox = 85 cc::TextureMailbox(name, GL_TEXTURE_2D, client_mailbox.syncPoint); 86 } 87 mailbox->set_allow_overlay(client_mailbox.allowOverlay); 88 89 if (mailbox->IsValid()) { 90 *release_callback = cc::SingleReleaseCallback::Create( 91 base::Bind(&WebExternalTextureLayerImpl::DidReleaseMailbox, 92 this->AsWeakPtr(), 93 client_mailbox, 94 bitmap)); 95 } 96 97 return true; 98 } 99 100 WebExternalBitmapImpl* WebExternalTextureLayerImpl::AllocateBitmap() { 101 if (!free_bitmaps_.empty()) { 102 WebExternalBitmapImpl* result = free_bitmaps_.back(); 103 free_bitmaps_.weak_erase(free_bitmaps_.end() - 1); 104 return result; 105 } 106 return new WebExternalBitmapImpl; 107 } 108 109 // static 110 void WebExternalTextureLayerImpl::DidReleaseMailbox( 111 base::WeakPtr<WebExternalTextureLayerImpl> layer, 112 const blink::WebExternalTextureMailbox& mailbox, 113 WebExternalBitmapImpl* bitmap, 114 unsigned sync_point, 115 bool lost_resource) { 116 DCHECK(layer); 117 blink::WebExternalTextureMailbox available_mailbox; 118 memcpy(available_mailbox.name, mailbox.name, sizeof(available_mailbox.name)); 119 available_mailbox.syncPoint = sync_point; 120 if (bitmap) 121 layer->free_bitmaps_.push_back(bitmap); 122 layer->client_->mailboxReleased(available_mailbox, lost_resource); 123 } 124 125 } // namespace cc_blink 126