Get rid of LayerTreeContext::seed on Mac.
[WebKit-https.git] / Source / WebKit2 / WebProcess / WebPage / mac / LayerTreeHostMac.mm
1 /*
2  * Copyright (C) 2011 Apple 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''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #import "config.h"
27 #import "LayerTreeHostMac.h"
28
29 #import "WebPage.h"
30 #import "WebProcess.h"
31 #import <WebCore/Frame.h>
32 #import <WebCore/FrameView.h>
33 #import <WebCore/Page.h>
34 #import <WebCore/Settings.h>
35 #import <WebKitSystemInterface.h>
36
37 using namespace WebCore;
38
39 namespace WebKit {
40
41 PassRefPtr<LayerTreeHostMac> LayerTreeHostMac::create(WebPage* webPage, GraphicsLayer* graphicsLayer)
42 {
43     return adoptRef(new LayerTreeHostMac(webPage, graphicsLayer));
44 }
45
46 LayerTreeHostMac::LayerTreeHostMac(WebPage* webPage, GraphicsLayer* graphicsLayer)
47     : LayerTreeHost(webPage)
48     , m_isValid(true)
49 {
50     mach_port_t serverPort = WebProcess::shared().compositingRenderServerPort();
51     m_remoteLayerClient = WKCARemoteLayerClientMakeWithServerPort(serverPort);
52
53     // Create a root layer.
54     m_rootLayer = GraphicsLayer::create(this);
55 #ifndef NDEBUG
56     m_rootLayer->setName("LayerTreeHost root layer");
57 #endif
58     m_rootLayer->setDrawsContent(false);
59     m_rootLayer->setSize(webPage->size());
60
61     // Add the accelerated layer tree hierarchy.
62     m_rootLayer->addChild(graphicsLayer);
63     
64     WKCARemoteLayerClientSetLayer(m_remoteLayerClient.get(), m_rootLayer->platformLayer());
65
66     scheduleLayerFlush();
67
68     m_layerTreeContext.contextID = WKCARemoteLayerClientGetClientId(m_remoteLayerClient.get());
69 }
70
71 LayerTreeHostMac::~LayerTreeHostMac()
72 {
73     ASSERT(!m_isValid);
74     ASSERT(!m_flushPendingLayerChangesRunLoopObserver);
75     ASSERT(!m_remoteLayerClient);
76     ASSERT(!m_rootLayer);
77 }
78
79 const LayerTreeContext& LayerTreeHostMac::layerTreeContext()
80 {
81     return m_layerTreeContext;
82 }
83
84 void LayerTreeHostMac::scheduleLayerFlush()
85 {
86     CFRunLoopRef currentRunLoop = CFRunLoopGetCurrent();
87     
88     // Make sure we wake up the loop or the observer could be delayed until some other source fires.
89     CFRunLoopWakeUp(currentRunLoop);
90
91     if (m_flushPendingLayerChangesRunLoopObserver)
92         return;
93
94     // Run before the Core Animation commit observer, which has order 2000000.
95     const CFIndex runLoopOrder = 2000000 - 1;
96     CFRunLoopObserverContext context = { 0, this, 0, 0, 0 };
97     m_flushPendingLayerChangesRunLoopObserver.adoptCF(CFRunLoopObserverCreate(0, kCFRunLoopBeforeWaiting | kCFRunLoopExit, true, runLoopOrder, flushPendingLayerChangesRunLoopObserverCallback, &context));
98
99     CFRunLoopAddObserver(currentRunLoop, m_flushPendingLayerChangesRunLoopObserver.get(), kCFRunLoopCommonModes);
100 }
101
102 void LayerTreeHostMac::invalidate()
103 {
104     ASSERT(m_isValid);
105
106     if (m_flushPendingLayerChangesRunLoopObserver) {
107         CFRunLoopObserverInvalidate(m_flushPendingLayerChangesRunLoopObserver.get());
108         m_flushPendingLayerChangesRunLoopObserver = nullptr;
109     }
110
111     WKCARemoteLayerClientInvalidate(m_remoteLayerClient.get());
112     m_remoteLayerClient = nullptr;
113     m_rootLayer = nullptr;
114     m_isValid = false;
115 }
116
117 void LayerTreeHostMac::notifyAnimationStarted(const WebCore::GraphicsLayer*, double time)
118 {
119 }
120
121 void LayerTreeHostMac::notifySyncRequired(const WebCore::GraphicsLayer*)
122 {
123 }
124
125 void LayerTreeHostMac::paintContents(const GraphicsLayer* graphicsLayer, GraphicsContext& graphicsContext, GraphicsLayerPaintingPhase, const IntRect& clipRect)
126 {
127 }
128
129 bool LayerTreeHostMac::showDebugBorders() const
130 {
131     return m_webPage->corePage()->settings()->showDebugBorders();
132 }
133
134 bool LayerTreeHostMac::showRepaintCounter() const
135 {
136     return m_webPage->corePage()->settings()->showRepaintCounter();
137 }
138
139 void LayerTreeHostMac::flushPendingLayerChangesRunLoopObserverCallback(CFRunLoopObserverRef, CFRunLoopActivity, void* context)
140 {
141     static_cast<LayerTreeHostMac*>(context)->flushPendingLayerChangesRunLoopObserverCallback();
142 }
143
144 void LayerTreeHostMac::flushPendingLayerChangesRunLoopObserverCallback()
145 {
146     if (!flushPendingLayerChanges())
147         return;
148
149     // We successfully flushed the pending layer changes, remove the run loop observer.
150     ASSERT(m_flushPendingLayerChangesRunLoopObserver);
151     CFRunLoopObserverInvalidate(m_flushPendingLayerChangesRunLoopObserver.get());
152     m_flushPendingLayerChangesRunLoopObserver = 0;
153 }
154
155 bool LayerTreeHostMac::flushPendingLayerChanges()
156 {
157     m_rootLayer->syncCompositingStateForThisLayerOnly();
158
159     return m_webPage->corePage()->mainFrame()->view()->syncCompositingStateIncludingSubframes();
160 }
161
162     
163 } // namespace WebKit