Path: blob/main/crates/bevy_render/src/diagnostic/tracy_gpu.rs
6596 views
use crate::renderer::{RenderAdapterInfo, RenderDevice, RenderQueue};1use tracy_client::{Client, GpuContext, GpuContextType};2use wgpu::{3Backend, BufferDescriptor, BufferUsages, CommandEncoderDescriptor, MapMode, PollType,4QuerySetDescriptor, QueryType, QUERY_SIZE,5};67pub fn new_tracy_gpu_context(8adapter_info: &RenderAdapterInfo,9device: &RenderDevice,10queue: &RenderQueue,11) -> GpuContext {12let tracy_gpu_backend = match adapter_info.backend {13Backend::Vulkan => GpuContextType::Vulkan,14Backend::Dx12 => GpuContextType::Direct3D12,15Backend::Gl => GpuContextType::OpenGL,16Backend::Metal | Backend::BrowserWebGpu | Backend::Noop => GpuContextType::Invalid,17};1819let tracy_client = Client::running().unwrap();20tracy_client21.new_gpu_context(22Some("RenderQueue"),23tracy_gpu_backend,24initial_timestamp(device, queue),25queue.get_timestamp_period(),26)27.unwrap()28}2930// Code copied from https://github.com/Wumpf/wgpu-profiler/blob/f9de342a62cb75f50904a98d11dd2bbeb40ceab8/src/tracy.rs31fn initial_timestamp(device: &RenderDevice, queue: &RenderQueue) -> i64 {32let query_set = device.wgpu_device().create_query_set(&QuerySetDescriptor {33label: None,34ty: QueryType::Timestamp,35count: 1,36});3738let resolve_buffer = device.create_buffer(&BufferDescriptor {39label: None,40size: QUERY_SIZE as _,41usage: BufferUsages::QUERY_RESOLVE | BufferUsages::COPY_SRC,42mapped_at_creation: false,43});4445let map_buffer = device.create_buffer(&BufferDescriptor {46label: None,47size: QUERY_SIZE as _,48usage: BufferUsages::MAP_READ | BufferUsages::COPY_DST,49mapped_at_creation: false,50});5152let mut timestamp_encoder = device.create_command_encoder(&CommandEncoderDescriptor::default());53timestamp_encoder.write_timestamp(&query_set, 0);54timestamp_encoder.resolve_query_set(&query_set, 0..1, &resolve_buffer, 0);55// Workaround for https://github.com/gfx-rs/wgpu/issues/640656// TODO when that bug is fixed, merge these encoders together again57let mut copy_encoder = device.create_command_encoder(&CommandEncoderDescriptor::default());58copy_encoder.copy_buffer_to_buffer(&resolve_buffer, 0, &map_buffer, 0, Some(QUERY_SIZE as _));59queue.submit([timestamp_encoder.finish(), copy_encoder.finish()]);6061map_buffer.slice(..).map_async(MapMode::Read, |_| ());62device63.poll(PollType::Wait)64.expect("Failed to poll device for map async");6566let view = map_buffer.slice(..).get_mapped_range();67i64::from_le_bytes((*view).try_into().unwrap())68}697071