diff --git a/src/gallium/auxiliary/util/u_range.h b/src/gallium/auxiliary/util/u_range.h index 9a158a4fcf9..90dc80bbc69 100644 --- a/src/gallium/auxiliary/util/u_range.h +++ b/src/gallium/auxiliary/util/u_range.h @@ -36,6 +36,8 @@ #include "os/os_thread.h" #include "pipe/p_state.h" +#include "pipe/p_screen.h" +#include "util/u_atomic.h" #include "util/u_math.h" #include "util/simple_mtx.h" @@ -61,7 +63,8 @@ util_range_add(struct pipe_resource *resource, struct util_range *range, unsigned start, unsigned end) { if (start < range->start || end > range->end) { - if (resource->flags & PIPE_RESOURCE_FLAG_SINGLE_THREAD_USE) { + if (resource->flags & PIPE_RESOURCE_FLAG_SINGLE_THREAD_USE || + p_atomic_read(&resource->screen->num_contexts) == 1) { range->start = MIN2(start, range->start); range->end = MAX2(end, range->end); } else { diff --git a/src/gallium/include/pipe/p_screen.h b/src/gallium/include/pipe/p_screen.h index 78dae7865b2..ae0e08318b3 100644 --- a/src/gallium/include/pipe/p_screen.h +++ b/src/gallium/include/pipe/p_screen.h @@ -68,6 +68,12 @@ struct u_transfer_helper; * context. */ struct pipe_screen { + /** + * Atomically incremented by drivers to track the number of contexts. + * If it's 0, it can be assumed that contexts are not tracked. + * Used by some places to skip locking if num_contexts == 1. + */ + unsigned num_contexts; /** * For drivers using u_transfer_helper: