@@ -145,6 +145,24 @@ impl Shader {
145
145
Shader { stage, source }
146
146
}
147
147
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
+
148
166
pub fn from_glsl ( stage : ShaderStage , glsl : & str ) -> Shader {
149
167
Shader {
150
168
source : ShaderSource :: Glsl ( glsl. to_string ( ) ) ,
@@ -243,6 +261,10 @@ impl AssetLoader for ShaderLoader {
243
261
let shader = match ext {
244
262
"vert" => Shader :: from_glsl ( ShaderStage :: Vertex , std:: str:: from_utf8 ( bytes) ?) ,
245
263
"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" ) ,
246
268
_ => panic ! ( "unhandled extension: {}" , ext) ,
247
269
} ;
248
270
@@ -252,7 +274,7 @@ impl AssetLoader for ShaderLoader {
252
274
}
253
275
254
276
fn extensions ( & self ) -> & [ & str ] {
255
- & [ "vert" , "frag" ]
277
+ & [ "vert" , "frag" , "spv" ]
256
278
}
257
279
}
258
280
0 commit comments