From e04bbf938ce258898565274b8542684295ee6cd4 Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Mon, 15 Aug 2016 12:25:47 +0300 Subject: [PATCH] support finding fractional vrefresh --- kms++/inc/kms++/connector.h | 2 +- kms++/inc/kms++/modedb.h | 4 ++-- kms++/src/connector.cpp | 11 ++++++----- kms++/src/modedb.cpp | 15 ++++++++------- py/pykmsbase.cpp | 2 +- utils/testpat.cpp | 4 ++-- 6 files changed, 20 insertions(+), 18 deletions(-) diff --git a/kms++/inc/kms++/connector.h b/kms++/inc/kms++/connector.h index 6ccc959..ccd7728 100644 --- a/kms++/inc/kms++/connector.h +++ b/kms++/inc/kms++/connector.h @@ -17,7 +17,7 @@ public: Videomode get_default_mode() const; Videomode get_mode(const std::string& mode) const; - Videomode get_mode(unsigned xres, unsigned yres, unsigned refresh, bool ilace) const; + Videomode get_mode(unsigned xres, unsigned yres, float vrefresh, bool ilace) const; Crtc* get_current_crtc() const; std::vector get_possible_crtcs() const; diff --git a/kms++/inc/kms++/modedb.h b/kms++/inc/kms++/modedb.h index 43c7afc..b6447c6 100644 --- a/kms++/inc/kms++/modedb.h +++ b/kms++/inc/kms++/modedb.h @@ -10,7 +10,7 @@ struct Videomode; extern const Videomode dmt_modes[]; extern const Videomode cea_modes[]; -const Videomode& find_dmt(uint32_t width, uint32_t height, uint32_t vrefresh, bool ilace); -const Videomode& find_cea(uint32_t width, uint32_t height, uint32_t refresh, bool ilace); +const Videomode& find_dmt(uint32_t width, uint32_t height, float vrefresh, bool ilace); +const Videomode& find_cea(uint32_t width, uint32_t height, float vrefresh, bool ilace); } diff --git a/kms++/src/connector.cpp b/kms++/src/connector.cpp index ec37d5d..92700af 100644 --- a/kms++/src/connector.cpp +++ b/kms++/src/connector.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include "helpers.h" @@ -118,23 +119,23 @@ Videomode Connector::get_mode(const string& mode) const throw invalid_argument(mode + ": mode not found"); } -Videomode Connector::get_mode(unsigned xres, unsigned yres, unsigned refresh, bool ilace) const +Videomode Connector::get_mode(unsigned xres, unsigned yres, float vrefresh, bool ilace) const { auto c = m_priv->drm_connector; for (int i = 0; i < c->count_modes; i++) { - drmModeModeInfo& m = c->modes[i]; + Videomode m = drm_mode_to_video_mode(c->modes[i]); if (m.hdisplay != xres || m.vdisplay != yres) continue; - if (refresh && m.vrefresh != refresh) + if (ilace != m.interlace()) continue; - if (ilace != !!(m.flags & DRM_MODE_FLAG_INTERLACE)) + if (vrefresh && std::abs(m.calculated_vrefresh() - vrefresh) >= 0.001) continue; - return drm_mode_to_video_mode(c->modes[i]); + return m; } throw invalid_argument("mode not found"); diff --git a/kms++/src/modedb.cpp b/kms++/src/modedb.cpp index 24d6f63..858c3d0 100644 --- a/kms++/src/modedb.cpp +++ b/kms++/src/modedb.cpp @@ -1,5 +1,6 @@ #include #include +#include #include @@ -8,7 +9,7 @@ using namespace std; namespace kms { -static const Videomode& find_from_table(const Videomode* modes, uint32_t width, uint32_t height, uint32_t refresh, bool ilace) +static const Videomode& find_from_table(const Videomode* modes, uint32_t width, uint32_t height, float vrefresh, bool ilace) { for (unsigned i = 0; modes[i].clock; ++i) { const Videomode& m = modes[i]; @@ -16,10 +17,10 @@ static const Videomode& find_from_table(const Videomode* modes, uint32_t width, if (m.hdisplay != width || m.vdisplay != height) continue; - if (refresh && m.vrefresh != refresh) + if (ilace != m.interlace()) continue; - if (ilace != !!(m.flags & DRM_MODE_FLAG_INTERLACE)) + if (vrefresh && std::abs(m.calculated_vrefresh() - vrefresh) >= 0.001) continue; return m; @@ -28,14 +29,14 @@ static const Videomode& find_from_table(const Videomode* modes, uint32_t width, throw invalid_argument("mode not found"); } -const Videomode& find_dmt(uint32_t width, uint32_t height, uint32_t refresh, bool ilace) +const Videomode& find_dmt(uint32_t width, uint32_t height, float vrefresh, bool ilace) { - return find_from_table(dmt_modes, width, height, refresh, ilace); + return find_from_table(dmt_modes, width, height, vrefresh, ilace); } -const Videomode& find_cea(uint32_t width, uint32_t height, uint32_t refresh, bool ilace) +const Videomode& find_cea(uint32_t width, uint32_t height, float vrefresh, bool ilace) { - return find_from_table(cea_modes, width, height, refresh, ilace); + return find_from_table(cea_modes, width, height, vrefresh, ilace); } } diff --git a/py/pykmsbase.cpp b/py/pykmsbase.cpp index 637e4f5..3ce5676 100644 --- a/py/pykmsbase.cpp +++ b/py/pykmsbase.cpp @@ -42,7 +42,7 @@ void init_pykmsbase(py::module &m) .def("get_possible_crtcs", &Connector::get_possible_crtcs) .def("get_modes", &Connector::get_modes) .def("get_mode", (Videomode (Connector::*)(const string& mode) const)&Connector::get_mode) - .def("get_mode", (Videomode (Connector::*)(unsigned xres, unsigned yres, unsigned refresh, bool ilace) const)&Connector::get_mode) + .def("get_mode", (Videomode (Connector::*)(unsigned xres, unsigned yres, float refresh, bool ilace) const)&Connector::get_mode) .def("__repr__", [](const Connector& o) { return ""; }) ; diff --git a/utils/testpat.cpp b/utils/testpat.cpp index 4cde7c1..ccddccb 100644 --- a/utils/testpat.cpp +++ b/utils/testpat.cpp @@ -102,7 +102,7 @@ static void get_default_crtc(Card& card, OutputInfo& output) static void parse_crtc(Card& card, const string& crtc_str, OutputInfo& output) { // @12:1920x1200@60 - const regex mode_re("(?:(@?)(\\d+):)?(?:(\\d+)x(\\d+)(i)?)(?:@(\\d+))?"); + const regex mode_re("(?:(@?)(\\d+):)?(?:(\\d+)x(\\d+)(i)?)(?:@([\\d\\.]+))?"); smatch sm; if (!regex_match(crtc_str, sm, mode_re)) @@ -133,7 +133,7 @@ static void parse_crtc(Card& card, const string& crtc_str, OutputInfo& output) unsigned w = stoul(sm[3]); unsigned h = stoul(sm[4]); bool ilace = sm[5].matched ? true : false; - unsigned refresh = sm[6].matched ? stoul(sm[6]) : 0; + float refresh = sm[6].matched ? stof(sm[6]) : 0; bool found_mode = false; -- 2.39.2