112 lines
3.0 KiB
C++
112 lines
3.0 KiB
C++
|
/*
|
||
|
* Copyright 2020 Google Inc.
|
||
|
*
|
||
|
* Use of this source code is governed by a BSD-style license that can be
|
||
|
* found in the LICENSE file.
|
||
|
*/
|
||
|
|
||
|
#include "src/gpu/GrTCluster.h"
|
||
|
#include "tests/Test.h"
|
||
|
|
||
|
#include "tools/ToolUtils.h"
|
||
|
|
||
|
using ToolUtils::TopoTestNode;
|
||
|
|
||
|
typedef void (*CreateGraphPF)(SkTArray<sk_sp<TopoTestNode>>* graph,
|
||
|
SkTArray<sk_sp<TopoTestNode>>* expected);
|
||
|
|
||
|
/*
|
||
|
* In: A1 B1 A2
|
||
|
* Out: B1 A1 A2
|
||
|
*/
|
||
|
static void create_graph0(SkTArray<sk_sp<TopoTestNode>>* graph,
|
||
|
SkTArray<sk_sp<TopoTestNode>>* expected) {
|
||
|
ToolUtils::TopoTestNode::AllocNodes(graph, 3);
|
||
|
|
||
|
graph->at(0)->targets(0);
|
||
|
graph->at(1)->targets(1);
|
||
|
graph->at(2)->targets(0);
|
||
|
graph->at(2)->dependsOn(graph->at(0).get());
|
||
|
|
||
|
expected->push_back(graph->at(1));
|
||
|
expected->push_back(graph->at(0));
|
||
|
expected->push_back(graph->at(2));
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* In: A1 B1 A2 C1 A3
|
||
|
* Out: B1 C1 A1 A2 A3
|
||
|
*/
|
||
|
static void create_graph1(SkTArray<sk_sp<TopoTestNode>>* graph,
|
||
|
SkTArray<sk_sp<TopoTestNode>>* expected) {
|
||
|
ToolUtils::TopoTestNode::AllocNodes(graph, 5);
|
||
|
|
||
|
graph->at(0)->targets(0);
|
||
|
graph->at(1)->targets(1);
|
||
|
graph->at(2)->targets(0);
|
||
|
graph->at(3)->targets(2);
|
||
|
graph->at(4)->targets(0);
|
||
|
|
||
|
expected->push_back(graph->at(1));
|
||
|
expected->push_back(graph->at(3));
|
||
|
expected->push_back(graph->at(0));
|
||
|
expected->push_back(graph->at(2));
|
||
|
expected->push_back(graph->at(4));
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* In: A1 B1 A2.
|
||
|
* Srcs: A1->B1, B1->A2.
|
||
|
* Out: A1 B1 A2. Can't reorder.
|
||
|
*/
|
||
|
static void create_graph2(SkTArray<sk_sp<TopoTestNode>>* graph,
|
||
|
SkTArray<sk_sp<TopoTestNode>>* expected) {
|
||
|
ToolUtils::TopoTestNode::AllocNodes(graph, 3);
|
||
|
|
||
|
graph->at(0)->targets(0);
|
||
|
graph->at(1)->targets(1);
|
||
|
graph->at(2)->targets(0);
|
||
|
|
||
|
graph->at(1)->dependsOn(graph->at(0).get());
|
||
|
graph->at(2)->dependsOn(graph->at(1).get());
|
||
|
|
||
|
// expected is empty. Can't reorder.
|
||
|
}
|
||
|
|
||
|
DEF_TEST(GrTCluster, reporter) {
|
||
|
CreateGraphPF tests[] = {
|
||
|
create_graph0,
|
||
|
create_graph1,
|
||
|
create_graph2
|
||
|
};
|
||
|
|
||
|
for (size_t i = 0; i < SK_ARRAY_COUNT(tests); ++i) {
|
||
|
SkTArray<sk_sp<TopoTestNode>> graph;
|
||
|
SkTArray<sk_sp<TopoTestNode>> expectedOutput;
|
||
|
|
||
|
(tests[i])(&graph, &expectedOutput);
|
||
|
|
||
|
SkTInternalLList<TopoTestNode> llist;
|
||
|
bool actualResult = GrTCluster<TopoTestNode>(graph, &llist);
|
||
|
|
||
|
if (expectedOutput.empty()) {
|
||
|
REPORTER_ASSERT(reporter, !actualResult);
|
||
|
} else {
|
||
|
REPORTER_ASSERT(reporter, actualResult);
|
||
|
// SkTInternalLList::countEntries is debug-only and these tests run in release.
|
||
|
int newCount = 0;
|
||
|
for ([[maybe_unused]] TopoTestNode* t : llist) {
|
||
|
newCount++;
|
||
|
}
|
||
|
REPORTER_ASSERT(reporter, newCount == expectedOutput.count());
|
||
|
|
||
|
int j = 0;
|
||
|
for (TopoTestNode* n : llist) {
|
||
|
REPORTER_ASSERT(reporter, n == expectedOutput[j++].get());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//SkDEBUGCODE(print(graph);)
|
||
|
}
|
||
|
}
|