mirror of
https://github.com/gfx-rs/wgpu.git
synced 2026-04-22 03:02:01 -04:00
Show expression uniformity in the Dot backend
This commit is contained in:
committed by
Dzmitry Malyshau
parent
e3818bb236
commit
665ac49a01
@@ -249,7 +249,7 @@ fn main() {
|
||||
#[cfg(feature = "dot-out")]
|
||||
"dot" => {
|
||||
use naga::back::dot;
|
||||
let output = dot::write(&module).unwrap();
|
||||
let output = dot::write(&module, analysis.as_ref()).unwrap();
|
||||
fs::write(output_path, output).unwrap();
|
||||
}
|
||||
other => {
|
||||
|
||||
@@ -4,7 +4,10 @@
|
||||
* of IR inspection and debugging.
|
||||
!*/
|
||||
|
||||
use crate::arena::Handle;
|
||||
use crate::{
|
||||
arena::Handle,
|
||||
proc::analyzer::{Analysis, FunctionInfo},
|
||||
};
|
||||
|
||||
use std::{
|
||||
borrow::Cow,
|
||||
@@ -140,7 +143,12 @@ const COLORS: &[&str] = &[
|
||||
"#d9d9d9",
|
||||
];
|
||||
|
||||
fn write_fun(output: &mut String, prefix: String, fun: &crate::Function) -> Result<(), FmtError> {
|
||||
fn write_fun(
|
||||
output: &mut String,
|
||||
prefix: String,
|
||||
fun: &crate::Function,
|
||||
info: Option<&FunctionInfo>,
|
||||
) -> Result<(), FmtError> {
|
||||
enum Payload<'a> {
|
||||
Arguments(&'a [Handle<crate::Expression>]),
|
||||
Local(Handle<crate::LocalVariable>),
|
||||
@@ -312,11 +320,18 @@ fn write_fun(output: &mut String, prefix: String, fun: &crate::Function) -> Resu
|
||||
(Cow::Borrowed("ArrayLength"), 7)
|
||||
}
|
||||
};
|
||||
|
||||
// give uniform expressions an outline
|
||||
let color_attr = match info {
|
||||
Some(info) if info[handle].uniformity.non_uniform_result.is_none() => "fillcolor",
|
||||
_ => "color",
|
||||
};
|
||||
writeln!(
|
||||
output,
|
||||
"\t\t{}_e{} [ color=\"{}\" label=\"{:?} {}\" ]",
|
||||
"\t\t{}_e{} [ {}=\"{}\" label=\"{:?} {}\" ]",
|
||||
prefix,
|
||||
handle.index(),
|
||||
color_attr,
|
||||
COLORS[color_id],
|
||||
handle,
|
||||
label,
|
||||
@@ -354,7 +369,7 @@ fn write_fun(output: &mut String, prefix: String, fun: &crate::Function) -> Resu
|
||||
Some(Payload::Global(h)) => {
|
||||
writeln!(
|
||||
output,
|
||||
"\t\tg{} -> {}_e{} [color=gray]",
|
||||
"\t\tg{} -> {}_e{} [fillcolor=gray]",
|
||||
h.index(),
|
||||
prefix,
|
||||
handle.index(),
|
||||
@@ -414,7 +429,7 @@ fn write_fun(output: &mut String, prefix: String, fun: &crate::Function) -> Resu
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn write(module: &crate::Module) -> Result<String, FmtError> {
|
||||
pub fn write(module: &crate::Module, analysis: Option<&Analysis>) -> Result<String, FmtError> {
|
||||
use std::fmt::Write as _;
|
||||
|
||||
let mut output = String::new();
|
||||
@@ -443,14 +458,16 @@ pub fn write(module: &crate::Module) -> Result<String, FmtError> {
|
||||
handle,
|
||||
name(&fun.name)
|
||||
)?;
|
||||
write_fun(&mut output, prefix, fun)?;
|
||||
let info = analysis.map(|a| &a[handle]);
|
||||
write_fun(&mut output, prefix, fun, info)?;
|
||||
writeln!(output, "\t}}")?;
|
||||
}
|
||||
for (ep_index, ep) in module.entry_points.iter().enumerate() {
|
||||
let prefix = format!("ep{}", ep_index);
|
||||
writeln!(output, "\tsubgraph cluster_{} {{", prefix)?;
|
||||
writeln!(output, "\t\tlabel=\"{:?}/'{}'\"", ep.stage, ep.name)?;
|
||||
write_fun(&mut output, prefix, &ep.function)?;
|
||||
let info = analysis.map(|a| a.get_entry_point(ep_index));
|
||||
write_fun(&mut output, prefix, &ep.function, info)?;
|
||||
writeln!(output, "\t}}")?;
|
||||
}
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ digraph Module {
|
||||
label="Vertex/'main'"
|
||||
node [ style=filled ]
|
||||
ep0_l0 [ shape=hexagon label="[1] 'out'" ]
|
||||
ep0_e0 [ color="#ffffb3" label="[1] Constant" ]
|
||||
ep0_e0 [ fillcolor="#ffffb3" label="[1] Constant" ]
|
||||
ep0_e1 [ color="#8dd3c7" label="[2] Argument[0]" ]
|
||||
ep0_e2 [ color="#8dd3c7" label="[3] Argument[1]" ]
|
||||
ep0_e3 [ color="#8dd3c7" label="[4] Local" ]
|
||||
@@ -24,8 +24,8 @@ digraph Module {
|
||||
ep0_e6 [ color="#fdb462" label="[7] Multiply" ]
|
||||
ep0_e1 -> ep0_e6 [ label="right" ]
|
||||
ep0_e0 -> ep0_e6 [ label="left" ]
|
||||
ep0_e7 [ color="#ffffb3" label="[8] Constant" ]
|
||||
ep0_e8 [ color="#ffffb3" label="[9] Constant" ]
|
||||
ep0_e7 [ fillcolor="#ffffb3" label="[8] Constant" ]
|
||||
ep0_e8 [ fillcolor="#ffffb3" label="[9] Constant" ]
|
||||
ep0_e9 [ color="#bebada" label="[10] Compose" ]
|
||||
{ ep0_e6 ep0_e7 ep0_e8 } -> ep0_e9
|
||||
ep0_e10 [ color="#fb8072" label="[11] Load" ]
|
||||
@@ -59,11 +59,11 @@ digraph Module {
|
||||
subgraph cluster_ep1 {
|
||||
label="Fragment/'main'"
|
||||
node [ style=filled ]
|
||||
ep1_e0 [ color="#ffffb3" label="[1] Constant" ]
|
||||
ep1_e1 [ color="#ffffb3" label="[2] Global" ]
|
||||
g1 -> ep1_e1 [color=gray]
|
||||
ep1_e2 [ color="#ffffb3" label="[3] Global" ]
|
||||
g0 -> ep1_e2 [color=gray]
|
||||
ep1_e0 [ fillcolor="#ffffb3" label="[1] Constant" ]
|
||||
ep1_e1 [ fillcolor="#ffffb3" label="[2] Global" ]
|
||||
g1 -> ep1_e1 [fillcolor=gray]
|
||||
ep1_e2 [ fillcolor="#ffffb3" label="[3] Global" ]
|
||||
g0 -> ep1_e2 [fillcolor=gray]
|
||||
ep1_e3 [ color="#8dd3c7" label="[4] Argument[0]" ]
|
||||
ep1_e4 [ color="#80b1d3" label="[5] ImageSample" ]
|
||||
ep1_e1 -> ep1_e4 [ label="sampler" ]
|
||||
@@ -71,7 +71,7 @@ digraph Module {
|
||||
ep1_e3 -> ep1_e4 [ label="coordinate" ]
|
||||
ep1_e5 [ color="#8dd3c7" label="[6] AccessIndex[3]" ]
|
||||
ep1_e4 -> ep1_e5 [ label="base" ]
|
||||
ep1_e6 [ color="#ffffb3" label="[7] Constant" ]
|
||||
ep1_e6 [ fillcolor="#ffffb3" label="[7] Constant" ]
|
||||
ep1_e7 [ color="#fdb462" label="[8] Equal" ]
|
||||
ep1_e6 -> ep1_e7 [ label="right" ]
|
||||
ep1_e5 -> ep1_e7 [ label="left" ]
|
||||
|
||||
@@ -106,7 +106,7 @@ fn check_targets(module: &naga::Module, name: &str, targets: Targets) {
|
||||
#[cfg(feature = "dot-out")]
|
||||
{
|
||||
if targets.contains(Targets::DOT) {
|
||||
let string = naga::back::dot::write(module).unwrap();
|
||||
let string = naga::back::dot::write(module, Some(&analysis)).unwrap();
|
||||
with_snapshot_settings(|| {
|
||||
insta::assert_snapshot!(format!("{}.dot", name), string);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user