diff options
author | Marek Olšák <[email protected]> | 2019-01-30 17:15:02 -0500 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2019-02-20 21:04:29 -0500 |
commit | 54f7545cd7925db9ff78b9dccbff7406dd2ad4a4 (patch) | |
tree | a513105da8f234ab058e0012802bababeaf5e1e7 /src/gallium/auxiliary/util | |
parent | dc8a2c139dd408a5b6e4365ea885ddda2f893770 (diff) |
gallium/u_upload_mgr: allow use of FLUSH_EXPLICIT with persistent mappings
for radeonsi
Reviewed-by: Nicolai Hähnle <[email protected]>
Tested-by: Dieter Nützel <[email protected]>
Diffstat (limited to 'src/gallium/auxiliary/util')
-rw-r--r-- | src/gallium/auxiliary/util/u_upload_mgr.c | 33 | ||||
-rw-r--r-- | src/gallium/auxiliary/util/u_upload_mgr.h | 4 |
2 files changed, 31 insertions, 6 deletions
diff --git a/src/gallium/auxiliary/util/u_upload_mgr.c b/src/gallium/auxiliary/util/u_upload_mgr.c index f703852be81..c2c0ba957e3 100644 --- a/src/gallium/auxiliary/util/u_upload_mgr.c +++ b/src/gallium/auxiliary/util/u_upload_mgr.c @@ -53,6 +53,7 @@ struct u_upload_mgr { uint8_t *map; /* Pointer to the mapped upload buffer. */ unsigned offset; /* Aligned offset to the upload buffer, pointing * at the first unused byte. */ + unsigned flushed_size; /* Size we have flushed by transfer_flush_region. */ }; @@ -102,27 +103,47 @@ u_upload_create_default(struct pipe_context *pipe) struct u_upload_mgr * u_upload_clone(struct pipe_context *pipe, struct u_upload_mgr *upload) { - return u_upload_create(pipe, upload->default_size, upload->bind, - upload->usage, upload->flags); + 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) + u_upload_enable_flush_explicit(result); + + return result; +} + +void +u_upload_enable_flush_explicit(struct u_upload_mgr *upload) +{ + assert(upload->map_persistent); + upload->map_flags &= ~PIPE_TRANSFER_COHERENT; + upload->map_flags |= PIPE_TRANSFER_FLUSH_EXPLICIT; } static void upload_unmap_internal(struct u_upload_mgr *upload, boolean destroying) { - if (!destroying && upload->map_persistent) + if (!upload->transfer) return; - if (upload->transfer) { + if (upload->map_flags & PIPE_TRANSFER_FLUSH_EXPLICIT) { struct pipe_box *box = &upload->transfer->box; + unsigned flush_offset = box->x + upload->flushed_size; - if (!upload->map_persistent && (int) upload->offset > box->x) { + if (upload->offset > flush_offset) { pipe_buffer_flush_mapped_range(upload->pipe, upload->transfer, - box->x, upload->offset - box->x); + flush_offset, + upload->offset - flush_offset); + upload->flushed_size = upload->offset; } + } + if (destroying || !upload->map_persistent) { pipe_transfer_unmap(upload->pipe, upload->transfer); upload->transfer = NULL; upload->map = NULL; + upload->flushed_size = 0; } } diff --git a/src/gallium/auxiliary/util/u_upload_mgr.h b/src/gallium/auxiliary/util/u_upload_mgr.h index a66b7365565..80832016272 100644 --- a/src/gallium/auxiliary/util/u_upload_mgr.h +++ b/src/gallium/auxiliary/util/u_upload_mgr.h @@ -69,6 +69,10 @@ u_upload_create_default(struct pipe_context *pipe); struct u_upload_mgr * u_upload_clone(struct pipe_context *pipe, struct u_upload_mgr *upload); +/** Whether to use FLUSH_EXPLICIT with persistent mappings. */ +void +u_upload_enable_flush_explicit(struct u_upload_mgr *upload); + /** * Destroy the upload manager. */ |