15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2011 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/renderer/compositor_bindings/web_external_texture_layer_impl.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/texture_layer.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/resource_update_queue.h" 9d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "cc/resources/single_release_callback.h" 10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "cc/resources/texture_mailbox.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebExternalTextureLayerClient.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebExternalTextureMailbox.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebFloatRect.h" 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "third_party/WebKit/public/platform/WebGraphicsContext3D.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebSize.h" 167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "webkit/renderer/compositor_bindings/web_external_bitmap_impl.h" 1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/renderer/compositor_bindings/web_layer_impl.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using cc::TextureLayer; 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using cc::ResourceUpdateQueue; 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace webkit { 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebExternalTextureLayerImpl::WebExternalTextureLayerImpl( 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebExternalTextureLayerClient* client) 267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : client_(client) { 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cc::TextureLayerClient* cc_client = client_ ? this : NULL; 287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<TextureLayer> layer = TextureLayer::CreateForMailbox(cc_client); 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->SetIsDrawable(true); 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_.reset(new WebLayerImpl(layer)); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebExternalTextureLayerImpl::~WebExternalTextureLayerImpl() { 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<TextureLayer*>(layer_->layer())->ClearClient(); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebLayer* WebExternalTextureLayerImpl::layer() { return layer_.get(); } 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebExternalTextureLayerImpl::clearTexture() { 407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch TextureLayer *layer = static_cast<TextureLayer*>(layer_->layer()); 41ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch layer->WillModifyTexture(); 42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) layer->SetTextureMailbox(cc::TextureMailbox(), 43d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_ptr<cc::SingleReleaseCallback>()); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebExternalTextureLayerImpl::setOpaque(bool opaque) { 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<TextureLayer*>(layer_->layer())->SetContentsOpaque(opaque); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebExternalTextureLayerImpl::setPremultipliedAlpha( 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool premultiplied_alpha) { 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<TextureLayer*>(layer_->layer())->SetPremultipliedAlpha( 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) premultiplied_alpha); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid WebExternalTextureLayerImpl::setBlendBackgroundColor(bool blend) { 577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch static_cast<TextureLayer*>(layer_->layer())->SetBlendBackgroundColor(blend); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebExternalTextureLayerImpl::setRateLimitContext(bool rate_limit) { 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<TextureLayer*>(layer_->layer())->SetRateLimitContext(rate_limit); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochunsigned WebExternalTextureLayerImpl::PrepareTexture() { 657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NOTREACHED(); 667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return 0; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool WebExternalTextureLayerImpl::PrepareTextureMailbox( 707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch cc::TextureMailbox* mailbox, 71d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_ptr<cc::SingleReleaseCallback>* release_callback, 727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool use_shared_memory) { 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebExternalTextureMailbox client_mailbox; 747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch WebExternalBitmapImpl* bitmap = NULL; 757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (use_shared_memory) 777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bitmap = AllocateBitmap(); 787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!client_->prepareMailbox(&client_mailbox, bitmap)) { 797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (bitmap) 807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch free_bitmaps_.push_back(bitmap); 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gpu::Mailbox name; 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) name.SetName(client_mailbox.name); 85d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (bitmap) 86d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) *mailbox = cc::TextureMailbox(bitmap->shared_memory(), bitmap->size()); 87d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) else 88d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) *mailbox = cc::TextureMailbox(name, client_mailbox.syncPoint); 89d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 90d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (mailbox->IsValid()) { 91d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) *release_callback = cc::SingleReleaseCallback::Create(base::Bind( 92d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) &WebExternalTextureLayerImpl::DidReleaseMailbox, 93d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) this->AsWeakPtr(), 94d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) client_mailbox, 95d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) bitmap)); 967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 97d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochWebExternalBitmapImpl* WebExternalTextureLayerImpl::AllocateBitmap() { 1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!free_bitmaps_.empty()) { 1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch WebExternalBitmapImpl* result = free_bitmaps_.back(); 1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch free_bitmaps_.weak_erase(free_bitmaps_.end() - 1); 1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return result; 1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return new WebExternalBitmapImpl; 1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// static 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebExternalTextureLayerImpl::DidReleaseMailbox( 1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::WeakPtr<WebExternalTextureLayerImpl> layer, 113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebExternalTextureMailbox& mailbox, 1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch WebExternalBitmapImpl* bitmap, 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) unsigned sync_point, 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool lost_resource) { 1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (lost_resource || !layer) { 1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch delete bitmap; 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebExternalTextureMailbox available_mailbox; 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) memcpy(available_mailbox.name, mailbox.name, sizeof(available_mailbox.name)); 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) available_mailbox.syncPoint = sync_point; 1257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (bitmap) 1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer->free_bitmaps_.push_back(bitmap); 1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer->client_->mailboxReleased(available_mailbox); 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace webkit 131