b3048368daa2076fa49dba14bb9c93698b676e1d
[WebKit-https.git] / Source / WebCore / platform / graphics / chromium / cc / CCLayerTreeHostImpl.cpp
1 /*
2  * Copyright (C) 2011 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
6  * are met:
7  * 1.  Redistributions of source code must retain the above copyright
8  *     notice, this list of conditions and the following disclaimer.
9  * 2.  Redistributions in binary form must reproduce the above copyright
10  *     notice, this list of conditions and the following disclaimer in the
11  *     documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16  * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23  */
24
25 #include "config.h"
26
27 #include "cc/CCLayerTreeHostImpl.h"
28
29 #include "Extensions3D.h"
30 #include "GraphicsContext3D.h"
31 #include "LayerRendererChromium.h"
32 #include "TraceEvent.h"
33 #include "cc/CCLayerTreeHost.h"
34 #include "cc/CCMainThread.h"
35 #include "cc/CCMainThreadTask.h"
36 #include "cc/CCThreadTask.h"
37 #include <wtf/CurrentTime.h>
38
39 namespace WebCore {
40
41 PassOwnPtr<CCLayerTreeHostImpl> CCLayerTreeHostImpl::create(const CCSettings& settings)
42 {
43     return adoptPtr(new CCLayerTreeHostImpl(settings));
44 }
45
46 CCLayerTreeHostImpl::CCLayerTreeHostImpl(const CCSettings& settings)
47     : m_sourceFrameNumber(-1)
48     , m_frameNumber(0)
49     , m_settings(settings)
50 {
51 }
52
53 CCLayerTreeHostImpl::~CCLayerTreeHostImpl()
54 {
55     TRACE_EVENT("CCLayerTreeHostImpl::~CCLayerTreeHostImpl()", this, 0);
56     if (m_layerRenderer)
57         m_layerRenderer->close();
58 }
59
60 void CCLayerTreeHostImpl::beginCommit()
61 {
62 }
63
64 void CCLayerTreeHostImpl::commitComplete()
65 {
66 }
67
68 GraphicsContext3D* CCLayerTreeHostImpl::context()
69 {
70     return m_layerRenderer ? m_layerRenderer->context() : 0;
71 }
72
73 void CCLayerTreeHostImpl::drawLayers()
74 {
75     TRACE_EVENT("CCLayerTreeHostImpl::drawLayers", this, 0);
76     ASSERT(m_layerRenderer);
77     if (m_layerRenderer->rootLayer())
78         m_layerRenderer->drawLayers();
79
80     ++m_frameNumber;
81 }
82
83 void CCLayerTreeHostImpl::finishAllRendering()
84 {
85     m_layerRenderer->finish();
86 }
87
88 bool CCLayerTreeHostImpl::isContextLost()
89 {
90     ASSERT(m_layerRenderer);
91     return m_layerRenderer->isContextLost();
92 }
93
94 const LayerRendererCapabilities& CCLayerTreeHostImpl::layerRendererCapabilities() const
95 {
96     return m_layerRenderer->capabilities();
97 }
98
99 void CCLayerTreeHostImpl::present()
100 {
101     ASSERT(m_layerRenderer && !isContextLost());
102     m_layerRenderer->present();
103 }
104
105 void CCLayerTreeHostImpl::readback(void* pixels, const IntRect& rect)
106 {
107     ASSERT(m_layerRenderer && !isContextLost());
108     m_layerRenderer->getFramebufferPixels(pixels, rect);
109 }
110
111 void CCLayerTreeHostImpl::setRootLayer(PassRefPtr<CCLayerImpl> layer)
112 {
113     m_rootLayerImpl = layer;
114 }
115
116 void CCLayerTreeHostImpl::setVisible(bool visible)
117 {
118     if (m_layerRenderer && !visible)
119         m_layerRenderer->releaseRenderSurfaceTextures();
120 }
121
122 bool CCLayerTreeHostImpl::initializeLayerRenderer(PassRefPtr<GraphicsContext3D> context)
123 {
124     OwnPtr<LayerRendererChromium> layerRenderer;
125     layerRenderer = LayerRendererChromium::create(this, context);
126
127     // If creation failed, and we had asked for accelerated painting, disable accelerated painting
128     // and try creating the renderer again.
129     if (!layerRenderer && m_settings.acceleratePainting) {
130         m_settings.acceleratePainting = false;
131
132         layerRenderer = LayerRendererChromium::create(this, context);
133     }
134
135     // If we had a previous layer renderer, then its context must have been lost along with all of its resources.
136     // Let the old layer renderer known its resources are gone.
137     if (m_layerRenderer) {
138         m_layerRenderer->setContentsTextureMemoryUseBytes(0);
139         m_layerRenderer->close();
140     }
141
142     m_layerRenderer = layerRenderer.release();
143     return m_layerRenderer;
144 }
145
146 void CCLayerTreeHostImpl::setViewport(const IntSize& viewportSize)
147 {
148     bool changed = viewportSize != m_viewportSize;
149     m_viewportSize = viewportSize;
150     if (changed)
151         m_layerRenderer->viewportChanged();
152 }
153
154 void CCLayerTreeHostImpl::setZoomAnimatorScale(double zoom)
155 {
156     m_layerRenderer->setZoomAnimatorScale(zoom);
157 }
158
159 }