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::{
|
use crate::{
|
||||||
pipeline::{BindType, InputStepMode, VertexBufferDescriptor},
|
pipeline::{BindType, InputStepMode, VertexBufferDescriptor},
|
||||||
renderer::RenderResourceContext,
|
renderer::RenderResourceContext,
|
||||||
shader::{Shader, ShaderError, ShaderSource},
|
shader::{Shader, ShaderError},
|
||||||
};
|
};
|
||||||
use bevy_asset::{Assets, Handle};
|
use bevy_asset::{Assets, Handle};
|
||||||
use bevy_reflect::Reflect;
|
use bevy_reflect::Reflect;
|
||||||
@ -79,11 +79,6 @@ impl PipelineCompiler {
|
|||||||
|
|
||||||
let shader = shaders.get(shader_handle).unwrap();
|
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) =
|
if let Some(specialized_shader) =
|
||||||
specialized_shaders
|
specialized_shaders
|
||||||
.iter()
|
.iter()
|
||||||
|
@ -145,6 +145,24 @@ impl Shader {
|
|||||||
Shader { stage, source }
|
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 {
|
pub fn from_glsl(stage: ShaderStage, glsl: &str) -> Shader {
|
||||||
Shader {
|
Shader {
|
||||||
source: ShaderSource::Glsl(glsl.to_string()),
|
source: ShaderSource::Glsl(glsl.to_string()),
|
||||||
@ -243,6 +261,10 @@ impl AssetLoader for ShaderLoader {
|
|||||||
let shader = match ext {
|
let shader = match ext {
|
||||||
"vert" => Shader::from_glsl(ShaderStage::Vertex, std::str::from_utf8(bytes)?),
|
"vert" => Shader::from_glsl(ShaderStage::Vertex, std::str::from_utf8(bytes)?),
|
||||||
"frag" => Shader::from_glsl(ShaderStage::Fragment, 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),
|
_ => panic!("unhandled extension: {}", ext),
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -252,7 +274,7 @@ impl AssetLoader for ShaderLoader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn extensions(&self) -> &[&str] {
|
fn extensions(&self) -> &[&str] {
|
||||||
&["vert", "frag"]
|
&["vert", "frag", "spv"]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user