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