improve compile time by type-erasing wgpu structs (#5950)
# Objective
structs containing wgpu types take a long time to compile. this is particularly bad for generics containing the wgpu structs (like the depth pipeline builder with `#[derive(SystemParam)]` i've been working on).
we can avoid that by boxing and type-erasing in the bevy `render_resource` wrappers.
type system magic is not a strength of mine so i guess there will be a cleaner way to achieve this, happy to take feedback or for it to be taken as a proof of concept if someone else wants to do a better job.
## Solution
- add macros to box and type-erase in debug mode
- leave current impl for release mode
timings:
<html xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta name=ProgId content=Excel.Sheet>
<meta name=Generator content="Microsoft Excel 15">
<link id=Main-File rel=Main-File
href="file:///C:/Users/robfm/AppData/Local/Temp/msohtmlclip1/01/clip.htm">
<link rel=File-List
href="file:///C:/Users/robfm/AppData/Local/Temp/msohtmlclip1/01/clip_filelist.xml">
<!--table
{mso-displayed-decimal-separator:"\.";
mso-displayed-thousand-separator:"\,";}
@page
{margin:.75in .7in .75in .7in;
mso-header-margin:.3in;
mso-footer-margin:.3in;}
tr
{mso-height-source:auto;}
col
{mso-width-source:auto;}
br
{mso-data-placement:same-cell;}
td
{padding-top:1px;
padding-right:1px;
padding-left:1px;
mso-ignore:padding;
color:black;
font-size:11.0pt;
font-weight:400;
font-style:normal;
text-decoration:none;
font-family:Calibri, sans-serif;
mso-font-charset:0;
mso-number-format:General;
text-align:general;
vertical-align:bottom;
border:none;
mso-background-source:auto;
mso-pattern:auto;
mso-protection:locked visible;
white-space:nowrap;
mso-rotate:0;}
.xl65
{mso-number-format:0%;}
.xl66
{vertical-align:middle;
white-space:normal;}
.xl67
{vertical-align:middle;}
-->
</head>
<body link="#0563C1" vlink="#954F72">
current | | |
-- | -- | -- | --
| Total time: | 64.9s |
| bevy_pbr v0.9.0-dev | 19.2s |
| bevy_render v0.9.0-dev | 17.0s |
| bevy_sprite v0.9.0-dev | 15.1s |
| DepthPipelineBuilder | 18.7s |
| | |
with type-erasing | | | diff
| Total time: | 49.0s | -24%
| bevy_render v0.9.0-dev | 12.0s | -38%
| bevy_pbr v0.9.0-dev | 8.7s | -49%
| bevy_sprite v0.9.0-dev | 6.1s | -60%
| DepthPipelineBuilder | 1.2s | -94%
</body>
</html>
the depth pipeline builder is a binary with body:
```rust
use std::{marker::PhantomData, hash::Hash};
use bevy::{prelude::*, ecs::system::SystemParam, pbr::{RenderMaterials, MaterialPipeline, ShadowPipeline}, render::{renderer::RenderDevice, render_resource::{SpecializedMeshPipelines, PipelineCache}, render_asset::RenderAssets}};
fn main() {
println!("Hello, world p!\n");
}
#[derive(SystemParam)]
pub struct DepthPipelineBuilder<'w, 's, M: Material>
where M::Data: Eq + Hash + Clone,
{
render_device: Res<'w, RenderDevice>,
material_pipeline: Res<'w, MaterialPipeline<M>>,
material_pipelines: ResMut<'w, SpecializedMeshPipelines<MaterialPipeline<M>>>,
shadow_pipeline: Res<'w, ShadowPipeline>,
pipeline_cache: ResMut<'w, PipelineCache>,
render_meshes: Res<'w, RenderAssets<Mesh>>,
render_materials: Res<'w, RenderMaterials<M>>,
msaa: Res<'w, Msaa>,
#[system_param(ignore)]
_p: PhantomData<&'s M>,
}
```