diff --git a/Cargo.lock b/Cargo.lock index ee3ed003d..e9a4e5180 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3227,6 +3227,20 @@ name = "profiling" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74605f360ce573babfe43964cbe520294dcb081afbf8c108fc6e23036b4da2df" +dependencies = [ + "profiling-procmacros", + "tracy-client", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a1e2417ef905b8ad94215f8a607bd2d0f5d13d416d18dca4a530811e8a0674c" +dependencies = [ + "quote", + "syn", +] [[package]] name = "quick-xml" @@ -3586,13 +3600,14 @@ dependencies = [ "futures", "gc-arena", "image", - "log", "naga-agal", "once_cell", "ouroboros", + "profiling", "raw-window-handle 0.5.0", "ruffle_render", "swf", + "tracing", "typed-arena", "web-sys", "wgpu", @@ -4505,9 +4520,9 @@ dependencies = [ [[package]] name = "tracing-tracy" -version = "0.10.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74513033e242c0109c2ba9cb6d94117a53dbd6511eb135f5512143136eeba311" +checksum = "ed3ebef1f9f0d00aaa29239537effef65b82c56040c680f540fc6cedfac7b230" dependencies = [ "tracing-core", "tracing-subscriber", @@ -4527,9 +4542,9 @@ dependencies = [ [[package]] name = "tracy-client" -version = "0.15.0" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c615e58172e788a208faee61b74988cd9c4778bc782384bed540b3fa4e5d4436" +checksum = "8b3b9ab635a5b91dd66b7a1591a89f7d52423e6a9143b230bb4c503f41296c0c" dependencies = [ "loom", "once_cell", diff --git a/desktop/Cargo.toml b/desktop/Cargo.toml index 0f07a872d..35a1e3260 100644 --- a/desktop/Cargo.toml +++ b/desktop/Cargo.toml @@ -25,7 +25,9 @@ isahc = "1.7.2" rfd = "0.10.0" anyhow = "1.0" bytemuck = "1.12.3" -tracing-tracy = { version = "0.10.1", optional = true } + +# Deliberately held back to match tracy client used by profiling crate +tracing-tracy = { version = "=0.10.0", optional = true } [target.'cfg(windows)'.dependencies] winapi = "0.3.9" @@ -40,7 +42,7 @@ default = ["software_video"] avm_debug = ["ruffle_core/avm_debug"] lzma = ["ruffle_core/lzma"] software_video = ["ruffle_video_software"] -tracy = ["tracing-tracy"] +tracy = ["tracing-tracy", "ruffle_render_wgpu/profile-with-tracy"] # wgpu features render_debug_labels = ["ruffle_render_wgpu/render_debug_labels"] diff --git a/render/wgpu/Cargo.toml b/render/wgpu/Cargo.toml index d1c90afb6..35782cf90 100644 --- a/render/wgpu/Cargo.toml +++ b/render/wgpu/Cargo.toml @@ -9,7 +9,7 @@ version.workspace = true [dependencies] wgpu = { git = "https://github.com/gfx-rs/wgpu", rev = "630c12fe47a7bc0dc9ec6217f3903ec6fd6e3fac", features = ["naga"] } -log = "0.4" +tracing = "0.1.37" ruffle_render = { path = "..", features = ["tessellator"] } bytemuck = { version = "1.12.3", features = ["derive"] } raw-window-handle = "0.5" @@ -24,6 +24,7 @@ once_cell = "1.17.0" gc-arena = { workspace = true } naga-agal = { path = "../naga-agal" } downcast-rs = "1.2.0" +profiling = { version = "1.0", default-features = false, optional = true } # desktop [target.'cfg(not(target_family = "wasm"))'.dependencies.futures] @@ -38,3 +39,4 @@ features = ["HtmlCanvasElement"] render_debug_labels = [] render_trace = ["wgpu/trace"] webgl = ["wgpu/webgl"] +profile-with-tracy = ["profiling", "profiling/profile-with-tracy"] diff --git a/render/wgpu/src/backend.rs b/render/wgpu/src/backend.rs index 47c9b11e5..e23a670ae 100644 --- a/render/wgpu/src/backend.rs +++ b/render/wgpu/src/backend.rs @@ -22,6 +22,7 @@ use std::num::NonZeroU32; use std::path::Path; use std::sync::Arc; use swf::Color; +use tracing::instrument; use wgpu::Extent3d; pub struct WgpuRenderBackend { @@ -72,7 +73,7 @@ impl WgpuRenderBackend { trace_path: Option<&Path>, ) -> Result { if wgpu::Backends::SECONDARY.contains(backend) { - log::warn!( + tracing::warn!( "{} graphics backend support may not be fully supported.", format_list(&get_backend_names(backend), "and") ); @@ -100,7 +101,7 @@ impl WgpuRenderBackend { trace_path: Option<&Path>, ) -> Result { if wgpu::Backends::SECONDARY.contains(backend) { - log::warn!( + tracing::warn!( "{} graphics backend support may not be fully supported.", format_list(&get_backend_names(backend), "and") ); @@ -298,6 +299,7 @@ impl RenderBackend for WgpuRenderBackend { ))) } + #[instrument(level = "debug", skip_all)] fn context3d_present<'gc>( &mut self, context: &mut dyn Context3D, @@ -346,6 +348,7 @@ impl RenderBackend for WgpuRenderBackend { } } + #[instrument(level = "debug", skip_all)] fn register_shape( &mut self, shape: DistilledShape, @@ -357,6 +360,7 @@ impl RenderBackend for WgpuRenderBackend { handle } + #[instrument(level = "debug", skip_all)] fn replace_shape( &mut self, shape: DistilledShape, @@ -367,6 +371,7 @@ impl RenderBackend for WgpuRenderBackend { self.meshes[handle.0] = mesh; } + #[instrument(level = "debug", skip_all)] fn register_glyph_shape(&mut self, glyph: &swf::Glyph) -> ShapeHandle { let shape = ruffle_render::shape_utils::swf_glyph_to_shape(glyph); let handle = ShapeHandle(self.meshes.len()); @@ -378,11 +383,12 @@ impl RenderBackend for WgpuRenderBackend { handle } + #[instrument(level = "debug", skip_all)] fn submit_frame(&mut self, clear: Color, commands: CommandList) { let frame_output = match self.target.get_next_texture() { Ok(frame) => frame, Err(e) => { - log::warn!("Couldn't begin new render frame: {}", e); + tracing::warn!("Couldn't begin new render frame: {}", e); // Attempt to recreate the swap chain in this case. self.target.resize( &self.descriptors.device, @@ -420,6 +426,7 @@ impl RenderBackend for WgpuRenderBackend { self.offscreen_texture_pool = TexturePool::new(); } + #[instrument(level = "debug", skip_all)] fn register_bitmap(&mut self, bitmap: Bitmap) -> Result { if bitmap.width() > self.descriptors.limits.max_texture_dimension_2d || bitmap.height() > self.descriptors.limits.max_texture_dimension_2d @@ -479,6 +486,7 @@ impl RenderBackend for WgpuRenderBackend { Ok(handle) } + #[instrument(level = "debug", skip_all)] fn update_texture( &mut self, handle: &BitmapHandle, @@ -513,6 +521,7 @@ impl RenderBackend for WgpuRenderBackend { Ok(()) } + #[instrument(level = "debug", skip_all)] fn render_offscreen( &mut self, handle: BitmapHandle, diff --git a/render/wgpu/src/context3d/current_pipeline.rs b/render/wgpu/src/context3d/current_pipeline.rs index 18311464f..fa6bf5cd9 100644 --- a/render/wgpu/src/context3d/current_pipeline.rs +++ b/render/wgpu/src/context3d/current_pipeline.rs @@ -174,7 +174,7 @@ impl CurrentPipeline { Context3DTriangleFace::Back => Some(wgpu::Face::Back), Context3DTriangleFace::Front => Some(wgpu::Face::Front), Context3DTriangleFace::FrontAndBack => { - log::error!("FrontAndBack culling not supported!"); + tracing::error!("FrontAndBack culling not supported!"); None } Context3DTriangleFace::None => None, diff --git a/render/wgpu/src/context3d/mod.rs b/render/wgpu/src/context3d/mod.rs index 40973915f..f32418199 100644 --- a/render/wgpu/src/context3d/mod.rs +++ b/render/wgpu/src/context3d/mod.rs @@ -225,7 +225,7 @@ impl WgpuContext3D { mask, } => { if *mask != COLOR_MASK | DEPTH_MASK | STENCIL_MASK { - log::warn!( + tracing::warn!( "Context3D::present: Clear command with mask {:x} not implemeneted", mask ); @@ -253,12 +253,14 @@ impl WgpuContext3D { wants_best_resolution_on_browser_zoom: _, } => { if *anti_alias != 1 { - log::warn!( + tracing::warn!( "configureBackBuffer: anti_alias={anti_alias} is not yet implemented" ); } if *depth_and_stencil { - log::warn!("configureBackBuffer: depth_and_stencil is not yet implemented"); + tracing::warn!( + "configureBackBuffer: depth_and_stencil is not yet implemented" + ); } let texture_label = create_debug_label!("Render target texture"); @@ -358,7 +360,7 @@ impl WgpuContext3D { ); if !seen_clear_command { - log::warn!("Context3D::present: drawTriangles called without first calling clear()"); + tracing::warn!("Context3D::present: drawTriangles called without first calling clear()"); } if new_pipeline.is_some() || render_pass.is_none() { diff --git a/render/wgpu/src/surface.rs b/render/wgpu/src/surface.rs index f954809d1..d4e5e1bb5 100644 --- a/render/wgpu/src/surface.rs +++ b/render/wgpu/src/surface.rs @@ -11,6 +11,7 @@ use crate::{ColorAdjustments, Descriptors, MaskState, Pipelines, Transforms, Uni use ruffle_render::commands::CommandList; use std::sync::Arc; use target::CommandTarget; +use tracing::instrument; #[derive(Debug)] pub struct Surface { @@ -47,6 +48,7 @@ impl Surface { } #[allow(clippy::too_many_arguments)] + #[instrument(level = "debug", skip_all)] pub fn draw_commands_to( &mut self, frame_view: &wgpu::TextureView, @@ -165,6 +167,7 @@ impl Surface { } #[allow(clippy::too_many_arguments)] + #[instrument(level = "debug", skip_all)] pub fn draw_commands<'frame, 'global: 'frame>( &mut self, clear_color: wgpu::Color, diff --git a/render/wgpu/src/target.rs b/render/wgpu/src/target.rs index 66d4ad672..e10b9a861 100644 --- a/render/wgpu/src/target.rs +++ b/render/wgpu/src/target.rs @@ -3,6 +3,7 @@ use crate::Error; use ruffle_render::utils::unmultiply_alpha_rgba; use std::fmt::Debug; use std::sync::Arc; +use tracing::instrument; pub trait RenderTargetFrame: Debug { fn into_view(self) -> wgpu::TextureView; @@ -123,6 +124,7 @@ impl RenderTarget for SwapChainTarget { Ok(SwapChainTargetFrame { texture, view }) } + #[instrument(level = "debug", skip_all)] fn submit>( &self, _device: &wgpu::Device, @@ -209,6 +211,7 @@ impl TextureTarget { /// Captures the current contents of our texture buffer /// as an `RgbaImage` + #[instrument(level = "debug", skip_all)] pub fn capture( &self, device: &wgpu::Device, @@ -251,7 +254,7 @@ impl TextureTarget { image } Err(e) => { - log::error!("Unknown error reading capture buffer: {:?}", e); + tracing::error!("Unknown error reading capture buffer: {:?}", e); None } } @@ -284,6 +287,7 @@ impl RenderTarget for TextureTarget { )) } + #[instrument(level = "debug", skip_all)] fn submit>( &self, device: &wgpu::Device,