Skip to content

Commit 0a51a26

Browse files
bevy_render: load .spv assets (#1104)
bevy_render: ShaderLoader can now load spv files
1 parent cbc0fe1 commit 0a51a26

File tree

2 files changed

+24
-7
lines changed

2 files changed

+24
-7
lines changed

crates/bevy_render/src/pipeline/pipeline_compiler.rs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use super::{state_descriptors::PrimitiveTopology, IndexFormat, PipelineDescripto
22
use crate::{
33
pipeline::{BindType, InputStepMode, VertexBufferDescriptor},
44
renderer::RenderResourceContext,
5-
shader::{Shader, ShaderError, ShaderSource},
5+
shader::{Shader, ShaderError},
66
};
77
use bevy_asset::{Assets, Handle};
88
use bevy_reflect::Reflect;
@@ -79,11 +79,6 @@ impl PipelineCompiler {
7979

8080
let shader = shaders.get(shader_handle).unwrap();
8181

82-
// don't produce new shader if the input source is already spirv
83-
if let ShaderSource::Spirv(_) = shader.source {
84-
return Ok(shader_handle.clone_weak());
85-
}
86-
8782
if let Some(specialized_shader) =
8883
specialized_shaders
8984
.iter()

crates/bevy_render/src/shader/shader.rs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,24 @@ impl Shader {
145145
Shader { stage, source }
146146
}
147147

148+
#[cfg(not(target_arch = "wasm32"))]
149+
pub fn from_spirv(spirv: &[u8]) -> Result<Shader, ShaderError> {
150+
use spirv_reflect::{types::ReflectShaderStageFlags, ShaderModule};
151+
152+
let module = ShaderModule::load_u8_data(spirv)
153+
.map_err(|msg| ShaderError::Compilation(msg.to_string()))?;
154+
let stage = match module.get_shader_stage() {
155+
ReflectShaderStageFlags::VERTEX => ShaderStage::Vertex,
156+
ReflectShaderStageFlags::FRAGMENT => ShaderStage::Fragment,
157+
other => panic!("cannot load {:?} shader", other),
158+
};
159+
160+
Ok(Shader {
161+
source: ShaderSource::spirv_from_bytes(spirv),
162+
stage,
163+
})
164+
}
165+
148166
pub fn from_glsl(stage: ShaderStage, glsl: &str) -> Shader {
149167
Shader {
150168
source: ShaderSource::Glsl(glsl.to_string()),
@@ -243,6 +261,10 @@ impl AssetLoader for ShaderLoader {
243261
let shader = match ext {
244262
"vert" => Shader::from_glsl(ShaderStage::Vertex, std::str::from_utf8(bytes)?),
245263
"frag" => Shader::from_glsl(ShaderStage::Fragment, std::str::from_utf8(bytes)?),
264+
#[cfg(not(target_arch = "wasm32"))]
265+
"spv" => Shader::from_spirv(bytes)?,
266+
#[cfg(target_arch = "wasm32")]
267+
"spv" => panic!("cannot load .spv file on wasm"),
246268
_ => panic!("unhandled extension: {}", ext),
247269
};
248270

@@ -252,7 +274,7 @@ impl AssetLoader for ShaderLoader {
252274
}
253275

254276
fn extensions(&self) -> &[&str] {
255-
&["vert", "frag"]
277+
&["vert", "frag", "spv"]
256278
}
257279
}
258280

0 commit comments

Comments
 (0)