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