bevy_render: load .spv assets (#1104)

bevy_render: ShaderLoader can now load spv files
This commit is contained in:
Jakob Hellermann 2020-12-24 02:41:34 +01:00 committed by GitHub
parent cbc0fe1416
commit 0a51a26aba
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 24 additions and 7 deletions

View File

@ -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;
@ -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()

View File

@ -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()),
@ -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),
};
@ -252,7 +274,7 @@ impl AssetLoader for ShaderLoader {
}
fn extensions(&self) -> &[&str] {
&["vert", "frag"]
&["vert", "frag", "spv"]
}
}