@@ -145,6 +145,24 @@ impl Shader {
145145 Shader { stage, source }
146146 }
147147
148+ #[ cfg( not( target_arch = "wasm32" ) ) ]
149+ pub fn from_spirv ( spirv : & [ u8 ] ) -> Result < Shader , ShaderError > {
150+ use spirv_reflect:: { types:: ReflectShaderStageFlags , ShaderModule } ;
151+
152+ let module = ShaderModule :: load_u8_data ( spirv)
153+ . map_err ( |msg| ShaderError :: Compilation ( msg. to_string ( ) ) ) ?;
154+ let stage = match module. get_shader_stage ( ) {
155+ ReflectShaderStageFlags :: VERTEX => ShaderStage :: Vertex ,
156+ ReflectShaderStageFlags :: FRAGMENT => ShaderStage :: Fragment ,
157+ other => panic ! ( "cannot load {:?} shader" , other) ,
158+ } ;
159+
160+ Ok ( Shader {
161+ source : ShaderSource :: spirv_from_bytes ( spirv) ,
162+ stage,
163+ } )
164+ }
165+
148166 pub fn from_glsl ( stage : ShaderStage , glsl : & str ) -> Shader {
149167 Shader {
150168 source : ShaderSource :: Glsl ( glsl. to_string ( ) ) ,
@@ -243,6 +261,10 @@ impl AssetLoader for ShaderLoader {
243261 let shader = match ext {
244262 "vert" => Shader :: from_glsl ( ShaderStage :: Vertex , std:: str:: from_utf8 ( bytes) ?) ,
245263 "frag" => Shader :: from_glsl ( ShaderStage :: Fragment , std:: str:: from_utf8 ( bytes) ?) ,
264+ #[ cfg( not( target_arch = "wasm32" ) ) ]
265+ "spv" => Shader :: from_spirv ( bytes) ?,
266+ #[ cfg( target_arch = "wasm32" ) ]
267+ "spv" => panic ! ( "cannot load .spv file on wasm" ) ,
246268 _ => panic ! ( "unhandled extension: {}" , ext) ,
247269 } ;
248270
@@ -252,7 +274,7 @@ impl AssetLoader for ShaderLoader {
252274 }
253275
254276 fn extensions ( & self ) -> & [ & str ] {
255- & [ "vert" , "frag" ]
277+ & [ "vert" , "frag" , "spv" ]
256278 }
257279}
258280
0 commit comments