aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Stiles <johnstiles@google.com>2022-03-15 18:44:33 -0400
committerDerek Sollenberger <djsollen@google.com>2022-03-22 17:56:43 +0000
commit83d303394bfcbd19563b0efd72b3be3c0b0e9dac (patch)
treedcd8688e25ac80a346d43c708ad7f827df1416ee
parentac7a40c7c7aabd390fc7ab1dcf141a1ded3397c0 (diff)
downloadskia-83d303394bfcbd19563b0efd72b3be3c0b0e9dac.tar.gz
Load the SkSL error tests when SkQP::init is executed.
Bug: skia:13042 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/521219 Auto-Submit: John Stiles <johnstiles@google.com> Reviewed-by: Leon Scroggins <scroggo@google.com> Reviewed-by: Brian Osman <brianosman@google.com> Change-Id: Ic3e0df00626d639bbaa55f77d057cc8fa231bd23 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/523178 Reviewed-by: John Stiles <johnstiles@google.com>
-rw-r--r--tools/skqp/src/skqp.cpp46
-rw-r--r--tools/skqp/src/skqp.h17
2 files changed, 53 insertions, 10 deletions
diff --git a/tools/skqp/src/skqp.cpp b/tools/skqp/src/skqp.cpp
index 28e40d3ef4..4cecdc8998 100644
--- a/tools/skqp/src/skqp.cpp
+++ b/tools/skqp/src/skqp.cpp
@@ -22,6 +22,7 @@
#include "src/utils/SkOSPath.h"
#include "tests/Test.h"
#include "tests/TestHarness.h"
+#include "tools/Resources.h"
#include "tools/fonts/TestFontMgr.h"
#ifdef SK_GL
#include "tools/gpu/gl/GLTestContext.h"
@@ -108,6 +109,38 @@ static std::vector<SkQP::UnitTest> get_unit_tests(const ExclusionList& exclusion
return unitTests;
}
+// Returns a list of every SkSL error test to be run.
+static std::vector<SkQP::SkSLErrorTest> get_sksl_error_tests(const ExclusionList& exclusionList) {
+ std::vector<SkQP::SkSLErrorTest> skslErrorTests;
+
+ auto iterateFn = [&](const char* directory, const char* extension) {
+ SkString resourceDirectory = GetResourcePath(directory);
+ SkOSFile::Iter iter(resourceDirectory.c_str(), extension);
+ SkString name;
+
+ while (iter.next(&name, /*getDir=*/false)) {
+ if (exclusionList.isExcluded(name.c_str())) {
+ continue;
+ }
+ SkString path(SkOSPath::Join(directory, name.c_str()));
+ sk_sp<SkData> shaderText = GetResourceAsData(path.c_str());
+ if (!shaderText) {
+ continue;
+ }
+ skslErrorTests.push_back({name.c_str(), static_cast<const char*>(shaderText->data())});
+ }
+ };
+
+ // Android only supports runtime shaders, not color filters or blenders.
+ iterateFn("sksl/runtime_errors/", ".rts");
+
+ auto lt = [](const SkQP::SkSLErrorTest& a, const SkQP::SkSLErrorTest& b) {
+ return a.name < b.name;
+ };
+ std::sort(skslErrorTests.begin(), skslErrorTests.end(), lt);
+ return skslErrorTests;
+}
+
static std::unique_ptr<sk_gpu_test::TestContext> make_test_context(SkQP::SkiaBackend backend) {
using U = std::unique_ptr<sk_gpu_test::TestContext>;
switch (backend) {
@@ -212,6 +245,7 @@ void SkQP::init(SkQPAssetManager* assetManager, const char* reportDirectory) {
}
fUnitTests = get_unit_tests(exclusionList);
+ fSkSLErrorTests = get_sksl_error_tests(exclusionList);
fSupportedBackends = get_backends();
print_backend_info((fReportDirectory + "/grdump.txt").c_str(), fSupportedBackends);
@@ -231,7 +265,7 @@ std::vector<std::string> SkQP::executeTest(SkQP::UnitTest test) {
test->fContextOptionsProc(&options);
}
test->fProc(&r, options);
- fUnitTestResults.push_back(UnitTestResult{test, r.fErrors});
+ fTestResults.push_back(TestResult{test->fName, r.fErrors});
return r.fErrors;
}
@@ -249,13 +283,13 @@ void SkQP::makeReport() {
}
SkFILEWStream unitOut(SkOSPath::Join(fReportDirectory.c_str(), kUnitTestReportPath).c_str());
SkASSERT_RELEASE(unitOut.isValid());
- for (const SkQP::UnitTestResult& result : fUnitTestResults) {
- unitOut.writeText(GetUnitTestName(result.fUnitTest));
- if (result.fErrors.empty()) {
+ for (const SkQP::TestResult& result : fTestResults) {
+ unitOut.writeText(result.name.c_str());
+ if (result.errors.empty()) {
unitOut.writeText(" PASSED\n* * *\n");
} else {
- write(&unitOut, SkStringPrintf(" FAILED (%zu errors)\n", result.fErrors.size()));
- for (const std::string& err : result.fErrors) {
+ write(&unitOut, SkStringPrintf(" FAILED (%zu errors)\n", result.errors.size()));
+ for (const std::string& err : result.errors) {
write(&unitOut, err);
unitOut.newline();
}
diff --git a/tools/skqp/src/skqp.h b/tools/skqp/src/skqp.h
index d56676556b..6093e0f1ca 100644
--- a/tools/skqp/src/skqp.h
+++ b/tools/skqp/src/skqp.h
@@ -46,6 +46,11 @@ public:
};
using UnitTest = const skiatest::Test*;
+ struct SkSLErrorTest {
+ std::string name;
+ std::string shaderText;
+ };
+
////////////////////////////////////////////////////////////////////////////
/** These functions provide a descriptive name for the given value.*/
@@ -71,17 +76,21 @@ public:
/** @return a sorted list of all Skia GPU unit tests */
const std::vector<UnitTest>& getUnitTests() const { return fUnitTests; }
+ /** @return a sorted list of all SkSL error tests */
+ const std::vector<SkSLErrorTest>& getSkSLErrorTests() const { return fSkSLErrorTests; }
+
////////////////////////////////////////////////////////////////////////////
private:
- struct UnitTestResult {
- UnitTest fUnitTest;
- std::vector<std::string> fErrors;
+ struct TestResult {
+ std::string name;
+ std::vector<std::string> errors;
};
- std::vector<UnitTestResult> fUnitTestResults;
+ std::vector<TestResult> fTestResults;
std::vector<SkiaBackend> fSupportedBackends;
std::string fReportDirectory;
std::vector<UnitTest> fUnitTests;
+ std::vector<SkSLErrorTest> fSkSLErrorTests;
SkQP(const SkQP&) = delete;
SkQP& operator=(const SkQP&) = delete;