[CoordinatedGraphics] The compositing loop is still running even after exiting AC...
[WebKit-https.git] / Source / WebKit / Shared / CoordinatedGraphics / threadedcompositor / ThreadedCompositor.h
1 /*
2  * Copyright (C) 2014 Igalia S.L.
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 #pragma once
27
28 #if USE(COORDINATED_GRAPHICS)
29
30 #include "CompositingRunLoop.h"
31 #include "CoordinatedGraphicsScene.h"
32 #include <WebCore/CoordinatedGraphicsState.h>
33 #include <WebCore/GLContext.h>
34 #include <WebCore/IntSize.h>
35 #include <WebCore/TextureMapper.h>
36 #include <wtf/Atomics.h>
37 #include <wtf/FastMalloc.h>
38 #include <wtf/Noncopyable.h>
39 #include <wtf/ThreadSafeRefCounted.h>
40
41 #if USE(REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR)
42 #include "ThreadedDisplayRefreshMonitor.h"
43 #endif
44
45 namespace WebKit {
46
47 class CoordinatedGraphicsScene;
48 class CoordinatedGraphicsSceneClient;
49
50 class ThreadedCompositor : public CoordinatedGraphicsSceneClient, public ThreadSafeRefCounted<ThreadedCompositor> {
51     WTF_MAKE_NONCOPYABLE(ThreadedCompositor);
52     WTF_MAKE_FAST_ALLOCATED;
53 public:
54     class Client {
55     public:
56         virtual uint64_t nativeSurfaceHandleForCompositing() = 0;
57         virtual void didDestroyGLContext() = 0;
58
59         virtual void resize(const WebCore::IntSize&) = 0;
60         virtual void willRenderFrame() = 0;
61         virtual void didRenderFrame() = 0;
62     };
63
64     enum class ShouldDoFrameSync { No, Yes };
65
66     static Ref<ThreadedCompositor> create(Client&, ThreadedDisplayRefreshMonitor::Client&, WebCore::PlatformDisplayID, const WebCore::IntSize&, float scaleFactor, ShouldDoFrameSync = ShouldDoFrameSync::Yes, WebCore::TextureMapper::PaintFlags = 0);
67     virtual ~ThreadedCompositor();
68
69     void setNativeSurfaceHandleForCompositing(uint64_t);
70     void setScaleFactor(float);
71     void setScrollPosition(const WebCore::IntPoint&, float scale);
72     void setViewportSize(const WebCore::IntSize&, float scale);
73
74     void updateSceneState(const WebCore::CoordinatedGraphicsState&);
75
76     void invalidate();
77
78     void forceRepaint();
79
80 #if USE(REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR)
81     RefPtr<WebCore::DisplayRefreshMonitor> displayRefreshMonitor(WebCore::PlatformDisplayID);
82     void handleDisplayRefreshMonitorUpdate();
83 #endif
84
85     void frameComplete();
86
87     void suspend();
88     void resume();
89
90 private:
91     ThreadedCompositor(Client&, ThreadedDisplayRefreshMonitor::Client&, WebCore::PlatformDisplayID, const WebCore::IntSize&, float scaleFactor, ShouldDoFrameSync, WebCore::TextureMapper::PaintFlags);
92
93     // CoordinatedGraphicsSceneClient
94     void updateViewport() override;
95
96     void renderLayerTree();
97     void sceneUpdateFinished();
98
99     void createGLContext();
100
101     Client& m_client;
102     RefPtr<CoordinatedGraphicsScene> m_scene;
103     std::unique_ptr<WebCore::GLContext> m_context;
104
105     uint64_t m_nativeSurfaceHandle;
106     ShouldDoFrameSync m_doFrameSync;
107     WebCore::TextureMapper::PaintFlags m_paintFlags { 0 };
108     bool m_inForceRepaint { false };
109     unsigned m_suspendedCount { 0 };
110
111     std::unique_ptr<CompositingRunLoop> m_compositingRunLoop;
112
113     struct {
114         Lock lock;
115         WebCore::IntSize viewportSize;
116         WebCore::IntPoint scrollPosition;
117         float scaleFactor { 1 };
118         bool needsResize { false };
119         Vector<WebCore::CoordinatedGraphicsState> states;
120
121         bool clientRendersNextFrame { false };
122         bool coordinateUpdateCompletionWithClient { false };
123     } m_attributes;
124
125 #if USE(REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR)
126     Ref<ThreadedDisplayRefreshMonitor> m_displayRefreshMonitor;
127 #endif
128 };
129
130 } // namespace WebKit
131
132 #endif // USE(COORDINATED_GRAPHICS)
133