Ensure swap chains are resized appropriately.
The swap chain dimensions are a union of all render request viewport sizes that use the swap chain. PiperOrigin-RevId: 916078573 Change-Id: If26a9e1486006ed346227120a361773bfa23f292
This commit is contained in:
committed by
Copybara-Service
parent
71ddeb3efc
commit
b540909f18
@@ -14,6 +14,7 @@
|
|||||||
|
|
||||||
#include "experimental/filament/filament/filament_context.h"
|
#include "experimental/filament/filament/filament_context.h"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <span>
|
#include <span>
|
||||||
@@ -86,6 +87,13 @@ mjrFrameHandle FilamentContext::Render(
|
|||||||
mju_error("Only one read request is supported for now.");
|
mju_error("Only one read request is supported for now.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if constexpr (UTILS_HAS_THREADING) {
|
||||||
|
// Wait until previous frame is completed before requesting a new frame.
|
||||||
|
engine_->flushAndWait();
|
||||||
|
}
|
||||||
|
|
||||||
|
ValidateSwapChains(requests);
|
||||||
|
|
||||||
bool render_began = false;
|
bool render_began = false;
|
||||||
mjrRenderTarget* current_target = nullptr;
|
mjrRenderTarget* current_target = nullptr;
|
||||||
for (const mjrRenderRequest& request : requests) {
|
for (const mjrRenderRequest& request : requests) {
|
||||||
@@ -100,22 +108,6 @@ mjrFrameHandle FilamentContext::Render(
|
|||||||
mju_error("Cannot read pixels from the window.");
|
mju_error("Cannot read pixels from the window.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if constexpr (UTILS_HAS_THREADING) {
|
|
||||||
// Wait until previous frame is completed before requesting a new frame.
|
|
||||||
engine_->flushAndWait();
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the window size has changed, we need to reacquire the swap chain.
|
|
||||||
if (request.viewport.width != window_width_ ||
|
|
||||||
request.viewport.height != window_height_) {
|
|
||||||
if (window_width_ != 0 && window_height_ != 0) {
|
|
||||||
engine_->destroy(window_swap_chain_);
|
|
||||||
window_swap_chain_ = engine_->createSwapChain(config_.native_window);
|
|
||||||
}
|
|
||||||
window_width_ = request.viewport.width;
|
|
||||||
window_height_ = request.viewport.height;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!render_began) {
|
if (!render_began) {
|
||||||
render_began = renderer_->beginFrame(window_swap_chain_);
|
render_began = renderer_->beginFrame(window_swap_chain_);
|
||||||
}
|
}
|
||||||
@@ -196,4 +188,51 @@ void FilamentContext::GetFrameStats(mjrFrameHandle frame,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FilamentContext::ValidateSwapChains(
|
||||||
|
std::span<const mjrRenderRequest> requests) {
|
||||||
|
// Determine the maximum extents of the requests.
|
||||||
|
int max_window_width = 0;
|
||||||
|
int max_window_height = 0;
|
||||||
|
int max_offscreen_width = 0;
|
||||||
|
int max_offscreen_height = 0;
|
||||||
|
|
||||||
|
for (const mjrRenderRequest& request : requests) {
|
||||||
|
const int width = request.viewport.width + request.viewport.left;
|
||||||
|
const int height = request.viewport.height + request.viewport.bottom;
|
||||||
|
if (request.target == nullptr) {
|
||||||
|
max_window_width = std::max(max_window_width, width);
|
||||||
|
max_window_height = std::max(max_window_height, height);
|
||||||
|
} else {
|
||||||
|
max_offscreen_width = std::max(max_offscreen_width, width);
|
||||||
|
max_offscreen_height = std::max(max_offscreen_height, height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (max_window_width && max_window_height) {
|
||||||
|
if (max_window_width != window_width_ ||
|
||||||
|
max_window_width != window_height_) {
|
||||||
|
engine_->destroy(window_swap_chain_);
|
||||||
|
window_width_ = max_window_width;
|
||||||
|
window_height_ = max_window_height;
|
||||||
|
if (config_.native_window) {
|
||||||
|
window_swap_chain_ = engine_->createSwapChain(config_.native_window);
|
||||||
|
} else {
|
||||||
|
window_swap_chain_ =
|
||||||
|
engine_->createSwapChain(window_width_, window_height_);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (max_offscreen_width && max_offscreen_height) {
|
||||||
|
if (max_offscreen_width != config_.width ||
|
||||||
|
max_offscreen_height != config_.height) {
|
||||||
|
engine_->destroy(offscreen_swap_chain_);
|
||||||
|
config_.width = max_offscreen_width;
|
||||||
|
config_.height = max_offscreen_height;
|
||||||
|
offscreen_swap_chain_ =
|
||||||
|
engine_->createSwapChain(config_.width, config_.height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace mujoco
|
} // namespace mujoco
|
||||||
|
|||||||
@@ -68,8 +68,9 @@ class FilamentContext : public mjrfContext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
mjrFilamentConfig config_;
|
void ValidateSwapChains(std::span<const mjrRenderRequest> render_requests);
|
||||||
|
|
||||||
|
mjrFilamentConfig config_;
|
||||||
filament::Engine* engine_ = nullptr;
|
filament::Engine* engine_ = nullptr;
|
||||||
filament::Renderer* renderer_ = nullptr;
|
filament::Renderer* renderer_ = nullptr;
|
||||||
filament::SwapChain* window_swap_chain_ = nullptr;
|
filament::SwapChain* window_swap_chain_ = nullptr;
|
||||||
|
|||||||
Reference in New Issue
Block a user