xref: /aosp_15_r20/external/libkmsxx/kms++/src/modedb.cpp (revision f0687c8a10b3e371dbe09214db6664e37c283cca)
1*f0687c8aSRaman Tenneti #include <xf86drm.h>
2*f0687c8aSRaman Tenneti #include <stdexcept>
3*f0687c8aSRaman Tenneti #include <cmath>
4*f0687c8aSRaman Tenneti 
5*f0687c8aSRaman Tenneti #include <kms++/modedb.h>
6*f0687c8aSRaman Tenneti 
7*f0687c8aSRaman Tenneti using namespace std;
8*f0687c8aSRaman Tenneti 
9*f0687c8aSRaman Tenneti namespace kms
10*f0687c8aSRaman Tenneti {
find_from_table(const Videomode * modes,uint32_t width,uint32_t height,float vrefresh,bool ilace)11*f0687c8aSRaman Tenneti static const Videomode& find_from_table(const Videomode* modes, uint32_t width, uint32_t height, float vrefresh, bool ilace)
12*f0687c8aSRaman Tenneti {
13*f0687c8aSRaman Tenneti 	for (unsigned i = 0; modes[i].clock; ++i) {
14*f0687c8aSRaman Tenneti 		const Videomode& m = modes[i];
15*f0687c8aSRaman Tenneti 
16*f0687c8aSRaman Tenneti 		if (m.hdisplay != width || m.vdisplay != height)
17*f0687c8aSRaman Tenneti 			continue;
18*f0687c8aSRaman Tenneti 
19*f0687c8aSRaman Tenneti 		if (ilace != m.interlace())
20*f0687c8aSRaman Tenneti 			continue;
21*f0687c8aSRaman Tenneti 
22*f0687c8aSRaman Tenneti 		if (vrefresh && vrefresh != m.calculated_vrefresh())
23*f0687c8aSRaman Tenneti 			continue;
24*f0687c8aSRaman Tenneti 
25*f0687c8aSRaman Tenneti 		return m;
26*f0687c8aSRaman Tenneti 	}
27*f0687c8aSRaman Tenneti 
28*f0687c8aSRaman Tenneti 	// If not found, do another round using rounded vrefresh
29*f0687c8aSRaman Tenneti 
30*f0687c8aSRaman Tenneti 	for (unsigned i = 0; modes[i].clock; ++i) {
31*f0687c8aSRaman Tenneti 		const Videomode& m = modes[i];
32*f0687c8aSRaman Tenneti 
33*f0687c8aSRaman Tenneti 		if (m.hdisplay != width || m.vdisplay != height)
34*f0687c8aSRaman Tenneti 			continue;
35*f0687c8aSRaman Tenneti 
36*f0687c8aSRaman Tenneti 		if (ilace != m.interlace())
37*f0687c8aSRaman Tenneti 			continue;
38*f0687c8aSRaman Tenneti 
39*f0687c8aSRaman Tenneti 		if (vrefresh && vrefresh != roundf(m.calculated_vrefresh()))
40*f0687c8aSRaman Tenneti 			continue;
41*f0687c8aSRaman Tenneti 
42*f0687c8aSRaman Tenneti 		return m;
43*f0687c8aSRaman Tenneti 	}
44*f0687c8aSRaman Tenneti 
45*f0687c8aSRaman Tenneti 	throw invalid_argument("mode not found");
46*f0687c8aSRaman Tenneti }
47*f0687c8aSRaman Tenneti 
find_dmt(uint32_t width,uint32_t height,float vrefresh,bool ilace)48*f0687c8aSRaman Tenneti const Videomode& find_dmt(uint32_t width, uint32_t height, float vrefresh, bool ilace)
49*f0687c8aSRaman Tenneti {
50*f0687c8aSRaman Tenneti 	return find_from_table(dmt_modes, width, height, vrefresh, ilace);
51*f0687c8aSRaman Tenneti }
52*f0687c8aSRaman Tenneti 
find_cea(uint32_t width,uint32_t height,float vrefresh,bool ilace)53*f0687c8aSRaman Tenneti const Videomode& find_cea(uint32_t width, uint32_t height, float vrefresh, bool ilace)
54*f0687c8aSRaman Tenneti {
55*f0687c8aSRaman Tenneti 	return find_from_table(cea_modes, width, height, vrefresh, ilace);
56*f0687c8aSRaman Tenneti }
57*f0687c8aSRaman Tenneti 
58*f0687c8aSRaman Tenneti } // namespace kms
59