This PR enabled backend specific rendertest for EEVEE and Workbench. Some changes that have been made are: - Add suffix to the test identifying the backend (_opengl, _vulkan, _metal) - Vulkan render tests are compared with the opengl results. Most EEVEE tests run as expected there are some issues in the Vulkan backend that needs to be addressed: - Fully smooth reflective materials miss lighting. - Tangent normals are off None of the workbench tests pass. It has to do with downloading the depth buffer. In Workbench they are stored as GPU_DEPTH32F_STENCIL8 and downloaded as FLOAT. We didn't implement it in the vulkan backend yet and currently asserts. The Vulkan render test run faster compared to OpenGL. On my system around 25-50% faster. Pull Request: https://projects.blender.org/blender/blender/pulls/126784
118 lines
3.3 KiB
Python
118 lines
3.3 KiB
Python
#!/usr/bin/env python3
|
|
# SPDX-FileCopyrightText: 2015-2022 Blender Authors
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
import argparse
|
|
import os
|
|
import platform
|
|
import sys
|
|
from pathlib import Path
|
|
try:
|
|
# Render report is not always available and leads to errors in the console logs that can be ignored.
|
|
from modules import render_report
|
|
|
|
class WorkbenchReport(render_report.Report):
|
|
def __init__(self, title, output_dir, oiiotool, device=None, blocklist=[]):
|
|
super().__init__(title, output_dir, oiiotool, device=device, blocklist=blocklist)
|
|
self.gpu_backend = device
|
|
|
|
def _get_render_arguments(self, arguments_cb, filepath, base_output_filepath):
|
|
return arguments_cb(filepath, base_output_filepath, gpu_backend=self.device)
|
|
|
|
except ImportError:
|
|
# render_report can only be loaded when running the render tests. It errors when
|
|
# this script is run during preparation steps.
|
|
pass
|
|
|
|
|
|
def setup():
|
|
import bpy
|
|
|
|
for scene in bpy.data.scenes:
|
|
scene.render.engine = 'BLENDER_WORKBENCH'
|
|
scene.display.shading.light = 'STUDIO'
|
|
scene.display.shading.color_type = 'TEXTURE'
|
|
|
|
|
|
# When run from inside Blender, render and exit.
|
|
try:
|
|
import bpy
|
|
inside_blender = True
|
|
except ImportError:
|
|
inside_blender = False
|
|
|
|
if inside_blender:
|
|
try:
|
|
setup()
|
|
except Exception as e:
|
|
print(e)
|
|
sys.exit(1)
|
|
|
|
|
|
def get_arguments(filepath, output_filepath, gpu_backend):
|
|
arguments = [
|
|
"--background",
|
|
"--factory-startup",
|
|
"--enable-autoexec",
|
|
"--debug-memory",
|
|
"--debug-exit-on-error"]
|
|
|
|
if gpu_backend:
|
|
arguments.extend(["--gpu-backend", gpu_backend])
|
|
|
|
arguments.extend([
|
|
filepath,
|
|
"-E", "BLENDER_WORKBENCH",
|
|
"-P",
|
|
os.path.realpath(__file__),
|
|
"-o", output_filepath,
|
|
"-F", "PNG",
|
|
"-f", "1"])
|
|
|
|
return arguments
|
|
|
|
|
|
def create_argparse():
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument("-blender", nargs="+")
|
|
parser.add_argument("-testdir", nargs=1)
|
|
parser.add_argument("-outdir", nargs=1)
|
|
parser.add_argument("-oiiotool", nargs=1)
|
|
parser.add_argument('--batch', default=False, action='store_true')
|
|
parser.add_argument('--fail-silently', default=False, action='store_true')
|
|
parser.add_argument('--gpu-backend', nargs=1)
|
|
return parser
|
|
|
|
|
|
def main():
|
|
parser = create_argparse()
|
|
args = parser.parse_args()
|
|
|
|
blender = args.blender[0]
|
|
test_dir = args.testdir[0]
|
|
oiiotool = args.oiiotool[0]
|
|
output_dir = args.outdir[0]
|
|
gpu_backend = args.gpu_backend[0]
|
|
|
|
from modules import render_report
|
|
report = WorkbenchReport("Workbench", output_dir, oiiotool, device=gpu_backend)
|
|
if gpu_backend == "vulkan":
|
|
report.set_compare_engine('workbench', 'opengl')
|
|
else:
|
|
report.set_compare_engine('eevee_next', 'opengl')
|
|
report.set_pixelated(True)
|
|
report.set_reference_dir("workbench_renders")
|
|
|
|
test_dir_name = Path(test_dir).name
|
|
if test_dir_name.startswith('hair') and platform.system() == "Darwin":
|
|
report.set_fail_threshold(0.050)
|
|
|
|
ok = report.run(test_dir, blender, get_arguments, batch=args.batch, fail_silently=args.fail_silently)
|
|
|
|
sys.exit(not ok)
|
|
|
|
|
|
if not inside_blender and __name__ == "__main__":
|
|
main()
|