xref: /aosp_15_r20/external/libkmsxx/py/tests/rottest.py (revision f0687c8a10b3e371dbe09214db6664e37c283cca)
1*f0687c8aSRaman Tenneti#!/usr/bin/python3
2*f0687c8aSRaman Tenneti
3*f0687c8aSRaman Tennetiimport pykms
4*f0687c8aSRaman Tennetifrom enum import Enum
5*f0687c8aSRaman Tenneti
6*f0687c8aSRaman Tennetiimport termios, sys, os, tty
7*f0687c8aSRaman Tenneti
8*f0687c8aSRaman Tenneticard = pykms.OmapCard()
9*f0687c8aSRaman Tenneti
10*f0687c8aSRaman Tennetires = pykms.ResourceManager(card)
11*f0687c8aSRaman Tenneticonn = res.reserve_connector()
12*f0687c8aSRaman Tenneticrtc = res.reserve_crtc(conn)
13*f0687c8aSRaman Tennetimode = conn.get_default_mode()
14*f0687c8aSRaman Tennetimodeb = mode.to_blob(card)
15*f0687c8aSRaman Tennetirootplane = res.reserve_primary_plane(crtc, pykms.PixelFormat.XRGB8888)
16*f0687c8aSRaman Tennetiplane = res.reserve_overlay_plane(crtc, pykms.PixelFormat.NV12)
17*f0687c8aSRaman Tenneti
18*f0687c8aSRaman Tenneticard.disable_planes()
19*f0687c8aSRaman Tenneti
20*f0687c8aSRaman Tennetireq = pykms.AtomicReq(card)
21*f0687c8aSRaman Tenneti
22*f0687c8aSRaman Tennetireq.add(conn, "CRTC_ID", crtc.id)
23*f0687c8aSRaman Tenneti
24*f0687c8aSRaman Tennetireq.add(crtc, {"ACTIVE": 1,
25*f0687c8aSRaman Tenneti		"MODE_ID": modeb.id})
26*f0687c8aSRaman Tenneti
27*f0687c8aSRaman Tenneti# This enables the root plane
28*f0687c8aSRaman Tenneti
29*f0687c8aSRaman Tenneti#rootfb = pykms.OmapFramebuffer(card, mode.hdisplay, mode.vdisplay, "XR24");
30*f0687c8aSRaman Tenneti#pykms.draw_test_pattern(rootfb);
31*f0687c8aSRaman Tenneti#
32*f0687c8aSRaman Tenneti#req.add(rootplane, {"FB_ID": rootfb.id,
33*f0687c8aSRaman Tenneti#		"CRTC_ID": crtc.id,
34*f0687c8aSRaman Tenneti#		"SRC_X": 0 << 16,
35*f0687c8aSRaman Tenneti#		"SRC_Y": 0 << 16,
36*f0687c8aSRaman Tenneti#		"SRC_W": mode.hdisplay << 16,
37*f0687c8aSRaman Tenneti#		"SRC_H": mode.vdisplay << 16,
38*f0687c8aSRaman Tenneti#		"CRTC_X": 0,
39*f0687c8aSRaman Tenneti#		"CRTC_Y": 0,
40*f0687c8aSRaman Tenneti#		"CRTC_W": mode.hdisplay,
41*f0687c8aSRaman Tenneti#		"CRTC_H": mode.vdisplay,
42*f0687c8aSRaman Tenneti#		"zpos": 0})
43*f0687c8aSRaman Tenneti
44*f0687c8aSRaman Tennetireq.commit_sync(allow_modeset = True)
45*f0687c8aSRaman Tenneti
46*f0687c8aSRaman Tennetidef show_rot_plane(crtc, plane, fb, rot, x_scale, y_scale):
47*f0687c8aSRaman Tenneti
48*f0687c8aSRaman Tenneti	crtc_w = int(fb_w * x_scale)
49*f0687c8aSRaman Tenneti	crtc_h = int(fb_h * y_scale)
50*f0687c8aSRaman Tenneti
51*f0687c8aSRaman Tenneti	if (rot & pykms.Rotation.ROTATE_90) or (rot & pykms.Rotation.ROTATE_270):
52*f0687c8aSRaman Tenneti		tmp = crtc_w
53*f0687c8aSRaman Tenneti		crtc_w = crtc_h
54*f0687c8aSRaman Tenneti		crtc_h = tmp
55*f0687c8aSRaman Tenneti
56*f0687c8aSRaman Tenneti	crtc_x = int(mode.hdisplay / 2 - crtc_w / 2)
57*f0687c8aSRaman Tenneti	crtc_y = int(mode.vdisplay / 2 - crtc_h / 2)
58*f0687c8aSRaman Tenneti
59*f0687c8aSRaman Tenneti	req = pykms.AtomicReq(card)
60*f0687c8aSRaman Tenneti
61*f0687c8aSRaman Tenneti	src_x = 0
62*f0687c8aSRaman Tenneti	src_y = 0
63*f0687c8aSRaman Tenneti	src_w = fb_w - src_x
64*f0687c8aSRaman Tenneti	src_h = fb_h - src_y
65*f0687c8aSRaman Tenneti
66*f0687c8aSRaman Tenneti	print("SRC {},{}-{}x{}  DST {},{}-{}x{}".format(
67*f0687c8aSRaman Tenneti		src_x, src_y, src_w, src_h,
68*f0687c8aSRaman Tenneti		crtc_x, crtc_y, crtc_w, crtc_h))
69*f0687c8aSRaman Tenneti
70*f0687c8aSRaman Tenneti	angle_str = pykms.Rotation(rot & pykms.Rotation.ROTATE_MASK).name
71*f0687c8aSRaman Tenneti	reflect_x_str = "REFLECT_X" if rot & pykms.Rotation.REFLECT_X else ""
72*f0687c8aSRaman Tenneti	reflect_y_str = "REFLECT_Y" if rot & pykms.Rotation.REFLECT_Y else ""
73*f0687c8aSRaman Tenneti
74*f0687c8aSRaman Tenneti	print("{} {} {}".format(angle_str, reflect_x_str, reflect_y_str))
75*f0687c8aSRaman Tenneti
76*f0687c8aSRaman Tenneti	sys.stdout.flush()
77*f0687c8aSRaman Tenneti
78*f0687c8aSRaman Tenneti	req.add(plane, {"FB_ID": fb.id,
79*f0687c8aSRaman Tenneti			"CRTC_ID": crtc.id,
80*f0687c8aSRaman Tenneti			"SRC_X": src_x << 16,
81*f0687c8aSRaman Tenneti			"SRC_Y": src_y << 16,
82*f0687c8aSRaman Tenneti			"SRC_W": src_w << 16,
83*f0687c8aSRaman Tenneti			"SRC_H": src_h << 16,
84*f0687c8aSRaman Tenneti			"CRTC_X": crtc_x,
85*f0687c8aSRaman Tenneti			"CRTC_Y": crtc_y,
86*f0687c8aSRaman Tenneti			"CRTC_W": crtc_w,
87*f0687c8aSRaman Tenneti			"CRTC_H": crtc_h,
88*f0687c8aSRaman Tenneti			"rotation": rot,
89*f0687c8aSRaman Tenneti			"zpos": 2})
90*f0687c8aSRaman Tenneti
91*f0687c8aSRaman Tenneti	req.commit_sync(allow_modeset = True)
92*f0687c8aSRaman Tenneti
93*f0687c8aSRaman Tenneti
94*f0687c8aSRaman Tennetifb_w = 480
95*f0687c8aSRaman Tennetifb_h = 150
96*f0687c8aSRaman Tennetix_scale = 1
97*f0687c8aSRaman Tennetiy_scale = 1
98*f0687c8aSRaman Tenneti
99*f0687c8aSRaman Tennetifb = pykms.OmapFramebuffer(card, fb_w, fb_h, "NV12", flags = pykms.OmapFramebuffer.Tiled);
100*f0687c8aSRaman Tenneti#fb = pykms.DumbFramebuffer(card, fb_w, fb_h, "NV12")
101*f0687c8aSRaman Tennetipykms.draw_test_pattern(fb);
102*f0687c8aSRaman Tenneti
103*f0687c8aSRaman Tennetidef even(i):
104*f0687c8aSRaman Tenneti	return i & ~1
105*f0687c8aSRaman Tenneti
106*f0687c8aSRaman Tennetipykms.draw_text(fb, even((fb_w // 2) - (8 * 3) // 2), 4, "TOP", pykms.white)
107*f0687c8aSRaman Tennetipykms.draw_text(fb, even((fb_w // 2) - (8 * 6) // 2), fb_h - 8 - 4, "BOTTOM", pykms.white)
108*f0687c8aSRaman Tennetipykms.draw_text(fb, 4, even(((fb_h // 2) - 4)), "L", pykms.white)
109*f0687c8aSRaman Tennetipykms.draw_text(fb, fb_w - 8 - 4, even(((fb_h // 2) - 4)), "R", pykms.white)
110*f0687c8aSRaman Tenneti
111*f0687c8aSRaman Tennetirots = [ pykms.Rotation.ROTATE_0, pykms.Rotation.ROTATE_90, pykms.Rotation.ROTATE_180, pykms.Rotation.ROTATE_270 ]
112*f0687c8aSRaman Tenneticursors = [ "A", "D", "B", "C" ]
113*f0687c8aSRaman Tenneti
114*f0687c8aSRaman Tennetiprint("Use the cursor keys, x and y to change rotation. Press q to quit.")
115*f0687c8aSRaman Tenneti
116*f0687c8aSRaman Tennetifd = sys.stdin.fileno()
117*f0687c8aSRaman Tennetioldterm = termios.tcgetattr(fd)
118*f0687c8aSRaman Tennetitty.setcbreak(fd)
119*f0687c8aSRaman Tenneti
120*f0687c8aSRaman Tennetitry:
121*f0687c8aSRaman Tenneti	esc_seq = 0
122*f0687c8aSRaman Tenneti
123*f0687c8aSRaman Tenneti	current_rot = pykms.Rotation.ROTATE_0
124*f0687c8aSRaman Tenneti
125*f0687c8aSRaman Tenneti	show_rot_plane(crtc, plane, fb, current_rot, x_scale, y_scale)
126*f0687c8aSRaman Tenneti
127*f0687c8aSRaman Tenneti	while True:
128*f0687c8aSRaman Tenneti		c = sys.stdin.read(1)
129*f0687c8aSRaman Tenneti		#print("Got character {}".format(repr(c)))
130*f0687c8aSRaman Tenneti
131*f0687c8aSRaman Tenneti		changed = False
132*f0687c8aSRaman Tenneti		handled = False
133*f0687c8aSRaman Tenneti
134*f0687c8aSRaman Tenneti		if esc_seq == 0:
135*f0687c8aSRaman Tenneti			if c == "\x1b":
136*f0687c8aSRaman Tenneti				esc_seq = 1
137*f0687c8aSRaman Tenneti				handled = True
138*f0687c8aSRaman Tenneti		elif esc_seq == 1:
139*f0687c8aSRaman Tenneti			if c == "[":
140*f0687c8aSRaman Tenneti				esc_seq = 2
141*f0687c8aSRaman Tenneti				handled = True
142*f0687c8aSRaman Tenneti			else:
143*f0687c8aSRaman Tenneti				esc_seq = 0
144*f0687c8aSRaman Tenneti		elif esc_seq == 2:
145*f0687c8aSRaman Tenneti			esc_seq = 0
146*f0687c8aSRaman Tenneti
147*f0687c8aSRaman Tenneti			if c in cursors:
148*f0687c8aSRaman Tenneti				handled = True
149*f0687c8aSRaman Tenneti
150*f0687c8aSRaman Tenneti				rot = rots[cursors.index(c)]
151*f0687c8aSRaman Tenneti
152*f0687c8aSRaman Tenneti				current_rot &= ~pykms.Rotation.ROTATE_MASK
153*f0687c8aSRaman Tenneti				current_rot |= rot
154*f0687c8aSRaman Tenneti
155*f0687c8aSRaman Tenneti				changed = True
156*f0687c8aSRaman Tenneti
157*f0687c8aSRaman Tenneti		if not handled:
158*f0687c8aSRaman Tenneti			if c == "q":
159*f0687c8aSRaman Tenneti				break
160*f0687c8aSRaman Tenneti			elif c == "x":
161*f0687c8aSRaman Tenneti				current_rot ^= pykms.Rotation.REFLECT_X
162*f0687c8aSRaman Tenneti				changed = True
163*f0687c8aSRaman Tenneti			elif c == "y":
164*f0687c8aSRaman Tenneti				current_rot ^= pykms.Rotation.REFLECT_Y
165*f0687c8aSRaman Tenneti				changed = True
166*f0687c8aSRaman Tenneti
167*f0687c8aSRaman Tenneti		if changed:
168*f0687c8aSRaman Tenneti			show_rot_plane(crtc, plane, fb, current_rot, x_scale, y_scale)
169*f0687c8aSRaman Tenneti
170*f0687c8aSRaman Tennetifinally:
171*f0687c8aSRaman Tenneti	termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
172