Add API function for querying frame stats.

Replaces the current GetFrameRate function.

PiperOrigin-RevId: 911897360
Change-Id: I4199ba9ce40d1d8bc37b551fa7058d964186641d
This commit is contained in:
Haroon Qureshi
2026-05-07 04:56:50 -07:00
committed by Copybara-Service
parent e1b27afcda
commit f2da6cabdf
6 changed files with 39 additions and 10 deletions
@@ -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());
}
@@ -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;
@@ -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<filament::Renderer::FrameInfo> 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<double>(ns);
} else {
stats_out->frame_rate = 0.0;
}
const int64_t ns = frame_info[0].denoisedGpuFrameDuration;
return 1.0e9 / static_cast<double>(ns);
}
} // namespace mujoco
@@ -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_; }
@@ -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,
@@ -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);