-
Notifications
You must be signed in to change notification settings - Fork 54
/
RenderCompositor.h
137 lines (104 loc) · 4.54 KB
/
RenderCompositor.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef MOZILLA_GFX_RENDERCOMPOSITOR_H
#define MOZILLA_GFX_RENDERCOMPOSITOR_H
#include "mozilla/RefPtr.h"
#include "mozilla/UniquePtr.h"
#include "mozilla/webrender/WebRenderTypes.h"
#include "Units.h"
namespace mozilla {
namespace gl {
class GLContext;
}
namespace layers {
class SyncObjectHost;
} // namespace layers
namespace widget {
class CompositorWidget;
}
namespace wr {
class RenderCompositor {
public:
static UniquePtr<RenderCompositor> Create(
RefPtr<widget::CompositorWidget>&& aWidget);
RenderCompositor(RefPtr<widget::CompositorWidget>&& aWidget);
virtual ~RenderCompositor();
virtual bool BeginFrame() = 0;
// Called to notify the RenderCompositor that all of the commands for a frame
// have been pushed to the queue.
// @return a RenderedFrameId for the frame
virtual RenderedFrameId EndFrame(
const nsTArray<DeviceIntRect>& aDirtyRects) = 0;
// Returns false when waiting gpu tasks is failed.
// It might happen when rendering context is lost.
virtual bool WaitForGPU() { return true; }
// Check for and return the last completed frame.
// @return the last (highest) completed RenderedFrameId
virtual RenderedFrameId GetLastCompletedFrameId() {
return mLatestRenderFrameId.Prev();
}
// Update FrameId when WR rendering does not happen.
virtual RenderedFrameId UpdateFrameId() { return GetNextRenderFrameId(); }
virtual void Pause() = 0;
virtual bool Resume() = 0;
// Called when WR rendering is skipped
virtual void Update() {}
virtual gl::GLContext* gl() const { return nullptr; }
virtual bool MakeCurrent();
virtual bool UseANGLE() const { return false; }
virtual bool UseDComp() const { return false; }
virtual bool UseTripleBuffering() const { return false; }
virtual LayoutDeviceIntSize GetBufferSize() = 0;
widget::CompositorWidget* GetWidget() const { return mWidget; }
layers::SyncObjectHost* GetSyncObject() const { return mSyncObject.get(); }
virtual bool IsContextLost();
virtual bool SupportAsyncScreenshot() { return true; }
virtual bool ShouldUseNativeCompositor() { return false; }
virtual uint32_t GetMaxUpdateRects() { return 0; }
// Interface for wr::Compositor
virtual void CompositorBeginFrame() {}
virtual void CompositorEndFrame() {}
virtual void Bind(wr::NativeTileId aId, wr::DeviceIntPoint* aOffset,
uint32_t* aFboId, wr::DeviceIntRect aDirtyRect,
wr::DeviceIntRect aValidRect) {}
virtual void Unbind() {}
virtual void CreateSurface(wr::NativeSurfaceId aId,
wr::DeviceIntPoint aVirtualOffset,
wr::DeviceIntSize aTileSize, bool aIsOpaque) {}
virtual void DestroySurface(NativeSurfaceId aId) {}
virtual void CreateTile(wr::NativeSurfaceId, int32_t aX, int32_t aY) {}
virtual void DestroyTile(wr::NativeSurfaceId, int32_t aX, int32_t aY) {}
virtual void AddSurface(wr::NativeSurfaceId aId, wr::DeviceIntPoint aPosition,
wr::DeviceIntRect aClipRect) {}
virtual void EnableNativeCompositor(bool aEnable) {}
virtual void DeInit() {}
virtual CompositorCapabilities GetCompositorCapabilities() = 0;
// Interface for partial present
virtual bool UsePartialPresent() { return false; }
virtual bool RequestFullRender() { return false; }
virtual uint32_t GetMaxPartialPresentRects() { return 0; }
// Whether the surface origin is top-left.
virtual bool SurfaceOriginIsTopLeft() { return false; }
// Does readback if wr_renderer_readback() could not get correct WR rendered
// result. It could happen when WebRender renders to multiple overlay layers.
virtual bool MaybeReadback(const gfx::IntSize& aReadbackSize,
const wr::ImageFormat& aReadbackFormat,
const Range<uint8_t>& aReadbackBuffer) {
return false;
}
protected:
// We default this to 2, so that mLatestRenderFrameId.Prev() is always valid.
RenderedFrameId mLatestRenderFrameId = RenderedFrameId{2};
RenderedFrameId GetNextRenderFrameId() {
mLatestRenderFrameId = mLatestRenderFrameId.Next();
return mLatestRenderFrameId;
}
RefPtr<widget::CompositorWidget> mWidget;
RefPtr<layers::SyncObjectHost> mSyncObject;
};
} // namespace wr
} // namespace mozilla
#endif