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 : nullptr;
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 void WebExternalTextureLayerImpl::setNearestNeighbor(bool nearest_neighbor
) {
66 static_cast<TextureLayer
*>(layer_
->layer())
67 ->SetNearestNeighbor(nearest_neighbor
);
70 bool WebExternalTextureLayerImpl::PrepareTextureMailbox(
71 cc::TextureMailbox
* mailbox
,
72 scoped_ptr
<cc::SingleReleaseCallback
>* release_callback
,
73 bool use_shared_memory
) {
74 blink::WebExternalTextureMailbox client_mailbox
;
75 WebExternalBitmapImpl
* bitmap
= nullptr;
77 if (use_shared_memory
)
78 bitmap
= AllocateBitmap();
79 if (!client_
->prepareMailbox(&client_mailbox
, bitmap
)) {
81 free_bitmaps_
.push_back(bitmap
);
85 name
.SetName(client_mailbox
.name
);
87 *mailbox
= cc::TextureMailbox(bitmap
->shared_bitmap(), bitmap
->size());
90 cc::TextureMailbox(name
, GL_TEXTURE_2D
, client_mailbox
.syncPoint
);
92 mailbox
->set_allow_overlay(client_mailbox
.allowOverlay
);
93 mailbox
->set_nearest_neighbor(client_mailbox
.nearestNeighbor
);
95 if (mailbox
->IsValid()) {
96 *release_callback
= cc::SingleReleaseCallback::Create(
97 base::Bind(&WebExternalTextureLayerImpl::DidReleaseMailbox
,
106 WebExternalBitmapImpl
* WebExternalTextureLayerImpl::AllocateBitmap() {
107 if (!free_bitmaps_
.empty()) {
108 WebExternalBitmapImpl
* result
= free_bitmaps_
.back();
109 free_bitmaps_
.weak_erase(free_bitmaps_
.end() - 1);
112 return new WebExternalBitmapImpl
;
116 void WebExternalTextureLayerImpl::DidReleaseMailbox(
117 base::WeakPtr
<WebExternalTextureLayerImpl
> layer
,
118 const blink::WebExternalTextureMailbox
& mailbox
,
119 WebExternalBitmapImpl
* bitmap
,
121 bool lost_resource
) {
123 blink::WebExternalTextureMailbox available_mailbox
;
124 memcpy(available_mailbox
.name
, mailbox
.name
, sizeof(available_mailbox
.name
));
125 available_mailbox
.syncPoint
= sync_point
;
127 layer
->free_bitmaps_
.push_back(bitmap
);
128 layer
->client_
->mailboxReleased(available_mailbox
, lost_resource
);
131 } // namespace cc_blink