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 20using cc::TextureLayer; 21using cc::ResourceUpdateQueue; 22 23namespace cc_blink { 24 25WebExternalTextureLayerImpl::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 34WebExternalTextureLayerImpl::~WebExternalTextureLayerImpl() { 35 static_cast<TextureLayer*>(layer_->layer())->ClearClient(); 36} 37 38blink::WebLayer* WebExternalTextureLayerImpl::layer() { 39 return layer_.get(); 40} 41 42void WebExternalTextureLayerImpl::clearTexture() { 43 TextureLayer* layer = static_cast<TextureLayer*>(layer_->layer()); 44 layer->ClearTexture(); 45} 46 47void WebExternalTextureLayerImpl::setOpaque(bool opaque) { 48 static_cast<TextureLayer*>(layer_->layer())->SetContentsOpaque(opaque); 49} 50 51void WebExternalTextureLayerImpl::setPremultipliedAlpha( 52 bool premultiplied_alpha) { 53 static_cast<TextureLayer*>(layer_->layer()) 54 ->SetPremultipliedAlpha(premultiplied_alpha); 55} 56 57void WebExternalTextureLayerImpl::setBlendBackgroundColor(bool blend) { 58 static_cast<TextureLayer*>(layer_->layer())->SetBlendBackgroundColor(blend); 59} 60 61void WebExternalTextureLayerImpl::setRateLimitContext(bool rate_limit) { 62 static_cast<TextureLayer*>(layer_->layer())->SetRateLimitContext(rate_limit); 63} 64 65bool 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 100WebExternalBitmapImpl* 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 110void 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