1 // Copyright 2011 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.
5 #include "webkit/renderer/compositor_bindings/web_external_texture_layer_impl.h"
7 #include "cc/layers/texture_layer.h"
8 #include "cc/resources/resource_update_queue.h"
9 #include "cc/resources/single_release_callback.h"
10 #include "cc/resources/texture_mailbox.h"
11 #include "third_party/WebKit/public/platform/WebExternalTextureLayerClient.h"
12 #include "third_party/WebKit/public/platform/WebExternalTextureMailbox.h"
13 #include "third_party/WebKit/public/platform/WebFloatRect.h"
14 #include "third_party/WebKit/public/platform/WebGraphicsContext3D.h"
15 #include "third_party/WebKit/public/platform/WebSize.h"
16 #include "webkit/renderer/compositor_bindings/web_external_bitmap_impl.h"
17 #include "webkit/renderer/compositor_bindings/web_layer_impl.h"
19 using cc::TextureLayer
;
20 using cc::ResourceUpdateQueue
;
24 WebExternalTextureLayerImpl::WebExternalTextureLayerImpl(
25 blink::WebExternalTextureLayerClient
* client
)
27 cc::TextureLayerClient
* cc_client
= client_
? this : NULL
;
28 scoped_refptr
<TextureLayer
> layer
= TextureLayer::CreateForMailbox(cc_client
);
29 layer
->SetIsDrawable(true);
30 layer_
.reset(new WebLayerImpl(layer
));
33 WebExternalTextureLayerImpl::~WebExternalTextureLayerImpl() {
34 static_cast<TextureLayer
*>(layer_
->layer())->ClearClient();
37 blink::WebLayer
* WebExternalTextureLayerImpl::layer() { return layer_
.get(); }
39 void WebExternalTextureLayerImpl::clearTexture() {
40 TextureLayer
*layer
= static_cast<TextureLayer
*>(layer_
->layer());
41 layer
->WillModifyTexture();
42 layer
->SetTextureMailbox(cc::TextureMailbox(),
43 scoped_ptr
<cc::SingleReleaseCallback
>());
46 void WebExternalTextureLayerImpl::setOpaque(bool opaque
) {
47 static_cast<TextureLayer
*>(layer_
->layer())->SetContentsOpaque(opaque
);
50 void WebExternalTextureLayerImpl::setPremultipliedAlpha(
51 bool premultiplied_alpha
) {
52 static_cast<TextureLayer
*>(layer_
->layer())->SetPremultipliedAlpha(
56 void WebExternalTextureLayerImpl::setBlendBackgroundColor(bool blend
) {
57 static_cast<TextureLayer
*>(layer_
->layer())->SetBlendBackgroundColor(blend
);
60 void WebExternalTextureLayerImpl::setRateLimitContext(bool rate_limit
) {
61 static_cast<TextureLayer
*>(layer_
->layer())->SetRateLimitContext(rate_limit
);
64 unsigned WebExternalTextureLayerImpl::PrepareTexture() {
69 bool WebExternalTextureLayerImpl::PrepareTextureMailbox(
70 cc::TextureMailbox
* mailbox
,
71 scoped_ptr
<cc::SingleReleaseCallback
>* release_callback
,
72 bool use_shared_memory
) {
73 blink::WebExternalTextureMailbox client_mailbox
;
74 WebExternalBitmapImpl
* bitmap
= NULL
;
76 if (use_shared_memory
)
77 bitmap
= AllocateBitmap();
78 if (!client_
->prepareMailbox(&client_mailbox
, bitmap
)) {
80 free_bitmaps_
.push_back(bitmap
);
84 name
.SetName(client_mailbox
.name
);
86 *mailbox
= cc::TextureMailbox(bitmap
->shared_memory(), bitmap
->size());
88 *mailbox
= cc::TextureMailbox(name
, client_mailbox
.syncPoint
);
90 if (mailbox
->IsValid()) {
91 *release_callback
= cc::SingleReleaseCallback::Create(base::Bind(
92 &WebExternalTextureLayerImpl::DidReleaseMailbox
,
101 WebExternalBitmapImpl
* WebExternalTextureLayerImpl::AllocateBitmap() {
102 if (!free_bitmaps_
.empty()) {
103 WebExternalBitmapImpl
* result
= free_bitmaps_
.back();
104 free_bitmaps_
.weak_erase(free_bitmaps_
.end() - 1);
107 return new WebExternalBitmapImpl
;
111 void WebExternalTextureLayerImpl::DidReleaseMailbox(
112 base::WeakPtr
<WebExternalTextureLayerImpl
> layer
,
113 const blink::WebExternalTextureMailbox
& mailbox
,
114 WebExternalBitmapImpl
* bitmap
,
116 bool lost_resource
) {
117 if (lost_resource
|| !layer
) {
122 blink::WebExternalTextureMailbox available_mailbox
;
123 memcpy(available_mailbox
.name
, mailbox
.name
, sizeof(available_mailbox
.name
));
124 available_mailbox
.syncPoint
= sync_point
;
126 layer
->free_bitmaps_
.push_back(bitmap
);
127 layer
->client_
->mailboxReleased(available_mailbox
);
130 } // namespace webkit