diff options
author | Marek Olšák <[email protected]> | 2017-11-02 01:06:43 +0100 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2017-11-06 16:23:20 +0100 |
commit | a5d3999c31e2460f690b561b41170bb7bc24fc65 (patch) | |
tree | 08d07f3eb5fcd083541237784dc17a226f863592 /src/gallium/auxiliary | |
parent | 60a9705e0040a0962b82ec5363c14503d8a96d42 (diff) |
gallium/u_threaded: clean up tc_improve_map_buffer_flags and prevent reentry
Reviewed-by: Nicolai Hähnle <[email protected]>
Diffstat (limited to 'src/gallium/auxiliary')
-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 * |