Trace Interpreter: gzip cpp and run gold tests.

New test step:
angle_restricted_trace_gold_interpreted_tests
similar to existing
angle_restricted_trace_gold_tests

but runs a subset of newest traces that have the right format.
Currently there are 8 of them and the filter is hard-coded in
test_suites.pyl. rise_of_empires can also be run interpreted but
happened to flake during testing so it's not included for now.

Trace cpp files are concatenated and gzipped
as a build step producing gen/tracegz_{trace}.gz
and these gz files are then distributed as part of the build

--trace-interpreter flag changes from boolean to string to support:
--trace-interpreter=gz:
* this uses the gz file above
* gold tests added in this CL use this option

--trace-interpreter=c:
* using uncompressed c/cpp file
* existing angle_trace_interpreter_tests runs a retrace
  saving .c files and uses this option

Bug: b/276742336
Change-Id: I69544f25bda873af191978195d02ffbdd34363c0
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4424690
Reviewed-by: Cody Northrop <cnorthrop@google.com>
Commit-Queue: Roman Lavrov <romanl@google.com>
This commit is contained in:
Roman Lavrov
2023-04-13 15:16:53 -04:00
committed by Angle LUCI CQ
parent 82f1cee01a
commit 4e07335654
15 changed files with 339 additions and 11 deletions

View File

@@ -599,6 +599,10 @@ template("angle_trace") {
"$angle_root/util:angle_trace_loader",
]
if (defined(invoker.deps)) {
deps += invoker.deps
}
if (is_android) {
libs = [ "log" ]
}
@@ -653,14 +657,25 @@ template("angle_trace_library") {
} else {
_target = "${target_name}_$_trace"
}
_gen_target = "gen${target_name}_$_trace"
action(_gen_target) {
script = "//scripts/tracegz.py"
args = [ _trace ]
outputs = [ "$root_gen_dir/tracegz_$_trace.gz" ]
}
angle_trace(_target) {
sources = rebase_path(_trace_data.TraceFiles, ".", _trace_dir)
data = [
"$_trace_dir/$_trace.json",
"$_trace_dir/$_trace.angledata.gz",
"$root_gen_dir/tracegz_$_trace.gz",
]
deps = [ ":$_gen_target" ]
if (invoker.short_names) {
output_name = _trace
}

View File

@@ -767,6 +767,43 @@
},
"test_id_prefix": "ninja://src/tests:angle_perftests/"
},
{
"args": [
"--test-machine-name",
"${buildername}",
"--trace-interpreter=gz",
"--filter=fishdom:geometry_dash:merge_dragons:minecraft_bedrock:new_legend_of_the_condor_heroes:street_fighter_duel:teslagrad:vainglory",
"-v",
"--git-revision=${got_angle_revision}"
],
"isolate_name": "angle_restricted_trace_gold_interpreted_tests",
"merge": {
"script": "//testing/merge_scripts/standard_isolated_script_merge.py"
},
"name": "angle_restricted_trace_gold_interpreted_tests",
"precommit_args": [
"--gerrit-issue=${patch_issue}",
"--gerrit-patchset=${patch_set}",
"--buildbucket-id=${buildbucket_build_id}",
"--use-permissive-pixel-comparison=${use_permissive_angle_pixel_comparison}"
],
"swarming": {
"can_use_on_swarming_builders": true,
"containment_type": "AUTO",
"dimension_sets": [
{
"device_os": "R",
"device_os_type": "userdebug",
"device_type": "flame",
"os": "Android",
"pool": "chromium.tests.gpu"
}
],
"service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
},
"test": "angle_restricted_trace_gold_tests",
"test_id_prefix": "ninja://src/tests/restricted_traces:angle_restricted_trace_gold_tests/"
},
{
"args": [
"--test-machine-name",
@@ -1557,6 +1594,40 @@
},
"test_id_prefix": "ninja://src/tests:angle_perftests/"
},
{
"args": [
"--test-machine-name",
"${buildername}",
"--trace-interpreter=gz",
"--filter=fishdom:geometry_dash:merge_dragons:minecraft_bedrock:new_legend_of_the_condor_heroes:street_fighter_duel:teslagrad:vainglory",
"--git-revision=${got_angle_revision}"
],
"isolate_name": "angle_restricted_trace_gold_interpreted_tests",
"merge": {
"script": "//testing/merge_scripts/standard_isolated_script_merge.py"
},
"name": "angle_restricted_trace_gold_interpreted_tests",
"precommit_args": [
"--gerrit-issue=${patch_issue}",
"--gerrit-patchset=${patch_set}",
"--buildbucket-id=${buildbucket_build_id}",
"--use-permissive-pixel-comparison=${use_permissive_angle_pixel_comparison}"
],
"swarming": {
"can_use_on_swarming_builders": true,
"containment_type": "AUTO",
"dimension_sets": [
{
"gpu": "8086:9bc5-20.0.8",
"os": "Ubuntu-18.04.6",
"pool": "chromium.tests.gpu"
}
],
"service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
},
"test": "angle_restricted_trace_gold_tests",
"test_id_prefix": "ninja://src/tests/restricted_traces:angle_restricted_trace_gold_tests/"
},
{
"args": [
"--test-machine-name",
@@ -2362,6 +2433,40 @@
},
"test_id_prefix": "ninja://src/tests:angle_perftests/"
},
{
"args": [
"--test-machine-name",
"${buildername}",
"--trace-interpreter=gz",
"--filter=fishdom:geometry_dash:merge_dragons:minecraft_bedrock:new_legend_of_the_condor_heroes:street_fighter_duel:teslagrad:vainglory",
"--git-revision=${got_angle_revision}"
],
"isolate_name": "angle_restricted_trace_gold_interpreted_tests",
"merge": {
"script": "//testing/merge_scripts/standard_isolated_script_merge.py"
},
"name": "angle_restricted_trace_gold_interpreted_tests",
"precommit_args": [
"--gerrit-issue=${patch_issue}",
"--gerrit-patchset=${patch_set}",
"--buildbucket-id=${buildbucket_build_id}",
"--use-permissive-pixel-comparison=${use_permissive_angle_pixel_comparison}"
],
"swarming": {
"can_use_on_swarming_builders": true,
"containment_type": "AUTO",
"dimension_sets": [
{
"gpu": "10de:2184-440.100",
"os": "Ubuntu-18.04.5|Ubuntu-18.04.6",
"pool": "chromium.tests.gpu"
}
],
"service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
},
"test": "angle_restricted_trace_gold_tests",
"test_id_prefix": "ninja://src/tests/restricted_traces:angle_restricted_trace_gold_tests/"
},
{
"args": [
"--test-machine-name",
@@ -4326,6 +4431,41 @@
},
"test_id_prefix": "ninja://src/tests:angle_perftests/"
},
{
"args": [
"--test-machine-name",
"${buildername}",
"--trace-interpreter=gz",
"--filter=fishdom:geometry_dash:merge_dragons:minecraft_bedrock:new_legend_of_the_condor_heroes:street_fighter_duel:teslagrad:vainglory",
"--git-revision=${got_angle_revision}"
],
"isolate_name": "angle_restricted_trace_gold_interpreted_tests",
"merge": {
"script": "//testing/merge_scripts/standard_isolated_script_merge.py"
},
"name": "angle_restricted_trace_gold_interpreted_tests",
"precommit_args": [
"--gerrit-issue=${patch_issue}",
"--gerrit-patchset=${patch_set}",
"--buildbucket-id=${buildbucket_build_id}",
"--use-permissive-pixel-comparison=${use_permissive_angle_pixel_comparison}"
],
"swarming": {
"can_use_on_swarming_builders": true,
"containment_type": "AUTO",
"dimension_sets": [
{
"display_attached": "1",
"gpu": "8086:9bc5-31.0.101.2111",
"os": "Windows-10",
"pool": "chromium.tests.gpu"
}
],
"service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
},
"test": "angle_restricted_trace_gold_tests",
"test_id_prefix": "ninja://src/tests/restricted_traces:angle_restricted_trace_gold_tests/"
},
{
"args": [
"--test-machine-name",
@@ -5240,6 +5380,41 @@
},
"test_id_prefix": "ninja://src/tests:angle_perftests/"
},
{
"args": [
"--test-machine-name",
"${buildername}",
"--trace-interpreter=gz",
"--filter=fishdom:geometry_dash:merge_dragons:minecraft_bedrock:new_legend_of_the_condor_heroes:street_fighter_duel:teslagrad:vainglory",
"--git-revision=${got_angle_revision}"
],
"isolate_name": "angle_restricted_trace_gold_interpreted_tests",
"merge": {
"script": "//testing/merge_scripts/standard_isolated_script_merge.py"
},
"name": "angle_restricted_trace_gold_interpreted_tests",
"precommit_args": [
"--gerrit-issue=${patch_issue}",
"--gerrit-patchset=${patch_set}",
"--buildbucket-id=${buildbucket_build_id}",
"--use-permissive-pixel-comparison=${use_permissive_angle_pixel_comparison}"
],
"swarming": {
"can_use_on_swarming_builders": true,
"containment_type": "AUTO",
"dimension_sets": [
{
"display_attached": "1",
"gpu": "10de:2184-27.21.14.5638",
"os": "Windows-10-18363",
"pool": "chromium.tests.gpu"
}
],
"service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
},
"test": "angle_restricted_trace_gold_tests",
"test_id_prefix": "ninja://src/tests/restricted_traces:angle_restricted_trace_gold_tests/"
},
{
"args": [
"--test-machine-name",

View File

@@ -736,6 +736,24 @@
},
},
'angle_restricted_trace_gold_interpreted_isolated_scripts': {
'angle_restricted_trace_gold_interpreted_tests': {
'android_args': [
'-v',
],
'args': [
'--test-machine-name',
'${buildername}',
'--trace-interpreter=gz',
'--filter=fishdom:geometry_dash:merge_dragons:minecraft_bedrock:new_legend_of_the_condor_heroes:street_fighter_duel:teslagrad:vainglory',
],
'mixins': [
'angle_skia_gold_test',
],
'test': 'angle_restricted_trace_gold_tests',
}
},
'angle_restricted_trace_gold_isolated_scripts': {
'angle_restricted_trace_gold_tests': {
'android_args': [
@@ -1170,6 +1188,7 @@
'common_isolated_scripts': [
'angle_perf_smoke_isolated_scripts',
'angle_restricted_trace_gold_isolated_scripts',
'angle_restricted_trace_gold_interpreted_isolated_scripts',
'angle_trace_interpreter_isolated_scripts',
'angle_trace_perf_native_smoke_isolated_scripts',
'angle_trace_perf_vulkan_smoke_isolated_scripts',

View File

@@ -1,6 +1,6 @@
{
"infra/specs/angle.json":
"2ed19f061846e1cb1de8487875516ef6",
"c72b4f277e0188c2e30130c6514428d7",
"infra/specs/generate_test_spec_json.py":
"b8dbb50c814b7fe05eb77cf6e376cee4",
"infra/specs/mixins.pyl":
@@ -8,7 +8,7 @@
"infra/specs/test_suite_exceptions.pyl":
"55886f8b6ae4122306ce42083c5126c7",
"infra/specs/test_suites.pyl":
"77d5ca23219e08c7aaa519e666fb5d79",
"05d9fcbb11fd192584d3c29b74af59cd",
"infra/specs/variants.pyl":
"8cfcaa99fa07ad2a2d5d14f220fd5037",
"infra/specs/waterfalls.pyl":

View File

@@ -18,7 +18,7 @@
"third_party/OpenGL-Registry/src/xml/wgl.xml":
"eae784bf4d1b983a42af5671b140b7c4",
"util/capture/trace_fixture.h":
"a53c68629f9a6873d34e6dd223dfb7a3",
"1e88581f8386f5f6228c0f0216ead2c7",
"util/capture/trace_interpreter_autogen.cpp":
"d89b2766ca28ffe273a72f5e9d22c46b"
}

17
scripts/tracegz.py Normal file
View File

@@ -0,0 +1,17 @@
import gzip
import json
import os
import sys
trace_dir = os.path.join('..', '..', 'src', 'tests', 'restricted_traces', sys.argv[1])
with open(os.path.join(trace_dir, sys.argv[1] + '.json'), 'rb') as f:
trace_json = json.loads(f.read())
# Concatenate trace cpp source into a single gz
with open('gen/tracegz_' + sys.argv[1] + '.gz', 'wb') as f:
with gzip.GzipFile(fileobj=f, mode='wb', compresslevel=9, mtime=0) as fgz:
for fn in trace_json['TraceFiles']:
if fn.endswith('.cpp'):
with open(os.path.join(trace_dir, fn), 'rb') as fcpp:
fgz.write(fcpp.read())

View File

@@ -47,7 +47,7 @@ bool gRunToKeyFrame = false;
bool gNoWarmup = false;
int gFixedTestTime = 0;
int gFixedTestTimeWithWarmup = 0;
bool gTraceInterpreter = false;
const char *gTraceInterpreter = nullptr;
const char *gPrintExtensionsToFile = nullptr;
const char *gRequestedExtensions = nullptr;
@@ -94,7 +94,7 @@ bool TraceTestArg(int *argc, char **argv, int argIndex)
ParseFlag("--offscreen", argc, argv, argIndex, &gOffscreen) ||
ParseFlag("--vsync", argc, argv, argIndex, &gVsync) ||
ParseFlag("--minimize-gpu-work", argc, argv, argIndex, &gMinimizeGPUWork) ||
ParseFlag("--trace-interpreter", argc, argv, argIndex, &gTraceInterpreter) ||
ParseCStringArg("--trace-interpreter", argc, argv, argIndex, &gTraceInterpreter) ||
ParseIntArg("--screenshot-frame", argc, argv, argIndex, &gScreenshotFrame) ||
ParseCStringArgWithHandling("--render-test-output-dir", argc, argv, argIndex,
&gRenderTestOutputDir, ArgHandling::Preserve) ||

View File

@@ -35,7 +35,7 @@ extern bool gNoFinish;
extern bool gRetraceMode;
extern bool gMinimizeGPUWork;
extern bool gTraceTestValidation;
extern bool gTraceInterpreter;
extern const char *gTraceInterpreter;
extern const char *gPerfCounters;
extern const char *gUseANGLE;
extern const char *gUseGL;

View File

@@ -1637,6 +1637,20 @@ void TracePerfTest::startTest()
ASSERT(mCurrentFrame == mStartFrame);
}
std::string FindTraceGzPath(const std::string &traceName)
{
std::stringstream pathStream;
char genDir[kMaxPath] = {};
if (!angle::FindTestDataPath("gen", genDir, kMaxPath))
{
return "";
}
pathStream << genDir << angle::GetPathSeparator() << "tracegz_" << traceName << ".gz";
return pathStream.str();
}
void TracePerfTest::initializeBenchmark()
{
const TraceInfo &traceInfo = mParams->traceInfo;
@@ -1651,6 +1665,16 @@ void TracePerfTest::initializeBenchmark()
if (gTraceInterpreter)
{
mTraceReplay.reset(new TraceLibrary("angle_trace_interpreter", traceInfo));
if (strcmp(gTraceInterpreter, "gz") == 0)
{
std::string traceGzPath = FindTraceGzPath(traceInfo.name);
if (traceGzPath.empty())
{
failTest("Could not find trace gz.");
return;
}
mTraceReplay->setTraceGzPath(traceGzPath);
}
}
else
{

View File

@@ -229,9 +229,9 @@ def PrepareRestrictedTraces(traces):
start = time.time()
total_size = 0
skipped = 0
for trace in traces:
path_from_root = 'src/tests/restricted_traces/' + trace + '/' + trace + '.angledata.gz'
local_path = '../../' + path_from_root
def _Push(local_path, path_from_root):
nonlocal total_size, skipped
device_path = '/sdcard/chromium_tests_root/' + path_from_root
if _CompareHashes(local_path, device_path):
skipped += 1
@@ -239,6 +239,13 @@ def PrepareRestrictedTraces(traces):
total_size += os.path.getsize(local_path)
_AdbRun(['push', local_path, device_path])
for trace in traces:
path_from_root = 'src/tests/restricted_traces/' + trace + '/' + trace + '.angledata.gz'
_Push('../../' + path_from_root, path_from_root)
tracegz = 'gen/tracegz_' + trace + '.gz'
_Push(tracegz, tracegz)
logging.info('Synced %d trace files (%.1fMB, %d files already ok) in %.1fs', len(traces),
total_size / 1e6, skipped,
time.time() - start)

View File

@@ -339,7 +339,7 @@ def interpret_traces(args, traces):
logging.debug('Using temporary path %s.' % out_path)
if upgrade_single_trace(args, trace_binary, trace, out_path, False, True):
if restore_single_trace(trace, out_path):
validate_args = ['--trace-interpreter']
validate_args = ['--trace-interpreter=c']
if args.verbose:
validate_args += ['--verbose-logging']
if validate_single_trace(args, trace_binary, trace, validate_args, {}):

View File

@@ -71,6 +71,7 @@ using FinishReplayFunc = void (*)();
using GetSerializedContextStateFunc = const char *(*)(uint32_t);
using SetValidateSerializedStateCallbackFunc = void (*)(ValidateSerializedStateCallback);
using SetTraceInfoFunc = void (*)(const std::vector<std::string> &);
using SetTraceGzPathFunc = void (*)(const std::string &);
struct TraceInfo;
@@ -115,6 +116,11 @@ class TraceLibrary : angle::NonCopyable
"SetValidateSerializedStateCallback", callback);
}
void setTraceGzPath(const std::string &traceGzPath)
{
callFunc<SetTraceGzPathFunc>("SetTraceGzPath", traceGzPath);
}
private:
template <typename FuncT, typename... ArgsT>
typename std::invoke_result<FuncT, ArgsT...>::type callFunc(const char *funcName, ArgsT... args)

View File

@@ -406,12 +406,18 @@ void SetValidateSerializedStateCallback(ValidateSerializedStateCallback callback
}
std::vector<std::string> gTraceFiles;
std::string gTraceGzPath;
void SetTraceInfo(const std::vector<std::string> &traceFiles)
{
gTraceFiles = traceFiles;
}
void SetTraceGzPath(const std::string &traceGzPath)
{
gTraceGzPath = traceGzPath;
}
void UpdateClientArrayPointer(int arrayIndex, const void *data, uint64_t size)
{
memcpy(gClientArrays[arrayIndex], data, static_cast<size_t>(size));

View File

@@ -44,6 +44,7 @@ extern ContextMap gContextMap;
extern std::string gBinaryDataDir;
extern std::vector<std::string> gTraceFiles;
extern std::string gTraceGzPath;
using DecompressCallback = uint8_t *(*)(const std::vector<uint8_t> &);
using DeleteCallback = void (*)(uint8_t *);
@@ -66,6 +67,7 @@ ANGLE_REPLAY_EXPORT void SetValidateSerializedStateCallback(
ANGLE_REPLAY_EXPORT const char *GetSerializedContextState(uint32_t frameIndex);
ANGLE_REPLAY_EXPORT void SetTraceInfo(const std::vector<std::string> &traceFiles);
ANGLE_REPLAY_EXPORT void SetTraceGzPath(const std::string &traceGzPath);
#endif // defined(__cplusplus)
// Exported trace functions.

View File

@@ -14,6 +14,9 @@
#include "common/string_utils.h"
#include "trace_fixture.h"
#define USE_SYSTEM_ZLIB
#include "compression_utils_portable.h"
namespace angle
{
namespace
@@ -517,6 +520,8 @@ class TraceInterpreter : angle::NonCopyable
private:
void runTraceFunction(const char *name) const;
void parseTraceUncompressed();
void parseTraceGz();
TraceFunctionMap mTraceFunctions;
TraceStringMap mTraceStrings;
@@ -530,7 +535,7 @@ void TraceInterpreter::replayFrame(uint32_t frameIndex)
runTraceFunction(funcName);
}
void TraceInterpreter::setupReplay()
void TraceInterpreter::parseTraceUncompressed()
{
for (const std::string &file : gTraceFiles)
{
@@ -560,6 +565,58 @@ void TraceInterpreter::setupReplay()
Parser parser(fileData, mTraceFunctions, mTraceStrings, mVerboseLogging);
parser.parse();
}
}
void TraceInterpreter::parseTraceGz()
{
if (mVerboseLogging)
{
printf("Parsing functions from %s\n", gTraceGzPath.c_str());
}
FILE *fp = fopen(gTraceGzPath.c_str(), "rb");
if (fp == 0)
{
printf("Error loading trace (gz) from: %s\n", gTraceGzPath.c_str());
exit(1);
}
fseek(fp, 0, SEEK_END);
long size = ftell(fp);
fseek(fp, 0, SEEK_SET);
std::vector<uint8_t> compressedData(size);
(void)fread(compressedData.data(), 1, size, fp);
uint32_t uncompressedSize =
zlib_internal::GetGzipUncompressedSize(compressedData.data(), compressedData.size());
std::string uncompressedData(uncompressedSize, 0);
uLong destLen = uncompressedSize;
int zResult = zlib_internal::GzipUncompressHelper((uint8_t *)uncompressedData.data(), &destLen,
compressedData.data(),
static_cast<uLong>(compressedData.size()));
if (zResult != Z_OK)
{
printf("Failure to decompress gz trace: %s\n", gTraceGzPath.c_str());
exit(1);
}
Parser parser(uncompressedData, mTraceFunctions, mTraceStrings, mVerboseLogging);
parser.parse();
}
void TraceInterpreter::setupReplay()
{
if (!gTraceGzPath.empty())
{
parseTraceGz();
}
else
{
parseTraceUncompressed();
}
if (mTraceFunctions.count("SetupReplay") == 0)
{