xref: /aosp_15_r20/external/libkmsxx/py/tests/plane_move.py (revision f0687c8a10b3e371dbe09214db6664e37c283cca)
1*f0687c8aSRaman Tenneti#!/usr/bin/python3
2*f0687c8aSRaman Tenneti
3*f0687c8aSRaman Tennetiimport pykms
4*f0687c8aSRaman Tennetiimport random
5*f0687c8aSRaman Tennetiimport time
6*f0687c8aSRaman Tennetiimport sys
7*f0687c8aSRaman Tennetiimport select
8*f0687c8aSRaman Tennetiimport selectors
9*f0687c8aSRaman Tenneti
10*f0687c8aSRaman Tennetiif len(sys.argv) != 3:
11*f0687c8aSRaman Tenneti    print('Usage: plane_move.py <connector0> <connector1>')
12*f0687c8aSRaman Tenneti    sys.exit()
13*f0687c8aSRaman Tenneti
14*f0687c8aSRaman Tenneticard = pykms.Card()
15*f0687c8aSRaman Tenneti
16*f0687c8aSRaman Tennetiif not card.has_atomic:
17*f0687c8aSRaman Tenneti    print('Atomic modesetting is not supported')
18*f0687c8aSRaman Tenneti    sys.exit(-1)
19*f0687c8aSRaman Tenneti
20*f0687c8aSRaman Tennetires = pykms.ResourceManager(card)
21*f0687c8aSRaman Tenneti
22*f0687c8aSRaman Tenneticonn_list = []
23*f0687c8aSRaman Tenneticrtc_list = []
24*f0687c8aSRaman Tennetimode_list = []
25*f0687c8aSRaman Tennetirootplane_list = []
26*f0687c8aSRaman Tennetifb_list = []
27*f0687c8aSRaman Tenneticolors = []
28*f0687c8aSRaman Tenneti
29*f0687c8aSRaman Tennetisrc_w = 300
30*f0687c8aSRaman Tennetisrc_h = 300
31*f0687c8aSRaman Tenneti
32*f0687c8aSRaman Tennetifor i in range(2):
33*f0687c8aSRaman Tenneti    conn = res.reserve_connector(sys.argv[i + 1])
34*f0687c8aSRaman Tenneti    if conn is None:
35*f0687c8aSRaman Tenneti        print('Invalid connector: {}'.format(sys.argv[i + 1]))
36*f0687c8aSRaman Tenneti        sys.exit(-1)
37*f0687c8aSRaman Tenneti
38*f0687c8aSRaman Tenneti    if conn.connected() == True:
39*f0687c8aSRaman Tenneti        conn_list.append(conn)
40*f0687c8aSRaman Tenneti    else:
41*f0687c8aSRaman Tenneti        print('connector: {} is not connected'.format(sys.argv[i + 1]))
42*f0687c8aSRaman Tenneti        sys.exit(-1)
43*f0687c8aSRaman Tenneti
44*f0687c8aSRaman Tenneti    crtc = res.reserve_crtc(conn)
45*f0687c8aSRaman Tenneti    crtc_list.append(crtc)
46*f0687c8aSRaman Tenneti
47*f0687c8aSRaman Tenneti    mode = conn.get_default_mode()
48*f0687c8aSRaman Tenneti    mode_list.append(mode)
49*f0687c8aSRaman Tenneti
50*f0687c8aSRaman Tenneti    fb_tmp = pykms.DumbFramebuffer(card, src_w, src_h, 'XR24');
51*f0687c8aSRaman Tenneti    fb_list.append(fb_tmp)
52*f0687c8aSRaman Tenneti
53*f0687c8aSRaman Tenneti    rootplane = res.reserve_primary_plane(crtc, pykms.PixelFormat.XRGB8888)
54*f0687c8aSRaman Tenneti    rootplane_list.append(rootplane)
55*f0687c8aSRaman Tenneti
56*f0687c8aSRaman Tenneticard.disable_planes()
57*f0687c8aSRaman Tenneti
58*f0687c8aSRaman Tennetiprint('Using the following connectors:')
59*f0687c8aSRaman Tennetifor i in range(2):
60*f0687c8aSRaman Tenneti    print(' {}: {} ({}x{})'.format(conn_list[i].idx, conn_list[i].fullname,
61*f0687c8aSRaman Tenneti        mode_list[i].hdisplay, mode_list[i].vdisplay))
62*f0687c8aSRaman Tenneti
63*f0687c8aSRaman Tenneticolors.append(pykms.red)
64*f0687c8aSRaman Tenneticolors.append(pykms.green)
65*f0687c8aSRaman Tenneti
66*f0687c8aSRaman Tennetifor i in range(2):
67*f0687c8aSRaman Tenneti    pykms.draw_rect(fb_list[i], 0, 0, src_w, src_h, colors[i])
68*f0687c8aSRaman Tenneti
69*f0687c8aSRaman Tennetifor i in range(2):
70*f0687c8aSRaman Tenneti    req = pykms.AtomicReq(card)
71*f0687c8aSRaman Tenneti    modeb = mode_list[i].to_blob(card)
72*f0687c8aSRaman Tenneti    req.add(conn_list[i], 'CRTC_ID', crtc_list[i].id)
73*f0687c8aSRaman Tenneti    req.add(crtc_list[i], {'ACTIVE': 1,
74*f0687c8aSRaman Tenneti                    'MODE_ID': modeb.id})
75*f0687c8aSRaman Tenneti    req.add(rootplane_list[i], {'FB_ID': fb_list[i].id,
76*f0687c8aSRaman Tenneti                'CRTC_ID': crtc_list[i].id,
77*f0687c8aSRaman Tenneti                'SRC_W': src_w << 16,
78*f0687c8aSRaman Tenneti                'SRC_H': src_h << 16,
79*f0687c8aSRaman Tenneti                'CRTC_W': src_w,
80*f0687c8aSRaman Tenneti                'CRTC_H': src_h})
81*f0687c8aSRaman Tenneti
82*f0687c8aSRaman Tenneti    req.commit_sync(allow_modeset = True)
83*f0687c8aSRaman Tenneti
84*f0687c8aSRaman Tennetiprint('\nRed box on {}, Green box on {}.'.format(conn_list[0].fullname,
85*f0687c8aSRaman Tenneti                                                 conn_list[1].fullname))
86*f0687c8aSRaman Tennetiinput('ENTER to continue\n')
87*f0687c8aSRaman Tenneti
88*f0687c8aSRaman Tenneti# FIXME: it should be possible to move plane without disabling it, but the
89*f0687c8aSRaman Tenneti# omapdrm driver does not supports it at the moment.
90*f0687c8aSRaman Tennetireq = pykms.AtomicReq(card)
91*f0687c8aSRaman Tennetireq.add(rootplane_list[0], {"FB_ID": 0,
92*f0687c8aSRaman Tenneti                "CRTC_ID": 0})
93*f0687c8aSRaman Tennetireq.commit_sync(allow_modeset = True)
94*f0687c8aSRaman Tenneti
95*f0687c8aSRaman Tennetireq = pykms.AtomicReq(card)
96*f0687c8aSRaman Tennetireq.add(rootplane_list[0], {'FB_ID': fb_list[0].id,
97*f0687c8aSRaman Tenneti            'CRTC_ID': crtc_list[1].id,
98*f0687c8aSRaman Tenneti            'SRC_W': src_w << 16,
99*f0687c8aSRaman Tenneti            'SRC_H': src_h << 16,
100*f0687c8aSRaman Tenneti            'CRTC_X': 150,
101*f0687c8aSRaman Tenneti            'CRTC_Y': 150,
102*f0687c8aSRaman Tenneti            'CRTC_W': src_w,
103*f0687c8aSRaman Tenneti            'CRTC_H': src_h})
104*f0687c8aSRaman Tennetireq.commit_sync(allow_modeset = True)
105*f0687c8aSRaman Tenneti
106*f0687c8aSRaman Tennetiprint('The red box from {} is moved underneath the green box on {}.'.format(
107*f0687c8aSRaman Tenneti                                conn_list[0].fullname, conn_list[1].fullname))
108*f0687c8aSRaman Tennetiinput('ENTER to continue\n')
109*f0687c8aSRaman Tenneti
110*f0687c8aSRaman Tenneti# FIXME: it should be possible to move plane without disabling it, but the
111*f0687c8aSRaman Tenneti# omapdrm driver does not supports it at the moment.
112*f0687c8aSRaman Tennetireq = pykms.AtomicReq(card)
113*f0687c8aSRaman Tennetireq.add(rootplane_list[1], {"FB_ID": 0,
114*f0687c8aSRaman Tenneti                "CRTC_ID": 0})
115*f0687c8aSRaman Tennetireq.commit_sync(allow_modeset = True)
116*f0687c8aSRaman Tenneti
117*f0687c8aSRaman Tennetireq = pykms.AtomicReq(card)
118*f0687c8aSRaman Tennetireq.add(rootplane_list[1], {'FB_ID': fb_list[1].id,
119*f0687c8aSRaman Tenneti            'CRTC_ID': crtc_list[0].id,
120*f0687c8aSRaman Tenneti            'SRC_W': src_w << 16,
121*f0687c8aSRaman Tenneti            'SRC_H': src_h << 16,
122*f0687c8aSRaman Tenneti            'CRTC_W': src_w,
123*f0687c8aSRaman Tenneti            'CRTC_H': src_h})
124*f0687c8aSRaman Tennetireq.commit_sync(allow_modeset = True)
125*f0687c8aSRaman Tenneti
126*f0687c8aSRaman Tennetiprint('Green box on {}, Red box on {}.'.format(conn_list[0].fullname,
127*f0687c8aSRaman Tenneti                                               conn_list[1].fullname))
128*f0687c8aSRaman Tennetiinput('ENTER to exit\n')
129