|
742 | 742 | <a href="#741" id="741">741</a> |
743 | 743 | <a href="#742" id="742">742</a> |
744 | 744 | <a href="#743" id="743">743</a> |
745 | | -<a href="#744" id="744">744</a> |
746 | | -<a href="#745" id="745">745</a> |
747 | | -<a href="#746" id="746">746</a> |
748 | | -<a href="#747" id="747">747</a> |
749 | | -<a href="#748" id="748">748</a> |
750 | | -<a href="#749" id="749">749</a> |
751 | | -<a href="#750" id="750">750</a> |
752 | | -<a href="#751" id="751">751</a> |
753 | | -<a href="#752" id="752">752</a> |
754 | | -<a href="#753" id="753">753</a> |
755 | | -<a href="#754" id="754">754</a> |
756 | | -<a href="#755" id="755">755</a> |
757 | | -<a href="#756" id="756">756</a> |
758 | | -<a href="#757" id="757">757</a> |
759 | | -<a href="#758" id="758">758</a> |
760 | | -<a href="#759" id="759">759</a> |
761 | | -<a href="#760" id="760">760</a> |
762 | | -<a href="#761" id="761">761</a> |
763 | | -<a href="#762" id="762">762</a> |
764 | | -<a href="#763" id="763">763</a> |
765 | | -<a href="#764" id="764">764</a> |
766 | | -<a href="#765" id="765">765</a> |
767 | | -<a href="#766" id="766">766</a> |
768 | | -<a href="#767" id="767">767</a> |
769 | 745 | </pre></div><pre class="rust"><code><span class="kw">use </span>std::{ |
770 | 746 | error, fmt, |
771 | 747 | ops::{Bound, Deref, DerefMut, Range, RangeBounds}, |
|
776 | 752 |
|
777 | 753 | <span class="kw">use crate</span>::<span class="kw-2">*</span>; |
778 | 754 |
|
779 | | -<span class="attr">#[derive(Debug)] |
780 | | -</span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">struct </span>BufferShared { |
781 | | - <span class="kw">pub </span>inner: dispatch::DispatchBuffer, |
782 | | - <span class="kw">pub </span>map_context: Mutex<MapContext>, |
783 | | - <span class="kw">pub </span>size: wgt::BufferAddress, |
784 | | - <span class="kw">pub </span>usage: BufferUsages, |
785 | | - <span class="comment">// Todo: missing map_state https://www.w3.org/TR/webgpu/#dom-gpubuffer-mapstate |
786 | | -</span>} |
787 | | - |
788 | 755 | <span class="doccomment">/// Handle to a GPU-accessible buffer. |
789 | 756 | /// |
790 | 757 | /// Created with [`Device::create_buffer`] or |
|
947 | 914 | /// [`MAP_WRITE`]: BufferUsages::MAP_WRITE |
948 | 915 | </span><span class="attr">#[derive(Debug, Clone)] |
949 | 916 | </span><span class="kw">pub struct </span>Buffer { |
950 | | - <span class="kw">pub</span>(<span class="kw">crate</span>) shared: Arc<BufferShared>, |
951 | | -} |
| 917 | + <span class="kw">pub</span>(<span class="kw">crate</span>) inner: dispatch::DispatchBuffer, |
| 918 | + <span class="kw">pub</span>(<span class="kw">crate</span>) map_context: Arc<Mutex<MapContext>>, |
| 919 | + <span class="kw">pub</span>(<span class="kw">crate</span>) size: wgt::BufferAddress, |
| 920 | + <span class="kw">pub</span>(<span class="kw">crate</span>) usage: BufferUsages, |
| 921 | + <span class="comment">// Todo: missing map_state https://www.w3.org/TR/webgpu/#dom-gpubuffer-mapstate |
| 922 | +</span>} |
952 | 923 | <span class="attr">#[cfg(send_sync)] |
953 | 924 | </span><span class="macro">static_assertions::assert_impl_all!</span>(Buffer: Send, Sync); |
954 | 925 |
|
955 | | -<span class="macro">crate::cmp::impl_eq_ord_hash_proxy!</span>(Buffer => .shared.inner); |
| 926 | +<span class="macro">crate::cmp::impl_eq_ord_hash_proxy!</span>(Buffer => .inner); |
956 | 927 |
|
957 | 928 | <span class="kw">impl </span>Buffer { |
958 | 929 | <span class="doccomment">/// Return the binding view of the entire buffer. |
|
980 | 951 | <span class="kw-2">&</span><span class="self">self</span>, |
981 | 952 | hal_buffer_callback: F, |
982 | 953 | ) -> R { |
983 | | - <span class="kw">if let </span><span class="prelude-val">Some</span>(buffer) = <span class="self">self</span>.shared.inner.as_core_opt() { |
| 954 | + <span class="kw">if let </span><span class="prelude-val">Some</span>(buffer) = <span class="self">self</span>.inner.as_core_opt() { |
984 | 955 | <span class="kw">unsafe </span>{ |
985 | 956 | buffer |
986 | 957 | .context |
|
1007 | 978 | /// end of the buffer. |
1008 | 979 | </span><span class="kw">pub fn </span>slice<S: RangeBounds<BufferAddress>>(<span class="kw-2">&</span><span class="self">self</span>, bounds: S) -> BufferSlice<<span class="lifetime">'_</span>> { |
1009 | 980 | <span class="kw">let </span>(offset, size) = range_to_offset_size(bounds); |
1010 | | - check_buffer_bounds(<span class="self">self</span>.shared.size, offset, size); |
| 981 | + check_buffer_bounds(<span class="self">self</span>.size, offset, size); |
1011 | 982 | BufferSlice { |
1012 | 983 | buffer: <span class="self">self</span>, |
1013 | 984 | offset, |
|
1017 | 988 |
|
1018 | 989 | <span class="doccomment">/// Flushes any pending write operations and unmaps the buffer from host memory. |
1019 | 990 | </span><span class="kw">pub fn </span>unmap(<span class="kw-2">&</span><span class="self">self</span>) { |
1020 | | - <span class="self">self</span>.shared.map_context.lock().reset(); |
1021 | | - <span class="self">self</span>.shared.inner.unmap(); |
| 991 | + <span class="self">self</span>.map_context.lock().reset(); |
| 992 | + <span class="self">self</span>.inner.unmap(); |
1022 | 993 | } |
1023 | 994 |
|
1024 | 995 | <span class="doccomment">/// Destroy the associated native resources as soon as possible. |
1025 | 996 | </span><span class="kw">pub fn </span>destroy(<span class="kw-2">&</span><span class="self">self</span>) { |
1026 | | - <span class="self">self</span>.shared.inner.destroy(); |
| 997 | + <span class="self">self</span>.inner.destroy(); |
1027 | 998 | } |
1028 | 999 |
|
1029 | 1000 | <span class="doccomment">/// Returns the length of the buffer allocation in bytes. |
1030 | 1001 | /// |
1031 | 1002 | /// This is always equal to the `size` that was specified when creating the buffer. |
1032 | 1003 | </span><span class="kw">pub fn </span>size(<span class="kw-2">&</span><span class="self">self</span>) -> BufferAddress { |
1033 | | - <span class="self">self</span>.shared.size |
| 1004 | + <span class="self">self</span>.size |
1034 | 1005 | } |
1035 | 1006 |
|
1036 | 1007 | <span class="doccomment">/// Returns the allowed usages for this `Buffer`. |
1037 | 1008 | /// |
1038 | 1009 | /// This is always equal to the `usage` that was specified when creating the buffer. |
1039 | 1010 | </span><span class="kw">pub fn </span>usage(<span class="kw-2">&</span><span class="self">self</span>) -> BufferUsages { |
1040 | | - <span class="self">self</span>.shared.usage |
| 1011 | + <span class="self">self</span>.usage |
1041 | 1012 | } |
1042 | 1013 | } |
1043 | 1014 |
|
|
1104 | 1075 | mode: MapMode, |
1105 | 1076 | callback: <span class="kw">impl </span>FnOnce(<span class="prelude-ty">Result</span><(), BufferAsyncError>) + WasmNotSend + <span class="lifetime">'static</span>, |
1106 | 1077 | ) { |
1107 | | - <span class="kw">let </span><span class="kw-2">mut </span>mc = <span class="self">self</span>.buffer.shared.map_context.lock(); |
| 1078 | + <span class="kw">let </span><span class="kw-2">mut </span>mc = <span class="self">self</span>.buffer.map_context.lock(); |
1108 | 1079 | <span class="macro">assert_eq!</span>(mc.initial_range, <span class="number">0</span>..<span class="number">0</span>, <span class="string">"Buffer is already mapped"</span>); |
1109 | 1080 | <span class="kw">let </span>end = <span class="kw">match </span><span class="self">self</span>.size { |
1110 | 1081 | <span class="prelude-val">Some</span>(s) => <span class="self">self</span>.offset + s.get(), |
|
1113 | 1084 | mc.initial_range = <span class="self">self</span>.offset..end; |
1114 | 1085 |
|
1115 | 1086 | <span class="self">self</span>.buffer |
1116 | | - .shared |
1117 | 1087 | .inner |
1118 | 1088 | .map_async(mode, <span class="self">self</span>.offset..end, Box::new(callback)); |
1119 | 1089 | } |
|
1133 | 1103 | /// |
1134 | 1104 | /// [mapped]: Buffer#mapping-buffers |
1135 | 1105 | </span><span class="kw">pub fn </span>get_mapped_range(<span class="kw-2">&</span><span class="self">self</span>) -> BufferView<<span class="lifetime">'a</span>> { |
1136 | | - <span class="kw">let </span>end = <span class="self">self |
1137 | | - </span>.buffer |
1138 | | - .shared |
1139 | | - .map_context |
1140 | | - .lock() |
1141 | | - .add(<span class="self">self</span>.offset, <span class="self">self</span>.size); |
1142 | | - <span class="kw">let </span>range = <span class="self">self</span>.buffer.shared.inner.get_mapped_range(<span class="self">self</span>.offset..end); |
| 1106 | + <span class="kw">let </span>end = <span class="self">self</span>.buffer.map_context.lock().add(<span class="self">self</span>.offset, <span class="self">self</span>.size); |
| 1107 | + <span class="kw">let </span>range = <span class="self">self</span>.buffer.inner.get_mapped_range(<span class="self">self</span>.offset..end); |
1143 | 1108 | BufferView { |
1144 | 1109 | slice: <span class="kw-2">*</span><span class="self">self</span>, |
1145 | 1110 | inner: range, |
|
1156 | 1121 | /// This is only available on WebGPU, on any other backends this will return `None`. |
1157 | 1122 | </span><span class="attr">#[cfg(webgpu)] |
1158 | 1123 | </span><span class="kw">pub fn </span>get_mapped_range_as_array_buffer(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="prelude-ty">Option</span><js_sys::ArrayBuffer> { |
1159 | | - <span class="kw">let </span>end = <span class="self">self |
1160 | | - </span>.buffer |
1161 | | - .shared |
1162 | | - .map_context |
1163 | | - .lock() |
1164 | | - .add(<span class="self">self</span>.offset, <span class="self">self</span>.size); |
| 1124 | + <span class="kw">let </span>end = <span class="self">self</span>.buffer.map_context.lock().add(<span class="self">self</span>.offset, <span class="self">self</span>.size); |
1165 | 1125 |
|
1166 | 1126 | <span class="self">self</span>.buffer |
1167 | | - .shared |
1168 | 1127 | .inner |
1169 | 1128 | .get_mapped_range_as_array_buffer(<span class="self">self</span>.offset..end) |
1170 | 1129 | } |
|
1184 | 1143 | /// |
1185 | 1144 | /// [mapped]: Buffer#mapping-buffers |
1186 | 1145 | </span><span class="kw">pub fn </span>get_mapped_range_mut(<span class="kw-2">&</span><span class="self">self</span>) -> BufferViewMut<<span class="lifetime">'a</span>> { |
1187 | | - <span class="kw">let </span>end = <span class="self">self |
1188 | | - </span>.buffer |
1189 | | - .shared |
1190 | | - .map_context |
1191 | | - .lock() |
1192 | | - .add(<span class="self">self</span>.offset, <span class="self">self</span>.size); |
1193 | | - <span class="kw">let </span>range = <span class="self">self</span>.buffer.shared.inner.get_mapped_range(<span class="self">self</span>.offset..end); |
| 1146 | + <span class="kw">let </span>end = <span class="self">self</span>.buffer.map_context.lock().add(<span class="self">self</span>.offset, <span class="self">self</span>.size); |
| 1147 | + <span class="kw">let </span>range = <span class="self">self</span>.buffer.inner.get_mapped_range(<span class="self">self</span>.offset..end); |
1194 | 1148 | BufferViewMut { |
1195 | 1149 | slice: <span class="kw-2">*</span><span class="self">self</span>, |
1196 | 1150 | inner: range, |
1197 | | - readable: <span class="self">self</span>.buffer.shared.usage.contains(BufferUsages::MAP_READ), |
| 1151 | + readable: <span class="self">self</span>.buffer.usage.contains(BufferUsages::MAP_READ), |
1198 | 1152 | } |
1199 | 1153 | } |
1200 | 1154 | } |
|
1419 | 1373 | <span class="kw">fn </span>drop(<span class="kw-2">&mut </span><span class="self">self</span>) { |
1420 | 1374 | <span class="self">self</span>.slice |
1421 | 1375 | .buffer |
1422 | | - .shared |
1423 | 1376 | .map_context |
1424 | 1377 | .lock() |
1425 | 1378 | .remove(<span class="self">self</span>.slice.offset, <span class="self">self</span>.slice.size); |
|
1430 | 1383 | <span class="kw">fn </span>drop(<span class="kw-2">&mut </span><span class="self">self</span>) { |
1431 | 1384 | <span class="self">self</span>.slice |
1432 | 1385 | .buffer |
1433 | | - .shared |
1434 | 1386 | .map_context |
1435 | 1387 | .lock() |
1436 | 1388 | .remove(<span class="self">self</span>.slice.offset, <span class="self">self</span>.slice.size); |
|
0 commit comments