diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/auxiliary/util/u_upload_mgr.c | 14 | ||||
-rw-r--r-- | src/gallium/auxiliary/util/u_upload_mgr.h | 4 |
2 files changed, 16 insertions, 2 deletions
diff --git a/src/gallium/auxiliary/util/u_upload_mgr.c b/src/gallium/auxiliary/util/u_upload_mgr.c index c2c0ba957e3..73f6cae0b6d 100644 --- a/src/gallium/auxiliary/util/u_upload_mgr.c +++ b/src/gallium/auxiliary/util/u_upload_mgr.c @@ -106,8 +106,10 @@ u_upload_clone(struct pipe_context *pipe, struct u_upload_mgr *upload) struct u_upload_mgr *result = u_upload_create(pipe, upload->default_size, upload->bind, upload->usage, upload->flags); - if (upload->map_persistent && - upload->map_flags & PIPE_TRANSFER_FLUSH_EXPLICIT) + if (!upload->map_persistent && result->map_persistent) + u_upload_disable_persistent(result); + else if (upload->map_persistent && + upload->map_flags & PIPE_TRANSFER_FLUSH_EXPLICIT) u_upload_enable_flush_explicit(result); return result; @@ -121,6 +123,14 @@ u_upload_enable_flush_explicit(struct u_upload_mgr *upload) upload->map_flags |= PIPE_TRANSFER_FLUSH_EXPLICIT; } +void +u_upload_disable_persistent(struct u_upload_mgr *upload) +{ + upload->map_persistent = FALSE; + upload->map_flags &= ~(PIPE_TRANSFER_COHERENT | PIPE_TRANSFER_PERSISTENT); + upload->map_flags |= PIPE_TRANSFER_FLUSH_EXPLICIT; +} + static void upload_unmap_internal(struct u_upload_mgr *upload, boolean destroying) { diff --git a/src/gallium/auxiliary/util/u_upload_mgr.h b/src/gallium/auxiliary/util/u_upload_mgr.h index 80832016272..6a4a60963fe 100644 --- a/src/gallium/auxiliary/util/u_upload_mgr.h +++ b/src/gallium/auxiliary/util/u_upload_mgr.h @@ -73,6 +73,10 @@ u_upload_clone(struct pipe_context *pipe, struct u_upload_mgr *upload); void u_upload_enable_flush_explicit(struct u_upload_mgr *upload); +/** Whether to avoid persistent mappings where available */ +void +u_upload_disable_persistent(struct u_upload_mgr *upload); + /** * Destroy the upload manager. */ |