Cache the render targets.

PiperOrigin-RevId: 929230223
Change-Id: I06571687ba0153c6ee8631685d1d37052419d2ac
This commit is contained in:
Haroon Qureshi
2026-06-09 09:09:30 -07:00
committed by Copybara-Service
parent b083ae487e
commit ecb15a8d9e
3 changed files with 33 additions and 17 deletions
+25 -17
View File
@@ -62,6 +62,8 @@ class CompatContext {
UniquePtr<mjrfContext> context_; UniquePtr<mjrfContext> context_;
std::unique_ptr<SceneBridge> scene_bridge_; std::unique_ptr<SceneBridge> scene_bridge_;
mjtFramebuffer framebuffer_ = mjFB_WINDOW; mjtFramebuffer framebuffer_ = mjFB_WINDOW;
UniquePtr<mjrfRenderTarget> color_target_{nullptr, nullptr};
UniquePtr<mjrfRenderTarget> depth_target_{nullptr, nullptr};
}; };
CompatContext::CompatContext(const mjrFilamentConfig* config, CompatContext::CompatContext(const mjrFilamentConfig* config,
@@ -104,14 +106,18 @@ void CompatContext::ReadPixels(mjrRect viewport, unsigned char* rgb,
mju_error("ReadPixels is only supported for offscreen rendering."); mju_error("ReadPixels is only supported for offscreen rendering.");
} }
const int width = viewport.width;
const int height = viewport.height;
if (rgb) { if (rgb) {
mjrfRenderTargetConfig config; if (!color_target_) {
mjrf_defaultRenderTargetConfig(&config); mjrfRenderTargetConfig config;
config.width = viewport.width; mjrf_defaultRenderTargetConfig(&config);
config.height = viewport.height; config.color_format = mjPIXEL_FORMAT_RGB8;
config.color_format = mjPIXEL_FORMAT_RGB8; config.depth_format = mjPIXEL_FORMAT_DEPTH32F;
config.depth_format = mjPIXEL_FORMAT_DEPTH32F; color_target_ = CreateRenderTarget(context_.get(), config);
auto target = CreateRenderTarget(context_.get(), config); }
mjrf_resizeRenderTarget(color_target_.get(), width, height);
mjrfRenderRequest req; mjrfRenderRequest req;
mjrf_defaultRenderRequest(&req); mjrf_defaultRenderRequest(&req);
@@ -119,11 +125,11 @@ void CompatContext::ReadPixels(mjrRect viewport, unsigned char* rgb,
req.draw_mode = draw_mode_; req.draw_mode = draw_mode_;
req.camera = scene_bridge_->GetCamera(); req.camera = scene_bridge_->GetCamera();
req.viewport = viewport; req.viewport = viewport;
req.target = target.get(); req.target = color_target_.get();
mjrfReadPixelsRequest read_req; mjrfReadPixelsRequest read_req;
mjrf_defaultReadPixelsRequest(&read_req); mjrf_defaultReadPixelsRequest(&read_req);
read_req.target = target.get(); read_req.target = color_target_.get();
read_req.output = rgb; read_req.output = rgb;
read_req.num_bytes = viewport.width * viewport.height * 3; read_req.num_bytes = viewport.width * viewport.height * 3;
@@ -132,13 +138,14 @@ void CompatContext::ReadPixels(mjrRect viewport, unsigned char* rgb,
} }
if (depth) { if (depth) {
mjrfRenderTargetConfig config; if (!depth_target_) {
mjrf_defaultRenderTargetConfig(&config); mjrfRenderTargetConfig config;
config.width = viewport.width; mjrf_defaultRenderTargetConfig(&config);
config.height = viewport.height; config.color_format = mjPIXEL_FORMAT_R32F;
config.color_format = mjPIXEL_FORMAT_R32F; config.depth_format = mjPIXEL_FORMAT_DEPTH32F;
config.depth_format = mjPIXEL_FORMAT_DEPTH32F; depth_target_ = CreateRenderTarget(context_.get(), config);
auto target = CreateRenderTarget(context_.get(), config); }
mjrf_resizeRenderTarget(depth_target_.get(), width, height);
mjrfRenderRequest req; mjrfRenderRequest req;
mjrf_defaultRenderRequest(&req); mjrf_defaultRenderRequest(&req);
@@ -146,10 +153,11 @@ void CompatContext::ReadPixels(mjrRect viewport, unsigned char* rgb,
req.draw_mode = mjDRAW_MODE_DEPTH; req.draw_mode = mjDRAW_MODE_DEPTH;
req.camera = scene_bridge_->GetCamera(); req.camera = scene_bridge_->GetCamera();
req.viewport = viewport; req.viewport = viewport;
req.target = target.get(); req.target = depth_target_.get();
mjrfReadPixelsRequest read_req; mjrfReadPixelsRequest read_req;
mjrf_defaultReadPixelsRequest(&read_req); mjrf_defaultReadPixelsRequest(&read_req);
read_req.target = depth_target_.get();
read_req.output = reinterpret_cast<uint8_t*>(depth); read_req.output = reinterpret_cast<uint8_t*>(depth);
read_req.num_bytes = viewport.width * viewport.height * sizeof(float); read_req.num_bytes = viewport.width * viewport.height * sizeof(float);
@@ -292,6 +292,11 @@ void mjrf_configureSceneFromModel(mjrfScene* scene, const mjModel* model) {
mujoco::SceneView::downcast(scene)->Configure(model); mujoco::SceneView::downcast(scene)->Configure(model);
} }
void mjrf_resizeRenderTarget(mjrfRenderTarget* render_target, int width,
int height) {
mujoco::RenderTarget::downcast(render_target)->Prepare(width, height);
}
mjrfFrameHandle mjrf_render(mjrfContext* ctx, const mjrfRenderRequest* req, mjrfFrameHandle mjrf_render(mjrfContext* ctx, const mjrfRenderRequest* req,
int nreq, const mjrfReadPixelsRequest* read_req, int nreq, const mjrfReadPixelsRequest* read_req,
int nread_req) { int nread_req) {
@@ -466,6 +466,9 @@ mjrfRenderTarget* mjrf_createRenderTarget(mjrfContext* ctx, const mjrfRenderTarg
// Destroys the render target. // Destroys the render target.
void mjrf_destroyRenderTarget(mjrfRenderTarget* render_target); void mjrf_destroyRenderTarget(mjrfRenderTarget* render_target);
// Resizes the render target to the given width and height.
void mjrf_resizeRenderTarget(mjrfRenderTarget* render_target, int width, int height);
// ## Debug-only functions. // ## Debug-only functions.
// Draws an ImGui editor for the given scene, exposing filament-specific settings. // Draws an ImGui editor for the given scene, exposing filament-specific settings.