Add renderer info query API
This commit is contained in:
@@ -55,6 +55,30 @@ void mjr_defaultContext(mjrContext* con) {
|
||||
memset(con, 0, sizeof(mjrContext));
|
||||
}
|
||||
|
||||
static int context_count = 0;
|
||||
|
||||
static int contextHasResources(const mjrContext* con) {
|
||||
return con->ntexture || con->offColor || con->offDepthStencil || con->offFBO ||
|
||||
con->shadowTex || con->shadowFBO || con->rangePlane || con->rangeMesh ||
|
||||
con->rangeHField || con->rangeBuiltin || con->rangeFont || con->nskin;
|
||||
}
|
||||
|
||||
// set default mjrRendererInfo
|
||||
void mjr_defaultRendererInfo(mjrRendererInfo* info) {
|
||||
memset(info, 0, sizeof(mjrRendererInfo));
|
||||
info->renderer = "classic";
|
||||
info->backend = "";
|
||||
info->backend_version = "";
|
||||
}
|
||||
|
||||
// get active renderer information
|
||||
void mjr_getRendererInfo(mjrRendererInfo* info) {
|
||||
mjr_defaultRendererInfo(info);
|
||||
if (context_count > 0) {
|
||||
info->backend = "opengl";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// allocate lists
|
||||
@@ -1608,6 +1632,7 @@ void mjr_makeContext_offSize(const mjModel* m, mjrContext* con, int fontscale,
|
||||
// try to bind window (bind offscreen if no window)
|
||||
mjr_setBuffer(mjFB_WINDOW, con);
|
||||
|
||||
context_count++;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1667,6 +1692,7 @@ void mjr_makeContext_offSize(const mjModel* m, mjrContext* con, int fontscale,
|
||||
|
||||
// set default depth mapping for mjr_readPixels
|
||||
con->readDepthMap = mjDEPTH_ZERONEAR;
|
||||
context_count++;
|
||||
}
|
||||
|
||||
|
||||
@@ -1811,6 +1837,8 @@ void mjr_addAux(int index, int width, int height, int samples, mjrContext* con)
|
||||
|
||||
// free resources in custom OpenGL context
|
||||
void mjr_freeContext(mjrContext* con) {
|
||||
int had_resources = contextHasResources(con);
|
||||
|
||||
// save flags
|
||||
int glInitialized = con->glInitialized;
|
||||
int windowAvailable = con->windowAvailable;
|
||||
@@ -1867,6 +1895,10 @@ void mjr_freeContext(mjrContext* con) {
|
||||
con->windowSamples = windowSamples;
|
||||
con->windowStereo = windowStereo;
|
||||
con->windowDoublebuffer = windowDoublebuffer;
|
||||
|
||||
if (had_resources && context_count > 0) {
|
||||
context_count--;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -49,6 +49,7 @@ namespace mujoco {
|
||||
FilamentContext::FilamentContext(const mjrfContextConfig* config)
|
||||
: config_(*config) {
|
||||
FilamentPlatformSetup setup = CreateFilamentPlatform(config_);
|
||||
backend_ = setup.backend;
|
||||
platform_ = std::move(setup.platform);
|
||||
|
||||
filament::Engine::Config engine_config;
|
||||
@@ -58,7 +59,7 @@ FilamentContext::FilamentContext(const mjrfContextConfig* config)
|
||||
|
||||
filament::Engine::Builder engine_builder;
|
||||
engine_builder.config(&engine_config);
|
||||
engine_builder.backend(setup.backend);
|
||||
engine_builder.backend(backend_);
|
||||
engine_builder.platform(platform_.get());
|
||||
engine_builder.feature("backend.disable_parallel_shader_compile",
|
||||
setup.disable_parallel_shader_compile);
|
||||
|
||||
@@ -59,6 +59,8 @@ class FilamentContext : public mjrfContext {
|
||||
|
||||
filament::Engine* GetEngine() const { return engine_; }
|
||||
|
||||
filament::Engine::Backend GetBackend() const { return backend_; }
|
||||
|
||||
ObjectManager* GetObjectManager() const { return object_manager_.get(); }
|
||||
|
||||
MaterialManager* GetMaterialManager() const {
|
||||
@@ -76,6 +78,7 @@ class FilamentContext : public mjrfContext {
|
||||
void ValidateSwapChains(std::span<const mjrfRenderRequest> render_requests);
|
||||
|
||||
mjrfContextConfig config_;
|
||||
filament::Engine::Backend backend_;
|
||||
filament::Engine* engine_ = nullptr;
|
||||
filament::Renderer* renderer_ = nullptr;
|
||||
filament::SwapChain* window_swap_chain_ = nullptr;
|
||||
|
||||
@@ -37,6 +37,17 @@ static void setf(float (&arr)[N], const std::array<float, N>& values) {
|
||||
}
|
||||
}
|
||||
|
||||
static const char* BackendName(filament::Engine::Backend backend) {
|
||||
switch (backend) {
|
||||
case filament::Engine::Backend::OPENGL:
|
||||
return "opengl";
|
||||
case filament::Engine::Backend::VULKAN:
|
||||
return "vulkan";
|
||||
default:
|
||||
return "unknown";
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
|
||||
void mjrf_defaultContextConfig(mjrfContextConfig* config) {
|
||||
@@ -124,6 +135,13 @@ void mjrf_destroyContext(mjrfContext* ctx) {
|
||||
delete mujoco::FilamentContext::downcast(ctx);
|
||||
}
|
||||
|
||||
void mjrf_getRendererInfo(mjrfContext* ctx, mjrRendererInfo* info) {
|
||||
memset(info, 0, sizeof(mjrRendererInfo));
|
||||
info->renderer = "filament";
|
||||
info->backend = ctx ? BackendName(mujoco::FilamentContext::downcast(ctx)->GetBackend()) : "";
|
||||
info->backend_version = "";
|
||||
}
|
||||
|
||||
mjrfTexture* mjrf_createTexture(mjrfContext* ctx,
|
||||
const mjrfTextureConfig* config) {
|
||||
return new mujoco::Texture(
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
// limitations under the License.
|
||||
|
||||
#include <mujoco/mujoco.h>
|
||||
#include <string.h>
|
||||
|
||||
// This library implements the entirety of mujoco's mjr API as fast-fail stubs.
|
||||
// You can link this library with your application (instead of standard renderer
|
||||
@@ -22,6 +23,15 @@
|
||||
void mjr_defaultContext(mjrContext* con) {
|
||||
mju_error("mjr_defaultContext not implemented.");
|
||||
}
|
||||
void mjr_defaultRendererInfo(mjrRendererInfo* info) {
|
||||
memset(info, 0, sizeof(mjrRendererInfo));
|
||||
info->renderer = "noop";
|
||||
info->backend = "";
|
||||
info->backend_version = "";
|
||||
}
|
||||
void mjr_getRendererInfo(mjrRendererInfo* info) {
|
||||
mjr_defaultRendererInfo(info);
|
||||
}
|
||||
void mjr_makeContext(const mjModel* m, mjrContext* con, int fontscale) {
|
||||
mju_error("mjr_makeContext not implemented.");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user