1*f0687c8aSRaman Tenneti#!/usr/bin/python3 2*f0687c8aSRaman Tenneti 3*f0687c8aSRaman Tennetiimport sys 4*f0687c8aSRaman Tennetiimport pykms 5*f0687c8aSRaman Tennetiimport selectors 6*f0687c8aSRaman Tenneti 7*f0687c8aSRaman Tennetibar_width = 20 8*f0687c8aSRaman Tennetibar_speed = 8 9*f0687c8aSRaman Tenneti 10*f0687c8aSRaman Tenneticlass FlipHandler(): 11*f0687c8aSRaman Tenneti def __init__(self): 12*f0687c8aSRaman Tenneti super().__init__() 13*f0687c8aSRaman Tenneti self.bar_xpos = 0 14*f0687c8aSRaman Tenneti self.front_buf = 0 15*f0687c8aSRaman Tenneti self.fb1 = pykms.DumbFramebuffer(card, mode.hdisplay, mode.vdisplay, "XR24"); 16*f0687c8aSRaman Tenneti self.fb2 = pykms.DumbFramebuffer(card, mode.hdisplay, mode.vdisplay, "XR24"); 17*f0687c8aSRaman Tenneti self.flips = 0 18*f0687c8aSRaman Tenneti self.frames = 0 19*f0687c8aSRaman Tenneti self.time = 0 20*f0687c8aSRaman Tenneti 21*f0687c8aSRaman Tenneti def handle_page_flip(self, frame, time): 22*f0687c8aSRaman Tenneti self.flips += 1 23*f0687c8aSRaman Tenneti if self.time == 0: 24*f0687c8aSRaman Tenneti self.frames = frame 25*f0687c8aSRaman Tenneti self.time = time 26*f0687c8aSRaman Tenneti 27*f0687c8aSRaman Tenneti time_delta = time - self.time 28*f0687c8aSRaman Tenneti if time_delta >= 5: 29*f0687c8aSRaman Tenneti frame_delta = frame - self.frames 30*f0687c8aSRaman Tenneti print("Frame rate: %f (%u/%u frames in %f s)" % 31*f0687c8aSRaman Tenneti (frame_delta / time_delta, self.flips, frame_delta, time_delta)) 32*f0687c8aSRaman Tenneti 33*f0687c8aSRaman Tenneti self.flips = 0 34*f0687c8aSRaman Tenneti self.frames = frame 35*f0687c8aSRaman Tenneti self.time = time 36*f0687c8aSRaman Tenneti 37*f0687c8aSRaman Tenneti if self.front_buf == 0: 38*f0687c8aSRaman Tenneti fb = self.fb2 39*f0687c8aSRaman Tenneti else: 40*f0687c8aSRaman Tenneti fb = self.fb1 41*f0687c8aSRaman Tenneti 42*f0687c8aSRaman Tenneti self.front_buf = self.front_buf ^ 1 43*f0687c8aSRaman Tenneti 44*f0687c8aSRaman Tenneti current_xpos = self.bar_xpos; 45*f0687c8aSRaman Tenneti old_xpos = (current_xpos + (fb.width - bar_width - bar_speed)) % (fb.width - bar_width); 46*f0687c8aSRaman Tenneti new_xpos = (current_xpos + bar_speed) % (fb.width - bar_width); 47*f0687c8aSRaman Tenneti 48*f0687c8aSRaman Tenneti self.bar_xpos = new_xpos 49*f0687c8aSRaman Tenneti 50*f0687c8aSRaman Tenneti pykms.draw_color_bar(fb, old_xpos, new_xpos, bar_width) 51*f0687c8aSRaman Tenneti 52*f0687c8aSRaman Tenneti if card.has_atomic: 53*f0687c8aSRaman Tenneti ctx = pykms.AtomicReq(card) 54*f0687c8aSRaman Tenneti ctx.add(crtc.primary_plane, "FB_ID", fb.id) 55*f0687c8aSRaman Tenneti ctx.commit() 56*f0687c8aSRaman Tenneti else: 57*f0687c8aSRaman Tenneti crtc.page_flip(fb) 58*f0687c8aSRaman Tenneti 59*f0687c8aSRaman Tennetiif len(sys.argv) > 1: 60*f0687c8aSRaman Tenneti conn_name = sys.argv[1] 61*f0687c8aSRaman Tennetielse: 62*f0687c8aSRaman Tenneti conn_name = '' 63*f0687c8aSRaman Tenneti 64*f0687c8aSRaman Tenneticard = pykms.Card() 65*f0687c8aSRaman Tennetires = pykms.ResourceManager(card) 66*f0687c8aSRaman Tenneticonn = res.reserve_connector(conn_name) 67*f0687c8aSRaman Tenneticrtc = res.reserve_crtc(conn) 68*f0687c8aSRaman Tennetimode = conn.get_default_mode() 69*f0687c8aSRaman Tenneti 70*f0687c8aSRaman Tennetifliphandler = FlipHandler() 71*f0687c8aSRaman Tenneti 72*f0687c8aSRaman Tenneticrtc.set_mode(conn, fliphandler.fb1, mode) 73*f0687c8aSRaman Tenneti 74*f0687c8aSRaman Tennetifliphandler.handle_page_flip(0, 0) 75*f0687c8aSRaman Tenneti 76*f0687c8aSRaman Tennetidef readdrm(fileobj, mask): 77*f0687c8aSRaman Tenneti #print("EVENT"); 78*f0687c8aSRaman Tenneti for ev in card.read_events(): 79*f0687c8aSRaman Tenneti if ev.type == pykms.DrmEventType.FLIP_COMPLETE: 80*f0687c8aSRaman Tenneti fliphandler.handle_page_flip(ev.seq, ev.time) 81*f0687c8aSRaman Tenneti 82*f0687c8aSRaman Tenneti 83*f0687c8aSRaman Tennetidef readkey(fileobj, mask): 84*f0687c8aSRaman Tenneti #print("KEY EVENT"); 85*f0687c8aSRaman Tenneti sys.stdin.readline() 86*f0687c8aSRaman Tenneti exit(0) 87*f0687c8aSRaman Tenneti 88*f0687c8aSRaman Tennetisel = selectors.DefaultSelector() 89*f0687c8aSRaman Tennetisel.register(card.fd, selectors.EVENT_READ, readdrm) 90*f0687c8aSRaman Tennetisel.register(sys.stdin, selectors.EVENT_READ, readkey) 91*f0687c8aSRaman Tenneti 92*f0687c8aSRaman Tennetiwhile True: 93*f0687c8aSRaman Tenneti events = sel.select() 94*f0687c8aSRaman Tenneti for key, mask in events: 95*f0687c8aSRaman Tenneti callback = key.data 96*f0687c8aSRaman Tenneti callback(key.fileobj, mask) 97