Adds function for creating the filament Platform based on the renderer
configuration. PiperOrigin-RevId: 889226229 Change-Id: Ia5bcdc16e9861e39c49422c2d5fccee23e477af6
This commit is contained in:
committed by
Copybara-Service
parent
c49bc7c7c0
commit
1bfd68cbba
@@ -33,6 +33,8 @@ target_sources(${MUJOCO_FILAMENT_TARGET_NAME}
|
|||||||
filament/drawable.h
|
filament/drawable.h
|
||||||
filament/filament_context.cc
|
filament/filament_context.cc
|
||||||
filament/filament_context.h
|
filament/filament_context.h
|
||||||
|
filament/filament_platform_factory.cc
|
||||||
|
filament/filament_platform_factory.h
|
||||||
filament/geom_util.cc
|
filament/geom_util.cc
|
||||||
filament/geom_util.h
|
filament/geom_util.h
|
||||||
filament/gui_view.cc
|
filament/gui_view.cc
|
||||||
|
|||||||
@@ -38,6 +38,7 @@
|
|||||||
#include <mujoco/mjmodel.h>
|
#include <mujoco/mjmodel.h>
|
||||||
#include <mujoco/mjvisualize.h>
|
#include <mujoco/mjvisualize.h>
|
||||||
#include <mujoco/mujoco.h>
|
#include <mujoco/mujoco.h>
|
||||||
|
#include "experimental/filament/filament/filament_platform_factory.h"
|
||||||
#include "experimental/filament/filament/gui_view.h"
|
#include "experimental/filament/filament/gui_view.h"
|
||||||
#include "experimental/filament/filament/imgui_editor.h"
|
#include "experimental/filament/filament/imgui_editor.h"
|
||||||
#include "experimental/filament/filament/object_manager.h"
|
#include "experimental/filament/filament/object_manager.h"
|
||||||
@@ -51,31 +52,20 @@ namespace mujoco {
|
|||||||
FilamentContext::FilamentContext(const mjrFilamentConfig* config,
|
FilamentContext::FilamentContext(const mjrFilamentConfig* config,
|
||||||
const mjModel* model, mjrContext* con)
|
const mjModel* model, mjrContext* con)
|
||||||
: config_(*config), context_(con), model_(model) {
|
: config_(*config), context_(con), model_(model) {
|
||||||
#if defined( __EMSCRIPTEN__)
|
FilamentPlatformSetup setup = CreateFilamentPlatform(config_);
|
||||||
filament::Engine::Backend backend = filament::Engine::Backend::OPENGL;
|
platform_ = std::move(setup.platform);
|
||||||
#else
|
|
||||||
filament::Engine::Backend backend = filament::Engine::Backend::VULKAN;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
switch (config_.graphics_api) {
|
filament::Engine::Builder engine_builder;
|
||||||
case mjGFX_DEFAULT:
|
engine_builder.backend(setup.backend);
|
||||||
// Use the default based on the platform above.
|
engine_builder.platform(platform_.get());
|
||||||
break;
|
engine_builder.feature("backend.disable_parallel_shader_compile",
|
||||||
case mjGFX_OPENGL:
|
setup.disable_parallel_shader_compile);
|
||||||
backend = filament::Engine::Backend::OPENGL;
|
engine_ = engine_builder.build();
|
||||||
break;
|
|
||||||
case mjGFX_VULKAN:
|
renderer_ = engine_->createRenderer();
|
||||||
backend = filament::Engine::Backend::VULKAN;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
mju_error("Unsupported graphics API: %d", config_.graphics_api);
|
|
||||||
}
|
|
||||||
|
|
||||||
const int width = model_->vis.global.offwidth;
|
const int width = model_->vis.global.offwidth;
|
||||||
const int height = model_->vis.global.offheight;
|
const int height = model_->vis.global.offheight;
|
||||||
|
|
||||||
engine_ = filament::Engine::create(backend);
|
|
||||||
renderer_ = engine_->createRenderer();
|
|
||||||
#ifdef __EMSCRIPTEN__
|
#ifdef __EMSCRIPTEN__
|
||||||
window_swap_chain_ = engine_->createSwapChain(nullptr);
|
window_swap_chain_ = engine_->createSwapChain(nullptr);
|
||||||
#else
|
#else
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
|
#include <backend/Platform.h>
|
||||||
#include <filament/Engine.h>
|
#include <filament/Engine.h>
|
||||||
#include <filament/Renderer.h>
|
#include <filament/Renderer.h>
|
||||||
#include <mujoco/mjmodel.h>
|
#include <mujoco/mjmodel.h>
|
||||||
@@ -73,10 +74,13 @@ class FilamentContext {
|
|||||||
mjrFilamentConfig config_;
|
mjrFilamentConfig config_;
|
||||||
mjrContext* context_ = nullptr;
|
mjrContext* context_ = nullptr;
|
||||||
const mjModel* model_ = nullptr;
|
const mjModel* model_ = nullptr;
|
||||||
|
|
||||||
filament::Engine* engine_ = nullptr;
|
filament::Engine* engine_ = nullptr;
|
||||||
|
filament::Renderer* renderer_ = nullptr;
|
||||||
filament::SwapChain* window_swap_chain_ = nullptr;
|
filament::SwapChain* window_swap_chain_ = nullptr;
|
||||||
filament::SwapChain* offscreen_swap_chain_ = nullptr;
|
filament::SwapChain* offscreen_swap_chain_ = nullptr;
|
||||||
filament::Renderer* renderer_ = nullptr;
|
std::unique_ptr<filament::backend::Platform> platform_;
|
||||||
|
|
||||||
SceneView::DrawMode last_render_mode_ = SceneView::DrawMode::kNormal;
|
SceneView::DrawMode last_render_mode_ = SceneView::DrawMode::kNormal;
|
||||||
SwapChainType scene_swap_chain_target_ = kWindowSwapChain;
|
SwapChainType scene_swap_chain_target_ = kWindowSwapChain;
|
||||||
SwapChainType gui_swap_chain_target_ = kWindowSwapChain;
|
SwapChainType gui_swap_chain_target_ = kWindowSwapChain;
|
||||||
|
|||||||
@@ -0,0 +1,78 @@
|
|||||||
|
// Copyright 2026 DeepMind Technologies Limited
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
#include "experimental/filament/filament/filament_platform_factory.h"
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
#include <backend/Platform.h>
|
||||||
|
|
||||||
|
#ifdef __linux__
|
||||||
|
#include <backend/platforms/PlatformEGL.h>
|
||||||
|
#include <backend/platforms/PlatformEGLHeadless.h> // IWYU pragma: keep
|
||||||
|
#include <backend/platforms/PlatformGLX.h>
|
||||||
|
#include <backend/platforms/VulkanPlatformLinux.h>
|
||||||
|
#include "third_party/filament/libs/bluegl/include/bluegl/BlueGL.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <filament/Engine.h>
|
||||||
|
#include <mujoco/mujoco.h>
|
||||||
|
#include "experimental/filament/render_context_filament.h"
|
||||||
|
|
||||||
|
namespace mujoco {
|
||||||
|
|
||||||
|
static filament::Engine::Backend ResolveBackend(int graphics_api) {
|
||||||
|
#if defined(__EMSCRIPTEN__)
|
||||||
|
filament::Engine::Backend backend = filament::Engine::Backend::OPENGL;
|
||||||
|
#else
|
||||||
|
filament::Engine::Backend backend = filament::Engine::Backend::VULKAN;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
switch (graphics_api) {
|
||||||
|
case mjGFX_DEFAULT:
|
||||||
|
// Use the default based on the platform above.
|
||||||
|
break;
|
||||||
|
case mjGFX_OPENGL:
|
||||||
|
backend = filament::Engine::Backend::OPENGL;
|
||||||
|
break;
|
||||||
|
case mjGFX_VULKAN:
|
||||||
|
backend = filament::Engine::Backend::VULKAN;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
mju_error("Unsupported graphics API: %d", graphics_api);
|
||||||
|
}
|
||||||
|
return backend;
|
||||||
|
}
|
||||||
|
|
||||||
|
FilamentPlatformSetup CreateFilamentPlatform(const mjrFilamentConfig& config) {
|
||||||
|
FilamentPlatformSetup setup;
|
||||||
|
setup.backend = ResolveBackend(config.graphics_api);
|
||||||
|
|
||||||
|
#ifdef __linux__
|
||||||
|
if (setup.backend == filament::Engine::Backend::OPENGL) {
|
||||||
|
if (config.native_window == nullptr) {
|
||||||
|
setup.platform = std::make_unique<filament::backend::PlatformEGLHeadless>();
|
||||||
|
setup.disable_parallel_shader_compile = true;
|
||||||
|
} else {
|
||||||
|
setup.platform = std::make_unique<filament::backend::PlatformGLX>();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
setup.platform = std::make_unique<filament::backend::VulkanPlatformLinux>();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return setup;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace mujoco
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
// Copyright 2026 DeepMind Technologies Limited
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
#ifndef MUJOCO_SRC_EXPERIMENTAL_FILAMENT_FILAMENT_FILAMENT_PLATFORM_FACTORY_H_
|
||||||
|
#define MUJOCO_SRC_EXPERIMENTAL_FILAMENT_FILAMENT_FILAMENT_PLATFORM_FACTORY_H_
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
#include "experimental/filament/render_context_filament.h"
|
||||||
|
#include <backend/Platform.h>
|
||||||
|
#include <filament/Engine.h>
|
||||||
|
|
||||||
|
namespace mujoco {
|
||||||
|
|
||||||
|
struct FilamentPlatformSetup {
|
||||||
|
// The filament::Platform to use for the engine. May be null, in which case
|
||||||
|
// the engine will be created with a default platform.
|
||||||
|
std::unique_ptr<filament::backend::Platform> platform = nullptr;
|
||||||
|
|
||||||
|
// The filament::Engine::Backend to use for the engine.
|
||||||
|
filament::Engine::Backend backend;
|
||||||
|
|
||||||
|
// Whether to disable parallel shader compilation.
|
||||||
|
bool disable_parallel_shader_compile = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Creates a filament::Platform based on the given config and defines the
|
||||||
|
// filament::Engine::Backend to use. Also returns additional information for
|
||||||
|
// setting up the filament::Engine for use with the provided Platform.
|
||||||
|
FilamentPlatformSetup CreateFilamentPlatform(const mjrFilamentConfig& config);
|
||||||
|
|
||||||
|
} // namespace mujoco
|
||||||
|
|
||||||
|
#endif // MUJOCO_SRC_EXPERIMENTAL_FILAMENT_FILAMENT_FILAMENT_PLATFORM_FACTORY_H_
|
||||||
Reference in New Issue
Block a user