Skip to content

Commit

Permalink
bevy_render: load .spv assets (#1104)
Browse files Browse the repository at this point in the history
bevy_render: ShaderLoader can now load spv files
  • Loading branch information
jakobhellermann committed Dec 24, 2020
1 parent cbc0fe1 commit 0a51a26
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 7 deletions.
7 changes: 1 addition & 6 deletions crates/bevy_render/src/pipeline/pipeline_compiler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use super::{state_descriptors::PrimitiveTopology, IndexFormat, PipelineDescripto
use crate::{
pipeline::{BindType, InputStepMode, VertexBufferDescriptor},
renderer::RenderResourceContext,
shader::{Shader, ShaderError, ShaderSource},
shader::{Shader, ShaderError},
};
use bevy_asset::{Assets, Handle};
use bevy_reflect::Reflect;
Expand Down Expand Up @@ -79,11 +79,6 @@ impl PipelineCompiler {

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

// don't produce new shader if the input source is already spirv
if let ShaderSource::Spirv(_) = shader.source {
return Ok(shader_handle.clone_weak());
}

if let Some(specialized_shader) =
specialized_shaders
.iter()
Expand Down
24 changes: 23 additions & 1 deletion crates/bevy_render/src/shader/shader.rs
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,24 @@ impl Shader {
Shader { stage, source }
}

#[cfg(not(target_arch = "wasm32"))]
pub fn from_spirv(spirv: &[u8]) -> Result<Shader, ShaderError> {
use spirv_reflect::{types::ReflectShaderStageFlags, ShaderModule};

let module = ShaderModule::load_u8_data(spirv)
.map_err(|msg| ShaderError::Compilation(msg.to_string()))?;
let stage = match module.get_shader_stage() {
ReflectShaderStageFlags::VERTEX => ShaderStage::Vertex,
ReflectShaderStageFlags::FRAGMENT => ShaderStage::Fragment,
other => panic!("cannot load {:?} shader", other),
};

Ok(Shader {
source: ShaderSource::spirv_from_bytes(spirv),
stage,
})
}

pub fn from_glsl(stage: ShaderStage, glsl: &str) -> Shader {
Shader {
source: ShaderSource::Glsl(glsl.to_string()),
Expand Down Expand Up @@ -243,6 +261,10 @@ impl AssetLoader for ShaderLoader {
let shader = match ext {
"vert" => Shader::from_glsl(ShaderStage::Vertex, std::str::from_utf8(bytes)?),
"frag" => Shader::from_glsl(ShaderStage::Fragment, std::str::from_utf8(bytes)?),
#[cfg(not(target_arch = "wasm32"))]
"spv" => Shader::from_spirv(bytes)?,
#[cfg(target_arch = "wasm32")]
"spv" => panic!("cannot load .spv file on wasm"),
_ => panic!("unhandled extension: {}", ext),
};

Expand All @@ -252,7 +274,7 @@ impl AssetLoader for ShaderLoader {
}

fn extensions(&self) -> &[&str] {
&["vert", "frag"]
&["vert", "frag", "spv"]
}
}

Expand Down

0 comments on commit 0a51a26

Please sign in to comment.