From: Marek Olšák Date: Thu, 2 Nov 2017 00:06:43 +0000 (+0100) Subject: gallium/u_threaded: clean up tc_improve_map_buffer_flags and prevent reentry X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a5d3999c31e2460f690b561b41170bb7bc24fc65;p=mesa.git gallium/u_threaded: clean up tc_improve_map_buffer_flags and prevent reentry Reviewed-by: Nicolai Hähnle --- 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 *