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