9191< a href =#91 id =91 data-nosnippet > 91</ a > ///
9292< a href =#92 id =92 data-nosnippet > 92</ a > /// - If the buffer is already mapped.
9393< a href =#93 id =93 data-nosnippet > 93</ a > /// - If the buffer’s [`BufferUsages`] do not allow the requested [`MapMode`].
94- < a href =#94 id =94 data-nosnippet > 94</ a > /// - If the endpoints of this slice are not aligned to [`MAP_ALIGNMENT`] within the buffer.
95- < a href =#95 id =95 data-nosnippet > 95</ a > ///
96- < a href =#96 id =96 data-nosnippet > 96</ a > /// [q::s]: Queue::submit
97- < a href =#97 id =97 data-nosnippet > 97</ a > /// [i::p_a]: Instance::poll_all
98- < a href =#98 id =98 data-nosnippet > 98</ a > /// [d::p]: Device::poll
99- < a href =#99 id =99 data-nosnippet > 99</ a > /// [CEmbos]: CommandEncoder::map_buffer_on_submit
100- < a href =#100 id =100 data-nosnippet > 100</ a > /// [CBmbos]: CommandBuffer::map_buffer_on_submit
101- < a href =#101 id =101 data-nosnippet > 101</ a > /// [RPmbos]: RenderPass::map_buffer_on_submit
102- < a href =#102 id =102 data-nosnippet > 102</ a > /// [CPmbos]: ComputePass::map_buffer_on_submit
103- < a href =#103 id =103 data-nosnippet > 103</ a > </ span > < span class ="kw "> pub fn </ span > map_buffer_on_submit<S: core::ops::RangeBounds<BufferAddress>>(
104- < a href =#104 id =104 data-nosnippet > 104</ a > < span class ="kw-2 "> &</ span > < span class ="self "> self</ span > ,
105- < a href =#105 id =105 data-nosnippet > 105</ a > buffer: < span class ="kw-2 "> &</ span > api::Buffer,
106- < a href =#106 id =106 data-nosnippet > 106</ a > mode: MapMode,
107- < a href =#107 id =107 data-nosnippet > 107</ a > bounds: S,
108- < a href =#108 id =108 data-nosnippet > 108</ a > callback: < span class ="kw "> impl </ span > FnOnce(< span class ="prelude-ty "> Result</ span > <(), BufferAsyncError>) + WasmNotSend + < span class ="lifetime "> 'static</ span > ,
109- < a href =#109 id =109 data-nosnippet > 109</ a > ) {
110- < a href =#110 id =110 data-nosnippet > 110</ a > < span class ="kw "> let </ span > (offset, size) = range_to_offset_size(bounds, buffer.size);
111- < a href =#111 id =111 data-nosnippet > 111</ a > < span class ="self "> self</ span > .actions.lock().buffer_mappings.push(
112- < a href =#112 id =112 data-nosnippet > 112</ a > < span class ="kw "> crate</ span > ::api::command_buffer_actions::DeferredBufferMapping {
113- < a href =#113 id =113 data-nosnippet > 113</ a > buffer: buffer.clone(),
114- < a href =#114 id =114 data-nosnippet > 114</ a > mode,
115- < a href =#115 id =115 data-nosnippet > 115</ a > offset,
116- < a href =#116 id =116 data-nosnippet > 116</ a > size,
117- < a href =#117 id =117 data-nosnippet > 117</ a > callback: alloc::boxed::Box::new(callback),
118- < a href =#118 id =118 data-nosnippet > 118</ a > },
119- < a href =#119 id =119 data-nosnippet > 119</ a > );
120- < a href =#120 id =120 data-nosnippet > 120</ a > }
121- < a href =#121 id =121 data-nosnippet > 121</ a >
122- < a href =#122 id =122 data-nosnippet > 122</ a > < span class ="doccomment "> /// Registers a callback that is invoked when this command buffer’s work finishes
123- < a href =#123 id =123 data-nosnippet > 123</ a > /// executing on the GPU. When this callback runs, all mapped-buffer callbacks
124- < a href =#124 id =124 data-nosnippet > 124</ a > /// registered for the same submission are guaranteed to have been called.
125- < a href =#125 id =125 data-nosnippet > 125</ a > ///
126- < a href =#126 id =126 data-nosnippet > 126</ a > /// For the callback to run, either [`queue.submit(..)`][q::s], [`instance.poll_all(..)`][i::p_a],
127- < a href =#127 id =127 data-nosnippet > 127</ a > /// or [`device.poll(..)`][d::p] must be called elsewhere in the runtime, possibly integrated
128- < a href =#128 id =128 data-nosnippet > 128</ a > /// into an event loop or run on a separate thread.
129- < a href =#129 id =129 data-nosnippet > 129</ a > ///
130- < a href =#130 id =130 data-nosnippet > 130</ a > /// The callback runs on the thread that first calls one of the above functions
131- < a href =#131 id =131 data-nosnippet > 131</ a > /// after the GPU work completes. There are no restrictions on the code you can run
132- < a href =#132 id =132 data-nosnippet > 132</ a > /// in the callback; however, on native the polling call will not return until the
133- < a href =#133 id =133 data-nosnippet > 133</ a > /// callback finishes, so keep callbacks short (set flags, send messages, etc.).
134- < a href =#134 id =134 data-nosnippet > 134</ a > ///
135- < a href =#135 id =135 data-nosnippet > 135</ a > /// [q::s]: Queue::submit
136- < a href =#136 id =136 data-nosnippet > 136</ a > /// [i::p_a]: Instance::poll_all
137- < a href =#137 id =137 data-nosnippet > 137</ a > /// [d::p]: Device::poll
138- < a href =#138 id =138 data-nosnippet > 138</ a > </ span > < span class ="kw "> pub fn </ span > on_submitted_work_done(< span class ="kw-2 "> &</ span > < span class ="self "> self</ span > , callback: < span class ="kw "> impl </ span > FnOnce() + Send + < span class ="lifetime "> 'static</ span > ) {
139- < a href =#139 id =139 data-nosnippet > 139</ a > < span class ="self "> self</ span > .actions
140- < a href =#140 id =140 data-nosnippet > 140</ a > .lock()
141- < a href =#141 id =141 data-nosnippet > 141</ a > .on_submitted_work_done_callbacks
142- < a href =#142 id =142 data-nosnippet > 142</ a > .push(alloc::boxed::Box::new(callback));
143- < a href =#143 id =143 data-nosnippet > 143</ a > }
144- < a href =#144 id =144 data-nosnippet > 144</ a > };
145- < a href =#145 id =145 data-nosnippet > 145</ a > }
146- < a href =#146 id =146 data-nosnippet > 146</ a >
147- < a href =#147 id =147 data-nosnippet > 147</ a > < span class ="kw "> pub</ span > (< span class ="kw "> crate</ span > ) < span class ="kw "> use </ span > impl_deferred_command_buffer_actions;</ code > </ pre > </ div > </ section > </ main > </ body > </ html >
94+ < a href =#94 id =94 data-nosnippet > 94</ a > /// - If `bounds` is outside of the bounds of `buffer`.
95+ < a href =#95 id =95 data-nosnippet > 95</ a > /// - If `bounds` does not start at a multiple of [`MAP_ALIGNMENT`].
96+ < a href =#96 id =96 data-nosnippet > 96</ a > /// - If `bounds` has a length that is not a multiple of 4 greater than 0.
97+ < a href =#97 id =97 data-nosnippet > 97</ a > ///
98+ < a href =#98 id =98 data-nosnippet > 98</ a > /// [q::s]: Queue::submit
99+ < a href =#99 id =99 data-nosnippet > 99</ a > /// [i::p_a]: Instance::poll_all
100+ < a href =#100 id =100 data-nosnippet > 100</ a > /// [d::p]: Device::poll
101+ < a href =#101 id =101 data-nosnippet > 101</ a > /// [CEmbos]: CommandEncoder::map_buffer_on_submit
102+ < a href =#102 id =102 data-nosnippet > 102</ a > /// [CBmbos]: CommandBuffer::map_buffer_on_submit
103+ < a href =#103 id =103 data-nosnippet > 103</ a > /// [RPmbos]: RenderPass::map_buffer_on_submit
104+ < a href =#104 id =104 data-nosnippet > 104</ a > /// [CPmbos]: ComputePass::map_buffer_on_submit
105+ < a href =#105 id =105 data-nosnippet > 105</ a > </ span > < span class ="kw "> pub fn </ span > map_buffer_on_submit<S: core::ops::RangeBounds<BufferAddress>>(
106+ < a href =#106 id =106 data-nosnippet > 106</ a > < span class ="kw-2 "> &</ span > < span class ="self "> self</ span > ,
107+ < a href =#107 id =107 data-nosnippet > 107</ a > buffer: < span class ="kw-2 "> &</ span > api::Buffer,
108+ < a href =#108 id =108 data-nosnippet > 108</ a > mode: MapMode,
109+ < a href =#109 id =109 data-nosnippet > 109</ a > bounds: S,
110+ < a href =#110 id =110 data-nosnippet > 110</ a > callback: < span class ="kw "> impl </ span > FnOnce(< span class ="prelude-ty "> Result</ span > <(), BufferAsyncError>) + WasmNotSend + < span class ="lifetime "> 'static</ span > ,
111+ < a href =#111 id =111 data-nosnippet > 111</ a > ) {
112+ < a href =#112 id =112 data-nosnippet > 112</ a > < span class ="kw "> let </ span > (offset, size) = range_to_offset_size(bounds, buffer.size);
113+ < a href =#113 id =113 data-nosnippet > 113</ a > < span class ="self "> self</ span > .actions.lock().buffer_mappings.push(
114+ < a href =#114 id =114 data-nosnippet > 114</ a > < span class ="kw "> crate</ span > ::api::command_buffer_actions::DeferredBufferMapping {
115+ < a href =#115 id =115 data-nosnippet > 115</ a > buffer: buffer.clone(),
116+ < a href =#116 id =116 data-nosnippet > 116</ a > mode,
117+ < a href =#117 id =117 data-nosnippet > 117</ a > offset,
118+ < a href =#118 id =118 data-nosnippet > 118</ a > size,
119+ < a href =#119 id =119 data-nosnippet > 119</ a > callback: alloc::boxed::Box::new(callback),
120+ < a href =#120 id =120 data-nosnippet > 120</ a > },
121+ < a href =#121 id =121 data-nosnippet > 121</ a > );
122+ < a href =#122 id =122 data-nosnippet > 122</ a > }
123+ < a href =#123 id =123 data-nosnippet > 123</ a >
124+ < a href =#124 id =124 data-nosnippet > 124</ a > < span class ="doccomment "> /// Registers a callback that is invoked when this command buffer’s work finishes
125+ < a href =#125 id =125 data-nosnippet > 125</ a > /// executing on the GPU. When this callback runs, all mapped-buffer callbacks
126+ < a href =#126 id =126 data-nosnippet > 126</ a > /// registered for the same submission are guaranteed to have been called.
127+ < a href =#127 id =127 data-nosnippet > 127</ a > ///
128+ < a href =#128 id =128 data-nosnippet > 128</ a > /// For the callback to run, either [`queue.submit(..)`][q::s], [`instance.poll_all(..)`][i::p_a],
129+ < a href =#129 id =129 data-nosnippet > 129</ a > /// or [`device.poll(..)`][d::p] must be called elsewhere in the runtime, possibly integrated
130+ < a href =#130 id =130 data-nosnippet > 130</ a > /// into an event loop or run on a separate thread.
131+ < a href =#131 id =131 data-nosnippet > 131</ a > ///
132+ < a href =#132 id =132 data-nosnippet > 132</ a > /// The callback runs on the thread that first calls one of the above functions
133+ < a href =#133 id =133 data-nosnippet > 133</ a > /// after the GPU work completes. There are no restrictions on the code you can run
134+ < a href =#134 id =134 data-nosnippet > 134</ a > /// in the callback; however, on native the polling call will not return until the
135+ < a href =#135 id =135 data-nosnippet > 135</ a > /// callback finishes, so keep callbacks short (set flags, send messages, etc.).
136+ < a href =#136 id =136 data-nosnippet > 136</ a > ///
137+ < a href =#137 id =137 data-nosnippet > 137</ a > /// [q::s]: Queue::submit
138+ < a href =#138 id =138 data-nosnippet > 138</ a > /// [i::p_a]: Instance::poll_all
139+ < a href =#139 id =139 data-nosnippet > 139</ a > /// [d::p]: Device::poll
140+ < a href =#140 id =140 data-nosnippet > 140</ a > </ span > < span class ="kw "> pub fn </ span > on_submitted_work_done(< span class ="kw-2 "> &</ span > < span class ="self "> self</ span > , callback: < span class ="kw "> impl </ span > FnOnce() + Send + < span class ="lifetime "> 'static</ span > ) {
141+ < a href =#141 id =141 data-nosnippet > 141</ a > < span class ="self "> self</ span > .actions
142+ < a href =#142 id =142 data-nosnippet > 142</ a > .lock()
143+ < a href =#143 id =143 data-nosnippet > 143</ a > .on_submitted_work_done_callbacks
144+ < a href =#144 id =144 data-nosnippet > 144</ a > .push(alloc::boxed::Box::new(callback));
145+ < a href =#145 id =145 data-nosnippet > 145</ a > }
146+ < a href =#146 id =146 data-nosnippet > 146</ a > };
147+ < a href =#147 id =147 data-nosnippet > 147</ a > }
148+ < a href =#148 id =148 data-nosnippet > 148</ a >
149+ < a href =#149 id =149 data-nosnippet > 149</ a > < span class ="kw "> pub</ span > (< span class ="kw "> crate</ span > ) < span class ="kw "> use </ span > impl_deferred_command_buffer_actions;</ code > </ pre > </ div > </ section > </ main > </ body > </ html >
0 commit comments