From 91f124e2f1f81c41f7aefaf3bde9dbcbd802e77f Mon Sep 17 00:00:00 2001 From: rdb Date: Tue, 21 Jan 2025 12:16:09 +0100 Subject: [PATCH] display: Allow setting a custom clock for a GraphicsEngine This is essential for supporting multiple engines, otherwise both engines will try to tick the global clock in render_frame() --- panda/src/display/graphicsEngine.cxx | 11 +++++------ panda/src/display/graphicsEngine.h | 5 ++++- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/panda/src/display/graphicsEngine.cxx b/panda/src/display/graphicsEngine.cxx index 3bf1b145e0..552be9c60a 100644 --- a/panda/src/display/graphicsEngine.cxx +++ b/panda/src/display/graphicsEngine.cxx @@ -152,8 +152,9 @@ INLINE static bool operator < (const CullKey &a, const CullKey &b) { * any Pipeline you choose. */ GraphicsEngine:: -GraphicsEngine(Pipeline *pipeline) : +GraphicsEngine(ClockObject *clock, Pipeline *pipeline) : _pipeline(pipeline), + _clock(clock), _app("app"), _lock("GraphicsEngine::_lock"), _loaded_textures_lock("GraphicsEngine::_loaded_textures_lock") @@ -729,11 +730,9 @@ render_frame() { // been rendered). open_windows(); - ClockObject *global_clock = ClockObject::get_global_clock(); - if (display_cat.is_spam()) { display_cat.spam() - << "render_frame() - frame " << global_clock->get_frame_count() << "\n"; + << "render_frame() - frame " << _clock->get_frame_count() << "\n"; } { @@ -846,8 +845,8 @@ render_frame() { } #endif // THREADED_PIPELINE - global_clock->tick(current_thread); - if (global_clock->check_errors(current_thread)) { + _clock->tick(current_thread); + if (_clock->check_errors(current_thread)) { throw_event("clock_error"); } diff --git a/panda/src/display/graphicsEngine.h b/panda/src/display/graphicsEngine.h index f0ebeb5a66..d33c245c7f 100644 --- a/panda/src/display/graphicsEngine.h +++ b/panda/src/display/graphicsEngine.h @@ -33,6 +33,7 @@ #include "loader.h" #include "referenceCount.h" #include "renderState.h" +#include "clockObject.h" class Pipeline; class DisplayRegion; @@ -53,7 +54,8 @@ class Texture; */ class EXPCL_PANDA_DISPLAY GraphicsEngine : public ReferenceCount { PUBLISHED: - explicit GraphicsEngine(Pipeline *pipeline = nullptr); + explicit GraphicsEngine(ClockObject *clock = ClockObject::get_global_clock(), + Pipeline *pipeline = nullptr); BLOCKING ~GraphicsEngine(); void set_threading_model(const GraphicsThreadingModel &threading_model); @@ -320,6 +322,7 @@ private: WindowRenderer *get_window_renderer(const std::string &name, int pipeline_stage); Pipeline *_pipeline; + ClockObject *const _clock; Windows _windows; bool _windows_sorted;