• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 Google Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *
8  *     * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *     * Redistributions in binary form must reproduce the above
11  * copyright notice, this list of conditions and the following disclaimer
12  * in the documentation and/or other materials provided with the
13  * distribution.
14  *     * Neither the name of Google Inc. nor the names of its
15  * contributors may be used to endorse or promote products derived from
16  * this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30 
31 #include "config.h"
32 
33 #if USE(ACCELERATED_COMPOSITING)
34 
35 #include "WebGLLayerChromium.h"
36 
37 #include "GraphicsContext3D.h"
38 #include "LayerRendererChromium.h"
39 
40 namespace WebCore {
41 
create(GraphicsLayerChromium * owner)42 PassRefPtr<WebGLLayerChromium> WebGLLayerChromium::create(GraphicsLayerChromium* owner)
43 {
44     return adoptRef(new WebGLLayerChromium(owner));
45 }
46 
WebGLLayerChromium(GraphicsLayerChromium * owner)47 WebGLLayerChromium::WebGLLayerChromium(GraphicsLayerChromium* owner)
48     : CanvasLayerChromium(owner)
49     , m_context(0)
50     , m_textureUpdated(false)
51 {
52 }
53 
~WebGLLayerChromium()54 WebGLLayerChromium::~WebGLLayerChromium()
55 {
56     if (m_context && layerRenderer())
57         layerRenderer()->removeChildContext(m_context);
58 }
59 
updateCompositorResources()60 void WebGLLayerChromium::updateCompositorResources()
61 {
62     if (!m_contentsDirty)
63         return;
64 
65     GraphicsContext3D* rendererContext = layerRendererContext();
66     ASSERT(m_context);
67     if (m_textureChanged) {
68         rendererContext->bindTexture(GraphicsContext3D::TEXTURE_2D, m_textureId);
69         // Set the min-mag filters to linear and wrap modes to GL_CLAMP_TO_EDGE
70         // to get around NPOT texture limitations of GLES.
71         rendererContext->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MIN_FILTER, GraphicsContext3D::LINEAR);
72         rendererContext->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MAG_FILTER, GraphicsContext3D::LINEAR);
73         rendererContext->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_WRAP_S, GraphicsContext3D::CLAMP_TO_EDGE);
74         rendererContext->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_WRAP_T, GraphicsContext3D::CLAMP_TO_EDGE);
75         m_textureChanged = false;
76     }
77     // Update the contents of the texture used by the compositor.
78     if (m_contentsDirty && m_textureUpdated) {
79         // prepareTexture copies the contents of the off-screen render target into the texture
80         // used by the compositor.
81         //
82         m_context->prepareTexture();
83         m_context->markLayerComposited();
84         m_contentsDirty = false;
85         m_textureUpdated = false;
86     }
87 }
88 
setTextureUpdated()89 void WebGLLayerChromium::setTextureUpdated()
90 {
91     m_textureUpdated = true;
92 }
93 
setContext(const GraphicsContext3D * context)94 void WebGLLayerChromium::setContext(const GraphicsContext3D* context)
95 {
96     if (m_context != context && layerRenderer()) {
97         if (m_context)
98             layerRenderer()->removeChildContext(m_context);
99         if (context)
100             layerRenderer()->addChildContext(const_cast<GraphicsContext3D*>(context));
101     }
102 
103     m_context = const_cast<GraphicsContext3D*>(context);
104 
105     unsigned int textureId = m_context->platformTexture();
106     if (textureId != m_textureId) {
107         m_textureChanged = true;
108         m_textureUpdated = true;
109     }
110     m_textureId = textureId;
111     m_premultipliedAlpha = m_context->getContextAttributes().premultipliedAlpha;
112 }
113 
setLayerRenderer(LayerRendererChromium * newLayerRenderer)114 void WebGLLayerChromium::setLayerRenderer(LayerRendererChromium* newLayerRenderer)
115 {
116     if (layerRenderer() != newLayerRenderer) {
117         if (m_context) {
118             if (layerRenderer())
119                 layerRenderer()->removeChildContext(m_context);
120             if (newLayerRenderer)
121                 newLayerRenderer->addChildContext(m_context);
122         }
123 
124         LayerChromium::setLayerRenderer(newLayerRenderer);
125     }
126 }
127 
128 }
129 #endif // USE(ACCELERATED_COMPOSITING)
130