skia2/tests/GrTClusterTest.cpp
Adlai Holler 78036086cf Add a new implementation of reduceOpsTaskSplitting
Currently this doesn't actually handle going over the memory
budget, but it does carve out space to do that later. This algorithm
can't handle everything yet but I want to get it landed for
more iteration as long as it's disabled.

Bug: skia:10877
Change-Id: I37942172345e8cfd6fc2c591a3788a10652377da
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/345168
Commit-Queue: Adlai Holler <adlai@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
Auto-Submit: Adlai Holler <adlai@google.com>
2021-01-07 17:20:03 +00:00

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);)
}
}