xref: /aosp_15_r20/external/libkmsxx/py/tests/ctm_test.py (revision f0687c8a10b3e371dbe09214db6664e37c283cca)
1*f0687c8aSRaman Tenneti#!/usr/bin/python3
2*f0687c8aSRaman Tenneti
3*f0687c8aSRaman Tennetiimport sys
4*f0687c8aSRaman Tennetiimport pykms
5*f0687c8aSRaman Tennetiimport argparse
6*f0687c8aSRaman Tenneti
7*f0687c8aSRaman Tennetidef ctm_to_blob(ctm, card):
8*f0687c8aSRaman Tenneti    len=9
9*f0687c8aSRaman Tenneti    arr = bytearray(len*8)
10*f0687c8aSRaman Tenneti    view = memoryview(arr).cast("I")
11*f0687c8aSRaman Tenneti
12*f0687c8aSRaman Tenneti    for x in range(len):
13*f0687c8aSRaman Tenneti        i, d = divmod(ctm[x], 1)
14*f0687c8aSRaman Tenneti        if i < 0:
15*f0687c8aSRaman Tenneti            i = -i
16*f0687c8aSRaman Tenneti            sign = 1 << 31
17*f0687c8aSRaman Tenneti        else:
18*f0687c8aSRaman Tenneti            sign = 0
19*f0687c8aSRaman Tenneti        view[x * 2 + 0] = int(d * ((2 ** 32) - 1))
20*f0687c8aSRaman Tenneti        view[x * 2 + 1] = int(i) | sign
21*f0687c8aSRaman Tenneti        #print("%f = %08x.%08x" % (ctm[x], view[x * 2 + 1], view[x * 2 + 0]))
22*f0687c8aSRaman Tenneti
23*f0687c8aSRaman Tenneti    return pykms.Blob(card, arr);
24*f0687c8aSRaman Tenneti
25*f0687c8aSRaman Tenneti
26*f0687c8aSRaman Tennetiparser = argparse.ArgumentParser(description='Simple CRTC CTM-property test.')
27*f0687c8aSRaman Tennetiparser.add_argument('--connector', '-c', dest='connector',
28*f0687c8aSRaman Tenneti		    required=False, help='connector to output')
29*f0687c8aSRaman Tennetiparser.add_argument('--mode', '-m', dest='modename',
30*f0687c8aSRaman Tenneti		    required=False, help='Video mode name to use')
31*f0687c8aSRaman Tennetiparser.add_argument('--plane', '-p', dest='plane', type=int,
32*f0687c8aSRaman Tenneti		    required=False, help='plane number to use')
33*f0687c8aSRaman Tennetiargs = parser.parse_args()
34*f0687c8aSRaman Tenneti
35*f0687c8aSRaman Tenneticard = pykms.Card()
36*f0687c8aSRaman Tennetires = pykms.ResourceManager(card)
37*f0687c8aSRaman Tenneticonn = res.reserve_connector(args.connector)
38*f0687c8aSRaman Tenneticrtc = res.reserve_crtc(conn)
39*f0687c8aSRaman Tennetiformat = pykms.PixelFormat.ARGB8888
40*f0687c8aSRaman Tennetiif args.modename == None:
41*f0687c8aSRaman Tenneti    mode = conn.get_default_mode()
42*f0687c8aSRaman Tennetielse:
43*f0687c8aSRaman Tenneti    mode = conn.get_mode(args.modename)
44*f0687c8aSRaman Tennetimodeb = mode.to_blob(card)
45*f0687c8aSRaman Tenneti
46*f0687c8aSRaman Tennetifb = pykms.DumbFramebuffer(card, mode.hdisplay, mode.vdisplay, "XR24");
47*f0687c8aSRaman Tennetipykms.draw_test_pattern(fb);
48*f0687c8aSRaman Tenneti
49*f0687c8aSRaman Tennetiif args.plane == None:
50*f0687c8aSRaman Tenneti	plane = res.reserve_generic_plane(crtc, fb.format)
51*f0687c8aSRaman Tennetielse:
52*f0687c8aSRaman Tenneti	plane = card.planes[args.plane]
53*f0687c8aSRaman Tenneti
54*f0687c8aSRaman Tenneticard.disable_planes()
55*f0687c8aSRaman Tenneticrtc.disable_mode()
56*f0687c8aSRaman Tenneti
57*f0687c8aSRaman Tennetiinput("press enter to set ctm at the same time with crtc mode\n")
58*f0687c8aSRaman Tenneti
59*f0687c8aSRaman Tennetictm = [ 0.0,	1.0,	0.0,
60*f0687c8aSRaman Tenneti        0.0,	0.0,	1.0,
61*f0687c8aSRaman Tenneti        1.0,	0.0,	0.0 ]
62*f0687c8aSRaman Tenneti
63*f0687c8aSRaman Tennetictmb = ctm_to_blob(ctm, card)
64*f0687c8aSRaman Tenneti
65*f0687c8aSRaman Tennetireq = pykms.AtomicReq(card)
66*f0687c8aSRaman Tennetireq.add(conn, "CRTC_ID", crtc.id)
67*f0687c8aSRaman Tennetireq.add(crtc, {"ACTIVE": 1,
68*f0687c8aSRaman Tenneti               "MODE_ID": modeb.id,
69*f0687c8aSRaman Tenneti               "CTM": ctmb.id})
70*f0687c8aSRaman Tennetireq.add_plane(plane, fb, crtc)
71*f0687c8aSRaman Tennetir = req.commit_sync(allow_modeset = True)
72*f0687c8aSRaman Tennetiassert r == 0, "Initial commit failed: %d" % r
73*f0687c8aSRaman Tenneti
74*f0687c8aSRaman Tennetiprint("r->b g->r b->g ctm active\n")
75*f0687c8aSRaman Tenneti
76*f0687c8aSRaman Tennetiinput("press enter to set normal ctm\n")
77*f0687c8aSRaman Tenneti
78*f0687c8aSRaman Tennetictm = [ 1.0,	0.0,	0.0,
79*f0687c8aSRaman Tenneti        0.0,	1.0,	0.0,
80*f0687c8aSRaman Tenneti        0.0,	0.0,	1.0 ]
81*f0687c8aSRaman Tenneti
82*f0687c8aSRaman Tennetictmb = ctm_to_blob(ctm, card)
83*f0687c8aSRaman Tenneti
84*f0687c8aSRaman Tenneticrtc.set_prop("CTM", ctmb.id)
85*f0687c8aSRaman Tenneti
86*f0687c8aSRaman Tennetiinput("press enter to set new ctm\n")
87*f0687c8aSRaman Tenneti
88*f0687c8aSRaman Tennetictm = [ 0.0,	0.0,	1.0,
89*f0687c8aSRaman Tenneti        1.0,	0.0,	0.0,
90*f0687c8aSRaman Tenneti        0.0,	1.0,	0.0 ]
91*f0687c8aSRaman Tenneti
92*f0687c8aSRaman Tennetictmb = ctm_to_blob(ctm, card)
93*f0687c8aSRaman Tenneti
94*f0687c8aSRaman Tenneticrtc.set_prop("CTM", ctmb.id)
95*f0687c8aSRaman Tennetiinput("r->g g->b b->r ctm active\n")
96*f0687c8aSRaman Tenneti
97*f0687c8aSRaman Tennetiinput("press enter to turn off the crtc\n")
98*f0687c8aSRaman Tenneti
99*f0687c8aSRaman Tenneticrtc.disable_mode()
100*f0687c8aSRaman Tenneti
101*f0687c8aSRaman Tennetiinput("press enter to enable crtc again\n")
102*f0687c8aSRaman Tenneti
103*f0687c8aSRaman Tenneticrtc.set_mode(conn, fb, mode)
104*f0687c8aSRaman Tenneti
105*f0687c8aSRaman Tennetiinput("press enter to remove ctm\n")
106*f0687c8aSRaman Tenneti
107*f0687c8aSRaman Tenneticrtc.set_prop("CTM", 0)
108*f0687c8aSRaman Tenneti
109*f0687c8aSRaman Tennetiinput("press enter to exit\n")
110