xref: /aosp_15_r20/external/libkmsxx/py/tests/modeset_event.py (revision f0687c8a10b3e371dbe09214db6664e37c283cca)
1*f0687c8aSRaman Tenneti#!/usr/bin/python3
2*f0687c8aSRaman Tenneti
3*f0687c8aSRaman Tennetiimport pykms
4*f0687c8aSRaman Tennetiimport selectors
5*f0687c8aSRaman Tennetiimport sys
6*f0687c8aSRaman Tenneti
7*f0687c8aSRaman Tennetidef readdrm(fileobj, mask):
8*f0687c8aSRaman Tenneti    for ev in card.read_events():
9*f0687c8aSRaman Tenneti        eventhandler(ev)
10*f0687c8aSRaman Tenneti
11*f0687c8aSRaman Tennetidef waitevent(sel):
12*f0687c8aSRaman Tenneti    events = sel.select(1)
13*f0687c8aSRaman Tenneti    if not events:
14*f0687c8aSRaman Tenneti        print("Error: timeout receiving event")
15*f0687c8aSRaman Tenneti    else:
16*f0687c8aSRaman Tenneti        for key, mask in events:
17*f0687c8aSRaman Tenneti            key.data(key.fileobj, mask)
18*f0687c8aSRaman Tenneti
19*f0687c8aSRaman Tennetidef eventhandler(event):
20*f0687c8aSRaman Tenneti    print("Received %s event successfully (seq %d time %f)" %
21*f0687c8aSRaman Tenneti          (event.type, event.seq, event.time))
22*f0687c8aSRaman Tenneti
23*f0687c8aSRaman Tenneticard = pykms.Card()
24*f0687c8aSRaman Tennetisel = selectors.DefaultSelector()
25*f0687c8aSRaman Tennetisel.register(card.fd, selectors.EVENT_READ, readdrm)
26*f0687c8aSRaman Tenneti
27*f0687c8aSRaman Tennetires = pykms.ResourceManager(card)
28*f0687c8aSRaman Tenneticonn = res.reserve_connector()
29*f0687c8aSRaman Tenneticrtc = res.reserve_crtc(conn)
30*f0687c8aSRaman Tennetipplane = res.reserve_primary_plane(crtc)
31*f0687c8aSRaman Tenneti
32*f0687c8aSRaman Tennetimode = conn.get_default_mode()
33*f0687c8aSRaman Tennetimodeb = mode.to_blob(card)
34*f0687c8aSRaman Tenneti
35*f0687c8aSRaman Tennetifor format in pplane.formats:
36*f0687c8aSRaman Tenneti    if format == pykms.PixelFormat.XRGB8888:
37*f0687c8aSRaman Tenneti        break
38*f0687c8aSRaman Tenneti    if format == pykms.PixelFormat.RGB565:
39*f0687c8aSRaman Tenneti        break
40*f0687c8aSRaman Tenneti
41*f0687c8aSRaman Tennetifb = pykms.DumbFramebuffer(card, mode.hdisplay, mode.vdisplay, format);
42*f0687c8aSRaman Tennetipykms.draw_test_pattern(fb);
43*f0687c8aSRaman Tenneti
44*f0687c8aSRaman Tenneti# Disable request
45*f0687c8aSRaman Tenneticard.disable_planes()
46*f0687c8aSRaman Tenneti
47*f0687c8aSRaman Tennetiprint("Setting %s to %s using %s" % (conn.fullname, mode.name, format))
48*f0687c8aSRaman Tenneti
49*f0687c8aSRaman Tennetireq = pykms.AtomicReq(card)
50*f0687c8aSRaman Tenneti
51*f0687c8aSRaman Tennetireq.add(conn, "CRTC_ID", crtc.id)
52*f0687c8aSRaman Tennetireq.add(crtc, {"ACTIVE": 1,
53*f0687c8aSRaman Tenneti               "MODE_ID": modeb.id})
54*f0687c8aSRaman Tennetireq.add(pplane, {"FB_ID": fb.id,
55*f0687c8aSRaman Tenneti                 "CRTC_ID": crtc.id,
56*f0687c8aSRaman Tenneti                 "SRC_X": 0 << 16,
57*f0687c8aSRaman Tenneti                 "SRC_Y": 0 << 16,
58*f0687c8aSRaman Tenneti                 "SRC_W": mode.hdisplay << 16,
59*f0687c8aSRaman Tenneti                 "SRC_H": mode.vdisplay << 16,
60*f0687c8aSRaman Tenneti                 "CRTC_X": 0,
61*f0687c8aSRaman Tenneti                 "CRTC_Y": 0,
62*f0687c8aSRaman Tenneti                 "CRTC_W": mode.hdisplay,
63*f0687c8aSRaman Tenneti                 "CRTC_H": mode.vdisplay})
64*f0687c8aSRaman Tenneti
65*f0687c8aSRaman Tennetiret = req.test(True)
66*f0687c8aSRaman Tennetiif ret != 0:
67*f0687c8aSRaman Tenneti    print("Atomic test failed: %d" % ret)
68*f0687c8aSRaman Tenneti    sys.exit()
69*f0687c8aSRaman Tenneti
70*f0687c8aSRaman Tennetireq.commit(0, allow_modeset = True)
71*f0687c8aSRaman Tennetiwaitevent(sel)
72*f0687c8aSRaman Tenneti
73*f0687c8aSRaman Tennetiinput("press enter to exit\n")
74