From ac7f23c8077cadec224682e593f19a0478139cd2 Mon Sep 17 00:00:00 2001 From: Hal Canary Date: Mon, 26 Nov 2018 14:07:41 -0500 Subject: SkQP: refatctor C++ bits. * C++ code moved into tools/skqp/src/. * State held with single SkQP class. * gmkb functions moved to skqp_model.{h,cpp} * model no longer knows about report format. * skqp_main and skqp_lib no longer have globals * jni code has fewer globals. * skqp_main no longer uses googletest. * AssetMng returns SkData, not a SkStream. * Add jitter tool. * dump GPU information into grdump.txt * JUnit puts report in directory with timestamp. * Document SkQP Render Test Algorithm. * GPU driver correctness workarounds always off * cut_release tool for assembling models * make_rendertests_list.py to help cut_release * make_gmkb.go emits a list of models CQ_INCLUDE_TRYBOTS=skia.primary:Build-Debian9-Clang-x86-devrel-Android_SKQP Change-Id: I7d4f0c24592b1f64be0088578a3f1a0bc366dd4d Reviewed-on: https://skia-review.googlesource.com/c/110420 Reviewed-by: Hal Canary Commit-Queue: Hal Canary --- .../skqp/src/main/java/org/skia/skqp/SkQP.java | 8 +-- .../src/main/java/org/skia/skqp/SkQPRunner.java | 64 ++++++++++------------ 2 files changed, 33 insertions(+), 39 deletions(-) (limited to 'platform_tools') diff --git a/platform_tools/android/apps/skqp/src/main/java/org/skia/skqp/SkQP.java b/platform_tools/android/apps/skqp/src/main/java/org/skia/skqp/SkQP.java index 58e09ec982..2f1381b0ab 100644 --- a/platform_tools/android/apps/skqp/src/main/java/org/skia/skqp/SkQP.java +++ b/platform_tools/android/apps/skqp/src/main/java/org/skia/skqp/SkQP.java @@ -14,8 +14,8 @@ import java.io.File; import java.io.IOException; public class SkQP { - protected native void nInit(AssetManager assetManager, String dataDir, boolean experimentalMode); - protected native float nExecuteGM(int gm, int backend) throws SkQPException; + protected native void nInit(AssetManager assetManager, String dataDir); + protected native long nExecuteGM(int gm, int backend) throws SkQPException; protected native String[] nExecuteUnitTest(int test); protected native void nMakeReport(); @@ -42,13 +42,13 @@ public class SkQP { // Note: nInit will initialize the mGMs, mBackends and mUnitTests fields. AssetManager assetManager = context.getResources().getAssets(); - this.nInit(assetManager, outputDirPath, true); + this.nInit(assetManager, outputDirPath); for (int backend = 0; backend < mBackends.length; backend++) { String classname = kSkiaGM + mBackends[backend]; for (int gm = 0; gm < mGMs.length; gm++) { String testName = kSkiaGM + mBackends[backend] + "_" +mGMs[gm]; - float value = java.lang.Float.MAX_VALUE; + long value = java.lang.Long.MAX_VALUE; String error = null; Log.w(LOG_PREFIX, "Running: " + testName); try { diff --git a/platform_tools/android/apps/skqp/src/main/java/org/skia/skqp/SkQPRunner.java b/platform_tools/android/apps/skqp/src/main/java/org/skia/skqp/SkQPRunner.java index 11a8e2bd6c..7827f3e88c 100644 --- a/platform_tools/android/apps/skqp/src/main/java/org/skia/skqp/SkQPRunner.java +++ b/platform_tools/android/apps/skqp/src/main/java/org/skia/skqp/SkQPRunner.java @@ -14,6 +14,8 @@ import android.support.test.InstrumentationRegistry; import android.util.Log; import java.io.File; import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; import org.junit.runner.Description; import org.junit.runner.RunWith; import org.junit.runner.Runner; @@ -28,48 +30,40 @@ public class SkQPRunner extends Runner implements Filterable { private int mShouldRunTestCount; private Description[] mTests; private boolean[] mShouldSkipTest; - private SkQP impl; + private String mOutputDirectory; + private SkQP mImpl; private static final String TAG = SkQP.LOG_PREFIX; private static void Fail(Description desc, RunNotifier notifier, String failure) { notifier.fireTestFailure(new Failure(desc, new SkQPFailure(failure))); } - private static File GetOutputDir() { - Context c = InstrumentationRegistry.getTargetContext(); - // File f = c.getFilesDir(); - File f = c.getExternalFilesDir(null); - return new File(f, "output"); - } - //////////////////////////////////////////////////////////////////////////// public SkQPRunner(Class testClass) { - impl = new SkQP(); - File filesDir = SkQPRunner.GetOutputDir(); - try { - SkQP.ensureEmtpyDirectory(filesDir); - } catch (IOException e) { - Log.w(TAG, "ensureEmtpyDirectory: " + e.getMessage()); - } - Log.i(TAG, String.format("output written to \"%s\"", filesDir.getAbsolutePath())); + mImpl = new SkQP(); + Context context = InstrumentationRegistry.getTargetContext(); + String now = (new SimpleDateFormat("yyyy-MM-dd'T'HHmmss")).format(new Date()); + File reportPath = new File(context.getExternalFilesDir(null), "skqp_report_" + now); + reportPath.mkdirs(); + mOutputDirectory = reportPath.getAbsolutePath(); + Log.i(TAG, String.format("output written to \"%s\"", mOutputDirectory)); - Resources resources = InstrumentationRegistry.getTargetContext().getResources(); - AssetManager mAssetManager = resources.getAssets(); - impl.nInit(mAssetManager, filesDir.getAbsolutePath(), false); + AssetManager assetManager = context.getResources().getAssets(); + mImpl.nInit(assetManager, mOutputDirectory); mTests = new Description[this.testCount()]; mShouldSkipTest = new boolean[mTests.length]; // = {false, false, ....}; int index = 0; - for (int backend = 0; backend < impl.mBackends.length; backend++) { - for (int gm = 0; gm < impl.mGMs.length; gm++) { + for (int backend = 0; backend < mImpl.mBackends.length; backend++) { + for (int gm = 0; gm < mImpl.mGMs.length; gm++) { mTests[index++] = Description.createTestDescription(SkQPRunner.class, - impl.mBackends[backend] + "_" + impl.mGMs[gm]); + mImpl.mBackends[backend] + "_" + mImpl.mGMs[gm]); } } - for (int unitTest = 0; unitTest < impl.mUnitTests.length; unitTest++) { + for (int unitTest = 0; unitTest < mImpl.mUnitTests.length; unitTest++) { mTests[index++] = Description.createTestDescription(SkQPRunner.class, - "unitTest_" + impl.mUnitTests[unitTest]); + "unitTest_" + mImpl.mUnitTests[unitTest]); } assert(index == mTests.length); mShouldRunTestCount = mTests.length; @@ -101,15 +95,15 @@ public class SkQPRunner extends Runner implements Filterable { @Override public int testCount() { - return impl.mUnitTests.length + impl.mGMs.length * impl.mBackends.length; + return mImpl.mUnitTests.length + mImpl.mGMs.length * mImpl.mBackends.length; } @Override public void run(RunNotifier notifier) { int testNumber = 0; // out of number of actually run tests. int testIndex = 0; // out of potential tests. - for (int backend = 0; backend < impl.mBackends.length; backend++) { - for (int gm = 0; gm < impl.mGMs.length; gm++, testIndex++) { + for (int backend = 0; backend < mImpl.mBackends.length; backend++) { + for (int gm = 0; gm < mImpl.mGMs.length; gm++, testIndex++) { Description desc = mTests[testIndex]; String name = desc.getMethodName(); if (mShouldSkipTest[testIndex]) { @@ -117,10 +111,10 @@ public class SkQPRunner extends Runner implements Filterable { } ++testNumber; notifier.fireTestStarted(desc); - float value = java.lang.Float.MAX_VALUE; + long value = java.lang.Long.MAX_VALUE; String error = null; try { - value = impl.nExecuteGM(gm, backend); + value = mImpl.nExecuteGM(gm, backend); } catch (SkQPException exept) { error = exept.getMessage(); } @@ -131,8 +125,8 @@ public class SkQPRunner extends Runner implements Filterable { result = "ERROR"; } else if (value != 0) { SkQPRunner.Fail(desc, notifier, String.format( - "Image mismatch: max channel diff = %f", value)); - Log.w(TAG, String.format("[FAIL] '%s': %f > 0", name, value)); + "Image mismatch: max channel diff = %d", value)); + Log.w(TAG, String.format("[FAIL] '%s': %d > 0", name, value)); result = "FAIL"; } notifier.fireTestFinished(desc); @@ -140,7 +134,7 @@ public class SkQPRunner extends Runner implements Filterable { name, testNumber, mShouldRunTestCount, result)); } } - for (int unitTest = 0; unitTest < impl.mUnitTests.length; unitTest++, testIndex++) { + for (int unitTest = 0; unitTest < mImpl.mUnitTests.length; unitTest++, testIndex++) { Description desc = mTests[testIndex]; String name = desc.getMethodName(); if (mShouldSkipTest[testIndex]) { @@ -148,7 +142,7 @@ public class SkQPRunner extends Runner implements Filterable { } ++testNumber; notifier.fireTestStarted(desc); - String[] errors = impl.nExecuteUnitTest(unitTest); + String[] errors = mImpl.nExecuteUnitTest(unitTest); String result = "pass"; if (errors != null && errors.length > 0) { Log.w(TAG, String.format("[FAIL] Test '%s' had %d failures.", name, errors.length)); @@ -162,7 +156,7 @@ public class SkQPRunner extends Runner implements Filterable { Log.i(TAG, String.format("Test '%s' complete (%d/%d). [%s]", name, testNumber, mShouldRunTestCount, result)); } - impl.nMakeReport(); - Log.i(TAG, String.format("output written to \"%s\"", GetOutputDir().getAbsolutePath())); + mImpl.nMakeReport(); + Log.i(TAG, String.format("output written to \"%s\"", mOutputDirectory)); } } -- cgit v1.2.3