Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/crates/bevy_render/src/diagnostic/tracy_gpu.rs
6596 views
1
use crate::renderer::{RenderAdapterInfo, RenderDevice, RenderQueue};
2
use tracy_client::{Client, GpuContext, GpuContextType};
3
use wgpu::{
4
Backend, BufferDescriptor, BufferUsages, CommandEncoderDescriptor, MapMode, PollType,
5
QuerySetDescriptor, QueryType, QUERY_SIZE,
6
};
7
8
pub fn new_tracy_gpu_context(
9
adapter_info: &RenderAdapterInfo,
10
device: &RenderDevice,
11
queue: &RenderQueue,
12
) -> GpuContext {
13
let tracy_gpu_backend = match adapter_info.backend {
14
Backend::Vulkan => GpuContextType::Vulkan,
15
Backend::Dx12 => GpuContextType::Direct3D12,
16
Backend::Gl => GpuContextType::OpenGL,
17
Backend::Metal | Backend::BrowserWebGpu | Backend::Noop => GpuContextType::Invalid,
18
};
19
20
let tracy_client = Client::running().unwrap();
21
tracy_client
22
.new_gpu_context(
23
Some("RenderQueue"),
24
tracy_gpu_backend,
25
initial_timestamp(device, queue),
26
queue.get_timestamp_period(),
27
)
28
.unwrap()
29
}
30
31
// Code copied from https://github.com/Wumpf/wgpu-profiler/blob/f9de342a62cb75f50904a98d11dd2bbeb40ceab8/src/tracy.rs
32
fn initial_timestamp(device: &RenderDevice, queue: &RenderQueue) -> i64 {
33
let query_set = device.wgpu_device().create_query_set(&QuerySetDescriptor {
34
label: None,
35
ty: QueryType::Timestamp,
36
count: 1,
37
});
38
39
let resolve_buffer = device.create_buffer(&BufferDescriptor {
40
label: None,
41
size: QUERY_SIZE as _,
42
usage: BufferUsages::QUERY_RESOLVE | BufferUsages::COPY_SRC,
43
mapped_at_creation: false,
44
});
45
46
let map_buffer = device.create_buffer(&BufferDescriptor {
47
label: None,
48
size: QUERY_SIZE as _,
49
usage: BufferUsages::MAP_READ | BufferUsages::COPY_DST,
50
mapped_at_creation: false,
51
});
52
53
let mut timestamp_encoder = device.create_command_encoder(&CommandEncoderDescriptor::default());
54
timestamp_encoder.write_timestamp(&query_set, 0);
55
timestamp_encoder.resolve_query_set(&query_set, 0..1, &resolve_buffer, 0);
56
// Workaround for https://github.com/gfx-rs/wgpu/issues/6406
57
// TODO when that bug is fixed, merge these encoders together again
58
let mut copy_encoder = device.create_command_encoder(&CommandEncoderDescriptor::default());
59
copy_encoder.copy_buffer_to_buffer(&resolve_buffer, 0, &map_buffer, 0, Some(QUERY_SIZE as _));
60
queue.submit([timestamp_encoder.finish(), copy_encoder.finish()]);
61
62
map_buffer.slice(..).map_async(MapMode::Read, |_| ());
63
device
64
.poll(PollType::Wait)
65
.expect("Failed to poll device for map async");
66
67
let view = map_buffer.slice(..).get_mapped_range();
68
i64::from_le_bytes((*view).try_into().unwrap())
69
}
70
71