#!/usr/bin/python3 import sys import pykms import selectors bar_width = 20 bar_speed = 8 buffer_cached = False conn_name = '' def usage(argv): print('Usage: %s ' % argv[0]) print('Supported options:') print(' --cached Mapped buffers cached') print(' --help Display this help screen') def parse_arguments(argv): global buffer_cached global conn_name for arg in argv[1:]: if arg.startswith('--'): if arg == '--cached': buffer_cached = True elif arg == '--help': usage(argv) exit(0) else: raise RuntimeError('Invalid argument %s' % arg) else: conn_name = arg class FlipHandler(): def __init__(self): super().__init__() self.bar_xpos = 0 self.front_buf = 0 self.fb1 = pykms.OmapFramebuffer(card, mode.hdisplay, mode.vdisplay, pykms.PixelFormat.XRGB8888, buffer_cached); self.fb2 = pykms.OmapFramebuffer(card, mode.hdisplay, mode.vdisplay, pykms.PixelFormat.XRGB8888, buffer_cached); self.flips = 0 self.frames = 0 self.time = 0 def handle_page_flip(self, frame, time): self.flips += 1 if self.time == 0: self.frames = frame self.time = time time_delta = time - self.time if time_delta >= 5: frame_delta = frame - self.frames print("Frame rate: %f (%u/%u frames in %f s)" % (frame_delta / time_delta, self.flips, frame_delta, time_delta)) self.flips = 0 self.frames = frame self.time = time if self.front_buf == 0: fb = self.fb2 else: fb = self.fb1 self.front_buf = self.front_buf ^ 1 current_xpos = self.bar_xpos; old_xpos = (current_xpos + (fb.width - bar_width - bar_speed)) % (fb.width - bar_width); new_xpos = (current_xpos + bar_speed) % (fb.width - bar_width); self.bar_xpos = new_xpos pykms.draw_color_bar(fb, old_xpos, new_xpos, bar_width) if card.has_atomic: ctx = pykms.AtomicReq(card) ctx.add(crtc.primary_plane, "CRTC_ID", crtc.id) ctx.add(crtc.primary_plane, "FB_ID", fb.id) ctx.commit(self) else: crtc.page_flip(fb, self) parse_arguments(sys.argv) card = pykms.OmapCard() res = pykms.ResourceManager(card) conn = res.reserve_connector(conn_name) crtc = res.reserve_crtc(conn) mode = conn.get_default_mode() fliphandler = FlipHandler() crtc.set_mode(conn, fliphandler.fb1, mode) fliphandler.handle_page_flip(0, 0) def readdrm(fileobj, mask): #print("EVENT"); for ev in card.read_events(): if ev.type == pykms.DrmEventType.FLIP_COMPLETE: ev.data.handle_page_flip(ev.seq, ev.time) def readkey(fileobj, mask): #print("KEY EVENT"); sys.stdin.readline() ctx = pykms.AtomicReq(card) ctx.add(crtc.primary_plane, "CRTC_ID", 0) ctx.add(crtc.primary_plane, "FB_ID", 0) ctx.add(crtc, "ACTIVE", False) # ctx.add(conn, "CRTC_ID", 0) ctx.commit_sync(True) exit(0) sel = selectors.DefaultSelector() sel.register(card.fd, selectors.EVENT_READ, readdrm) sel.register(sys.stdin, selectors.EVENT_READ, readkey) while True: events = sel.select() for key, mask in events: callback = key.data callback(key.fileobj, mask)