1+ #![ cfg_attr( target_arch = "spirv" , no_std) ]
2+ #![ allow( clippy:: missing_safety_doc) ]
3+
4+ use spirv_std:: { spirv, glam:: { Mat3 , Mat4 , Vec3 , Vec4 } } ;
5+
6+ #[ repr( C ) ]
7+ #[ derive( Copy , Clone ) ]
8+ pub struct Ubo {
9+ pub projection : [ Mat4 ; 2 ] ,
10+ pub modelview : [ Mat4 ; 2 ] ,
11+ pub light_pos : Vec4 ,
12+ }
13+
14+ #[ spirv( geometry( triangles = 3 , output_triangle_strip = 3 , invocations = 2 ) ) ]
15+ pub fn main_gs (
16+ #[ spirv( position) ] in_position : [ Vec4 ; 3 ] ,
17+ in_normal : [ Vec3 ; 3 ] ,
18+ in_color : [ Vec3 ; 3 ] ,
19+ #[ spirv( invocation_id) ] invocation_id : u32 ,
20+ #[ spirv( primitive_id) ] primitive_id_in : u32 ,
21+ #[ spirv( uniform, descriptor_set = 0 , binding = 0 ) ] ubo : & Ubo ,
22+ #[ spirv( position) ] out_position : & mut Vec4 ,
23+ out_normal : & mut Vec3 ,
24+ out_color : & mut Vec3 ,
25+ out_view_vec : & mut Vec3 ,
26+ out_light_vec : & mut Vec3 ,
27+ #[ spirv( viewport_index, flat) ] out_viewport_index : & mut u32 ,
28+ #[ spirv( primitive_id, flat) ] out_primitive_id : & mut u32 ,
29+ ) {
30+ let inv_id = invocation_id as usize ;
31+
32+ for i in 0 ..3 {
33+ * out_normal = Mat3 :: from_mat4 ( ubo. modelview [ inv_id] ) * in_normal[ i] ;
34+ * out_color = in_color[ i] ;
35+
36+ let pos = in_position[ i] ;
37+ let world_pos = ubo. modelview [ inv_id] * pos;
38+
39+ let l_pos = ( ubo. modelview [ inv_id] * ubo. light_pos ) . truncate ( ) ;
40+ * out_light_vec = l_pos - world_pos. truncate ( ) ;
41+ * out_view_vec = -world_pos. truncate ( ) ;
42+
43+ * out_position = ubo. projection [ inv_id] * world_pos;
44+
45+ // Set the viewport index that the vertex will be emitted to
46+ * out_viewport_index = invocation_id;
47+ * out_primitive_id = primitive_id_in;
48+
49+ unsafe { spirv_std:: arch:: emit_vertex ( ) } ;
50+ }
51+
52+ unsafe { spirv_std:: arch:: end_primitive ( ) } ;
53+ }
0 commit comments