Fix shader import hot reloading on windows (#10502)

# Objective

Hot reloading shader imports on windows is currently broken due to
inconsistent `/` and `\` usage ('/` is used in the user facing APIs and
`\` is produced by notify-rs (and likely other OS apis).

Fixes #10500

## Solution

Standardize import paths when loading a `Shader`. The correct long term
fix is to standardize AssetPath on `/`-only, but this is the right scope
of fix for a patch release.

---------

Co-authored-by: François <mockersf@gmail.com>
This commit is contained in:
Carter Anderson 2023-11-11 15:01:08 -08:00
parent 26dfe42623
commit b32976504d

View file

@ -259,30 +259,24 @@ impl AssetLoader for ShaderLoader {
) -> BoxedFuture<'a, Result<Shader, Self::Error>> {
Box::pin(async move {
let ext = load_context.path().extension().unwrap().to_str().unwrap();
let path = load_context.asset_path().to_string();
// On windows, the path will inconsistently use \ or /.
// TODO: remove this once AssetPath forces cross-platform "slash" consistency. See #10511
let path = path.replace(std::path::MAIN_SEPARATOR, "/");
let mut bytes = Vec::new();
reader.read_to_end(&mut bytes).await?;
let mut shader = match ext {
"spv" => Shader::from_spirv(bytes, load_context.path().to_string_lossy()),
"wgsl" => Shader::from_wgsl(
String::from_utf8(bytes)?,
load_context.path().to_string_lossy(),
),
"vert" => Shader::from_glsl(
String::from_utf8(bytes)?,
naga::ShaderStage::Vertex,
load_context.path().to_string_lossy(),
),
"frag" => Shader::from_glsl(
String::from_utf8(bytes)?,
naga::ShaderStage::Fragment,
load_context.path().to_string_lossy(),
),
"comp" => Shader::from_glsl(
String::from_utf8(bytes)?,
naga::ShaderStage::Compute,
load_context.path().to_string_lossy(),
),
"wgsl" => Shader::from_wgsl(String::from_utf8(bytes)?, path),
"vert" => {
Shader::from_glsl(String::from_utf8(bytes)?, naga::ShaderStage::Vertex, path)
}
"frag" => {
Shader::from_glsl(String::from_utf8(bytes)?, naga::ShaderStage::Fragment, path)
}
"comp" => {
Shader::from_glsl(String::from_utf8(bytes)?, naga::ShaderStage::Compute, path)
}
_ => panic!("unhandled extension: {ext}"),
};