From bc1f9513be6d6d4a6e341ec893174ac1328ab2ef Mon Sep 17 00:00:00 2001 From: Haroon Qureshi Date: Wed, 18 Mar 2026 01:47:21 -0700 Subject: [PATCH] Add flag for software rendering. This flag is currently unused. PiperOrigin-RevId: 885453938 Change-Id: Ia2112410ff12c7b18ad154f18887d4d795bafa3d --- .../filament/render_context_filament.h | 3 +++ src/experimental/platform/graphics_mode.cc | 15 ++++++++++++--- src/experimental/platform/graphics_mode.h | 4 ++++ src/experimental/platform/renderer.cc | 1 + src/experimental/studio/app.cc | 7 +++++++ 5 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/experimental/filament/render_context_filament.h b/src/experimental/filament/render_context_filament.h index 5197bdf1..8596bf82 100644 --- a/src/experimental/filament/render_context_filament.h +++ b/src/experimental/filament/render_context_filament.h @@ -41,6 +41,9 @@ struct mjrFilamentConfig { // The backend graphics API to use. int graphics_api; + + // Use software rendering even if the platform supports hardware rendering. + bool force_software_rendering; }; void mjrf_defaultFilamentConfig(mjrFilamentConfig* config); diff --git a/src/experimental/platform/graphics_mode.cc b/src/experimental/platform/graphics_mode.cc index 011cd79d..e291ed78 100644 --- a/src/experimental/platform/graphics_mode.cc +++ b/src/experimental/platform/graphics_mode.cc @@ -28,14 +28,16 @@ bool IsFilament(GraphicsMode gfx_mode) { return gfx_mode == GraphicsMode::FilamentOpenGl || gfx_mode == GraphicsMode::FilamentVulkan || gfx_mode == GraphicsMode::FilamentWebGl || - gfx_mode == GraphicsMode::FilamentOpenGlHeadless; + gfx_mode == GraphicsMode::FilamentOpenGlHeadless || + gfx_mode == GraphicsMode::FilamentOpenGlSoftware; } bool IsOpenGl(GraphicsMode gfx_mode) { return gfx_mode == GraphicsMode::ClassicOpenGl || gfx_mode == GraphicsMode::ClassicOpenGlHeadless || gfx_mode == GraphicsMode::FilamentOpenGl || - gfx_mode == GraphicsMode::FilamentOpenGlHeadless; + gfx_mode == GraphicsMode::FilamentOpenGlHeadless || + gfx_mode == GraphicsMode::FilamentOpenGlSoftware; } bool IsVulkan(GraphicsMode gfx_mode) { @@ -48,7 +50,12 @@ bool IsWebGl(GraphicsMode gfx_mode) { bool IsHeadless(GraphicsMode gfx_mode) { return gfx_mode == GraphicsMode::ClassicOpenGlHeadless || - gfx_mode == GraphicsMode::FilamentOpenGlHeadless; + gfx_mode == GraphicsMode::FilamentOpenGlHeadless || + gfx_mode == GraphicsMode::FilamentOpenGlSoftware; +} + +bool IsSoftware(GraphicsMode gfx_mode) { + return gfx_mode == GraphicsMode::FilamentOpenGlSoftware; } GraphicsMode GraphicsModeFromString(std::string_view str, @@ -65,6 +72,8 @@ GraphicsMode GraphicsModeFromString(std::string_view str, return GraphicsMode::FilamentWebGl; } else if (str == "opengl_headless") { return GraphicsMode::FilamentOpenGlHeadless; + } else if (str == "opengl_software") { + return GraphicsMode::FilamentOpenGlSoftware; } else if (str.empty()) { return default_mode; } else { diff --git a/src/experimental/platform/graphics_mode.h b/src/experimental/platform/graphics_mode.h index 009f36ad..e5e79764 100644 --- a/src/experimental/platform/graphics_mode.h +++ b/src/experimental/platform/graphics_mode.h @@ -38,6 +38,9 @@ enum class GraphicsMode { // Similar to FilamentOpenGl, but assumes "headless" rendering. FilamentOpenGlHeadless, + + // Similar to FilamentOpenGl, but forces software rendering. + FilamentOpenGlSoftware, }; bool IsClassic(GraphicsMode gfx_mode); @@ -46,6 +49,7 @@ bool IsOpenGl(GraphicsMode gfx_mode); bool IsVulkan(GraphicsMode gfx_mode); bool IsWebGl(GraphicsMode gfx_mode); bool IsHeadless(GraphicsMode gfx_mode); +bool IsSoftware(GraphicsMode gfx_mode); GraphicsMode GraphicsModeFromString(std::string_view str, GraphicsMode default_mode); diff --git a/src/experimental/platform/renderer.cc b/src/experimental/platform/renderer.cc index 056b362d..7583a46e 100644 --- a/src/experimental/platform/renderer.cc +++ b/src/experimental/platform/renderer.cc @@ -88,6 +88,7 @@ void Renderer::Init(const mjModel* model) { mjrFilamentConfig render_config; mjrf_defaultFilamentConfig(&render_config); render_config.native_window = native_window_; + render_config.force_software_rendering = IsSoftware(gfx_); render_config.graphics_api = IsOpenGl(gfx_) || IsWebGl(gfx_) ? mjGFX_OPENGL : mjGFX_VULKAN; mjrf_makeFilamentContext(model, &render_context_, &render_config); diff --git a/src/experimental/studio/app.cc b/src/experimental/studio/app.cc index 0e843912..eb4b29a8 100644 --- a/src/experimental/studio/app.cc +++ b/src/experimental/studio/app.cc @@ -1761,6 +1761,7 @@ void App::MainMenuGui() { ImGui::Separator(); + #ifdef __linux__ if (ImGui::BeginMenu("Graphics Mode (Experimental)")) { std::optional mode; if (ImGui::MenuItem( @@ -1783,6 +1784,11 @@ void App::MainMenuGui() { gfx_mode_ == platform::GraphicsMode::FilamentOpenGlHeadless)) { mode = platform::GraphicsMode::FilamentOpenGlHeadless; } + if (ImGui::MenuItem( + "Filament OpenGL Software", nullptr, + gfx_mode_ == platform::GraphicsMode::FilamentOpenGlSoftware)) { + mode = platform::GraphicsMode::FilamentOpenGlSoftware; + } if (ImGui::MenuItem( "Filament Vulkan", nullptr, gfx_mode_ == platform::GraphicsMode::FilamentVulkan)) { @@ -1802,6 +1808,7 @@ void App::MainMenuGui() { } ImGui::EndMenu(); } + #endif // __linux__ ImGui::EndMenu(); }