xref: /aosp_15_r20/external/libkmsxx/py/tests/scale.py (revision f0687c8a10b3e371dbe09214db6664e37c283cca)
1*f0687c8aSRaman Tenneti#!/usr/bin/python3
2*f0687c8aSRaman Tenneti
3*f0687c8aSRaman Tennetiimport pykms
4*f0687c8aSRaman Tennetiimport time
5*f0687c8aSRaman Tennetiimport random
6*f0687c8aSRaman Tennetiimport argparse
7*f0687c8aSRaman Tenneti
8*f0687c8aSRaman Tennetidef plane_commit(card, crtc, plane, fb, x, y, w, h) :
9*f0687c8aSRaman Tenneti	req = pykms.AtomicReq(card)
10*f0687c8aSRaman Tenneti	req.add_plane(plane, fb, crtc, None, (x, y, w, h))
11*f0687c8aSRaman Tenneti	r = req.commit_sync()
12*f0687c8aSRaman Tenneti	assert r == 0, "Plane commit failed: %d" % r
13*f0687c8aSRaman Tenneti
14*f0687c8aSRaman Tenneti
15*f0687c8aSRaman Tennetiparser = argparse.ArgumentParser(description='Simple scaling stress test.')
16*f0687c8aSRaman Tennetiparser.add_argument('--plane', '-p', dest='plane', default="",
17*f0687c8aSRaman Tenneti		    required=False, help='plane number to use')
18*f0687c8aSRaman Tennetiparser.add_argument('--connector', '-c', dest='connector', default="",
19*f0687c8aSRaman Tenneti		    required=False, help='connector to output')
20*f0687c8aSRaman Tenneti
21*f0687c8aSRaman Tennetiargs = parser.parse_args()
22*f0687c8aSRaman Tenneti
23*f0687c8aSRaman Tenneticard = pykms.Card()
24*f0687c8aSRaman Tennetires = pykms.ResourceManager(card)
25*f0687c8aSRaman Tenneticonn = res.reserve_connector(args.connector)
26*f0687c8aSRaman Tenneticrtc = res.reserve_crtc(conn)
27*f0687c8aSRaman Tennetiformat = pykms.PixelFormat.NV12
28*f0687c8aSRaman Tenneti
29*f0687c8aSRaman Tennetiif args.plane == "":
30*f0687c8aSRaman Tenneti	plane = res.reserve_generic_plane(crtc, format)
31*f0687c8aSRaman Tennetielse:
32*f0687c8aSRaman Tenneti	plane = card.planes[int(args.plane)]
33*f0687c8aSRaman Tenneti
34*f0687c8aSRaman Tennetimode = conn.get_default_mode()
35*f0687c8aSRaman Tennetimodeb = mode.to_blob(card)
36*f0687c8aSRaman Tennetireq = pykms.AtomicReq(card)
37*f0687c8aSRaman Tennetireq.add(conn, "CRTC_ID", crtc.id)
38*f0687c8aSRaman Tennetireq.add(crtc, {"ACTIVE": 1,
39*f0687c8aSRaman Tenneti               "MODE_ID": modeb.id})
40*f0687c8aSRaman Tennetir = req.commit_sync(allow_modeset = True)
41*f0687c8aSRaman Tennetiassert r == 0, "Initial commit failed: %d" % r
42*f0687c8aSRaman Tenneti
43*f0687c8aSRaman Tenneti# Initialize framebuffer for the scaled plane
44*f0687c8aSRaman TennetifbX = 1920
45*f0687c8aSRaman TennetifbY = 1080
46*f0687c8aSRaman Tennetifb = pykms.DumbFramebuffer(card, fbX, fbY, format);
47*f0687c8aSRaman Tennetipykms.draw_test_pattern(fb);
48*f0687c8aSRaman Tenneti
49*f0687c8aSRaman Tenneti# max downscale.
50*f0687c8aSRaman Tenneti# The values bellow are for DSS5. For DSS7 use 64 for both.
51*f0687c8aSRaman Tennetimax_downscale_x=5
52*f0687c8aSRaman Tennetimax_downscale_y=8
53*f0687c8aSRaman Tenneti
54*f0687c8aSRaman Tenneti# Plane's initial scaled size
55*f0687c8aSRaman TennetiW = 640
56*f0687c8aSRaman TennetiH = 480
57*f0687c8aSRaman Tenneti
58*f0687c8aSRaman Tenneti# Plane's initial position
59*f0687c8aSRaman TennetiX = 0
60*f0687c8aSRaman TennetiY = 0
61*f0687c8aSRaman Tenneti
62*f0687c8aSRaman Tenneti# initialize increments
63*f0687c8aSRaman TennetiWinc = 1
64*f0687c8aSRaman TennetiHinc = 1
65*f0687c8aSRaman TennetiXinc = 1
66*f0687c8aSRaman TennetiYinc = 1
67*f0687c8aSRaman Tenneti
68*f0687c8aSRaman Tennetiwhile True:
69*f0687c8aSRaman Tenneti	print("+%d+%d %dx%d" % (X, Y, W, H))
70*f0687c8aSRaman Tenneti	plane_commit(card, crtc, plane, fb, X, Y, W, H)
71*f0687c8aSRaman Tenneti	W = W + Winc
72*f0687c8aSRaman Tenneti	H = H + Hinc
73*f0687c8aSRaman Tenneti	if (Winc == 1 and W >= mode.hdisplay - X):
74*f0687c8aSRaman Tenneti		Winc = -1
75*f0687c8aSRaman Tenneti	if (Winc == -1 and W <= fbX/max_downscale_x):
76*f0687c8aSRaman Tenneti		Winc = 1
77*f0687c8aSRaman Tenneti	if (Hinc == 1 and H >= mode.vdisplay - Y):
78*f0687c8aSRaman Tenneti		Hinc = -1
79*f0687c8aSRaman Tenneti	if (Hinc == -1 and H <= fbY/max_downscale_y):
80*f0687c8aSRaman Tenneti		Hinc = 1
81*f0687c8aSRaman Tenneti	X = X + Xinc
82*f0687c8aSRaman Tenneti	Y = Y + Yinc
83*f0687c8aSRaman Tenneti	if (Xinc == 1 and X >= mode.hdisplay - W):
84*f0687c8aSRaman Tenneti		Xinc = -1
85*f0687c8aSRaman Tenneti	if (Xinc == -1 and X <= 0):
86*f0687c8aSRaman Tenneti		Xinc = 1
87*f0687c8aSRaman Tenneti	if (Yinc == 1 and Y >= mode.vdisplay - H):
88*f0687c8aSRaman Tenneti		Yinc = -1
89*f0687c8aSRaman Tenneti	if (Yinc == -1 and Y <= 0):
90*f0687c8aSRaman Tenneti		Yinc = 1
91