Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeroen Bakker <jeroen@blender.org>2022-06-27 13:27:30 +0300
committerJeroen Bakker <jeroen@blender.org>2022-06-27 13:27:30 +0300
commit4397a7806a8f495f22b50a9d0ade9551bb5b619e (patch)
tree7471e2482868354278e96da7247491c32b0574a2
parentb56eb338961d38817706941a2a82034f5dc88224 (diff)
Add eevee playback performance to benchmark.
-rw-r--r--source/blender/makesrna/intern/rna_wm.c1
-rw-r--r--tests/performance/tests/eevee.py132
2 files changed, 102 insertions, 31 deletions
diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c
index 3ff9e6be3ce..aea5900280d 100644
--- a/source/blender/makesrna/intern/rna_wm.c
+++ b/source/blender/makesrna/intern/rna_wm.c
@@ -138,6 +138,7 @@ const EnumPropertyItem rna_enum_wm_job_type_items[] = {
{WM_JOB_TYPE_RENDER_PREVIEW, "RENDER_PREVIEW", 0, "Rendering previews", ""},
{WM_JOB_TYPE_OBJECT_BAKE, "OBJECT_BAKE", 0, "Object Baking", ""},
{WM_JOB_TYPE_COMPOSITE, "COMPOSITE", 0, "Compositing", ""},
+ {WM_JOB_TYPE_SHADER_COMPILATION, "SHADER_COMPILATION", 0, "Shader compilation", ""},
{0, NULL, 0, NULL, NULL},
};
diff --git a/tests/performance/tests/eevee.py b/tests/performance/tests/eevee.py
index 4081510fe29..569afd9a7c6 100644
--- a/tests/performance/tests/eevee.py
+++ b/tests/performance/tests/eevee.py
@@ -1,48 +1,118 @@
# SPDX-License-Identifier: Apache-2.0
-import api
import os
+import enum
+import time
-def _run(args):
- import bpy
- import time
+class RecordStage(enum.Enum):
+ INIT = 0,
+ WAIT_SHADERS = 1,
+ WARMUP = 2,
+ RECORD = 3,
+ FINISHED = 4
- start_time = time.time()
- elapsed_time = 0.0
- num_frames = 0
- while elapsed_time < 10.0:
- scene = bpy.context.scene
- for i in range(scene.frame_start, scene.frame_end + 1):
- print(i)
- scene.frame_set(i)
+WARMUP_SECONDS = 3
+WARMUP_FRAMES = 10
+SHADER_FALLBACK_SECONDS = 60
+RECORD_SECONDS = 10
+LOG_KEY = "ANIMATION_PERFORMANCE: "
- num_frames += scene.frame_end + 1 - scene.frame_start
- elapsed_time = time.time() - start_time
- time_per_frame = elapsed_time / num_frames
+def _run(args):
+ import bpy
- result = {'time': time_per_frame}
- bpy.ops.wm.quit_blender()
+ global record_stage
+ record_stage = RecordStage.INIT
+ bpy.app.handlers.frame_change_post.append(frame_change_handler)
+ bpy.ops.screen.animation_play()
-class EeveeTest(api.Test):
- def __init__(self, filepath):
- self.filepath = filepath
+
+def frame_change_handler(scene):
+ import bpy
+
+ global record_stage
+ global start_time
+ global start_record_time
+ global start_warmup_time
+ global num_frames
+ global stop_record_time
+
+ if record_stage == RecordStage.INIT:
+ screen = bpy.context.window_manager.windows[0].screen
+ for area in screen.areas:
+ if area.type == 'VIEW_3D':
+ space = area.spaces[0]
+ space.shading.type = 'RENDERED'
+ space.overlay.show_overlays = False
+
+ start_time = time.perf_counter()
+ record_stage = RecordStage.WAIT_SHADERS
+
+ elif record_stage == RecordStage.WAIT_SHADERS:
+ shaders_compiled = False
+ if hasattr(bpy.app, 'is_job_running'):
+ shaders_compiled = not bpy.app.is_job_running("SHADER_COMPILATION")
+ else:
+ # Fallback when is_job_running doesn't exists by waiting for a time.
+ shaders_compiled = time.perf_counter() - start_time > SHADER_FALLBACK_SECONDS
+
+ if shaders_compiled:
+ start_warmup_time = time.perf_counter()
+ num_frames = 0
+ record_stage = RecordStage.WARMUP
+
+ elif record_stage == RecordStage.WARMUP:
+ num_frames += 1
+ if time.perf_counter() - start_warmup_time > WARMUP_SECONDS and num_frames > WARMUP_FRAMES:
+ start_record_time = time.perf_counter()
+ num_frames = 0
+ record_stage = RecordStage.RECORD
+
+ elif record_stage == RecordStage.RECORD:
+ current_time = time.perf_counter()
+ num_frames += 1
+ if current_time - start_record_time > RECORD_SECONDS:
+ stop_record_time = current_time
+ record_stage = RecordStage.FINISHED
- def name(self):
- return self.filepath.stem
+ elif record_stage == RecordStage.FINISHED:
+ bpy.ops.screen.animation_cancel()
+ elapse_seconds = stop_record_time - start_record_time
+ avg_frame_time = elapse_seconds / num_frames
+ fps = 1.0 / avg_frame_time
+ print(f"{LOG_KEY}{{'time': {avg_frame_time}, 'fps': {fps} }}")
+ bpy.app.handlers.frame_change_post.remove(frame_change_handler)
+ bpy.ops.wm.quit_blender()
+
- def category(self):
- return "eevee"
+if __name__ == '__main__':
+ _run(None)
+
+else:
+ import api
+ class EeveeTest(api.Test):
+ def __init__(self, filepath):
+ self.filepath = filepath
- def run(self, env, device_id):
- args = {}
- _, log = env.run_in_blender(_run, args, [self.filepath], foreground=True)
- return {'time':1.0}
+ def name(self):
+ return self.filepath.stem
+ def category(self):
+ return "eevee"
-def generate(env):
- filepaths = env.find_blend_files('eevee/*')
- return [EeveeTest(filepath) for filepath in filepaths]
+ def run(self, env, device_id):
+ args = {}
+ _, log = env.run_in_blender(_run, args, [self.filepath], foreground=True)
+ for line in log:
+ if line.startswith(LOG_KEY):
+ result_str = line[len(LOG_KEY):]
+ result = eval(result_str)
+ return result
+ return {'time': 'UNKNOWN'}
+
+ def generate(env):
+ filepaths = env.find_blend_files('eevee/*')
+ return [EeveeTest(filepath) for filepath in filepaths] \ No newline at end of file