1#[cfg(feature = "trace")]
2mod record;
3
4use core::{convert::Infallible, ops::Range};
5
6use alloc::{string::String, vec::Vec};
7use macro_rules_attribute::apply;
8
9use crate::{
10 command::{serde_object_reference_struct, BasePass, Command, ReferenceType, RenderCommand},
11 id::{markers, PointerId},
12 pipeline::GeneralRenderPipelineDescriptor,
13};
14
15#[cfg(feature = "trace")]
16pub use record::*;
17
18type FileName = String;
19
20pub const FILE_NAME: &str = "trace.ron";
21
22#[allow(clippy::large_enum_variant)]
23#[derive(Debug)]
24#[apply(serde_object_reference_struct)]
25pub enum Action<'a, R: ReferenceType> {
26 Init {
27 desc: crate::device::DeviceDescriptor<'a>,
28 backend: wgt::Backend,
29 },
30 ConfigureSurface(
31 R::Surface,
32 wgt::SurfaceConfiguration<Vec<wgt::TextureFormat>>,
33 ),
34 CreateBuffer(R::Buffer, crate::resource::BufferDescriptor<'a>),
35 FreeBuffer(R::Buffer),
36 DestroyBuffer(R::Buffer),
37 CreateTexture(R::Texture, crate::resource::TextureDescriptor<'a>),
38 FreeTexture(R::Texture),
39 DestroyTexture(R::Texture),
40 CreateTextureView {
41 id: R::TextureView,
42 parent: R::Texture,
43 desc: crate::resource::TextureViewDescriptor<'a>,
44 },
45 DestroyTextureView(R::TextureView),
46 CreateExternalTexture {
47 id: R::ExternalTexture,
48 desc: crate::resource::ExternalTextureDescriptor<'a>,
49 planes: alloc::boxed::Box<[R::TextureView]>,
50 },
51 FreeExternalTexture(R::ExternalTexture),
52 DestroyExternalTexture(R::ExternalTexture),
53 CreateSampler(
54 PointerId<markers::Sampler>,
55 crate::resource::SamplerDescriptor<'a>,
56 ),
57 DestroySampler(PointerId<markers::Sampler>),
58 GetSurfaceTexture {
59 id: R::Texture,
60 parent: R::Surface,
61 },
62 Present(R::Surface),
63 DiscardSurfaceTexture(R::Surface),
64 CreateBindGroupLayout(
65 PointerId<markers::BindGroupLayout>,
66 crate::binding_model::BindGroupLayoutDescriptor<'a>,
67 ),
68 DestroyBindGroupLayout(PointerId<markers::BindGroupLayout>),
69 CreatePipelineLayout(
70 PointerId<markers::PipelineLayout>,
71 crate::binding_model::ResolvedPipelineLayoutDescriptor<
72 'a,
73 PointerId<markers::BindGroupLayout>,
74 >,
75 ),
76 DestroyPipelineLayout(PointerId<markers::PipelineLayout>),
77 CreateBindGroup(PointerId<markers::BindGroup>, TraceBindGroupDescriptor<'a>),
78 DestroyBindGroup(PointerId<markers::BindGroup>),
79 CreateShaderModule {
80 id: PointerId<markers::ShaderModule>,
81 desc: crate::pipeline::ShaderModuleDescriptor<'a>,
82 data: FileName,
83 },
84 CreateShaderModulePassthrough {
85 id: PointerId<markers::ShaderModule>,
86 data: Vec<FileName>,
87
88 entry_point: String,
89 label: crate::Label<'a>,
90 num_workgroups: (u32, u32, u32),
91 runtime_checks: wgt::ShaderRuntimeChecks,
92 },
93 DestroyShaderModule(PointerId<markers::ShaderModule>),
94 CreateComputePipeline {
95 id: PointerId<markers::ComputePipeline>,
96 desc: TraceComputePipelineDescriptor<'a>,
97 },
98 DestroyComputePipeline(PointerId<markers::ComputePipeline>),
99 CreateGeneralRenderPipeline {
100 id: PointerId<markers::RenderPipeline>,
101 desc: TraceGeneralRenderPipelineDescriptor<'a>,
102 },
103 DestroyRenderPipeline(PointerId<markers::RenderPipeline>),
104 CreatePipelineCache {
105 id: PointerId<markers::PipelineCache>,
106 desc: crate::pipeline::PipelineCacheDescriptor<'a>,
107 },
108 DestroyPipelineCache(PointerId<markers::PipelineCache>),
109 CreateRenderBundle {
110 id: R::RenderBundle,
111 desc: crate::command::RenderBundleEncoderDescriptor<'a>,
112 base: BasePass<RenderCommand<R>, Infallible>,
113 },
114 DestroyRenderBundle(PointerId<markers::RenderBundle>),
115 CreateQuerySet {
116 id: PointerId<markers::QuerySet>,
117 desc: crate::resource::QuerySetDescriptor<'a>,
118 },
119 DestroyQuerySet(PointerId<markers::QuerySet>),
120 WriteBuffer {
121 id: R::Buffer,
122 data: FileName,
123 range: Range<wgt::BufferAddress>,
124 queued: bool,
125 },
126 WriteTexture {
127 to: wgt::TexelCopyTextureInfo<R::Texture>,
128 data: FileName,
129 layout: wgt::TexelCopyBufferLayout,
130 size: wgt::Extent3d,
131 },
132 Submit(crate::SubmissionIndex, Vec<Command<R>>),
133 CreateBlas {
134 id: R::Blas,
135 desc: crate::resource::BlasDescriptor<'a>,
136 sizes: wgt::BlasGeometrySizeDescriptors,
137 },
138 DestroyBlas(R::Blas),
139 CreateTlas {
140 id: R::Tlas,
141 desc: crate::resource::TlasDescriptor<'a>,
142 },
143 DestroyTlas(R::Tlas),
144}
145
146pub type TraceBindGroupDescriptor<'a> = crate::binding_model::BindGroupDescriptor<
148 'a,
149 PointerId<markers::BindGroupLayout>,
150 PointerId<markers::Buffer>,
151 PointerId<markers::Sampler>,
152 PointerId<markers::TextureView>,
153 PointerId<markers::Tlas>,
154 PointerId<markers::ExternalTexture>,
155>;
156
157#[doc(hidden)]
161pub type TraceGeneralRenderPipelineDescriptor<'a> = GeneralRenderPipelineDescriptor<
162 'a,
163 PointerId<markers::PipelineLayout>,
164 PointerId<markers::ShaderModule>,
165 PointerId<markers::PipelineCache>,
166>;
167
168#[doc(hidden)]
172pub type TraceComputePipelineDescriptor<'a> = crate::pipeline::ComputePipelineDescriptor<
173 'a,
174 PointerId<markers::PipelineLayout>,
175 PointerId<markers::ShaderModule>,
176 PointerId<markers::PipelineCache>,
177>;