aboutsummaryrefslogtreecommitdiffstats
path: root/.gitlab-ci/tracie
diff options
context:
space:
mode:
authorAndres Gomez <[email protected]>2020-02-12 23:21:07 +0200
committerAndres Gomez <[email protected]>2020-03-04 15:24:03 +0200
commit5c65f8b377a6485e6c155dad98cb8af49d594418 (patch)
tree6dee7cf1a9c5bc35a6823cbd7b80c9bc283c97ff /.gitlab-ci/tracie
parent1d75595da4a72c2ca0eb2b9b88db09a05a873e67 (diff)
gitlab-ci: Add gfxreconstruct traces support
Signed-off-by: Andres Gomez <[email protected]> Reviewed-by: Samuel Pitoiset <[email protected]> Reviewed-by: Alexandros Frantzis <[email protected]>
Diffstat (limited to '.gitlab-ci/tracie')
-rw-r--r--.gitlab-ci/tracie/dump_trace_images.py51
-rw-r--r--.gitlab-ci/tracie/traceutil.py3
2 files changed, 50 insertions, 4 deletions
diff --git a/.gitlab-ci/tracie/dump_trace_images.py b/.gitlab-ci/tracie/dump_trace_images.py
index 66a99f7efe2..6a3ed6b18e6 100644
--- a/.gitlab-ci/tracie/dump_trace_images.py
+++ b/.gitlab-ci/tracie/dump_trace_images.py
@@ -1,6 +1,7 @@
#!/usr/bin/python3
# Copyright (c) 2019 Collabora Ltd
+# Copyright © 2019 Valve Corporation.
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
@@ -35,8 +36,8 @@ def log(severity, msg, end='\n'):
def log_result(msg):
print(msg, flush=True)
-def run_logged_command(cmd, log_path):
- ret = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+def run_logged_command(cmd, env, log_path):
+ ret = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, env=env)
logoutput = ("[dump_trace_images] Running: %s\n" % " ".join(cmd)).encode() + \
ret.stdout
log_path.parent.mkdir(parents=True, exist_ok=True)
@@ -56,6 +57,20 @@ def get_last_apitrace_frame_call(trace_path):
return int(s[0])
return -1
+def get_last_gfxreconstruct_frame_call(trace_path):
+ # FIXME: It would be great to have another way to get the amount of
+ # traces which wouldn't imply replaying the whole trace:
+ # https://github.com/LunarG/gfxreconstruct/issues/329
+ cmd = ["gfxrecon-replay", str(trace_path)]
+ ret = subprocess.run(cmd, stdout=subprocess.PIPE)
+ for l in reversed(ret.stdout.decode(errors='replace').splitlines()):
+ s = l.split(", ", 2)
+ if len(s) >= 3:
+ c = s[2].split(None, 1)
+ if len(c) >= 1 and c[0].isnumeric():
+ return int(c[0])
+ return -1
+
def dump_with_apitrace(trace_path, calls, device_name):
outputdir = str(trace_path.parent / "test" / device_name)
os.makedirs(outputdir, exist_ok=True)
@@ -65,7 +80,7 @@ def dump_with_apitrace(trace_path, calls, device_name):
cmd = ["apitrace", "dump-images", "--calls=" + ','.join(calls),
"-o", outputprefix, str(trace_path)]
log_path = Path(outputdir) / (trace_path.name + ".log")
- run_logged_command(cmd, log_path)
+ run_logged_command(cmd, None, log_path)
def dump_with_renderdoc(trace_path, calls, device_name):
outputdir = str(trace_path.parent / "test" / device_name)
@@ -73,7 +88,33 @@ def dump_with_renderdoc(trace_path, calls, device_name):
cmd = [str(script_path / "renderdoc_dump_images.py"), str(trace_path), outputdir]
cmd.extend(calls)
log_path = Path(outputdir) / (trace_path.name + ".log")
- run_logged_command(cmd, log_path)
+ run_logged_command(cmd, None, log_path)
+
+def dump_with_gfxreconstruct(trace_path, calls, device_name):
+ from PIL import Image
+ outputdir_path = trace_path.parent / "test" / device_name
+ outputdir_path.mkdir(parents=True, exist_ok=True)
+ outputprefix = str(outputdir_path / trace_path.name) + "-"
+ if len(calls) == 0:
+ # FIXME: The VK_LAYER_LUNARG_screenshot numbers the calls from
+ # 0 to (total-num-calls - 1) while gfxreconstruct does it from
+ # 1 to total-num-calls:
+ # https://github.com/LunarG/gfxreconstruct/issues/284
+ calls = [str(get_last_gfxreconstruct_frame_call(trace_path) - 1)]
+ cmd = ["gfxrecon-replay", str(trace_path)]
+ log_path = outputdir_path / (trace_path.name + ".log")
+ env = os.environ.copy()
+ env["VK_INSTANCE_LAYERS"] = "VK_LAYER_LUNARG_screenshot"
+ env["VK_SCREENSHOT_FRAMES"] = ",".join(calls)
+ env["VK_SCREENSHOT_DIR"] = str(outputdir_path)
+ run_logged_command(cmd, env, log_path)
+ for c in calls:
+ ppm = str(outputdir_path / c) + ".ppm"
+ outputfile = outputprefix + c + ".png"
+ with log_path.open(mode='w') as log:
+ log.write("Writing: %s to %s" % (ppm, outputfile))
+ Image.open(ppm).save(outputfile)
+ os.remove(ppm)
def dump_with_testtrace(trace_path, calls, device_name):
from PIL import Image
@@ -99,6 +140,8 @@ def dump_from_trace(trace_path, calls, device_name):
dump_with_apitrace(trace_path, calls, device_name)
elif trace_type == TraceType.RENDERDOC:
dump_with_renderdoc(trace_path, calls, device_name)
+ elif trace_type == TraceType.GFXRECONSTRUCT:
+ dump_with_gfxreconstruct(trace_path, calls, device_name)
elif trace_type == TraceType.TESTTRACE:
dump_with_testtrace(trace_path, calls, device_name)
else:
diff --git a/.gitlab-ci/tracie/traceutil.py b/.gitlab-ci/tracie/traceutil.py
index 1b4de23ba5d..d383e41df30 100644
--- a/.gitlab-ci/tracie/traceutil.py
+++ b/.gitlab-ci/tracie/traceutil.py
@@ -1,4 +1,5 @@
# Copyright (c) 2019 Collabora Ltd
+# Copyright © 2019 Valve Corporation.
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
@@ -28,11 +29,13 @@ class TraceType(Enum):
UNKNOWN = auto()
APITRACE = auto()
RENDERDOC = auto()
+ GFXRECONSTRUCT = auto()
TESTTRACE = auto()
_trace_type_info_map = {
TraceType.APITRACE : ("apitrace", ".trace"),
TraceType.RENDERDOC : ("renderdoc", ".rdc"),
+ TraceType.GFXRECONSTRUCT : ("gfxreconstruct", ".gfxr"),
TraceType.TESTTRACE : ("testtrace", ".testtrace")
}