- struct vc4_surface *csurf = vc4_surface(vc4->framebuffer.cbufs[0]);
- struct vc4_resource *ctex = vc4_resource(csurf->base.texture);
- struct drm_vc4_submit_cl submit;
- memset(&submit, 0, sizeof(submit));
-
- submit.bo_handles = vc4->bo_handles.base;
- submit.bo_handle_count = (vc4->bo_handles.next -
- vc4->bo_handles.base) / 4;
- submit.bin_cl = vc4->bcl.base;
- submit.bin_cl_len = vc4->bcl.next - vc4->bcl.base;
- submit.render_cl = vc4->rcl.base;
- submit.render_cl_len = vc4->rcl.next - vc4->rcl.base;
- submit.shader_records = vc4->shader_rec.base;
- submit.shader_record_len = vc4->shader_rec.next - vc4->shader_rec.base;
- submit.shader_record_count = vc4->shader_rec_count;
-
-#ifndef USE_VC4_SIMULATOR
- int ret = drmIoctl(vc4->fd, DRM_IOCTL_VC4_SUBMIT_CL, &submit);
- if (ret)
- errx(1, "VC4 submit failed\n");
-#else
- vc4_simulator_flush(vc4, csurf);
-#endif
- vc4_reset_cl(&vc4->bcl);
- vc4_reset_cl(&vc4->rcl);
- vc4_reset_cl(&vc4->shader_rec);
- vc4_reset_cl(&vc4->bo_handles);
- vc4->shader_rec_count = 0;
-
- vc4->needs_flush = false;
- vc4->dirty = ~0;
-
- dump_fbo(vc4, ctex->bo);
+ if (fence) {
+ struct pipe_screen *screen = pctx->screen;
+ struct vc4_fence *f = vc4_fence_create(vc4->screen,
+ vc4->last_emit_seqno);
+ screen->fence_reference(screen, fence, NULL);
+ *fence = (struct pipe_fence_handle *)f;
+ }