}
if (fence) {
- radeon_fence_reference(fence, NULL);
- *fence = radeon_cs_create_fence(rcs);
+ if (cs->next_fence) {
+ radeon_fence_reference(fence, cs->next_fence);
+ } else {
+ radeon_fence_reference(fence, NULL);
+ *fence = radeon_cs_create_fence(rcs);
+ }
}
+ radeon_fence_reference(&cs->next_fence, NULL);
radeon_drm_cs_sync_flush(rcs);
p_atomic_dec(&cs->ws->num_cs);
radeon_destroy_cs_context(&cs->csc1);
radeon_destroy_cs_context(&cs->csc2);
+ radeon_fence_reference(&cs->next_fence, NULL);
FREE(cs);
}
pb_reference((struct pb_buffer**)dst, (struct pb_buffer*)src);
}
+static struct pipe_fence_handle *
+radeon_drm_cs_get_next_fence(struct radeon_winsys_cs *rcs)
+{
+ struct radeon_drm_cs *cs = radeon_drm_cs(rcs);
+ struct pipe_fence_handle *fence = NULL;
+
+ if (cs->next_fence) {
+ radeon_fence_reference(&fence, cs->next_fence);
+ return fence;
+ }
+
+ fence = radeon_cs_create_fence(rcs);
+ if (!fence)
+ return NULL;
+
+ radeon_fence_reference(&cs->next_fence, fence);
+ return fence;
+}
+
void radeon_drm_cs_init_functions(struct radeon_drm_winsys *ws)
{
ws->base.ctx_create = radeon_drm_ctx_create;
ws->base.cs_check_space = radeon_drm_cs_check_space;
ws->base.cs_get_buffer_list = radeon_drm_cs_get_buffer_list;
ws->base.cs_flush = radeon_drm_cs_flush;
+ ws->base.cs_get_next_fence = radeon_drm_cs_get_next_fence;
ws->base.cs_is_buffer_referenced = radeon_bo_is_referenced;
ws->base.cs_sync_flush = radeon_drm_cs_sync_flush;
ws->base.fence_wait = radeon_fence_wait;