mirror of
https://github.com/godotengine/godot-angle-static.git
synced 2026-01-06 02:09:55 +03:00
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:
committed by
Angle LUCI CQ
parent
82f1cee01a
commit
4e07335654
@@ -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
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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":
|
||||
|
||||
@@ -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
17
scripts/tracegz.py
Normal 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())
|
||||
@@ -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) ||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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, {}):
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user