diff options
author | Jeroen Bakker <jbakker> | 2022-08-01 11:57:18 +0300 |
---|---|---|
committer | Jeroen Bakker <jeroen@blender.org> | 2022-08-01 11:57:32 +0300 |
commit | 3393b7137e247383477eb38d938239fbb9221680 (patch) | |
tree | ce0ae31d19aee50eb03dabd6467cb9ccbe64455a /tests | |
parent | 6749a4a8f02900db9f2ecae79820d9b418694706 (diff) |
RenderReport: Add option to add platform specific overrides.
Reference images in the reference_override_dir will be chosen before
images in reference_dir. This allows platform specific reference
images, with a common base.
Ignored when set to None. The caller is responsible
of setting the reference override dir as the unit test is more aware
what the definition of a platform is.
Patch adds `gpu.platform.device_type_get` function to get the device
type that blender has detected.
Reviewed By: brecht
Maniphest Tasks: T99046
Differential Revision: https://developer.blender.org/D15265
Diffstat (limited to 'tests')
-rw-r--r-- | tests/python/eevee_render_tests.py | 27 | ||||
-rw-r--r-- | tests/python/gpu_info.py | 24 | ||||
-rwxr-xr-x | tests/python/modules/render_report.py | 17 |
3 files changed, 65 insertions, 3 deletions
diff --git a/tests/python/eevee_render_tests.py b/tests/python/eevee_render_tests.py index 68895291044..34c15872a11 100644 --- a/tests/python/eevee_render_tests.py +++ b/tests/python/eevee_render_tests.py @@ -3,6 +3,7 @@ import argparse import os +import pathlib import shlex import shutil import subprocess @@ -98,6 +99,26 @@ if inside_blender: print(e) sys.exit(1) +def get_gpu_device_type(blender): + command = [ + blender, + "-noaudio", + "--background" + "--factory-startup", + "--python", + str(pathlib.Path(__file__).parent / "gpu_info.py") + ] + try: + completed_process = subprocess.run(command, stdout=subprocess.PIPE) + for line in completed_process.stdout.read_text(): + if line.startswith("GPU_DEVICE_TYPE:"): + vendor = line.split(':')[1] + return vendor + except BaseException as e: + return None + return None + + def get_arguments(filepath, output_filepath): return [ @@ -134,10 +155,16 @@ def main(): idiff = args.idiff[0] output_dir = args.outdir[0] + gpu_device_type = get_gpu_device_type(blender) + reference_override_dir = None + if gpu_device_type == "AMD": + reference_override_dir = "eevee_renders/amd" + from modules import render_report report = render_report.Report("Eevee", output_dir, idiff) report.set_pixelated(True) report.set_reference_dir("eevee_renders") + report.set_reference_override_dir(reference_override_dir) report.set_compare_engine('cycles', 'CPU') test_dir_name = Path(test_dir).name diff --git a/tests/python/gpu_info.py b/tests/python/gpu_info.py new file mode 100644 index 00000000000..1df23d68000 --- /dev/null +++ b/tests/python/gpu_info.py @@ -0,0 +1,24 @@ +""" + Prints GPU backend information to the console and exits. + + Use this script as `blender --background --python gpu_info.py`. +""" +import bpy +import gpu +import sys + +# Render with workbench to initialize the GPU backend otherwise it would fail when running in +# background mode as the GPU backend won't be initialized. +scene = bpy.context.scene +scene.render.resolution_x = 1 +scene.render.resolution_y = 1 +scene.render.engine = "BLENDER_WORKBENCH" +bpy.ops.render.render(animation=False, write_still=False) + + +print('GPU_VENDOR:' + gpu.platform.vendor_get()) +print('GPU_RENDERER:' + gpu.platform.renderer_get()) +print('GPU_VERSION:' + gpu.platform.version_get()) +print('GPU_DEVICE_TYPE:' + gpu.platform.device_type_get()) + +sys.exit(0)
\ No newline at end of file diff --git a/tests/python/modules/render_report.py b/tests/python/modules/render_report.py index 15441918800..52f388586d8 100755 --- a/tests/python/modules/render_report.py +++ b/tests/python/modules/render_report.py @@ -78,12 +78,18 @@ def test_get_name(filepath): return os.path.splitext(filename)[0] -def test_get_images(output_dir, filepath, reference_dir): +def test_get_images(output_dir, filepath, reference_dir, reference_override_dir): testname = test_get_name(filepath) dirpath = os.path.dirname(filepath) old_dirpath = os.path.join(dirpath, reference_dir) old_img = os.path.join(old_dirpath, testname + ".png") + if reference_override_dir: + override_dirpath = os.path.join(dirpath, reference_override_dir) + override_img = os.path.join(override_dirpath, testname + ".png") + if os.path.exists(override_img): + old_dirpath = override_dirpath + old_img = override_img ref_dirpath = os.path.join(output_dir, os.path.basename(dirpath), "ref") ref_img = os.path.join(ref_dirpath, testname + ".png") @@ -108,6 +114,7 @@ class Report: 'output_dir', 'global_dir', 'reference_dir', + 'reference_override_dir', 'idiff', 'pixelated', 'fail_threshold', @@ -127,6 +134,7 @@ class Report: self.output_dir = output_dir self.global_dir = os.path.dirname(output_dir) self.reference_dir = 'reference_renders' + self.reference_override_dir = None self.idiff = idiff self.compare_engine = None self.fail_threshold = 0.016 @@ -161,6 +169,9 @@ class Report: def set_reference_dir(self, reference_dir): self.reference_dir = reference_dir + def set_reference_override_dir(self, reference_override_dir): + self.reference_override_dir = reference_override_dir + def set_compare_engine(self, other_engine, other_device=None): self.compare_engine = (other_engine, other_device) @@ -343,7 +354,7 @@ class Report: name = test_get_name(filepath) name = name.replace('_', ' ') - old_img, ref_img, new_img, diff_img = test_get_images(self.output_dir, filepath, self.reference_dir) + old_img, ref_img, new_img, diff_img = test_get_images(self.output_dir, filepath, self.reference_dir, self.reference_override_dir) status = error if error else "" tr_style = """ class="table-danger" """ if error else "" @@ -390,7 +401,7 @@ class Report: self.compare_tests += test_html def _diff_output(self, filepath, tmp_filepath): - old_img, ref_img, new_img, diff_img = test_get_images(self.output_dir, filepath, self.reference_dir) + old_img, ref_img, new_img, diff_img = test_get_images(self.output_dir, filepath, self.reference_dir, self.reference_override_dir) # Create reference render directory. old_dirpath = os.path.dirname(old_img) |