1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2021 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "src/gpu/GrRenderTaskCluster.h" 9cb93a386Sopenharmony_ci#include "src/gpu/mock/GrMockRenderTask.h" 10cb93a386Sopenharmony_ci#include "src/gpu/mock/GrMockSurfaceProxy.h" 11cb93a386Sopenharmony_ci#include "tests/Test.h" 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_citypedef void (*CreateGraphPF)(SkTArray<sk_sp<GrMockRenderTask>>* graph, 14cb93a386Sopenharmony_ci SkTArray<sk_sp<GrMockRenderTask>>* expected); 15cb93a386Sopenharmony_ci 16cb93a386Sopenharmony_cistatic void make_proxies(int count, SkTArray<sk_sp<GrSurfaceProxy>>* proxies) { 17cb93a386Sopenharmony_ci proxies->reset(count); 18cb93a386Sopenharmony_ci for (int i = 0; i < count; i++) { 19cb93a386Sopenharmony_ci auto name = SkStringPrintf("%c", 'A' + i); 20cb93a386Sopenharmony_ci proxies->at(i) = sk_make_sp<GrMockSurfaceProxy>(std::move(name)); 21cb93a386Sopenharmony_ci } 22cb93a386Sopenharmony_ci} 23cb93a386Sopenharmony_ci 24cb93a386Sopenharmony_cistatic void make_tasks(int count, SkTArray<sk_sp<GrMockRenderTask>>* tasks) { 25cb93a386Sopenharmony_ci tasks->reset(count); 26cb93a386Sopenharmony_ci for (int i = 0; i < count; i++) { 27cb93a386Sopenharmony_ci tasks->at(i) = sk_make_sp<GrMockRenderTask>(); 28cb93a386Sopenharmony_ci } 29cb93a386Sopenharmony_ci} 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_ci/* 32cb93a386Sopenharmony_ci * In: A1 B1 A2 33cb93a386Sopenharmony_ci * Out: B1 A1 A2 34cb93a386Sopenharmony_ci */ 35cb93a386Sopenharmony_cistatic void create_graph0(SkTArray<sk_sp<GrMockRenderTask>>* graph, 36cb93a386Sopenharmony_ci SkTArray<sk_sp<GrMockRenderTask>>* expected) { 37cb93a386Sopenharmony_ci SkTArray<sk_sp<GrSurfaceProxy>> proxies; 38cb93a386Sopenharmony_ci make_proxies(2, &proxies); 39cb93a386Sopenharmony_ci make_tasks(3, graph); 40cb93a386Sopenharmony_ci 41cb93a386Sopenharmony_ci graph->at(0)->addTarget(proxies[0]); 42cb93a386Sopenharmony_ci graph->at(1)->addTarget(proxies[1]); 43cb93a386Sopenharmony_ci graph->at(2)->addTarget(proxies[0]); 44cb93a386Sopenharmony_ci graph->at(2)->addDependency(graph->at(1).get()); 45cb93a386Sopenharmony_ci 46cb93a386Sopenharmony_ci expected->push_back(graph->at(1)); 47cb93a386Sopenharmony_ci expected->push_back(graph->at(0)); 48cb93a386Sopenharmony_ci expected->push_back(graph->at(2)); 49cb93a386Sopenharmony_ci} 50cb93a386Sopenharmony_ci 51cb93a386Sopenharmony_ci/* 52cb93a386Sopenharmony_ci * In: A1 B1 A2 C1 A3 53cb93a386Sopenharmony_ci * Out: B1 C1 A1 A2 A3 54cb93a386Sopenharmony_ci */ 55cb93a386Sopenharmony_cistatic void create_graph1(SkTArray<sk_sp<GrMockRenderTask>>* graph, 56cb93a386Sopenharmony_ci SkTArray<sk_sp<GrMockRenderTask>>* expected) { 57cb93a386Sopenharmony_ci SkTArray<sk_sp<GrSurfaceProxy>> proxies; 58cb93a386Sopenharmony_ci make_proxies(3, &proxies); 59cb93a386Sopenharmony_ci make_tasks(5, graph); 60cb93a386Sopenharmony_ci 61cb93a386Sopenharmony_ci graph->at(0)->addTarget(proxies[0]); 62cb93a386Sopenharmony_ci graph->at(1)->addTarget(proxies[1]); 63cb93a386Sopenharmony_ci graph->at(2)->addTarget(proxies[0]); 64cb93a386Sopenharmony_ci graph->at(3)->addTarget(proxies[2]); 65cb93a386Sopenharmony_ci graph->at(4)->addTarget(proxies[0]); 66cb93a386Sopenharmony_ci 67cb93a386Sopenharmony_ci expected->push_back(graph->at(1)); 68cb93a386Sopenharmony_ci expected->push_back(graph->at(3)); 69cb93a386Sopenharmony_ci expected->push_back(graph->at(0)); 70cb93a386Sopenharmony_ci expected->push_back(graph->at(2)); 71cb93a386Sopenharmony_ci expected->push_back(graph->at(4)); 72cb93a386Sopenharmony_ci} 73cb93a386Sopenharmony_ci 74cb93a386Sopenharmony_ci/* 75cb93a386Sopenharmony_ci * In: A1 B1 A2. 76cb93a386Sopenharmony_ci * Srcs: A1->B1, B1->A2. 77cb93a386Sopenharmony_ci * Out: A1 B1 A2. Can't reorder. 78cb93a386Sopenharmony_ci */ 79cb93a386Sopenharmony_cistatic void create_graph2(SkTArray<sk_sp<GrMockRenderTask>>* graph, 80cb93a386Sopenharmony_ci SkTArray<sk_sp<GrMockRenderTask>>* expected) { 81cb93a386Sopenharmony_ci SkTArray<sk_sp<GrSurfaceProxy>> proxies; 82cb93a386Sopenharmony_ci make_proxies(2, &proxies); 83cb93a386Sopenharmony_ci make_tasks(3, graph); 84cb93a386Sopenharmony_ci 85cb93a386Sopenharmony_ci graph->at(0)->addTarget(proxies[0]); 86cb93a386Sopenharmony_ci graph->at(1)->addTarget(proxies[1]); 87cb93a386Sopenharmony_ci graph->at(2)->addTarget(proxies[0]); 88cb93a386Sopenharmony_ci 89cb93a386Sopenharmony_ci graph->at(1)->addDependency(graph->at(0).get()); 90cb93a386Sopenharmony_ci graph->at(2)->addDependency(graph->at(1).get()); 91cb93a386Sopenharmony_ci 92cb93a386Sopenharmony_ci // expected is empty. Can't reorder. 93cb93a386Sopenharmony_ci} 94cb93a386Sopenharmony_ci 95cb93a386Sopenharmony_ci/* 96cb93a386Sopenharmony_ci * Write-after-read case. 97cb93a386Sopenharmony_ci * In: A1 B1 A2 B2 98cb93a386Sopenharmony_ci * Srcs: A1->B1, A2->B2 99cb93a386Sopenharmony_ci * Used: B1(A), B2(A) 100cb93a386Sopenharmony_ci * Out: Can't reorder. 101cb93a386Sopenharmony_ci */ 102cb93a386Sopenharmony_cistatic void create_graph3(SkTArray<sk_sp<GrMockRenderTask>>* graph, 103cb93a386Sopenharmony_ci SkTArray<sk_sp<GrMockRenderTask>>* expected) { 104cb93a386Sopenharmony_ci SkTArray<sk_sp<GrSurfaceProxy>> proxies; 105cb93a386Sopenharmony_ci make_proxies(2, &proxies); 106cb93a386Sopenharmony_ci make_tasks(4, graph); 107cb93a386Sopenharmony_ci 108cb93a386Sopenharmony_ci graph->at(0)->addTarget(proxies[0]); 109cb93a386Sopenharmony_ci graph->at(1)->addTarget(proxies[1]); 110cb93a386Sopenharmony_ci graph->at(2)->addTarget(proxies[0]); 111cb93a386Sopenharmony_ci graph->at(3)->addTarget(proxies[1]); 112cb93a386Sopenharmony_ci 113cb93a386Sopenharmony_ci graph->at(1)->addDependency(graph->at(0).get()); 114cb93a386Sopenharmony_ci graph->at(3)->addDependency(graph->at(2).get()); 115cb93a386Sopenharmony_ci 116cb93a386Sopenharmony_ci graph->at(1)->addUsed(proxies[0]); 117cb93a386Sopenharmony_ci graph->at(3)->addUsed(proxies[0]); 118cb93a386Sopenharmony_ci 119cb93a386Sopenharmony_ci // expected is empty. Can't reorder. 120cb93a386Sopenharmony_ci} 121cb93a386Sopenharmony_ci 122cb93a386Sopenharmony_ciDEF_TEST(GrRenderTaskCluster, reporter) { 123cb93a386Sopenharmony_ci CreateGraphPF tests[] = { 124cb93a386Sopenharmony_ci create_graph0, 125cb93a386Sopenharmony_ci create_graph1, 126cb93a386Sopenharmony_ci create_graph2, 127cb93a386Sopenharmony_ci create_graph3 128cb93a386Sopenharmony_ci }; 129cb93a386Sopenharmony_ci 130cb93a386Sopenharmony_ci for (size_t i = 0; i < SK_ARRAY_COUNT(tests); ++i) { 131cb93a386Sopenharmony_ci SkTArray<sk_sp<GrMockRenderTask>> graph; 132cb93a386Sopenharmony_ci SkTArray<sk_sp<GrMockRenderTask>> expectedOutput; 133cb93a386Sopenharmony_ci 134cb93a386Sopenharmony_ci (tests[i])(&graph, &expectedOutput); 135cb93a386Sopenharmony_ci 136cb93a386Sopenharmony_ci SkTInternalLList<GrRenderTask> llist; 137cb93a386Sopenharmony_ci // TODO: Why does Span not want to convert from sk_sp<GrMockRenderTask> to 138cb93a386Sopenharmony_ci // `const sk_sp<GrRenderTask>`? 139cb93a386Sopenharmony_ci SkSpan<const sk_sp<GrRenderTask>> graphSpan( 140cb93a386Sopenharmony_ci reinterpret_cast<sk_sp<GrRenderTask>*>(graph.data()), graph.count()); 141cb93a386Sopenharmony_ci bool actualResult = GrClusterRenderTasks(graphSpan, &llist); 142cb93a386Sopenharmony_ci 143cb93a386Sopenharmony_ci if (expectedOutput.empty()) { 144cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, !actualResult); 145cb93a386Sopenharmony_ci } else { 146cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, actualResult); 147cb93a386Sopenharmony_ci // SkTInternalLList::countEntries is debug-only and these tests run in release. 148cb93a386Sopenharmony_ci int newCount = 0; 149cb93a386Sopenharmony_ci for ([[maybe_unused]] GrRenderTask* t : llist) { 150cb93a386Sopenharmony_ci newCount++; 151cb93a386Sopenharmony_ci } 152cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, newCount == expectedOutput.count()); 153cb93a386Sopenharmony_ci 154cb93a386Sopenharmony_ci int j = 0; 155cb93a386Sopenharmony_ci for (GrRenderTask* n : llist) { 156cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, n == expectedOutput[j++].get()); 157cb93a386Sopenharmony_ci } 158cb93a386Sopenharmony_ci } 159cb93a386Sopenharmony_ci 160cb93a386Sopenharmony_ci //SkDEBUGCODE(print(graph);) 161cb93a386Sopenharmony_ci } 162cb93a386Sopenharmony_ci} 163