drmModeModeInfo
structure from DRM contains uint32_t vrefresh;
field, and the values are actually good there i.e. I’m getting 24-75Hz for different video modes. But refresh rates aren’t integers, they’re rational numbers, right now for my display the value is 59997/1000.
Is it possible to get the precise numbers on Linux? Or at least a floating point value?
2
Answers
The numerator is
drmModeModeInfo::clock * 1000
, theclock
field is in kilohertz and we need Hz for the formula.The denominator is the product of
drmModeModeInfo::htotal
anddrmModeModeInfo::vtotal
fields.For better result, I simplify the rational by dividing both numerator and denominator by their greatest common divisor. For this part, I have used an algorithm from Wikipedia.
I’m not sure if current displays support signal frequencies above 2^32 Hz = 4.29 GHz, but even if they do not, future ones may do so, i.e. you better use 64-bit integer math there.
I simply use this: