diff options
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/auxiliary/util/u_threaded_context.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/src/gallium/auxiliary/util/u_threaded_context.c b/src/gallium/auxiliary/util/u_threaded_context.c index 7e28b87a7ff..0f232580532 100644 --- a/src/gallium/auxiliary/util/u_threaded_context.c +++ b/src/gallium/auxiliary/util/u_threaded_context.c @@ -1276,6 +1276,14 @@ tc_improve_map_buffer_flags(struct threaded_context *tc, struct threaded_resource *tres, unsigned usage, unsigned offset, unsigned size) { + /* Never invalidate inside the driver and never infer "unsynchronized". */ + unsigned tc_flags = TC_TRANSFER_MAP_NO_INVALIDATE | + TC_TRANSFER_MAP_NO_INFER_UNSYNCHRONIZED; + + /* Prevent a reentry. */ + if (usage & tc_flags) + return usage; + /* Sparse buffers can't be mapped directly and can't be reallocated * (fully invalidated). That may just be a radeonsi limitation, but * the threaded context must obey it with radeonsi. @@ -1295,12 +1303,12 @@ tc_improve_map_buffer_flags(struct threaded_context *tc, return usage; } + usage |= tc_flags; + /* Handle CPU reads trivially. */ if (usage & PIPE_TRANSFER_READ) { /* Drivers aren't allowed to do buffer invalidations. */ - return (usage & ~PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE) | - TC_TRANSFER_MAP_NO_INVALIDATE | - TC_TRANSFER_MAP_NO_INFER_UNSYNCHRONIZED; + return usage & ~PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE; } /* See if the buffer range being mapped has never been initialized, @@ -1342,10 +1350,7 @@ tc_improve_map_buffer_flags(struct threaded_context *tc, usage |= TC_TRANSFER_MAP_THREADED_UNSYNC; /* notify the driver */ } - /* Never invalidate inside the driver and never infer "unsynchronized". */ - return usage | - TC_TRANSFER_MAP_NO_INVALIDATE | - TC_TRANSFER_MAP_NO_INFER_UNSYNCHRONIZED; + return usage; } static void * |