diff options
author | Rob Clark <[email protected]> | 2018-07-17 10:14:59 -0400 |
---|---|---|
committer | Rob Clark <[email protected]> | 2018-07-17 11:00:00 -0400 |
commit | 4cf8f329edb3ad3482819de8dc091061ae19c5af (patch) | |
tree | 00bc5e4c414b9a4ae87e254de050c548d1243848 /src/gallium/drivers/freedreno/freedreno_batch.h | |
parent | 4b847b38ae3cfd2bacc2fd5b01478046796c52bf (diff) |
freedreno: re-work fd_batch_reference() locking
Annoyingly we still have to briefly drop the lock to unref resources..
but push the lock down into __fd_batch_destroy() so we can invalidate
the batch and reset resources before dropping the lock.
Signed-off-by: Rob Clark <[email protected]>
Diffstat (limited to 'src/gallium/drivers/freedreno/freedreno_batch.h')
-rw-r--r-- | src/gallium/drivers/freedreno/freedreno_batch.h | 35 |
1 files changed, 18 insertions, 17 deletions
diff --git a/src/gallium/drivers/freedreno/freedreno_batch.h b/src/gallium/drivers/freedreno/freedreno_batch.h index 294eca8f531..4b0539d0062 100644 --- a/src/gallium/drivers/freedreno/freedreno_batch.h +++ b/src/gallium/drivers/freedreno/freedreno_batch.h @@ -228,16 +228,6 @@ void __fd_batch_destroy(struct fd_batch *batch); * __fd_batch_destroy() needs to unref resources) */ -static inline void -fd_batch_reference(struct fd_batch **ptr, struct fd_batch *batch) -{ - struct fd_batch *old_batch = *ptr; - if (pipe_reference_described(&(*ptr)->reference, &batch->reference, - (debug_reference_descriptor)__fd_batch_describe)) - __fd_batch_destroy(old_batch); - *ptr = batch; -} - /* fwd-decl prototypes to untangle header dependency :-/ */ static inline void fd_context_assert_locked(struct fd_context *ctx); static inline void fd_context_lock(struct fd_context *ctx); @@ -248,21 +238,32 @@ fd_batch_reference_locked(struct fd_batch **ptr, struct fd_batch *batch) { struct fd_batch *old_batch = *ptr; + /* only need lock if a reference is dropped: */ if (old_batch) fd_context_assert_locked(old_batch->ctx); - else if (batch) - fd_context_assert_locked(batch->ctx); if (pipe_reference_described(&(*ptr)->reference, &batch->reference, - (debug_reference_descriptor)__fd_batch_describe)) { - struct fd_context *ctx = old_batch->ctx; - fd_context_unlock(ctx); + (debug_reference_descriptor)__fd_batch_describe)) __fd_batch_destroy(old_batch); - fd_context_lock(ctx); - } + *ptr = batch; } +static inline void +fd_batch_reference(struct fd_batch **ptr, struct fd_batch *batch) +{ + struct fd_batch *old_batch = *ptr; + struct fd_context *ctx = old_batch ? old_batch->ctx : NULL; + + if (ctx) + fd_context_lock(ctx); + + fd_batch_reference_locked(ptr, batch); + + if (ctx) + fd_context_unlock(ctx); +} + #include "freedreno_context.h" static inline void |