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 committed by GitHub
parent c505610358
commit 0eeb8f95fb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -259,30 +259,24 @@ impl AssetLoader for ShaderLoader {
) -> BoxedFuture<'a, Result<Shader, Self::Error>> { ) -> BoxedFuture<'a, Result<Shader, Self::Error>> {
Box::pin(async move { Box::pin(async move {
let ext = load_context.path().extension().unwrap().to_str().unwrap(); 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(); let mut bytes = Vec::new();
reader.read_to_end(&mut bytes).await?; reader.read_to_end(&mut bytes).await?;
let mut shader = match ext { let mut shader = match ext {
"spv" => Shader::from_spirv(bytes, load_context.path().to_string_lossy()), "spv" => Shader::from_spirv(bytes, load_context.path().to_string_lossy()),
"wgsl" => Shader::from_wgsl( "wgsl" => Shader::from_wgsl(String::from_utf8(bytes)?, path),
String::from_utf8(bytes)?, "vert" => {
load_context.path().to_string_lossy(), Shader::from_glsl(String::from_utf8(bytes)?, naga::ShaderStage::Vertex, path)
), }
"vert" => Shader::from_glsl( "frag" => {
String::from_utf8(bytes)?, Shader::from_glsl(String::from_utf8(bytes)?, naga::ShaderStage::Fragment, path)
naga::ShaderStage::Vertex, }
load_context.path().to_string_lossy(), "comp" => {
), Shader::from_glsl(String::from_utf8(bytes)?, naga::ShaderStage::Compute, path)
"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(),
),
_ => panic!("unhandled extension: {ext}"), _ => panic!("unhandled extension: {ext}"),
}; };