@@ -24,7 +24,8 @@ pub async fn start_internal(
24
24
. await
25
25
. expect ( "Failed to find an appropriate adapter" ) ;
26
26
27
- let mut features = wgpu:: Features :: TIMESTAMP_QUERY ;
27
+ let mut features =
28
+ wgpu:: Features :: TIMESTAMP_QUERY | wgpu:: Features :: TIMESTAMP_QUERY_INSIDE_PASSES ;
28
29
if options. force_spirv_passthru {
29
30
features |= wgpu:: Features :: SPIRV_SHADER_PASSTHROUGH ;
30
31
}
@@ -110,10 +111,17 @@ pub async fn start_internal(
110
111
let timestamp_buffer = device. create_buffer ( & wgpu:: BufferDescriptor {
111
112
label : Some ( "Timestamps buffer" ) ,
112
113
size : 16 ,
114
+ usage : wgpu:: BufferUsages :: QUERY_RESOLVE | wgpu:: BufferUsages :: COPY_SRC ,
115
+ mapped_at_creation : false ,
116
+ } ) ;
117
+
118
+ let timestamp_readback_buffer = device. create_buffer ( & wgpu:: BufferDescriptor {
119
+ label : None ,
120
+ size : 16 ,
113
121
usage : wgpu:: BufferUsages :: MAP_READ | wgpu:: BufferUsages :: COPY_DST ,
114
122
mapped_at_creation : true ,
115
123
} ) ;
116
- timestamp_buffer . unmap ( ) ;
124
+ timestamp_readback_buffer . unmap ( ) ;
117
125
118
126
let bind_group = device. create_bind_group ( & wgpu:: BindGroupDescriptor {
119
127
label : None ,
@@ -150,10 +158,17 @@ pub async fn start_internal(
150
158
src. len ( ) as wgpu:: BufferAddress ,
151
159
) ;
152
160
encoder. resolve_query_set ( & queries, 0 ..2 , & timestamp_buffer, 0 ) ;
161
+ encoder. copy_buffer_to_buffer (
162
+ & timestamp_buffer,
163
+ 0 ,
164
+ & timestamp_readback_buffer,
165
+ 0 ,
166
+ timestamp_buffer. size ( ) ,
167
+ ) ;
153
168
154
169
queue. submit ( Some ( encoder. finish ( ) ) ) ;
155
170
let buffer_slice = readback_buffer. slice ( ..) ;
156
- let timestamp_slice = timestamp_buffer . slice ( ..) ;
171
+ let timestamp_slice = timestamp_readback_buffer . slice ( ..) ;
157
172
timestamp_slice. map_async ( wgpu:: MapMode :: Read , |r| r. unwrap ( ) ) ;
158
173
buffer_slice. map_async ( wgpu:: MapMode :: Read , |r| r. unwrap ( ) ) ;
159
174
// NOTE(eddyb) `poll` should return only after the above callbacks fire
@@ -173,7 +188,7 @@ pub async fn start_internal(
173
188
drop ( data) ;
174
189
readback_buffer. unmap ( ) ;
175
190
drop ( timing_data) ;
176
- timestamp_buffer . unmap ( ) ;
191
+ timestamp_readback_buffer . unmap ( ) ;
177
192
let mut max = 0 ;
178
193
for ( src, out) in src_range. zip ( result. iter ( ) . copied ( ) ) {
179
194
if out == u32:: MAX {
0 commit comments