bevy_render: load .spv assets (#1104)
bevy_render: ShaderLoader can now load spv files
This commit is contained in:
parent
cbc0fe1416
commit
0a51a26aba
@ -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()
|
||||
|
@ -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"]
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user