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.
5 #include "cc/blink/web_external_texture_layer_impl.h"
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"
20 using cc::TextureLayer
;
21 using cc::ResourceUpdateQueue
;
25 WebExternalTextureLayerImpl::WebExternalTextureLayerImpl(
26 blink::WebExternalTextureLayerClient
* 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
));
34 WebExternalTextureLayerImpl::~WebExternalTextureLayerImpl() {
35 static_cast<TextureLayer
*>(layer_
->layer())->ClearClient();
38 blink::WebLayer
* WebExternalTextureLayerImpl::layer() {
42 void WebExternalTextureLayerImpl::clearTexture() {
43 TextureLayer
* layer
= static_cast<TextureLayer
*>(layer_
->layer());
44 layer
->ClearTexture();
47 void WebExternalTextureLayerImpl::setOpaque(bool opaque
) {
48 static_cast<TextureLayer
*>(layer_
->layer())->SetContentsOpaque(opaque
);
51 void WebExternalTextureLayerImpl::setPremultipliedAlpha(
52 bool premultiplied_alpha
) {
53 static_cast<TextureLayer
*>(layer_
->layer())
54 ->SetPremultipliedAlpha(premultiplied_alpha
);
57 void WebExternalTextureLayerImpl::setBlendBackgroundColor(bool blend
) {
58 static_cast<TextureLayer
*>(layer_
->layer())->SetBlendBackgroundColor(blend
);
61 void WebExternalTextureLayerImpl::setRateLimitContext(bool rate_limit
) {
62 static_cast<TextureLayer
*>(layer_
->layer())->SetRateLimitContext(rate_limit
);
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
;
72 if (use_shared_memory
)
73 bitmap
= AllocateBitmap();
74 if (!client_
->prepareMailbox(&client_mailbox
, bitmap
)) {
76 free_bitmaps_
.push_back(bitmap
);
80 name
.SetName(client_mailbox
.name
);
82 *mailbox
= cc::TextureMailbox(bitmap
->shared_memory(), bitmap
->size());
85 cc::TextureMailbox(name
, GL_TEXTURE_2D
, client_mailbox
.syncPoint
);
87 mailbox
->set_allow_overlay(client_mailbox
.allowOverlay
);
89 if (mailbox
->IsValid()) {
90 *release_callback
= cc::SingleReleaseCallback::Create(
91 base::Bind(&WebExternalTextureLayerImpl::DidReleaseMailbox
,
100 WebExternalBitmapImpl
* WebExternalTextureLayerImpl::AllocateBitmap() {
101 if (!free_bitmaps_
.empty()) {
102 WebExternalBitmapImpl
* result
= free_bitmaps_
.back();
103 free_bitmaps_
.weak_erase(free_bitmaps_
.end() - 1);
106 return new WebExternalBitmapImpl
;
110 void WebExternalTextureLayerImpl::DidReleaseMailbox(
111 base::WeakPtr
<WebExternalTextureLayerImpl
> layer
,
112 const blink::WebExternalTextureMailbox
& mailbox
,
113 WebExternalBitmapImpl
* bitmap
,
115 bool lost_resource
) {
117 blink::WebExternalTextureMailbox available_mailbox
;
118 memcpy(available_mailbox
.name
, mailbox
.name
, sizeof(available_mailbox
.name
));
119 available_mailbox
.syncPoint
= sync_point
;
121 layer
->free_bitmaps_
.push_back(bitmap
);
122 layer
->client_
->mailboxReleased(available_mailbox
, lost_resource
);
125 } // namespace cc_blink