diff --git a/src/experimental/filament/compat/mjr_filament_renderer.cc b/src/experimental/filament/compat/mjr_filament_renderer.cc index d43153d8..f01d3f5a 100644 --- a/src/experimental/filament/compat/mjr_filament_renderer.cc +++ b/src/experimental/filament/compat/mjr_filament_renderer.cc @@ -181,6 +181,13 @@ uintptr_t MjrFilamentRenderer::UploadGuiImage(uintptr_t tex_id, return imgui_bridge_->UploadImage(tex_id, pixels, width, height, bpp); } +double MjrFilamentRenderer::GetFrameRate() const { + mjrFrameStats stats; + mjr_defaultFrameStats(&stats); + filament_context_->GetFrameStats(0, &stats); + return stats.frame_rate; +} + void MjrFilamentRenderer::UpdateGui() { mjrf_DEBUG_drawImguiEditor(scene_bridge_->GetScene()); } diff --git a/src/experimental/filament/compat/mjr_filament_renderer.h b/src/experimental/filament/compat/mjr_filament_renderer.h index f1f2f69d..d986a16d 100644 --- a/src/experimental/filament/compat/mjr_filament_renderer.h +++ b/src/experimental/filament/compat/mjr_filament_renderer.h @@ -65,9 +65,7 @@ class MjrFilamentRenderer { // Renders an ImGui window containing Filament-specific editor UI. void UpdateGui(); - double GetFrameRate() const { - return filament_context_->GetFrameRate(); - } + double GetFrameRate() const; MjrFilamentRenderer(const MjrFilamentRenderer&) = delete; MjrFilamentRenderer& operator=(const MjrFilamentRenderer&) = delete; diff --git a/src/experimental/filament/filament/filament_context.cc b/src/experimental/filament/filament/filament_context.cc index 3166bea8..e55db060 100644 --- a/src/experimental/filament/filament/filament_context.cc +++ b/src/experimental/filament/filament/filament_context.cc @@ -183,14 +183,16 @@ void FilamentContext::SetClearColor(const filament::math::float4& color) { renderer_->setClearOptions(opts); } -double FilamentContext::GetFrameRate() const { +void FilamentContext::GetFrameStats(mjrFrameHandle frame, + mjrFrameStats* stats_out) const { utils::FixedCapacityVector frame_info = renderer_->getFrameInfoHistory(1); - if (frame_info.empty()) { - return 0; + if (!frame_info.empty()) { + const int64_t ns = frame_info[0].denoisedGpuFrameDuration; + stats_out->frame_rate = 1.0e9 / static_cast(ns); + } else { + stats_out->frame_rate = 0.0; } - const int64_t ns = frame_info[0].denoisedGpuFrameDuration; - return 1.0e9 / static_cast(ns); } } // namespace mujoco diff --git a/src/experimental/filament/filament/filament_context.h b/src/experimental/filament/filament/filament_context.h index 732229e0..db817395 100644 --- a/src/experimental/filament/filament/filament_context.h +++ b/src/experimental/filament/filament/filament_context.h @@ -52,8 +52,8 @@ class FilamentContext : public mjrfContext { // Sets the clear color for the renderer. void SetClearColor(const filament::math::float4& color); - // Returns the current frame rate of the renderer. - double GetFrameRate() const; + // Returns information about the frame. + void GetFrameStats(mjrFrameHandle frame, mjrFrameStats* stats_out) const; filament::Engine* GetEngine() const { return engine_; } diff --git a/src/experimental/filament/render_context_filament.cc b/src/experimental/filament/render_context_filament.cc index 938f4d19..eeecf054 100644 --- a/src/experimental/filament/render_context_filament.cc +++ b/src/experimental/filament/render_context_filament.cc @@ -145,6 +145,10 @@ void mjr_defaultReadPixelsRequest(mjrReadPixelsRequest* request) { memset(request, 0, sizeof(mjrReadPixelsRequest)); } +void mjr_defaultFrameStats(mjrFrameStats* stats) { + memset(stats, 0, sizeof(mjrFrameStats)); +} + mjrfContext* mjrf_createContext(const mjrFilamentConfig* config) { return new mujoco::FilamentContext(config); } @@ -355,6 +359,11 @@ void mjrf_waitForFrame(mjrfContext* ctx, mjrFrameHandle frame) { mujoco::FilamentContext::downcast(ctx)->WaitForFrame(frame); } +void mjrf_getFrameStats(mjrfContext* ctx, mjrFrameHandle frame, + mjrFrameStats* stats_out) { + mujoco::FilamentContext::downcast(ctx)->GetFrameStats(frame, stats_out); +} + // Legacy API, to be deprecated. void mjrf_makeFilamentContext(const mjModel* m, mjrContext* con, diff --git a/src/experimental/filament/render_context_filament.h b/src/experimental/filament/render_context_filament.h index 29c403de..5cd7faf2 100644 --- a/src/experimental/filament/render_context_filament.h +++ b/src/experimental/filament/render_context_filament.h @@ -406,6 +406,15 @@ struct mjrReadPixelsRequest { // Initializes the mjrReadPixelsRequest to default values. void mjr_defaultReadPixelsRequest(mjrReadPixelsRequest* request); +// Information about a single frame of rendering. +struct mjrFrameStats { + // The frame rate of the renderer, in frames per second. + double frame_rate; +}; + +// Initializes the mjrFrameStats to default values. +void mjr_defaultFrameStats(mjrFrameStats* stats); + // Configuration parameters for the filament rendering context. struct mjrFilamentConfig { // The native window handle into which we can render directly. @@ -562,6 +571,10 @@ mjrFrameHandle mjrf_render(mjrfContext* ctx, const mjrRenderRequest* req, // Waits for the rendering to complete for the given frame handle. void mjrf_waitForFrame(mjrfContext* ctx, mjrFrameHandle frame); +// Returns the stats for the given frame but updating the given `stats_out`. +void mjrf_getFrameStats(mjrfContext* ctx, mjrFrameHandle frame, + mjrFrameStats* stats_out); + // Draws an ImGui editor for the given scene, exposing filament-specific // settings. void mjrf_DEBUG_drawImguiEditor(mjrScene* scene);