Add an fence_class_manager::last_queued_sequence member, since a

sequence number may actually turn up before the corresponding fence
object has been queued on the ring.

Fence drivers can use this member to determine whether a
sequence number must be re-reported.
main
Thomas Hellstrom 2008-01-31 14:11:12 +01:00
parent 47ee6237fe
commit c77b0937f2
2 changed files with 5 additions and 3 deletions

View File

@ -129,8 +129,8 @@ void drm_fence_handler(struct drm_device *dev, uint32_t fence_class,
type |= fence->native_types;
relevant_type = type & fence->type;
new_type = (fence->signaled_types | relevant_type) &
~fence->signaled_types;
new_type = (fence->signaled_types | relevant_type) ^
fence->signaled_types;
if (new_type) {
fence->signaled_types |= new_type;
@ -450,6 +450,7 @@ int drm_fence_object_emit(struct drm_fence_object *fence, uint32_t fence_flags,
if (list_empty(&fc->ring))
fc->highest_waiting_sequence = sequence - 1;
list_add_tail(&fence->ring, &fc->ring);
fc->latest_queued_sequence = sequence;
write_unlock_irqrestore(&fm->lock, flags);
return 0;
}
@ -554,8 +555,8 @@ void drm_fence_manager_init(struct drm_device *dev)
for (i = 0; i < fm->num_classes; ++i) {
fence_class = &fm->fence_class[i];
memset(fence_class, 0, sizeof(*fence_class));
INIT_LIST_HEAD(&fence_class->ring);
fence_class->pending_flush = 0;
DRM_INIT_WAITQUEUE(&fence_class->fence_queue);
}

View File

@ -164,6 +164,7 @@ struct drm_fence_class_manager {
uint32_t waiting_types;
wait_queue_head_t fence_queue;
uint32_t highest_waiting_sequence;
uint32_t latest_queued_sequence;
};
struct drm_fence_manager {