aboutsummaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/freedreno/freedreno_batch.h
diff options
context:
space:
mode:
authorRob Clark <[email protected]>2018-07-17 10:14:59 -0400
committerRob Clark <[email protected]>2018-07-17 11:00:00 -0400
commit4cf8f329edb3ad3482819de8dc091061ae19c5af (patch)
tree00bc5e4c414b9a4ae87e254de050c548d1243848 /src/gallium/drivers/freedreno/freedreno_batch.h
parent4b847b38ae3cfd2bacc2fd5b01478046796c52bf (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.h35
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