Files
Faset_Engine/include/faset/render/temporal.hpp
T

77 lines
2.3 KiB
C++

#pragma once
#include <array>
#include <cstdint>
#include <optional>
#include <string>
namespace faset::render {
enum class TemporalMode { Off, TAA, Upscale };
struct TemporalCapabilities {
bool compute{};
bool formats{};
bool extent{};
};
enum class TemporalFallbackReason {
None,
ComputeUnavailable,
FormatUnavailable,
ExtentUnsupported
};
TemporalFallbackReason temporal_fallback_reason(TemporalMode requested,
TemporalCapabilities available) noexcept;
TemporalMode select_effective_temporal_mode(TemporalMode requested,
TemporalCapabilities available) noexcept;
enum class TemporalResetReason {
None,
FirstFrame,
CameraCut,
CameraDiscontinuity,
ViewChanged,
ViewportChanged,
ProjectionChanged,
Resize,
ModeChanged,
ScaleChanged,
ShaderReload,
Unsupported
};
// Snapshot matrices/rect stay unjittered. This is independent of HZB history:
// Direct rendering and GPU frustum mode can still accumulate temporal color.
// A missing previous key means no completed frame is available to reuse.
struct TemporalHistoryKey {
std::string view_id;
std::uint32_t output_width{}, output_height{};
std::uint32_t internal_width{}, internal_height{};
std::array<float, 4> scene_rect{};
std::array<float, 16> projection{}, view_projection{};
std::array<float, 3> camera_eye{};
TemporalMode mode{TemporalMode::Off};
float render_scale{1};
std::uint64_t shader_generation{};
bool camera_cut{};
};
struct TemporalHistoryDecision {
bool valid{};
TemporalResetReason reason{TemporalResetReason::FirstFrame};
};
TemporalHistoryDecision
evaluate_temporal_history(const std::optional<TemporalHistoryKey>& previous,
const TemporalHistoryKey& current) noexcept;
// Sixteen-phase Halton(2,3) offset in clip-space units, for the scene raster
// projection only. UI, picking, culling, and history keys use unjittered space.
// A zero viewport extent throws std::invalid_argument.
std::array<float, 2> temporal_jitter(std::uint64_t frame_index,
std::uint32_t viewport_width,
std::uint32_t viewport_height);
} // namespace faset::render