Path: blob/21.2-virgl/src/gallium/winsys/i915/drm/i915_drm_fence.c
4566 views
1#include "i915_drm_winsys.h"2#include "util/u_memory.h"3#include "util/u_atomic.h"4#include "util/u_inlines.h"56/**7* Because gem does not have fence's we have to create our own fences.8*9* They work by keeping the batchbuffer around and checking if that has10* been idled. If bo is NULL fence has expired.11*/12struct i915_drm_fence13{14struct pipe_reference reference;15drm_intel_bo *bo;16};171819struct pipe_fence_handle *20i915_drm_fence_create(drm_intel_bo *bo)21{22struct i915_drm_fence *fence = CALLOC_STRUCT(i915_drm_fence);2324pipe_reference_init(&fence->reference, 1);25/* bo is null if fence already expired */26if (bo) {27drm_intel_bo_reference(bo);28fence->bo = bo;29}3031return (struct pipe_fence_handle *)fence;32}3334static void35i915_drm_fence_reference(struct i915_winsys *iws,36struct pipe_fence_handle **ptr,37struct pipe_fence_handle *fence)38{39struct i915_drm_fence *old = (struct i915_drm_fence *)*ptr;40struct i915_drm_fence *f = (struct i915_drm_fence *)fence;4142if (pipe_reference(&((struct i915_drm_fence *)(*ptr))->reference, &f->reference)) {43if (old->bo)44drm_intel_bo_unreference(old->bo);45FREE(old);46}47*ptr = fence;48}4950static int51i915_drm_fence_signalled(struct i915_winsys *iws,52struct pipe_fence_handle *fence)53{54struct i915_drm_fence *f = (struct i915_drm_fence *)fence;5556/* fence already expired */57if (!f->bo)58return 1;5960return !drm_intel_bo_busy(f->bo);61}6263static int64i915_drm_fence_finish(struct i915_winsys *iws,65struct pipe_fence_handle *fence)66{67struct i915_drm_fence *f = (struct i915_drm_fence *)fence;6869/* fence already expired */70if (!f->bo)71return 0;7273drm_intel_bo_wait_rendering(f->bo);74drm_intel_bo_unreference(f->bo);75f->bo = NULL;7677return 0;78}7980void81i915_drm_winsys_init_fence_functions(struct i915_drm_winsys *idws)82{83idws->base.fence_reference = i915_drm_fence_reference;84idws->base.fence_signalled = i915_drm_fence_signalled;85idws->base.fence_finish = i915_drm_fence_finish;86}878889