12 return builder.asReceiver();
17static std::vector<testing::DisplayListInvocationGroup> allRenderingOps =
20static std::vector<testing::DisplayListInvocationGroup> allOps =
23enum class DisplayListBuilderBenchmarkType {
30enum class DisplayListDispatchBenchmarkType {
36static void InvokeAllRenderingOps(DisplayListBuilder& builder) {
38 for (
auto& group : allRenderingOps) {
39 for (
size_t i = 0;
i < group.variants.size();
i++) {
40 auto& invocation = group.variants[
i];
41 invocation.Invoke(receiver);
46static void InvokeAllOps(DisplayListBuilder& builder) {
48 for (
auto& group : allOps) {
53 for (
size_t i = 0;
i < group.variants.size();
i++) {
54 auto& invocation = group.variants[
i];
55 invocation.Invoke(receiver);
61static void Complete(DisplayListBuilder& builder,
62 DisplayListBuilderBenchmarkType
type) {
63 auto display_list = builder.Build();
65 case DisplayListBuilderBenchmarkType::kBounds:
66 display_list->GetBounds();
68 case DisplayListBuilderBenchmarkType::kRtree:
69 display_list->rtree();
71 case DisplayListBuilderBenchmarkType::kBoundsAndRtree:
72 display_list->GetBounds();
73 display_list->rtree();
75 case DisplayListBuilderBenchmarkType::kDefault:
80bool NeedPrepareRTree(DisplayListBuilderBenchmarkType
type) {
81 return type == DisplayListBuilderBenchmarkType::kRtree ||
82 type == DisplayListBuilderBenchmarkType::kBoundsAndRtree;
85bool NeedPrepareRTree(DisplayListDispatchBenchmarkType
type) {
86 return type != DisplayListDispatchBenchmarkType::kDefaultNoRtree;
92 DisplayListBuilderBenchmarkType
type) {
93 bool prepare_rtree = NeedPrepareRTree(
type);
94 while (state.KeepRunning()) {
96 InvokeAllRenderingOps(builder);
97 Complete(builder,
type);
102 benchmark::State& state,
103 DisplayListBuilderBenchmarkType
type) {
104 bool prepare_rtree = NeedPrepareRTree(
type);
105 while (state.KeepRunning()) {
107 builder.
Scale(3.5, 3.5);
109 InvokeAllRenderingOps(builder);
110 Complete(builder,
type);
115 benchmark::State& state,
116 DisplayListBuilderBenchmarkType
type) {
117 bool prepare_rtree = NeedPrepareRTree(
type);
118 while (state.KeepRunning()) {
120 builder.
TransformFullPerspective(0, 1, 0, 12, 1, 0, 0, 33, 3, 2, 5, 29, 0,
122 InvokeAllRenderingOps(builder);
123 Complete(builder,
type);
128 benchmark::State& state,
129 DisplayListBuilderBenchmarkType
type) {
131 bool prepare_rtree = NeedPrepareRTree(
type);
132 while (state.KeepRunning()) {
135 InvokeAllRenderingOps(builder);
136 Complete(builder,
type);
141 benchmark::State& state,
142 DisplayListBuilderBenchmarkType
type) {
143 bool prepare_rtree = NeedPrepareRTree(
type);
144 while (state.KeepRunning()) {
146 builder.
Scale(3.5, 3.5);
148 builder.
SaveLayer(std::nullopt,
nullptr);
151 for (
auto& group : allRenderingOps) {
152 for (
size_t i = 0;
i < group.variants.size();
i++) {
153 auto& invocation = group.variants[
i];
154 invocation.Invoke(receiver);
158 Complete(builder,
type);
163 benchmark::State& state,
164 DisplayListBuilderBenchmarkType
type) {
165 bool prepare_rtree = NeedPrepareRTree(
type);
166 while (state.KeepRunning()) {
169 for (
auto& group : allRenderingOps) {
170 for (
size_t i = 0;
i < group.variants.size();
i++) {
171 auto& invocation = group.variants[
i];
172 builder.
SaveLayer(std::nullopt,
nullptr);
173 invocation.Invoke(receiver);
177 Complete(builder,
type);
182 benchmark::State& state,
183 DisplayListBuilderBenchmarkType
type) {
187 bool prepare_rtree = NeedPrepareRTree(
type);
188 while (state.KeepRunning()) {
191 for (
auto& group : allRenderingOps) {
192 for (
size_t i = 0;
i < group.variants.size();
i++) {
193 auto& invocation = group.variants[
i];
194 builder.
SaveLayer(layer_bounds, &layer_paint);
195 invocation.Invoke(receiver);
199 Complete(builder,
type);
209 benchmark::State& state,
210 DisplayListDispatchBenchmarkType
type) {
211 bool prepare_rtree = NeedPrepareRTree(
type);
213 for (
int i = 0;
i < 5;
i++) {
214 InvokeAllOps(builder);
216 auto display_list = builder.
Build();
218 while (state.KeepRunning()) {
219 display_list->Dispatch(receiver);
224 benchmark::State& state,
225 DisplayListDispatchBenchmarkType
type) {
226 bool prepare_rtree = NeedPrepareRTree(
type);
228 for (
int i = 0;
i < 5;
i++) {
229 InvokeAllOps(builder);
231 auto display_list = builder.
Build();
233 while (state.KeepRunning()) {
236 display_list->Dispatch(receiver,
i);
242 benchmark::State& state,
243 DisplayListDispatchBenchmarkType
type) {
244 bool prepare_rtree = NeedPrepareRTree(
type);
246 for (
int i = 0;
i < 5;
i++) {
247 InvokeAllOps(builder);
249 auto display_list = builder.
Build();
251 while (state.KeepRunning()) {
253 display_list->Dispatch(receiver,
i);
259 benchmark::State& state,
260 DisplayListDispatchBenchmarkType
type) {
261 bool prepare_rtree = NeedPrepareRTree(
type);
263 for (
int i = 0;
i < 5;
i++) {
264 InvokeAllOps(builder);
266 auto display_list = builder.
Build();
268 while (state.KeepRunning()) {
269 std::vector<DlIndex> indices =
270 display_list->GetCulledIndices(display_list->GetBounds());
271 for (
DlIndex index : indices) {
272 display_list->Dispatch(receiver, index);
278 DisplayListDispatchBenchmarkType
type) {
279 bool prepare_rtree = NeedPrepareRTree(
type);
281 for (
int i = 0;
i < 5;
i++) {
282 InvokeAllOps(builder);
284 auto display_list = builder.
Build();
286 EXPECT_FALSE(rect.
Contains(display_list->GetBounds()));
288 while (state.KeepRunning()) {
289 display_list->Dispatch(receiver, rect);
294 benchmark::State& state,
295 DisplayListDispatchBenchmarkType
type) {
296 bool prepare_rtree = NeedPrepareRTree(
type);
298 for (
int i = 0;
i < 5;
i++) {
299 InvokeAllOps(builder);
301 auto display_list = builder.
Build();
303 EXPECT_FALSE(rect.
Contains(display_list->GetBounds()));
305 while (state.KeepRunning()) {
306 std::vector<DlIndex> indices = display_list->GetCulledIndices(rect);
307 for (
DlIndex index : indices) {
308 display_list->Dispatch(receiver, index);
315 DisplayListBuilderBenchmarkType::kDefault)
316 ->Unit(benchmark::kMicrosecond);
319 DisplayListBuilderBenchmarkType::kBounds)
320 ->Unit(benchmark::kMicrosecond);
323 DisplayListBuilderBenchmarkType::kRtree)
324 ->Unit(benchmark::kMicrosecond);
327 DisplayListBuilderBenchmarkType::kBoundsAndRtree)
328 ->Unit(benchmark::kMicrosecond);
332 DisplayListBuilderBenchmarkType::kDefault)
333 ->Unit(benchmark::kMicrosecond);
336 DisplayListBuilderBenchmarkType::kBounds)
337 ->Unit(benchmark::kMicrosecond);
340 DisplayListBuilderBenchmarkType::kRtree)
341 ->Unit(benchmark::kMicrosecond);
344 DisplayListBuilderBenchmarkType::kBoundsAndRtree)
345 ->Unit(benchmark::kMicrosecond);
349 DisplayListBuilderBenchmarkType::kDefault)
350 ->Unit(benchmark::kMicrosecond);
353 DisplayListBuilderBenchmarkType::kBounds)
354 ->Unit(benchmark::kMicrosecond);
357 DisplayListBuilderBenchmarkType::kRtree)
358 ->Unit(benchmark::kMicrosecond);
361 DisplayListBuilderBenchmarkType::kBoundsAndRtree)
362 ->Unit(benchmark::kMicrosecond);
366 DisplayListBuilderBenchmarkType::kDefault)
367 ->Unit(benchmark::kMicrosecond);
370 DisplayListBuilderBenchmarkType::kBounds)
371 ->Unit(benchmark::kMicrosecond);
374 DisplayListBuilderBenchmarkType::kRtree)
375 ->Unit(benchmark::kMicrosecond);
378 DisplayListBuilderBenchmarkType::kBoundsAndRtree)
379 ->Unit(benchmark::kMicrosecond);
383 DisplayListBuilderBenchmarkType::kDefault)
384 ->Unit(benchmark::kMicrosecond);
387 DisplayListBuilderBenchmarkType::kBounds)
388 ->Unit(benchmark::kMicrosecond);
391 DisplayListBuilderBenchmarkType::kRtree)
392 ->Unit(benchmark::kMicrosecond);
395 DisplayListBuilderBenchmarkType::kBoundsAndRtree)
396 ->Unit(benchmark::kMicrosecond);
400 DisplayListBuilderBenchmarkType::kDefault)
401 ->Unit(benchmark::kMicrosecond);
404 DisplayListBuilderBenchmarkType::kBounds)
405 ->Unit(benchmark::kMicrosecond);
408 DisplayListBuilderBenchmarkType::kRtree)
409 ->Unit(benchmark::kMicrosecond);
412 DisplayListBuilderBenchmarkType::kBoundsAndRtree)
413 ->Unit(benchmark::kMicrosecond);
417 DisplayListBuilderBenchmarkType::kDefault)
418 ->Unit(benchmark::kMicrosecond);
421 DisplayListBuilderBenchmarkType::kBounds)
422 ->Unit(benchmark::kMicrosecond);
425 DisplayListBuilderBenchmarkType::kRtree)
426 ->Unit(benchmark::kMicrosecond);
429 DisplayListBuilderBenchmarkType::kBoundsAndRtree)
430 ->Unit(benchmark::kMicrosecond);
434 DisplayListDispatchBenchmarkType::kDefaultNoRtree)
435 ->Unit(benchmark::kMicrosecond);
439 DisplayListDispatchBenchmarkType::kDefaultWithRtree)
440 ->Unit(benchmark::kMicrosecond);
444 DisplayListDispatchBenchmarkType::kCulledWithRtree)
445 ->Unit(benchmark::kMicrosecond);
449 DisplayListDispatchBenchmarkType::kDefaultNoRtree)
450 ->Unit(benchmark::kMicrosecond);
454 DisplayListDispatchBenchmarkType::kDefaultNoRtree)
455 ->Unit(benchmark::kMicrosecond);
459 DisplayListDispatchBenchmarkType::kDefaultNoRtree)
460 ->Unit(benchmark::kMicrosecond);
464 DisplayListDispatchBenchmarkType::kCulledWithRtree)
465 ->Unit(benchmark::kMicrosecond);
void ClipRect(const DlRect &rect, DlClipOp clip_op=DlClipOp::kIntersect, bool is_aa=false) override
void SaveLayer(const std::optional< DlRect > &bounds, const DlPaint *paint=nullptr, const DlImageFilter *backdrop=nullptr, std::optional< int64_t > backdrop_id=std::nullopt) override
void Scale(DlScalar sx, DlScalar sy) override
void Translate(DlScalar tx, DlScalar ty) override
sk_sp< DisplayList > Build()
void TransformFullPerspective(DlScalar mxx, DlScalar mxy, DlScalar mxz, DlScalar mxt, DlScalar myx, DlScalar myy, DlScalar myz, DlScalar myt, DlScalar mzx, DlScalar mzy, DlScalar mzz, DlScalar mzt, DlScalar mwx, DlScalar mwy, DlScalar mwz, DlScalar mwt) override
Internal API for rendering recorded display lists to backends.
DlPaint & setImageFilter(std::nullptr_t filter)
std::vector< DisplayListInvocationGroup > CreateAllRenderingOps()
static const DlBlurImageFilter kTestBlurImageFilter1(5.0, 5.0, DlTileMode::kClamp)
std::vector< DisplayListInvocationGroup > CreateAllGroups()
static void BM_DisplayListDispatchByIndexDefault(benchmark::State &state, DisplayListDispatchBenchmarkType type)
static void BM_DisplayListDispatchByVectorCull(benchmark::State &state, DisplayListDispatchBenchmarkType type)
static void BM_DisplayListBuilderWithScaleAndTranslate(benchmark::State &state, DisplayListBuilderBenchmarkType type)
static void BM_DisplayListBuilderWithSaveLayer(benchmark::State &state, DisplayListBuilderBenchmarkType type)
static void BM_DisplayListBuilderDefault(benchmark::State &state, DisplayListBuilderBenchmarkType type)
static void BM_DisplayListBuilderWithClipRect(benchmark::State &state, DisplayListBuilderBenchmarkType type)
static void BM_DisplayListDispatchDefault(benchmark::State &state, DisplayListDispatchBenchmarkType type)
static void BM_DisplayListDispatchCull(benchmark::State &state, DisplayListDispatchBenchmarkType type)
BENCHMARK_CAPTURE(BM_DisplayListBuilderDefault, kDefault, DisplayListBuilderBenchmarkType::kDefault) -> Unit(benchmark::kMicrosecond)
static void BM_DisplayListDispatchByVectorDefault(benchmark::State &state, DisplayListDispatchBenchmarkType type)
static void BM_DisplayListDispatchByIteratorDefault(benchmark::State &state, DisplayListDispatchBenchmarkType type)
DlOpReceiver & DisplayListBuilderBenchmarkAccessor(DisplayListBuilder &builder)
static void BM_DisplayListBuilderWithSaveLayerAndImageFilter(benchmark::State &state, DisplayListBuilderBenchmarkType type)
static void BM_DisplayListBuilderWithGlobalSaveLayer(benchmark::State &state, DisplayListBuilderBenchmarkType type)
static void BM_DisplayListBuilderWithPerspective(benchmark::State &state, DisplayListBuilderBenchmarkType type)
constexpr bool Contains(const TPoint< Type > &p) const
Returns true iff the provided point |p| is inside the half-open interior of this rectangle.
static constexpr TRect MakeLTRB(Type left, Type top, Type right, Type bottom)