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