def METHOD_NAME(self, fd, args):
    sys.stdout.write(".")
    sys.stdout.flush()
    size = drm_asahi_cmdbuf_t.sizeof()
    cmdbuf = drm_asahi_cmdbuf_t.parse(self.read_buf(args.cmdbuf, size))
    self.log("Pushing objects...")
    for obj in self.bos.values():
        #if obj._skipped_pushes > 64:# and obj._addr > 0x1200000000 and obj._size > 131072:
            #continue
        obj.push(True)
    self.log("Push done")
    attachment_objs = []
    for i in cmdbuf.attachments:
        for obj in self.bos.values():
            if obj._addr == i.pointer:
                attachment_objs.append(obj)
    if self.dump_frames:
        name = f"shim_frame{self.frame:03d}.agx"
        f = GPUFrame(self.renderer.ctx)
        f.cmdbuf = cmdbuf
        for obj in self.bos.values():
            f.add_object(obj)
        f.save(name)
    self.renderer.METHOD_NAME(cmdbuf)
    self.renderer.run()
    self.renderer.wait()
    if self.pull_buffers:
        self.log("Pulling buffers...")
        for obj in attachment_objs:
            obj.pull()
            obj._map[:] = obj.val
            obj.val = obj._map
        self.log("Pull done")
    #print("HEAP STATS")
    #self.ctx.uobj.va.check()
    #self.ctx.gobj.va.check()
    #self.ctx.pobj.va.check()
    #self.agx.kobj.va.check()
    #self.agx.cmdbuf.va.check()
    #self.agx.kshared.va.check()
    #self.agx.kshared2.va.check()
    self.frame += 1
    return 0