diff options
-rw-r--r-- | src/gallium/docs/source/context.rst | 23 | ||||
-rw-r--r-- | src/gallium/include/pipe/p_context.h | 11 |
2 files changed, 34 insertions, 0 deletions
diff --git a/src/gallium/docs/source/context.rst b/src/gallium/docs/source/context.rst index d8b25601a62..d70e34e7aa5 100644 --- a/src/gallium/docs/source/context.rst +++ b/src/gallium/docs/source/context.rst @@ -252,6 +252,29 @@ multi-byte element value starting at offset bytes from resource start, going for size bytes. It is guaranteed that size % clear_value_size == 0. +Uploading +^^^^^^^^^ + +For simple single-use uploads, use ``pipe_context::stream_uploader`` or +``pipe_context::const_uploader``. The latter should be used for uploading +constants, while the former should be used for uploading everything else. +PIPE_USAGE_STREAM is implied in both cases, so don't use the uploaders +for static allocations. + +Usage: + +Call u_upload_alloc or u_upload_data as many times as you want. After you are +done, call u_upload_unmap. If the driver doesn't support persistent mappings, +u_upload_unmap makes sure the previously mapped memory is unmapped. + +Gotchas: +- Always fill the memory immediately after u_upload_alloc. Any following call +to u_upload_alloc and u_upload_data can unmap memory returned by previous +u_upload_alloc. +- Don't interleave calls using stream_uploader and const_uploader. If you use +one of them, do the upload, unmap, and only then can you use the other one. + + Drawing ^^^^^^^ diff --git a/src/gallium/include/pipe/p_context.h b/src/gallium/include/pipe/p_context.h index 45098c9c74f..49e366a74eb 100644 --- a/src/gallium/include/pipe/p_context.h +++ b/src/gallium/include/pipe/p_context.h @@ -76,6 +76,7 @@ struct pipe_viewport_state; struct pipe_compute_state; union pipe_color_union; union pipe_query_result; +struct u_upload_mgr; /** * Gallium rendering context. Basically: @@ -89,6 +90,16 @@ struct pipe_context { void *priv; /**< context private data (for DRI for example) */ void *draw; /**< private, for draw module (temporary?) */ + /** + * Stream uploaders created by the driver. All drivers, state trackers, and + * modules should use them. + * + * Use u_upload_alloc or u_upload_data as many times as you want. + * Once you are done, use u_upload_unmap. + */ + struct u_upload_mgr *stream_uploader; /* everything but shader constants */ + struct u_upload_mgr *const_uploader; /* shader constants only */ + void (*destroy)( struct pipe_context * ); /** |