|
1640 | 1640 | <a href="#1639" id="1639">1639</a> |
1641 | 1641 | <a href="#1640" id="1640">1640</a> |
1642 | 1642 | <a href="#1641" id="1641">1641</a> |
| 1643 | +<a href="#1642" id="1642">1642</a> |
| 1644 | +<a href="#1643" id="1643">1643</a> |
| 1645 | +<a href="#1644" id="1644">1644</a> |
| 1646 | +<a href="#1645" id="1645">1645</a> |
| 1647 | +<a href="#1646" id="1646">1646</a> |
| 1648 | +<a href="#1647" id="1647">1647</a> |
| 1649 | +<a href="#1648" id="1648">1648</a> |
1643 | 1650 | </pre></div><pre class="rust"><code><span class="kw">use super</span>::{conv, PrivateCapabilities}; |
1644 | 1651 | <span class="kw">use </span><span class="kw">crate</span>::auxil::map_naga_stage; |
1645 | 1652 | <span class="kw">use </span>glow::HasContext; |
|
1650 | 1657 | sync::{Arc, Mutex}, |
1651 | 1658 | }; |
1652 | 1659 |
|
| 1660 | +<span class="kw">use </span><span class="kw">crate</span>::AtomicFenceValue; |
1653 | 1661 | <span class="kw">use </span>arrayvec::ArrayVec; |
1654 | 1662 | <span class="kw">use </span>std::sync::atomic::Ordering; |
1655 | 1663 |
|
|
3176 | 3184 | <span class="kw">unsafe fn </span>create_fence(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="prelude-ty">Result</span><<span class="kw">super</span>::Fence, <span class="kw">crate</span>::DeviceError> { |
3177 | 3185 | <span class="self">self</span>.counters.fences.add(<span class="number">1</span>); |
3178 | 3186 | <span class="prelude-val">Ok</span>(<span class="kw">super</span>::Fence { |
3179 | | - last_completed: <span class="number">0</span>, |
| 3187 | + last_completed: AtomicFenceValue::new(<span class="number">0</span>), |
3180 | 3188 | pending: Vec::new(), |
3181 | 3189 | }) |
3182 | 3190 | } |
|
3202 | 3210 | wait_value: <span class="kw">crate</span>::FenceValue, |
3203 | 3211 | timeout_ms: u32, |
3204 | 3212 | ) -> <span class="prelude-ty">Result</span><bool, <span class="kw">crate</span>::DeviceError> { |
3205 | | - <span class="kw">if </span>fence.last_completed < wait_value { |
| 3213 | + <span class="kw">if </span>fence.last_completed.load(Ordering::Relaxed) < wait_value { |
3206 | 3214 | <span class="kw">let </span>gl = <span class="kw-2">&</span><span class="self">self</span>.shared.context.lock(); |
3207 | 3215 | <span class="kw">let </span>timeout_ns = <span class="kw">if </span><span class="macro">cfg!</span>(any(webgl, Emscripten)) { |
3208 | 3216 | <span class="number">0 |
|
3214 | 3222 | .iter() |
3215 | 3223 | .find(|&&(value, <span class="kw">_</span>)| value >= wait_value) |
3216 | 3224 | { |
3217 | | - <span class="kw">return match unsafe </span>{ |
| 3225 | + <span class="kw">let </span>signalled = <span class="kw">match unsafe </span>{ |
3218 | 3226 | gl.client_wait_sync(sync, glow::SYNC_FLUSH_COMMANDS_BIT, timeout_ns <span class="kw">as </span>i32) |
3219 | 3227 | } { |
3220 | 3228 | <span class="comment">// for some reason firefox returns WAIT_FAILED, to investigate |
3221 | 3229 | </span><span class="attr">#[cfg(any(webgl, Emscripten))] |
3222 | 3230 | </span>glow::WAIT_FAILED => { |
3223 | 3231 | <span class="macro">log::warn!</span>(<span class="string">"wait failed!"</span>); |
3224 | | - <span class="prelude-val">Ok</span>(<span class="bool-val">false</span>) |
3225 | | - } |
3226 | | - glow::TIMEOUT_EXPIRED => <span class="prelude-val">Ok</span>(<span class="bool-val">false</span>), |
3227 | | - glow::CONDITION_SATISFIED | glow::ALREADY_SIGNALED => <span class="prelude-val">Ok</span>(<span class="bool-val">true</span>), |
3228 | | - <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(<span class="kw">crate</span>::DeviceError::Lost), |
| 3232 | + <span class="bool-val">false |
| 3233 | + </span>} |
| 3234 | + glow::TIMEOUT_EXPIRED => <span class="bool-val">false</span>, |
| 3235 | + glow::CONDITION_SATISFIED | glow::ALREADY_SIGNALED => <span class="bool-val">true</span>, |
| 3236 | + <span class="kw">_ </span>=> <span class="kw">return </span><span class="prelude-val">Err</span>(<span class="kw">crate</span>::DeviceError::Lost), |
3229 | 3237 | }; |
| 3238 | + <span class="kw">if </span>signalled { |
| 3239 | + fence |
| 3240 | + .last_completed |
| 3241 | + .fetch_max(wait_value, Ordering::Relaxed); |
| 3242 | + } |
| 3243 | + <span class="kw">return </span><span class="prelude-val">Ok</span>(signalled); |
3230 | 3244 | } |
3231 | 3245 | } |
3232 | 3246 | <span class="prelude-val">Ok</span>(<span class="bool-val">true</span>) |
|
0 commit comments