[chromium] Make CCThreadProxy draw
[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     ASSERT(CCProxy::isImplThread());
52 }
53
54 CCLayerTreeHostImpl::~CCLayerTreeHostImpl()
55 {
56     ASSERT(CCProxy::isImplThread());
57     TRACE_EVENT("CCLayerTreeHostImpl::~CCLayerTreeHostImpl()", this, 0);
58     if (m_layerRenderer)
59         m_layerRenderer->close();
60 }
61
62 void CCLayerTreeHostImpl::beginCommit()
63 {
64 }
65
66 void CCLayerTreeHostImpl::commitComplete()
67 {
68 }
69
70 GraphicsContext3D* CCLayerTreeHostImpl::context()
71 {
72     return m_layerRenderer ? m_layerRenderer->context() : 0;
73 }
74
75 void CCLayerTreeHostImpl::drawLayers()
76 {
77     TRACE_EVENT("CCLayerTreeHostImpl::drawLayers", this, 0);
78     ASSERT(m_layerRenderer);
79     if (m_layerRenderer->rootLayer())
80         m_layerRenderer->drawLayers();
81
82     ++m_frameNumber;
83 }
84
85 void CCLayerTreeHostImpl::finishAllRendering()
86 {
87     m_layerRenderer->finish();
88 }
89
90 bool CCLayerTreeHostImpl::isContextLost()
91 {
92     ASSERT(m_layerRenderer);
93     return m_layerRenderer->isContextLost();
94 }
95
96 const LayerRendererCapabilities& CCLayerTreeHostImpl::layerRendererCapabilities() const
97 {
98     return m_layerRenderer->capabilities();
99 }
100
101 void CCLayerTreeHostImpl::present()
102 {
103     ASSERT(m_layerRenderer && !isContextLost());
104     m_layerRenderer->present();
105 }
106
107 void CCLayerTreeHostImpl::readback(void* pixels, const IntRect& rect)
108 {
109     ASSERT(m_layerRenderer && !isContextLost());
110     m_layerRenderer->getFramebufferPixels(pixels, rect);
111 }
112
113 void CCLayerTreeHostImpl::setRootLayer(PassRefPtr<CCLayerImpl> layer)
114 {
115     m_rootLayerImpl = layer;
116 }
117
118 void CCLayerTreeHostImpl::setVisible(bool visible)
119 {
120     if (m_layerRenderer && !visible)
121         m_layerRenderer->releaseRenderSurfaceTextures();
122 }
123
124 bool CCLayerTreeHostImpl::initializeLayerRenderer(PassRefPtr<GraphicsContext3D> context)
125 {
126     OwnPtr<LayerRendererChromium> layerRenderer;
127     layerRenderer = LayerRendererChromium::create(this, context);
128
129     // If creation failed, and we had asked for accelerated painting, disable accelerated painting
130     // and try creating the renderer again.
131     if (!layerRenderer && m_settings.acceleratePainting) {
132         m_settings.acceleratePainting = false;
133
134         layerRenderer = LayerRendererChromium::create(this, context);
135     }
136
137     // If we had a previous layer renderer, then its context must have been lost along with all of its resources.
138     // Let the old layer renderer known its resources are gone.
139     if (m_layerRenderer) {
140         m_layerRenderer->setContentsTextureMemoryUseBytes(0);
141         m_layerRenderer->close();
142     }
143
144     m_layerRenderer = layerRenderer.release();
145     return m_layerRenderer;
146 }
147
148 void CCLayerTreeHostImpl::setViewport(const IntSize& viewportSize)
149 {
150     bool changed = viewportSize != m_viewportSize;
151     m_viewportSize = viewportSize;
152     if (changed)
153         m_layerRenderer->viewportChanged();
154 }
155
156 void CCLayerTreeHostImpl::setZoomAnimatorScale(double zoom)
157 {
158     m_layerRenderer->setZoomAnimatorScale(zoom);
159 }
160
161 }