mirror of
https://github.com/maplibre/maplibre-rs.git
synced 2025-12-08 19:05:57 +00:00
638 lines
28 KiB
HTML
638 lines
28 KiB
HTML
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `maplibre/src/render/resource/surface.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>surface.rs - source</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../../SourceSerif4-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../../FiraSans-Regular.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../../FiraSans-Medium.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../../SourceCodePro-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../../SourceSerif4-Bold.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../../../SourceCodePro-Semibold.ttf.woff2"><link rel="stylesheet" href="../../../../normalize.css"><link rel="stylesheet" href="../../../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" href="../../../../ayu.css" disabled><link rel="stylesheet" href="../../../../dark.css" disabled><link rel="stylesheet" href="../../../../light.css" id="themeStyle"><script id="default-settings" ></script><script src="../../../../storage.js"></script><script defer src="../../../../source-script.js"></script><script defer src="../../../../source-files.js"></script><script defer src="../../../../main.js"></script><noscript><link rel="stylesheet" href="../../../../noscript.css"></noscript><link rel="alternate icon" type="image/png" href="../../../../favicon-16x16.png"><link rel="alternate icon" type="image/png" href="../../../../favicon-32x32.png"><link rel="icon" type="image/svg+xml" href="../../../../favicon.svg"></head><body class="rustdoc source"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="mobile-topbar"><button class="sidebar-menu-toggle">☰</button><a class="sidebar-logo" href="../../../../maplibre/index.html"><div class="logo-container"><img class="rust-logo" src="../../../../rust-logo.svg" alt="logo"></div></a><h2 class="location"></h2></nav><nav class="sidebar"><a class="sidebar-logo" href="../../../../maplibre/index.html"><div class="logo-container"><img class="rust-logo" src="../../../../rust-logo.svg" alt="logo"></div></a></nav><main><div class="width-limiter"><div class="sub-container"><a class="sub-logo-container" href="../../../../maplibre/index.html"><img class="rust-logo" src="../../../../rust-logo.svg" alt="logo"></a><nav class="sub"><form class="search-form"><div class="search-container"><span></span><input class="search-input" name="search" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" title="help" tabindex="-1"><button type="button">?</button></div><div id="settings-menu" tabindex="-1"><a href="../../../../settings.html" title="settings"><img width="22" height="22" alt="Change settings" src="../../../../wheel.svg"></a></div></div></form></nav></div><section id="main-content" class="content"><div class="example-wrap"><pre class="line-numbers"><span id="1">1</span>
|
||
<span id="2">2</span>
|
||
<span id="3">3</span>
|
||
<span id="4">4</span>
|
||
<span id="5">5</span>
|
||
<span id="6">6</span>
|
||
<span id="7">7</span>
|
||
<span id="8">8</span>
|
||
<span id="9">9</span>
|
||
<span id="10">10</span>
|
||
<span id="11">11</span>
|
||
<span id="12">12</span>
|
||
<span id="13">13</span>
|
||
<span id="14">14</span>
|
||
<span id="15">15</span>
|
||
<span id="16">16</span>
|
||
<span id="17">17</span>
|
||
<span id="18">18</span>
|
||
<span id="19">19</span>
|
||
<span id="20">20</span>
|
||
<span id="21">21</span>
|
||
<span id="22">22</span>
|
||
<span id="23">23</span>
|
||
<span id="24">24</span>
|
||
<span id="25">25</span>
|
||
<span id="26">26</span>
|
||
<span id="27">27</span>
|
||
<span id="28">28</span>
|
||
<span id="29">29</span>
|
||
<span id="30">30</span>
|
||
<span id="31">31</span>
|
||
<span id="32">32</span>
|
||
<span id="33">33</span>
|
||
<span id="34">34</span>
|
||
<span id="35">35</span>
|
||
<span id="36">36</span>
|
||
<span id="37">37</span>
|
||
<span id="38">38</span>
|
||
<span id="39">39</span>
|
||
<span id="40">40</span>
|
||
<span id="41">41</span>
|
||
<span id="42">42</span>
|
||
<span id="43">43</span>
|
||
<span id="44">44</span>
|
||
<span id="45">45</span>
|
||
<span id="46">46</span>
|
||
<span id="47">47</span>
|
||
<span id="48">48</span>
|
||
<span id="49">49</span>
|
||
<span id="50">50</span>
|
||
<span id="51">51</span>
|
||
<span id="52">52</span>
|
||
<span id="53">53</span>
|
||
<span id="54">54</span>
|
||
<span id="55">55</span>
|
||
<span id="56">56</span>
|
||
<span id="57">57</span>
|
||
<span id="58">58</span>
|
||
<span id="59">59</span>
|
||
<span id="60">60</span>
|
||
<span id="61">61</span>
|
||
<span id="62">62</span>
|
||
<span id="63">63</span>
|
||
<span id="64">64</span>
|
||
<span id="65">65</span>
|
||
<span id="66">66</span>
|
||
<span id="67">67</span>
|
||
<span id="68">68</span>
|
||
<span id="69">69</span>
|
||
<span id="70">70</span>
|
||
<span id="71">71</span>
|
||
<span id="72">72</span>
|
||
<span id="73">73</span>
|
||
<span id="74">74</span>
|
||
<span id="75">75</span>
|
||
<span id="76">76</span>
|
||
<span id="77">77</span>
|
||
<span id="78">78</span>
|
||
<span id="79">79</span>
|
||
<span id="80">80</span>
|
||
<span id="81">81</span>
|
||
<span id="82">82</span>
|
||
<span id="83">83</span>
|
||
<span id="84">84</span>
|
||
<span id="85">85</span>
|
||
<span id="86">86</span>
|
||
<span id="87">87</span>
|
||
<span id="88">88</span>
|
||
<span id="89">89</span>
|
||
<span id="90">90</span>
|
||
<span id="91">91</span>
|
||
<span id="92">92</span>
|
||
<span id="93">93</span>
|
||
<span id="94">94</span>
|
||
<span id="95">95</span>
|
||
<span id="96">96</span>
|
||
<span id="97">97</span>
|
||
<span id="98">98</span>
|
||
<span id="99">99</span>
|
||
<span id="100">100</span>
|
||
<span id="101">101</span>
|
||
<span id="102">102</span>
|
||
<span id="103">103</span>
|
||
<span id="104">104</span>
|
||
<span id="105">105</span>
|
||
<span id="106">106</span>
|
||
<span id="107">107</span>
|
||
<span id="108">108</span>
|
||
<span id="109">109</span>
|
||
<span id="110">110</span>
|
||
<span id="111">111</span>
|
||
<span id="112">112</span>
|
||
<span id="113">113</span>
|
||
<span id="114">114</span>
|
||
<span id="115">115</span>
|
||
<span id="116">116</span>
|
||
<span id="117">117</span>
|
||
<span id="118">118</span>
|
||
<span id="119">119</span>
|
||
<span id="120">120</span>
|
||
<span id="121">121</span>
|
||
<span id="122">122</span>
|
||
<span id="123">123</span>
|
||
<span id="124">124</span>
|
||
<span id="125">125</span>
|
||
<span id="126">126</span>
|
||
<span id="127">127</span>
|
||
<span id="128">128</span>
|
||
<span id="129">129</span>
|
||
<span id="130">130</span>
|
||
<span id="131">131</span>
|
||
<span id="132">132</span>
|
||
<span id="133">133</span>
|
||
<span id="134">134</span>
|
||
<span id="135">135</span>
|
||
<span id="136">136</span>
|
||
<span id="137">137</span>
|
||
<span id="138">138</span>
|
||
<span id="139">139</span>
|
||
<span id="140">140</span>
|
||
<span id="141">141</span>
|
||
<span id="142">142</span>
|
||
<span id="143">143</span>
|
||
<span id="144">144</span>
|
||
<span id="145">145</span>
|
||
<span id="146">146</span>
|
||
<span id="147">147</span>
|
||
<span id="148">148</span>
|
||
<span id="149">149</span>
|
||
<span id="150">150</span>
|
||
<span id="151">151</span>
|
||
<span id="152">152</span>
|
||
<span id="153">153</span>
|
||
<span id="154">154</span>
|
||
<span id="155">155</span>
|
||
<span id="156">156</span>
|
||
<span id="157">157</span>
|
||
<span id="158">158</span>
|
||
<span id="159">159</span>
|
||
<span id="160">160</span>
|
||
<span id="161">161</span>
|
||
<span id="162">162</span>
|
||
<span id="163">163</span>
|
||
<span id="164">164</span>
|
||
<span id="165">165</span>
|
||
<span id="166">166</span>
|
||
<span id="167">167</span>
|
||
<span id="168">168</span>
|
||
<span id="169">169</span>
|
||
<span id="170">170</span>
|
||
<span id="171">171</span>
|
||
<span id="172">172</span>
|
||
<span id="173">173</span>
|
||
<span id="174">174</span>
|
||
<span id="175">175</span>
|
||
<span id="176">176</span>
|
||
<span id="177">177</span>
|
||
<span id="178">178</span>
|
||
<span id="179">179</span>
|
||
<span id="180">180</span>
|
||
<span id="181">181</span>
|
||
<span id="182">182</span>
|
||
<span id="183">183</span>
|
||
<span id="184">184</span>
|
||
<span id="185">185</span>
|
||
<span id="186">186</span>
|
||
<span id="187">187</span>
|
||
<span id="188">188</span>
|
||
<span id="189">189</span>
|
||
<span id="190">190</span>
|
||
<span id="191">191</span>
|
||
<span id="192">192</span>
|
||
<span id="193">193</span>
|
||
<span id="194">194</span>
|
||
<span id="195">195</span>
|
||
<span id="196">196</span>
|
||
<span id="197">197</span>
|
||
<span id="198">198</span>
|
||
<span id="199">199</span>
|
||
<span id="200">200</span>
|
||
<span id="201">201</span>
|
||
<span id="202">202</span>
|
||
<span id="203">203</span>
|
||
<span id="204">204</span>
|
||
<span id="205">205</span>
|
||
<span id="206">206</span>
|
||
<span id="207">207</span>
|
||
<span id="208">208</span>
|
||
<span id="209">209</span>
|
||
<span id="210">210</span>
|
||
<span id="211">211</span>
|
||
<span id="212">212</span>
|
||
<span id="213">213</span>
|
||
<span id="214">214</span>
|
||
<span id="215">215</span>
|
||
<span id="216">216</span>
|
||
<span id="217">217</span>
|
||
<span id="218">218</span>
|
||
<span id="219">219</span>
|
||
<span id="220">220</span>
|
||
<span id="221">221</span>
|
||
<span id="222">222</span>
|
||
<span id="223">223</span>
|
||
<span id="224">224</span>
|
||
<span id="225">225</span>
|
||
<span id="226">226</span>
|
||
<span id="227">227</span>
|
||
<span id="228">228</span>
|
||
<span id="229">229</span>
|
||
<span id="230">230</span>
|
||
<span id="231">231</span>
|
||
<span id="232">232</span>
|
||
<span id="233">233</span>
|
||
<span id="234">234</span>
|
||
<span id="235">235</span>
|
||
<span id="236">236</span>
|
||
<span id="237">237</span>
|
||
<span id="238">238</span>
|
||
<span id="239">239</span>
|
||
<span id="240">240</span>
|
||
<span id="241">241</span>
|
||
<span id="242">242</span>
|
||
<span id="243">243</span>
|
||
<span id="244">244</span>
|
||
<span id="245">245</span>
|
||
<span id="246">246</span>
|
||
<span id="247">247</span>
|
||
<span id="248">248</span>
|
||
<span id="249">249</span>
|
||
<span id="250">250</span>
|
||
<span id="251">251</span>
|
||
<span id="252">252</span>
|
||
<span id="253">253</span>
|
||
<span id="254">254</span>
|
||
<span id="255">255</span>
|
||
<span id="256">256</span>
|
||
<span id="257">257</span>
|
||
<span id="258">258</span>
|
||
<span id="259">259</span>
|
||
<span id="260">260</span>
|
||
<span id="261">261</span>
|
||
<span id="262">262</span>
|
||
<span id="263">263</span>
|
||
<span id="264">264</span>
|
||
<span id="265">265</span>
|
||
<span id="266">266</span>
|
||
<span id="267">267</span>
|
||
<span id="268">268</span>
|
||
<span id="269">269</span>
|
||
<span id="270">270</span>
|
||
<span id="271">271</span>
|
||
<span id="272">272</span>
|
||
<span id="273">273</span>
|
||
<span id="274">274</span>
|
||
<span id="275">275</span>
|
||
<span id="276">276</span>
|
||
<span id="277">277</span>
|
||
<span id="278">278</span>
|
||
<span id="279">279</span>
|
||
<span id="280">280</span>
|
||
<span id="281">281</span>
|
||
<span id="282">282</span>
|
||
<span id="283">283</span>
|
||
<span id="284">284</span>
|
||
<span id="285">285</span>
|
||
<span id="286">286</span>
|
||
<span id="287">287</span>
|
||
<span id="288">288</span>
|
||
<span id="289">289</span>
|
||
<span id="290">290</span>
|
||
<span id="291">291</span>
|
||
<span id="292">292</span>
|
||
<span id="293">293</span>
|
||
<span id="294">294</span>
|
||
<span id="295">295</span>
|
||
<span id="296">296</span>
|
||
<span id="297">297</span>
|
||
<span id="298">298</span>
|
||
<span id="299">299</span>
|
||
<span id="300">300</span>
|
||
<span id="301">301</span>
|
||
<span id="302">302</span>
|
||
<span id="303">303</span>
|
||
<span id="304">304</span>
|
||
<span id="305">305</span>
|
||
<span id="306">306</span>
|
||
<span id="307">307</span>
|
||
<span id="308">308</span>
|
||
<span id="309">309</span>
|
||
<span id="310">310</span>
|
||
<span id="311">311</span>
|
||
<span id="312">312</span>
|
||
<span id="313">313</span>
|
||
<span id="314">314</span>
|
||
<span id="315">315</span>
|
||
<span id="316">316</span>
|
||
<span id="317">317</span>
|
||
<span id="318">318</span>
|
||
</pre><pre class="rust"><code><span class="doccomment">//! Utilities for handling surfaces which can be either headless or headed. A headed surface has
|
||
//! a handle to a window. A headless surface renders to a texture.
|
||
|
||
</span><span class="kw">use </span>std::{mem::size_of, num::NonZeroU32, sync::Arc};
|
||
|
||
<span class="kw">use </span>log::debug;
|
||
|
||
<span class="kw">use crate</span>::{
|
||
render::{eventually::HasChanged, resource::texture::TextureView, settings::RendererSettings},
|
||
window::{HeadedMapWindow, MapWindow, WindowSize},
|
||
};
|
||
|
||
<span class="kw">pub struct </span>BufferDimensions {
|
||
<span class="kw">pub </span>width: u32,
|
||
<span class="kw">pub </span>height: u32,
|
||
<span class="kw">pub </span>unpadded_bytes_per_row: NonZeroU32,
|
||
<span class="kw">pub </span>padded_bytes_per_row: NonZeroU32,
|
||
}
|
||
|
||
<span class="kw">impl </span>BufferDimensions {
|
||
<span class="kw">fn </span>new(size: WindowSize) -> <span class="self">Self </span>{
|
||
<span class="kw">let </span>bytes_per_pixel = size_of::<u32>() <span class="kw">as </span>u32;
|
||
<span class="kw">let </span>unpadded_bytes_per_row = size.width() * bytes_per_pixel;
|
||
|
||
<span class="kw">let </span>align = wgpu::COPY_BYTES_PER_ROW_ALIGNMENT;
|
||
<span class="kw">let </span>padded_bytes_per_row_padding = (align - unpadded_bytes_per_row % align) % align;
|
||
<span class="kw">let </span>padded_bytes_per_row = unpadded_bytes_per_row + padded_bytes_per_row_padding;
|
||
<span class="self">Self </span>{
|
||
width: size.width(),
|
||
height: size.height(),
|
||
unpadded_bytes_per_row: NonZeroU32::new(unpadded_bytes_per_row)
|
||
.expect(<span class="string">"can not be zero"</span>), <span class="comment">// expect is fine because this can never happen
|
||
</span>padded_bytes_per_row: NonZeroU32::new(padded_bytes_per_row).expect(<span class="string">"can not be zero"</span>),
|
||
}
|
||
}
|
||
}
|
||
|
||
<span class="kw">pub struct </span>WindowHead {
|
||
surface: wgpu::Surface,
|
||
size: WindowSize,
|
||
format: wgpu::TextureFormat,
|
||
present_mode: wgpu::PresentMode,
|
||
}
|
||
|
||
<span class="kw">impl </span>WindowHead {
|
||
<span class="kw">pub fn </span>resize_and_configure(<span class="kw-2">&mut </span><span class="self">self</span>, width: u32, height: u32, device: <span class="kw-2">&</span>wgpu::Device) {
|
||
<span class="self">self</span>.size = WindowSize::new(width, height).unwrap();
|
||
<span class="self">self</span>.configure(device);
|
||
}
|
||
|
||
<span class="kw">pub fn </span>configure(<span class="kw-2">&</span><span class="self">self</span>, device: <span class="kw-2">&</span>wgpu::Device) {
|
||
<span class="kw">let </span>surface_config = wgpu::SurfaceConfiguration {
|
||
alpha_mode: wgpu::CompositeAlphaMode::Auto,
|
||
usage: wgpu::TextureUsages::RENDER_ATTACHMENT,
|
||
format: <span class="self">self</span>.format,
|
||
width: <span class="self">self</span>.size.width(),
|
||
height: <span class="self">self</span>.size.height(),
|
||
present_mode: <span class="self">self</span>.present_mode,
|
||
};
|
||
|
||
<span class="self">self</span>.surface.configure(device, <span class="kw-2">&</span>surface_config);
|
||
}
|
||
|
||
<span class="kw">pub fn </span>recreate_surface<MW>(<span class="kw-2">&mut </span><span class="self">self</span>, window: <span class="kw-2">&</span>MW, instance: <span class="kw-2">&</span>wgpu::Instance)
|
||
<span class="kw">where
|
||
</span>MW: MapWindow + HeadedMapWindow,
|
||
{
|
||
<span class="self">self</span>.surface = <span class="kw">unsafe </span>{ instance.create_surface(window.raw()) };
|
||
}
|
||
|
||
<span class="kw">pub fn </span>surface(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>wgpu::Surface {
|
||
<span class="kw-2">&</span><span class="self">self</span>.surface
|
||
}
|
||
}
|
||
|
||
<span class="kw">pub struct </span>BufferedTextureHead {
|
||
texture: wgpu::Texture,
|
||
texture_format: wgpu::TextureFormat,
|
||
output_buffer: wgpu::Buffer,
|
||
buffer_dimensions: BufferDimensions,
|
||
}
|
||
|
||
<span class="attribute">#[cfg(feature = <span class="string">"headless"</span>)]
|
||
</span><span class="kw">impl </span>BufferedTextureHead {
|
||
<span class="kw">pub fn </span>map_async(<span class="kw-2">&</span><span class="self">self</span>, device: <span class="kw-2">&</span>wgpu::Device) -> wgpu::BufferSlice {
|
||
<span class="comment">// Note that we're not calling `.await` here.
|
||
</span><span class="kw">let </span>buffer_slice = <span class="self">self</span>.output_buffer.slice(..);
|
||
buffer_slice.map_async(wgpu::MapMode::Read, |<span class="kw">_</span>| ());
|
||
|
||
<span class="comment">// Poll the device in a blocking manner so that our future resolves.
|
||
// In an actual application, `device.poll(...)` should
|
||
// be called in an event loop or on another thread.
|
||
</span>device.poll(wgpu::Maintain::Wait);
|
||
buffer_slice
|
||
}
|
||
|
||
<span class="kw">pub fn </span>unmap(<span class="kw-2">&</span><span class="self">self</span>) {
|
||
<span class="self">self</span>.output_buffer.unmap();
|
||
}
|
||
|
||
<span class="kw">pub fn </span>write_png<<span class="lifetime">'a</span>>(<span class="kw-2">&</span><span class="self">self</span>, padded_buffer: <span class="kw-2">&</span>wgpu::BufferView<<span class="lifetime">'a</span>>, png_output_path: <span class="kw-2">&</span>str) {
|
||
<span class="kw">use </span>std::{fs::File, io::Write};
|
||
<span class="kw">let </span><span class="kw-2">mut </span>png_encoder = png::Encoder::new(
|
||
File::create(png_output_path).unwrap(), <span class="comment">// TODO: Remove unwrap
|
||
</span><span class="self">self</span>.buffer_dimensions.width <span class="kw">as </span>u32,
|
||
<span class="self">self</span>.buffer_dimensions.height <span class="kw">as </span>u32,
|
||
);
|
||
png_encoder.set_depth(png::BitDepth::Eight);
|
||
png_encoder.set_color(png::ColorType::Rgba);
|
||
<span class="kw">let </span><span class="kw-2">mut </span>png_writer = png_encoder
|
||
.write_header()
|
||
.unwrap() <span class="comment">// TODO: Remove unwrap
|
||
</span>.into_stream_writer_with_size(
|
||
<span class="self">self</span>.buffer_dimensions.unpadded_bytes_per_row.get() <span class="kw">as </span>usize
|
||
)
|
||
.unwrap(); <span class="comment">// TODO: Remove unwrap
|
||
|
||
// from the padded_buffer we write just the unpadded bytes into the image
|
||
</span><span class="kw">for </span>chunk <span class="kw">in
|
||
</span>padded_buffer.chunks(<span class="self">self</span>.buffer_dimensions.padded_bytes_per_row.get() <span class="kw">as </span>usize)
|
||
{
|
||
png_writer
|
||
.write_all(<span class="kw-2">&</span>chunk[..<span class="self">self</span>.buffer_dimensions.unpadded_bytes_per_row.get() <span class="kw">as </span>usize])
|
||
.unwrap(); <span class="comment">// TODO: Remove unwrap
|
||
</span>}
|
||
png_writer.finish().unwrap(); <span class="comment">// TODO: Remove unwrap
|
||
</span>}
|
||
|
||
<span class="kw">pub fn </span>copy_texture(<span class="kw-2">&</span><span class="self">self</span>) -> wgpu::ImageCopyTexture<<span class="lifetime">'_</span>> {
|
||
<span class="self">self</span>.texture.as_image_copy()
|
||
}
|
||
|
||
<span class="kw">pub fn </span>buffer(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>wgpu::Buffer {
|
||
<span class="kw-2">&</span><span class="self">self</span>.output_buffer
|
||
}
|
||
|
||
<span class="kw">pub fn </span>bytes_per_row(<span class="kw-2">&</span><span class="self">self</span>) -> NonZeroU32 {
|
||
<span class="self">self</span>.buffer_dimensions.padded_bytes_per_row
|
||
}
|
||
}
|
||
|
||
<span class="kw">pub enum </span>Head {
|
||
Headed(WindowHead),
|
||
Headless(Arc<BufferedTextureHead>),
|
||
}
|
||
|
||
<span class="kw">pub struct </span>Surface {
|
||
size: WindowSize,
|
||
head: Head,
|
||
}
|
||
|
||
<span class="kw">impl </span>Surface {
|
||
<span class="kw">pub fn </span>from_surface<MW>(
|
||
surface: wgpu::Surface,
|
||
adapter: <span class="kw-2">&</span>wgpu::Adapter,
|
||
window: <span class="kw-2">&</span>MW,
|
||
settings: <span class="kw-2">&</span>RendererSettings,
|
||
) -> <span class="self">Self
|
||
</span><span class="kw">where
|
||
</span>MW: MapWindow + HeadedMapWindow,
|
||
{
|
||
<span class="kw">let </span>size = window.size();
|
||
|
||
<span class="macro">debug!</span>(
|
||
<span class="string">"supported formats by adapter: {:?}"</span>,
|
||
surface.get_supported_formats(adapter)
|
||
);
|
||
|
||
<span class="kw">let </span>format = settings
|
||
.texture_format
|
||
.or_else(|| surface.get_supported_formats(adapter).first().cloned())
|
||
.unwrap_or(wgpu::TextureFormat::Rgba8Unorm);
|
||
|
||
<span class="self">Self </span>{
|
||
size,
|
||
head: Head::Headed(WindowHead {
|
||
surface,
|
||
size,
|
||
format,
|
||
present_mode: settings.present_mode,
|
||
}),
|
||
}
|
||
}
|
||
|
||
<span class="comment">// TODO: Give better name
|
||
</span><span class="kw">pub fn </span>from_image<MW>(device: <span class="kw-2">&</span>wgpu::Device, window: <span class="kw-2">&</span>MW, settings: <span class="kw-2">&</span>RendererSettings) -> <span class="self">Self
|
||
</span><span class="kw">where
|
||
</span>MW: MapWindow,
|
||
{
|
||
<span class="kw">let </span>size = window.size();
|
||
|
||
<span class="comment">// It is a WebGPU requirement that ImageCopyBuffer.layout.bytes_per_row % wgpu::COPY_BYTES_PER_ROW_ALIGNMENT == 0
|
||
// So we calculate padded_bytes_per_row by rounding unpadded_bytes_per_row
|
||
// up to the next multiple of wgpu::COPY_BYTES_PER_ROW_ALIGNMENT.
|
||
// https://en.wikipedia.org/wiki/Data_structure_alignment#Computing_padding
|
||
</span><span class="kw">let </span>buffer_dimensions = BufferDimensions::new(size);
|
||
|
||
<span class="comment">// The output buffer lets us retrieve the data as an array
|
||
</span><span class="kw">let </span>output_buffer = device.create_buffer(<span class="kw-2">&</span>wgpu::BufferDescriptor {
|
||
label: <span class="prelude-val">Some</span>(<span class="string">"BufferedTextureHead buffer"</span>),
|
||
size: (buffer_dimensions.padded_bytes_per_row.get() * buffer_dimensions.height) <span class="kw">as </span>u64,
|
||
usage: wgpu::BufferUsages::MAP_READ | wgpu::BufferUsages::COPY_DST,
|
||
mapped_at_creation: <span class="bool-val">false</span>,
|
||
});
|
||
|
||
<span class="comment">// FIXME: Is this a sane default?
|
||
</span><span class="kw">let </span>format = settings
|
||
.texture_format
|
||
.unwrap_or(wgpu::TextureFormat::Rgba8Unorm);
|
||
|
||
<span class="kw">let </span>texture_descriptor = wgpu::TextureDescriptor {
|
||
label: <span class="prelude-val">Some</span>(<span class="string">"Surface texture"</span>),
|
||
size: wgpu::Extent3d {
|
||
width: size.width(),
|
||
height: size.height(),
|
||
depth_or_array_layers: <span class="number">1</span>,
|
||
},
|
||
mip_level_count: <span class="number">1</span>,
|
||
sample_count: <span class="number">1</span>,
|
||
dimension: wgpu::TextureDimension::D2,
|
||
format,
|
||
usage: wgpu::TextureUsages::RENDER_ATTACHMENT | wgpu::TextureUsages::COPY_SRC,
|
||
};
|
||
<span class="kw">let </span>texture = device.create_texture(<span class="kw-2">&</span>texture_descriptor);
|
||
|
||
<span class="self">Self </span>{
|
||
size,
|
||
head: Head::Headless(Arc::new(BufferedTextureHead {
|
||
texture,
|
||
texture_format: format,
|
||
output_buffer,
|
||
buffer_dimensions,
|
||
})),
|
||
}
|
||
}
|
||
|
||
<span class="kw">pub fn </span>surface_format(<span class="kw-2">&</span><span class="self">self</span>) -> wgpu::TextureFormat {
|
||
<span class="kw">match </span><span class="kw-2">&</span><span class="self">self</span>.head {
|
||
Head::Headed(headed) => headed.format,
|
||
Head::Headless(headless) => headless.texture_format,
|
||
}
|
||
}
|
||
|
||
<span class="attribute">#[tracing::instrument(name = <span class="string">"create_view"</span>, skip_all)]
|
||
</span><span class="kw">pub fn </span>create_view(<span class="kw-2">&</span><span class="self">self</span>, device: <span class="kw-2">&</span>wgpu::Device) -> TextureView {
|
||
<span class="kw">match </span><span class="kw-2">&</span><span class="self">self</span>.head {
|
||
Head::Headed(window) => {
|
||
<span class="kw">let </span>WindowHead { surface, .. } = window;
|
||
<span class="kw">let </span>frame = <span class="kw">match </span>surface.get_current_texture() {
|
||
<span class="prelude-val">Ok</span>(view) => view,
|
||
<span class="prelude-val">Err</span>(wgpu::SurfaceError::Outdated) => {
|
||
<span class="macro">log::warn!</span>(<span class="string">"surface outdated"</span>);
|
||
window.configure(device);
|
||
surface
|
||
.get_current_texture()
|
||
.expect(<span class="string">"Error reconfiguring surface"</span>)
|
||
}
|
||
err => err.expect(<span class="string">"Failed to acquire next swap chain texture!"</span>),
|
||
};
|
||
frame.into()
|
||
}
|
||
Head::Headless(arc) => arc
|
||
.texture
|
||
.create_view(<span class="kw-2">&</span>wgpu::TextureViewDescriptor::default())
|
||
.into(),
|
||
}
|
||
}
|
||
|
||
<span class="kw">pub fn </span>size(<span class="kw-2">&</span><span class="self">self</span>) -> WindowSize {
|
||
<span class="self">self</span>.size
|
||
}
|
||
|
||
<span class="kw">pub fn </span>resize(<span class="kw-2">&mut </span><span class="self">self</span>, width: u32, height: u32) {
|
||
<span class="self">self</span>.size = WindowSize::new(width, height).expect(<span class="string">"Invalid size for resizing the surface."</span>);
|
||
}
|
||
|
||
<span class="kw">pub fn </span>reconfigure(<span class="kw-2">&mut </span><span class="self">self</span>, device: <span class="kw-2">&</span>wgpu::Device) {
|
||
<span class="kw">match </span><span class="kw-2">&mut </span><span class="self">self</span>.head {
|
||
Head::Headed(window) => {
|
||
<span class="kw">if </span>window.has_changed(<span class="kw-2">&</span>(<span class="self">self</span>.size.width(), <span class="self">self</span>.size.height())) {
|
||
window.resize_and_configure(<span class="self">self</span>.size.width(), <span class="self">self</span>.size.height(), device);
|
||
}
|
||
}
|
||
Head::Headless(<span class="kw">_</span>) => {}
|
||
}
|
||
}
|
||
|
||
<span class="kw">pub fn </span>recreate<MW>(<span class="kw-2">&mut </span><span class="self">self</span>, window: <span class="kw-2">&</span>MW, instance: <span class="kw-2">&</span>wgpu::Instance)
|
||
<span class="kw">where
|
||
</span>MW: MapWindow + HeadedMapWindow,
|
||
{
|
||
<span class="kw">match </span><span class="kw-2">&mut </span><span class="self">self</span>.head {
|
||
Head::Headed(window_head) => {
|
||
<span class="kw">if </span>window_head.has_changed(<span class="kw-2">&</span>(<span class="self">self</span>.size.width(), <span class="self">self</span>.size.height())) {
|
||
window_head.recreate_surface(window, instance);
|
||
}
|
||
}
|
||
Head::Headless(<span class="kw">_</span>) => {}
|
||
}
|
||
}
|
||
|
||
<span class="kw">pub fn </span>head(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>Head {
|
||
<span class="kw-2">&</span><span class="self">self</span>.head
|
||
}
|
||
|
||
<span class="kw">pub fn </span>head_mut(<span class="kw-2">&mut </span><span class="self">self</span>) -> <span class="kw-2">&mut </span>Head {
|
||
<span class="kw-2">&mut </span><span class="self">self</span>.head
|
||
}
|
||
}
|
||
|
||
<span class="kw">impl </span>HasChanged <span class="kw">for </span>WindowHead {
|
||
<span class="doccomment">/// Tuple of width and height
|
||
</span><span class="kw">type </span>Criteria = (u32, u32);
|
||
|
||
<span class="kw">fn </span>has_changed(<span class="kw-2">&</span><span class="self">self</span>, criteria: <span class="kw-2">&</span><span class="self">Self</span>::Criteria) -> bool {
|
||
<span class="self">self</span>.size.width() != criteria.<span class="number">0 </span>|| <span class="self">self</span>.size.height() != criteria.<span class="number">1
|
||
</span>}
|
||
}
|
||
</code></pre></div>
|
||
</section></div></main><div id="rustdoc-vars" data-root-path="../../../../" data-current-crate="maplibre" data-themes="ayu,dark,light" data-resource-suffix="" data-rustdoc-version="1.65.0 (897e37553 2022-11-02)" ></div></body></html> |