1 use spirv_cross_internal::{hlsl, spirv};
2 
3 mod common;
4 use crate::common::words_from_bytes;
5 
6 #[test]
hlsl_compiler_options_has_default()7 fn hlsl_compiler_options_has_default() {
8     let compiler_options = hlsl::CompilerOptions::default();
9     assert_eq!(compiler_options.shader_model, hlsl::ShaderModel::V3_0);
10     assert_eq!(compiler_options.point_size_compat, false);
11     assert_eq!(compiler_options.point_coord_compat, false);
12     assert_eq!(compiler_options.vertex.invert_y, false);
13     assert_eq!(compiler_options.vertex.transform_clip_space, false);
14 }
15 
16 #[test]
ast_compiles_to_hlsl()17 fn ast_compiles_to_hlsl() {
18     let module =
19         spirv::Module::from_words(words_from_bytes(include_bytes!("shaders/simple.vert.spv")));
20     let mut ast = spirv::Ast::<hlsl::Target>::parse(&module).unwrap();
21     ast.set_compiler_options(&hlsl::CompilerOptions {
22         shader_model: hlsl::ShaderModel::V6_0,
23         point_size_compat: false,
24         point_coord_compat: false,
25         vertex: hlsl::CompilerVertexOptions::default(),
26         force_storage_buffer_as_uav: false,
27         nonwritable_uav_texture_as_srv: false,
28     })
29     .unwrap();
30 
31     assert_eq!(
32         ast.compile().unwrap(),
33         "\
34 cbuffer uniform_buffer_object
35 {
36     row_major float4x4 _22_u_model_view_projection : packoffset(c0);
37     float _22_u_scale : packoffset(c4);
38 };
39 
40 
41 static float4 gl_Position;
42 static float3 v_normal;
43 static float3 a_normal;
44 static float4 a_position;
45 
46 struct SPIRV_Cross_Input
47 {
48     float4 a_position : TEXCOORD0;
49     float3 a_normal : TEXCOORD1;
50 };
51 
52 struct SPIRV_Cross_Output
53 {
54     float3 v_normal : TEXCOORD0;
55     float4 gl_Position : SV_Position;
56 };
57 
58 void vert_main()
59 {
60     v_normal = a_normal;
61     gl_Position = mul(a_position, _22_u_model_view_projection) * _22_u_scale;
62 }
63 
64 SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
65 {
66     a_normal = stage_input.a_normal;
67     a_position = stage_input.a_position;
68     vert_main();
69     SPIRV_Cross_Output stage_output;
70     stage_output.gl_Position = gl_Position;
71     stage_output.v_normal = v_normal;
72     return stage_output;
73 }
74 "
75     );
76 }
77 
78 #[test]
ast_compiles_all_shader_models_to_hlsl()79 fn ast_compiles_all_shader_models_to_hlsl() {
80     let module =
81         spirv::Module::from_words(words_from_bytes(include_bytes!("shaders/simple.vert.spv")));
82     let mut ast = spirv::Ast::<hlsl::Target>::parse(&module).unwrap();
83 
84     let shader_models = [
85         hlsl::ShaderModel::V3_0,
86         hlsl::ShaderModel::V4_0,
87         hlsl::ShaderModel::V4_0L9_0,
88         hlsl::ShaderModel::V4_0L9_1,
89         hlsl::ShaderModel::V4_0L9_3,
90         hlsl::ShaderModel::V4_1,
91         hlsl::ShaderModel::V5_0,
92         hlsl::ShaderModel::V5_1,
93         hlsl::ShaderModel::V6_0,
94     ];
95     for &shader_model in shader_models.iter() {
96         if ast
97             .set_compiler_options(&hlsl::CompilerOptions {
98                 shader_model,
99                 point_size_compat: false,
100                 point_coord_compat: false,
101                 vertex: hlsl::CompilerVertexOptions::default(),
102                 force_storage_buffer_as_uav: false,
103                 nonwritable_uav_texture_as_srv: false,
104             })
105             .is_err()
106         {
107             panic!("Did not compile");
108         }
109     }
110 }
111