Skip to content

Commit 739905e

Browse files
authored
Extract a naga pub create_validator function for use in Bevy (#5606)
1 parent d4f3063 commit 739905e

File tree

1 file changed

+74
-66
lines changed

1 file changed

+74
-66
lines changed

wgpu-core/src/device/resource.rs

Lines changed: 74 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1480,9 +1480,78 @@ impl<A: HalApi> Device<A> {
14801480
};
14811481
}
14821482

1483-
use naga::valid::Capabilities as Caps;
14841483
profiling::scope!("naga::validate");
1484+
let debug_source =
1485+
if self.instance_flags.contains(wgt::InstanceFlags::DEBUG) && !source.is_empty() {
1486+
Some(hal::DebugSource {
1487+
file_name: Cow::Owned(
1488+
desc.label
1489+
.as_ref()
1490+
.map_or("shader".to_string(), |l| l.to_string()),
1491+
),
1492+
source_code: Cow::Owned(source.clone()),
1493+
})
1494+
} else {
1495+
None
1496+
};
1497+
1498+
let info = self
1499+
.create_validator(naga::valid::ValidationFlags::all())
1500+
.validate(&module)
1501+
.map_err(|inner| {
1502+
pipeline::CreateShaderModuleError::Validation(pipeline::ShaderError {
1503+
source,
1504+
label: desc.label.as_ref().map(|l| l.to_string()),
1505+
inner: Box::new(inner),
1506+
})
1507+
})?;
1508+
1509+
let interface =
1510+
validation::Interface::new(&module, &info, self.limits.clone(), self.features);
1511+
let hal_shader = hal::ShaderInput::Naga(hal::NagaShader {
1512+
module,
1513+
info,
1514+
debug_source,
1515+
});
1516+
let hal_desc = hal::ShaderModuleDescriptor {
1517+
label: desc.label.to_hal(self.instance_flags),
1518+
runtime_checks: desc.shader_bound_checks.runtime_checks(),
1519+
};
1520+
let raw = match unsafe {
1521+
self.raw
1522+
.as_ref()
1523+
.unwrap()
1524+
.create_shader_module(&hal_desc, hal_shader)
1525+
} {
1526+
Ok(raw) => raw,
1527+
Err(error) => {
1528+
return Err(match error {
1529+
hal::ShaderError::Device(error) => {
1530+
pipeline::CreateShaderModuleError::Device(error.into())
1531+
}
1532+
hal::ShaderError::Compilation(ref msg) => {
1533+
log::error!("Shader error: {}", msg);
1534+
pipeline::CreateShaderModuleError::Generation
1535+
}
1536+
})
1537+
}
1538+
};
1539+
1540+
Ok(pipeline::ShaderModule {
1541+
raw: Some(raw),
1542+
device: self.clone(),
1543+
interface: Some(interface),
1544+
info: ResourceInfo::new(desc.label.borrow_or_default(), None),
1545+
label: desc.label.borrow_or_default().to_string(),
1546+
})
1547+
}
14851548

1549+
/// Create a validator with the given validation flags.
1550+
pub fn create_validator(
1551+
self: &Arc<Self>,
1552+
flags: naga::valid::ValidationFlags,
1553+
) -> naga::valid::Validator {
1554+
use naga::valid::Capabilities as Caps;
14861555
let mut caps = Caps::empty();
14871556
caps.set(
14881557
Caps::PUSH_CONSTANT,
@@ -1560,20 +1629,6 @@ impl<A: HalApi> Device<A> {
15601629
self.features.intersects(wgt::Features::SUBGROUP_BARRIER),
15611630
);
15621631

1563-
let debug_source =
1564-
if self.instance_flags.contains(wgt::InstanceFlags::DEBUG) && !source.is_empty() {
1565-
Some(hal::DebugSource {
1566-
file_name: Cow::Owned(
1567-
desc.label
1568-
.as_ref()
1569-
.map_or("shader".to_string(), |l| l.to_string()),
1570-
),
1571-
source_code: Cow::Owned(source.clone()),
1572-
})
1573-
} else {
1574-
None
1575-
};
1576-
15771632
let mut subgroup_stages = naga::valid::ShaderStages::empty();
15781633
subgroup_stages.set(
15791634
naga::valid::ShaderStages::COMPUTE | naga::valid::ShaderStages::FRAGMENT,
@@ -1590,57 +1645,10 @@ impl<A: HalApi> Device<A> {
15901645
} else {
15911646
naga::valid::SubgroupOperationSet::empty()
15921647
};
1593-
1594-
let info = naga::valid::Validator::new(naga::valid::ValidationFlags::all(), caps)
1595-
.subgroup_stages(subgroup_stages)
1596-
.subgroup_operations(subgroup_operations)
1597-
.validate(&module)
1598-
.map_err(|inner| {
1599-
pipeline::CreateShaderModuleError::Validation(pipeline::ShaderError {
1600-
source,
1601-
label: desc.label.as_ref().map(|l| l.to_string()),
1602-
inner: Box::new(inner),
1603-
})
1604-
})?;
1605-
1606-
let interface =
1607-
validation::Interface::new(&module, &info, self.limits.clone(), self.features);
1608-
let hal_shader = hal::ShaderInput::Naga(hal::NagaShader {
1609-
module,
1610-
info,
1611-
debug_source,
1612-
});
1613-
let hal_desc = hal::ShaderModuleDescriptor {
1614-
label: desc.label.to_hal(self.instance_flags),
1615-
runtime_checks: desc.shader_bound_checks.runtime_checks(),
1616-
};
1617-
let raw = match unsafe {
1618-
self.raw
1619-
.as_ref()
1620-
.unwrap()
1621-
.create_shader_module(&hal_desc, hal_shader)
1622-
} {
1623-
Ok(raw) => raw,
1624-
Err(error) => {
1625-
return Err(match error {
1626-
hal::ShaderError::Device(error) => {
1627-
pipeline::CreateShaderModuleError::Device(error.into())
1628-
}
1629-
hal::ShaderError::Compilation(ref msg) => {
1630-
log::error!("Shader error: {}", msg);
1631-
pipeline::CreateShaderModuleError::Generation
1632-
}
1633-
})
1634-
}
1635-
};
1636-
1637-
Ok(pipeline::ShaderModule {
1638-
raw: Some(raw),
1639-
device: self.clone(),
1640-
interface: Some(interface),
1641-
info: ResourceInfo::new(desc.label.borrow_or_default(), None),
1642-
label: desc.label.borrow_or_default().to_string(),
1643-
})
1648+
let mut validator = naga::valid::Validator::new(flags, caps);
1649+
validator.subgroup_stages(subgroup_stages);
1650+
validator.subgroup_operations(subgroup_operations);
1651+
validator
16441652
}
16451653

16461654
#[allow(unused_unsafe)]

0 commit comments

Comments
 (0)