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 "cc/texture_layer_impl.h"
7 #include "base/stringprintf.h"
8 #include "cc/quad_sink.h"
9 #include "cc/renderer.h"
10 #include "cc/texture_draw_quad.h"
14 TextureLayerImpl::TextureLayerImpl(LayerTreeImpl
* treeImpl
, int id
)
15 : LayerImpl(treeImpl
, id
)
17 , m_externalTextureResource(0)
18 , m_premultipliedAlpha(true)
20 , m_uvRect(0, 0, 1, 1)
22 m_vertexOpacity
[0] = 1.0f
;
23 m_vertexOpacity
[1] = 1.0f
;
24 m_vertexOpacity
[2] = 1.0f
;
25 m_vertexOpacity
[3] = 1.0f
;
28 TextureLayerImpl::~TextureLayerImpl()
32 void TextureLayerImpl::willDraw(ResourceProvider
* resourceProvider
)
36 DCHECK(!m_externalTextureResource
);
37 m_externalTextureResource
= resourceProvider
->createResourceFromExternalTexture(m_textureId
);
40 void TextureLayerImpl::appendQuads(QuadSink
& quadSink
, AppendQuadsData
& appendQuadsData
)
42 if (!m_externalTextureResource
)
45 SharedQuadState
* sharedQuadState
= quadSink
.useSharedQuadState(createSharedQuadState());
46 appendDebugBorderQuad(quadSink
, sharedQuadState
, appendQuadsData
);
48 gfx::Rect
quadRect(gfx::Point(), contentBounds());
49 gfx::Rect
opaqueRect(contentsOpaque() ? quadRect
: gfx::Rect());
50 scoped_ptr
<TextureDrawQuad
> quad
= TextureDrawQuad::Create();
51 quad
->SetNew(sharedQuadState
, quadRect
, opaqueRect
, m_externalTextureResource
, m_premultipliedAlpha
, m_uvRect
, m_vertexOpacity
, m_flipped
);
53 // Perform explicit clipping on a quad to avoid setting a scissor later.
54 if (sharedQuadState
->is_clipped
&& quad
->PerformClipping())
55 sharedQuadState
->is_clipped
= false;
56 if (!quad
->rect
.IsEmpty())
57 quadSink
.append(quad
.PassAs
<DrawQuad
>(), appendQuadsData
);
60 void TextureLayerImpl::didDraw(ResourceProvider
* resourceProvider
)
62 if (!m_externalTextureResource
)
64 // FIXME: the following assert will not be true when sending resources to a
65 // parent compositor. A synchronization scheme (double-buffering or
66 // pipelining of updates) for the client will need to exist to solve this.
67 DCHECK(!resourceProvider
->inUseByConsumer(m_externalTextureResource
));
68 resourceProvider
->deleteResource(m_externalTextureResource
);
69 m_externalTextureResource
= 0;
72 void TextureLayerImpl::dumpLayerProperties(std::string
* str
, int indent
) const
74 str
->append(indentString(indent
));
75 base::StringAppendF(str
, "texture layer texture id: %u premultiplied: %d\n", m_textureId
, m_premultipliedAlpha
);
76 LayerImpl::dumpLayerProperties(str
, indent
);
79 void TextureLayerImpl::setVertexOpacity(const float vertexOpacity
[4]) {
80 m_vertexOpacity
[0] = vertexOpacity
[0];
81 m_vertexOpacity
[1] = vertexOpacity
[1];
82 m_vertexOpacity
[2] = vertexOpacity
[2];
83 m_vertexOpacity
[3] = vertexOpacity
[3];
86 void TextureLayerImpl::didLoseOutputSurface()
89 m_externalTextureResource
= 0;
92 const char* TextureLayerImpl::layerTypeAsString() const
94 return "TextureLayer";