blob: 17992d95c1ec3bb63d40bbe1712cc6b4c50d1e73 [file] [log] [blame]
// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/ui/scenic/bin/temporary_frame_renderer_delegator.h"
#include <lib/syslog/cpp/macros.h>
namespace scenic_impl {
TemporaryFrameRendererDelegator::TemporaryFrameRendererDelegator(
std::shared_ptr<flatland::FlatlandManager> flatland_manager,
std::shared_ptr<flatland::Engine> flatland_engine, std::shared_ptr<gfx::Engine> gfx_engine)
: flatland_manager_(std::move(flatland_manager)),
flatland_engine_(std::move(flatland_engine)),
gfx_engine_(std::move(gfx_engine)) {
FX_DCHECK(flatland_manager_);
FX_DCHECK(flatland_engine_);
FX_DCHECK(gfx_engine_);
}
void TemporaryFrameRendererDelegator::RenderScheduledFrame(uint64_t frame_number,
zx::time presentation_time,
FramePresentedCallback callback) {
FX_CHECK(flatland_frame_count_ + gfx_frame_count_ == frame_number - 1);
if (auto display = flatland_manager_->GetPrimaryFlatlandDisplayForRendering()) {
flatland_engine_->RenderScheduledFrame(++flatland_frame_count_, presentation_time,
*display.get(), std::move(callback));
} else {
// Render the good ol' Gfx Engine way.
gfx_engine_->RenderScheduledFrame(++gfx_frame_count_, presentation_time, std::move(callback));
}
}
void TemporaryFrameRendererDelegator::SignalFencesWhenPreviousRendersAreDone(
std::vector<zx::event> release_fences) {
if (auto display = flatland_manager_->GetPrimaryFlatlandDisplayForRendering()) {
// Flatland doesn't pass release fences into the FrameScheduler. Instead, they are stored in
// the FlatlandPresenter and pulled out by the flatland::Engine during rendering.
FX_CHECK(release_fences.empty()) << "Flatland fences should not be handled by FrameScheduler.";
} else {
// Render the good ol' Gfx Engine way.
gfx_engine_->SignalFencesWhenPreviousRendersAreDone(std::move(release_fences));
}
}
} // namespace scenic_impl