Use runtime enum for the renderer backend instead of preprocessor macros.

TESTED:
  studio:vulkan
  studio:vulkan --offscreen_mode=true
  studio:opengl
  studio:opengl_egl
  studio:classic
  studio:classic --offscreen_mode=true
  studio:server
  robot_sim/frontend:debug_server
  pyviewer:example
  pyviewer:example --define=mujoco_gl=vulkan
PiperOrigin-RevId: 864768322
Change-Id: I4478e0115b3807060d60d98b4ddfd63da9389aac
This commit is contained in:
Haroon Qureshi
2026-02-03 02:12:40 -08:00
committed by Copybara-Service
parent 24e5b966c3
commit 1a2bca4986
7 changed files with 136 additions and 55 deletions
+31 -14
View File
@@ -18,21 +18,20 @@
#include <span>
#include <mujoco/mujoco.h>
#include "experimental/platform/renderer_backend.h"
#if defined(USE_FILAMENT_OPENGL) || defined(USE_FILAMENT_VULKAN)
#include "experimental/filament/render_context_filament.h"
#include "experimental/platform/plugin.h"
#elif defined(USE_CLASSIC_OPENGL)
#if defined(MUJOCO_RENDERER_CLASSIC_OPENGL)
#include <imgui.h>
#include <backends/imgui_impl_opengl3.h>
#else
#error No rendering mode defined.
#include "experimental/filament/render_context_filament.h"
#include "experimental/platform/plugin.h"
#endif
namespace mujoco::platform {
Renderer::Renderer(void* native_window) : native_window_(native_window) {
#ifdef USE_CLASSIC_OPENGL
#ifdef MUJOCO_RENDERER_CLASSIC_OPENGL
ImGui_ImplOpenGL3_Init();
#endif
}
@@ -44,16 +43,18 @@ void Renderer::Init(const mjModel* model) {
if (model) {
mjr_defaultContext(&render_context_);
#if defined(USE_CLASSIC_OPENGL)
#if defined(MUJOCO_RENDERER_CLASSIC_OPENGL)
mjr_makeContext(model, &render_context_, mjFONTSCALE_150);
#else
mjrFilamentConfig render_config;
mjr_defaultFilamentConfig(&render_config);
render_config.native_window = native_window_;
render_config.enable_gui = true;
#if defined(USE_FILAMENT_OPENGL)
#if defined(MUJOCO_RENDERER_FILAMENT_OPENGL)
render_config.graphics_api = mjGFX_OPENGL;
#elif defined(USE_FILAMENT_VULKAN)
#elif defined(MUJOCO_RENDERER_FILAMENT_OPENGL_HEADLESS)
render_config.graphics_api = mjGFX_OPENGL;
#elif defined(MUJOCO_RENDERER_FILAMENT_VULKAN)
render_config.graphics_api = mjGFX_VULKAN;
#endif
mjr_makeFilamentContext(model, &render_context_, &render_config);
@@ -92,7 +93,7 @@ void Renderer::Render(const mjModel* model, mjData* data,
width * height * 3);
}
#ifdef USE_CLASSIC_OPENGL
#ifdef MUJOCO_RENDERER_CLASSIC_OPENGL
mjr_resizeOffscreen(width, height, &render_context_);
mjr_setBuffer(mjFB_OFFSCREEN, &render_context_);
#else
@@ -108,7 +109,7 @@ void Renderer::Render(const mjModel* model, mjData* data,
// The filament backend knows how to renders the ImGui draw data. For the
// classic backend, we need to render the ImGui draw data ourselves.
#ifdef USE_CLASSIC_OPENGL
#ifdef MUJOCO_RENDERER_CLASSIC_OPENGL
ImGui_ImplOpenGL3_NewFrame();
ImGui::Render();
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
@@ -141,7 +142,7 @@ void Renderer::RenderToTexture(const mjModel* model, mjData* data,
int Renderer::UploadImage(int texture_id, const std::byte* pixels, int width,
int height, int bpp) {
#if defined(USE_CLASSIC_OPENGL)
#if defined(MUJOCO_RENDERER_CLASSIC_OPENGL)
return 0;
#else
return mjr_uploadGuiImage(texture_id,
@@ -153,7 +154,7 @@ int Renderer::UploadImage(int texture_id, const std::byte* pixels, int width,
double Renderer::GetFps() { return fps_; }
void Renderer::UpdateFps() {
#ifdef USE_CLASSIC_OPENGL
#ifdef MUJOCO_RENDERER_CLASSIC_OPENGL
TimePoint now = std::chrono::steady_clock::now();
TimePoint::duration delta_time = now - last_fps_update_;
const double interval = std::chrono::duration<double>(delta_time).count();
@@ -168,9 +169,25 @@ void Renderer::UpdateFps() {
#endif
}
RendererBackend Renderer::GetBackend() {
#if defined(MUJOCO_RENDERER_FILAMENT_OPENGL_HEADLESS)
return RendererBackend::FilamentOpenGlHeadless;
#elif defined(MUJOCO_RENDERER_FILAMENT_OPENGL)
return RendererBackend::FilamentOpenGl;
#elif defined(MUJOCO_RENDERER_FILAMENT_VULKAN)
return RendererBackend::FilamentVulkan;
#elif defined(MUJOCO_RENDERER_FILAMENT_WEBGL)
return RendererBackend::FilamentWebGl;
#elif defined(MUJOCO_RENDERER_CLASSIC_OPENGL)
return RendererBackend::ClassicOpenGl;
#else
#error "Unsupported renderer backend."
#endif
}
} // namespace mujoco::platform
#if !defined(USE_CLASSIC_OPENGL)
#if !defined(MUJOCO_RENDERER_CLASSIC_OPENGL)
mjPLUGIN_LIB_INIT {
mujoco::platform::GuiPlugin plugin;
plugin.name = "Filament";