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
	 Jakob Hellermann
						Jakob Hellermann