1*f0687c8aSRaman Tenneti#!/usr/bin/python3 2*f0687c8aSRaman Tenneti 3*f0687c8aSRaman Tennetiimport pykms 4*f0687c8aSRaman Tennetiimport sys 5*f0687c8aSRaman Tenneti 6*f0687c8aSRaman Tenneticard = pykms.Card() 7*f0687c8aSRaman Tennetires = pykms.ResourceManager(card) 8*f0687c8aSRaman Tenneti 9*f0687c8aSRaman Tenneticonn1 = False 10*f0687c8aSRaman Tenneticonn2 = False 11*f0687c8aSRaman Tenneti 12*f0687c8aSRaman Tennetifor conn in card.connectors: 13*f0687c8aSRaman Tenneti if not conn1: 14*f0687c8aSRaman Tenneti conn1 = conn 15*f0687c8aSRaman Tenneti elif not conn2: 16*f0687c8aSRaman Tenneti conn2 = conn 17*f0687c8aSRaman Tenneti else: 18*f0687c8aSRaman Tenneti break 19*f0687c8aSRaman Tenneti 20*f0687c8aSRaman Tenneticrtc1 = res.reserve_crtc(conn1) 21*f0687c8aSRaman Tennetimode1 = conn1.get_default_mode() 22*f0687c8aSRaman Tennetimodeb1 = mode1.to_blob(card) 23*f0687c8aSRaman Tennetiprint("CRTC idx %d goes to %s connector" % (crtc1.idx, conn1.fullname)) 24*f0687c8aSRaman Tenneti 25*f0687c8aSRaman Tennetiif conn2: 26*f0687c8aSRaman Tenneti crtc2 = res.reserve_crtc(conn2) 27*f0687c8aSRaman Tenneti mode2 = conn2.get_default_mode() 28*f0687c8aSRaman Tenneti modeb2 = mode2.to_blob(card) 29*f0687c8aSRaman Tenneti print("CRTC idx %d goes to %s connector" % (crtc2.idx, conn2.fullname)) 30*f0687c8aSRaman Tenneti 31*f0687c8aSRaman Tennetifbwidth = 480 32*f0687c8aSRaman Tennetifbheight = 270 33*f0687c8aSRaman Tenneti 34*f0687c8aSRaman Tennetifb = pykms.DumbFramebuffer(card, fbwidth, fbheight, "AR24"); 35*f0687c8aSRaman Tennetipykms.draw_test_pattern(fb); 36*f0687c8aSRaman Tenneti 37*f0687c8aSRaman Tenneti# Disable request 38*f0687c8aSRaman Tenneticard.disable_planes() 39*f0687c8aSRaman Tenneti 40*f0687c8aSRaman Tennetiplane_list = [] 41*f0687c8aSRaman Tenneti 42*f0687c8aSRaman Tennetiwhile True: 43*f0687c8aSRaman Tenneti plane = res.reserve_generic_plane(crtc1) 44*f0687c8aSRaman Tenneti if plane: 45*f0687c8aSRaman Tenneti print("Got plane idx %d" % plane.idx) 46*f0687c8aSRaman Tenneti plane_list.append(plane) 47*f0687c8aSRaman Tenneti else: 48*f0687c8aSRaman Tenneti break 49*f0687c8aSRaman Tenneti 50*f0687c8aSRaman Tennetiprint("Got %d planes" % len(plane_list)) 51*f0687c8aSRaman Tenneti 52*f0687c8aSRaman Tennetireq = pykms.AtomicReq(card) 53*f0687c8aSRaman Tennetireq.add(conn1, "CRTC_ID", crtc1.id) 54*f0687c8aSRaman Tennetireq.add(crtc1, {"ACTIVE": 1, 55*f0687c8aSRaman Tenneti "MODE_ID": modeb1.id}) 56*f0687c8aSRaman Tenneti 57*f0687c8aSRaman Tennetiinput("Press enter to enable crtc idx %d at %s" % (crtc1.idx, conn1.fullname)) 58*f0687c8aSRaman Tennetir = req.commit_sync(allow_modeset = True) 59*f0687c8aSRaman Tenneti 60*f0687c8aSRaman Tennetiprint("Crtc enable request returned %d\n" % r) 61*f0687c8aSRaman Tenneti 62*f0687c8aSRaman Tennetix = 0 63*f0687c8aSRaman Tennetiy = 0 64*f0687c8aSRaman Tennetiz = 0 65*f0687c8aSRaman Tenneti 66*f0687c8aSRaman Tennetifor plane in plane_list: 67*f0687c8aSRaman Tenneti input("Press enter to enable plane idx %d on crtc idx %d" % 68*f0687c8aSRaman Tenneti (plane.idx, crtc1.idx)) 69*f0687c8aSRaman Tenneti req = pykms.AtomicReq(card) 70*f0687c8aSRaman Tenneti req.add(plane, {"FB_ID": fb.id, 71*f0687c8aSRaman Tenneti "CRTC_ID": crtc1.id, 72*f0687c8aSRaman Tenneti "SRC_X": 0 << 16, 73*f0687c8aSRaman Tenneti "SRC_Y": 0 << 16, 74*f0687c8aSRaman Tenneti "SRC_W": fb.width << 16, 75*f0687c8aSRaman Tenneti "SRC_H": fb.height << 16, 76*f0687c8aSRaman Tenneti "CRTC_X": x, 77*f0687c8aSRaman Tenneti "CRTC_Y": y, 78*f0687c8aSRaman Tenneti "CRTC_W": fb.width, 79*f0687c8aSRaman Tenneti "CRTC_H": fb.height, 80*f0687c8aSRaman Tenneti "zpos": z}) 81*f0687c8aSRaman Tenneti r = req.commit_sync() 82*f0687c8aSRaman Tenneti print("Plane enable request returned %d\n" % r) 83*f0687c8aSRaman Tenneti 84*f0687c8aSRaman Tenneti x = x + 50 85*f0687c8aSRaman Tenneti y = y + 50 86*f0687c8aSRaman Tenneti z = z + 1 87*f0687c8aSRaman Tenneti 88*f0687c8aSRaman Tennetiif not conn2: 89*f0687c8aSRaman Tenneti sys.exit() 90*f0687c8aSRaman Tenneti 91*f0687c8aSRaman Tennetireq = pykms.AtomicReq(card) 92*f0687c8aSRaman Tennetireq.add(conn2, "CRTC_ID", crtc2.id) 93*f0687c8aSRaman Tennetireq.add(crtc2, {"ACTIVE": 1, 94*f0687c8aSRaman Tenneti "MODE_ID": modeb2.id}) 95*f0687c8aSRaman Tenneti 96*f0687c8aSRaman Tennetiinput("Press enter to enable crtc idx %d at %s" % (crtc2.idx, conn2.fullname)) 97*f0687c8aSRaman Tennetir = req.commit_sync(allow_modeset = True) 98*f0687c8aSRaman Tennetiprint("Crtc enable request returned %d\n" % r) 99*f0687c8aSRaman Tenneti 100*f0687c8aSRaman Tennetix = 0 101*f0687c8aSRaman Tennetiy = 0 102*f0687c8aSRaman Tennetiz = 0 103*f0687c8aSRaman Tenneti 104*f0687c8aSRaman Tenneti# Code assumes that planes for crtc1 also work for crtc2 105*f0687c8aSRaman Tennetifor plane in reversed(plane_list): 106*f0687c8aSRaman Tenneti 107*f0687c8aSRaman Tenneti input("Press enter to disable plane idx %d on crtc idx %d" % 108*f0687c8aSRaman Tenneti (plane.idx, crtc1.idx)) 109*f0687c8aSRaman Tenneti req = pykms.AtomicReq(card) 110*f0687c8aSRaman Tenneti req.add(plane, {"FB_ID": 0, 111*f0687c8aSRaman Tenneti "CRTC_ID": 0}) 112*f0687c8aSRaman Tenneti r = req.commit_sync(allow_modeset = True) 113*f0687c8aSRaman Tenneti print("Plane disable request returned %d\n" % r) 114*f0687c8aSRaman Tenneti 115*f0687c8aSRaman Tenneti input("Press enter to enable plane idx %d on crtc idx %d" % 116*f0687c8aSRaman Tenneti (plane.idx, crtc2.idx)) 117*f0687c8aSRaman Tenneti req = pykms.AtomicReq(card) 118*f0687c8aSRaman Tenneti req.add(plane, {"FB_ID": fb.id, 119*f0687c8aSRaman Tenneti "CRTC_ID": crtc2.id, 120*f0687c8aSRaman Tenneti "SRC_X": 0 << 16, 121*f0687c8aSRaman Tenneti "SRC_Y": 0 << 16, 122*f0687c8aSRaman Tenneti "SRC_W": fb.width << 16, 123*f0687c8aSRaman Tenneti "SRC_H": fb.height << 16, 124*f0687c8aSRaman Tenneti "CRTC_X": x, 125*f0687c8aSRaman Tenneti "CRTC_Y": y, 126*f0687c8aSRaman Tenneti "CRTC_W": fb.width, 127*f0687c8aSRaman Tenneti "CRTC_H": fb.height, 128*f0687c8aSRaman Tenneti "zpos": z}) 129*f0687c8aSRaman Tenneti r = req.commit_sync(allow_modeset = True) 130*f0687c8aSRaman Tenneti print("Plane enable request returned %d\n" % r) 131*f0687c8aSRaman Tenneti 132*f0687c8aSRaman Tenneti x = x + 50 133*f0687c8aSRaman Tenneti y = y + 50 134*f0687c8aSRaman Tenneti z = z + 1 135*f0687c8aSRaman Tenneti 136*f0687c8aSRaman Tennetiinput("press enter to exit\n") 137