diff --git a/src/nouveau/compiler/nak.h b/src/nouveau/compiler/nak.h index aad81fc265f..3b9ade65524 100644 --- a/src/nouveau/compiler/nak.h +++ b/src/nouveau/compiler/nak.h @@ -140,6 +140,9 @@ struct nak_shader_info { /** Number of instructions used */ uint32_t num_instrs; + /** Number of cycles used by fixed-latency instructions */ + uint32_t num_static_cycles; + /** Size of shader local (scratch) memory */ uint32_t slm_size; diff --git a/src/nouveau/compiler/nak/api.rs b/src/nouveau/compiler/nak/api.rs index 86dc11d11c3..192ab30eeb6 100644 --- a/src/nouveau/compiler/nak/api.rs +++ b/src/nouveau/compiler/nak/api.rs @@ -239,6 +239,7 @@ impl ShaderBin { num_control_barriers: info.num_control_barriers, _pad0: Default::default(), num_instrs: info.num_instrs, + num_static_cycles: info.num_static_cycles, slm_size: info.slm_size, crs_size: sm.crs_size(info.max_crs_depth), __bindgen_anon_1: match &info.stage { @@ -313,6 +314,7 @@ impl ShaderBin { eprintln!("Stage: {}", stage_name); eprintln!("Instruction count: {}", c_info.num_instrs); + eprintln!("Static cycle count: {}", c_info.num_static_cycles); eprintln!("Num GPRs: {}", c_info.num_gprs); eprintln!("SLM size: {}", c_info.slm_size); diff --git a/src/nouveau/compiler/nak/from_nir.rs b/src/nouveau/compiler/nak/from_nir.rs index 715e12fd9e9..bc4524ac3b5 100644 --- a/src/nouveau/compiler/nak/from_nir.rs +++ b/src/nouveau/compiler/nak/from_nir.rs @@ -23,6 +23,7 @@ fn init_info_from_nir(nak: &nak_compiler, nir: &nir_shader) -> ShaderInfo { ShaderInfo { num_gprs: 0, num_instrs: 0, + num_static_cycles: 0, num_control_barriers: 0, slm_size: nir.scratch_size, max_crs_depth: 0, diff --git a/src/nouveau/compiler/nak/hw_tests.rs b/src/nouveau/compiler/nak/hw_tests.rs index 140bdd1d291..907b92a548b 100644 --- a/src/nouveau/compiler/nak/hw_tests.rs +++ b/src/nouveau/compiler/nak/hw_tests.rs @@ -201,6 +201,7 @@ impl<'a> TestShaderBuilder<'a> { num_gprs: 0, num_control_barriers: 0, num_instrs: 0, + num_static_cycles: 0, slm_size: 0, max_crs_depth: 0, uses_global_mem: true, diff --git a/src/nouveau/compiler/nak/ir.rs b/src/nouveau/compiler/nak/ir.rs index ba35eaeec80..047f94dcf1c 100644 --- a/src/nouveau/compiler/nak/ir.rs +++ b/src/nouveau/compiler/nak/ir.rs @@ -7456,6 +7456,7 @@ pub struct ShaderInfo { pub num_gprs: u8, pub num_control_barriers: u8, pub num_instrs: u32, + pub num_static_cycles: u32, pub slm_size: u32, pub max_crs_depth: u32, pub uses_global_mem: bool, @@ -7535,11 +7536,13 @@ impl Shader<'_> { pub fn gather_info(&mut self) { let mut num_instrs = 0; + let mut num_static_cycles = 0; let mut uses_global_mem = false; let mut writes_global_mem = false; self.for_each_instr(&mut |instr| { num_instrs += 1; + num_static_cycles += instr.deps.delay as u32; if !uses_global_mem { uses_global_mem = instr.uses_global_mem(); @@ -7551,6 +7554,7 @@ impl Shader<'_> { }); self.info.num_instrs = num_instrs; + self.info.num_static_cycles = num_static_cycles; self.info.uses_global_mem = uses_global_mem; self.info.writes_global_mem = writes_global_mem; } diff --git a/src/nouveau/vulkan/nvk_shader.c b/src/nouveau/vulkan/nvk_shader.c index 8794bcab56d..e985b47439a 100644 --- a/src/nouveau/vulkan/nvk_shader.c +++ b/src/nouveau/vulkan/nvk_shader.c @@ -1247,6 +1247,14 @@ nvk_shader_get_executable_statistics( stat->value.u64 = shader->info.num_instrs; } + vk_outarray_append_typed(VkPipelineExecutableStatisticKHR, &out, stat) { + WRITE_STR(stat->name, "Static cycle count"); + WRITE_STR(stat->description, + "Total cycles used by fixed-latency instructions in this shader"); + stat->format = VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_UINT64_KHR; + stat->value.u64 = shader->info.num_static_cycles; + } + vk_outarray_append_typed(VkPipelineExecutableStatisticKHR, &out, stat) { WRITE_STR(stat->name, "Code Size"); WRITE_STR(stat->description,