/** * @file src/display_device_policy.h * @brief Data-only display configuration policy. */ #pragma once #include #include #include #include #include #include namespace display_device::policy { struct resolution_t { unsigned int m_width {}; unsigned int m_height {}; auto operator<=>(const resolution_t &) const = default; }; struct rational_t { unsigned int m_numerator {}; unsigned int m_denominator {}; // Refresh rates may reach this policy as either Hz or millihertz. Keep // the representation supplied by the caller, but compare the numeric // value so 60/1 and 60000/1000 describe the same requested mode. [[nodiscard]] bool operator==(const rational_t &other) const { if (m_denominator == 0 || other.m_denominator == 0) { return m_numerator == other.m_numerator && m_denominator == other.m_denominator; } return static_cast(m_numerator) * other.m_denominator == static_cast(other.m_numerator) * m_denominator; } }; enum class device_preparation_e { VerifyOnly, EnsureActive, EnsurePrimary, EnsureOnlyDisplay }; enum class hdr_state_e { Disabled, Enabled }; struct configuration_t { std::string m_device_id; device_preparation_e m_device_prep {}; std::optional m_resolution; std::optional m_refresh_rate; std::optional m_hdr_state; }; struct failed_to_parse_tag_t {}; struct configuration_disabled_tag_t {}; struct video_config_t { struct dd_t { enum class config_option_e { disabled, verify_only, ensure_active, ensure_primary, ensure_only_display }; enum class resolution_option_e { disabled, automatic, manual }; enum class refresh_rate_option_e { disabled, automatic, manual, prefer_highest }; enum class hdr_option_e { disabled, automatic }; struct mode_remapping_entry_t { std::string requested_resolution; std::string requested_fps; std::string final_resolution; std::string final_refresh_rate; }; struct mode_remapping_t { std::vector mixed; std::vector resolution_only; std::vector refresh_rate_only; }; struct workarounds_t { bool dummy_plug_hdr10 {}; } wa; config_option_e configuration_option {}; resolution_option_e resolution_option {}; std::string manual_resolution; refresh_rate_option_e refresh_rate_option {}; std::string manual_refresh_rate; hdr_option_e hdr_option {}; mode_remapping_t mode_remapping; } dd; std::string output_name; bool rtx_hdr_enabled {}; }; struct session_t { struct resolution_override_t { int width; int height; }; int width {}; int height {}; int fps {}; bool enable_sops {}; bool enable_hdr {}; bool prefer_sdr_10bit {}; bool force_sdr {}; bool client_display_mode_override {}; std::uint32_t client_display_refresh_millihz {}; std::optional resolution_override; std::optional framegen_refresh_rate; std::optional framegen_refresh_millihz; }; [[nodiscard]] bool effective_hdr_requested(const session_t &session); [[nodiscard]] bool effective_10bit_sdr_requested(const session_t &session); [[nodiscard]] std::variant parse_configuration(const video_config_t &video_config, const session_t &session); [[nodiscard]] bool refresh_rate_override_active(const video_config_t &video_config, const session_t &session); } // namespace display_device::policy