1+ // RUN: %dxc -T ps_6_0 -E main -fcgl %s -spirv | FileCheck %s
2+ // RUN: not %dxc -T ps_6_0 -E main -fcgl %s -spirv -DERROR 2>&1 | FileCheck %s --check-prefix=ERROR
3+
4+ // CHECK: OpCapability ImageQuery
5+
6+ vk::SampledTexture2D<float4 > t1;
7+
8+ void main () {
9+ uint mipLevel = 1 ;
10+ uint width, height, numLevels;
11+
12+ // CHECK: [[t1_load:%[0-9]+]] = OpLoad %type_sampled_image %t1
13+ // CHECK-NEXT: [[image1:%[0-9]+]] = OpImage %type_2d_image [[t1_load]]
14+ // CHECK-NEXT: [[query1:%[0-9]+]] = OpImageQuerySizeLod %v2uint [[image1]] %int_0
15+ // CHECK-NEXT: [[query1_0:%[0-9]+]] = OpCompositeExtract %uint [[query1]] 0
16+ // CHECK-NEXT: OpStore %width [[query1_0]]
17+ // CHECK-NEXT: [[query1_1:%[0-9]+]] = OpCompositeExtract %uint [[query1]] 1
18+ // CHECK-NEXT: OpStore %height [[query1_1]]
19+ t1.GetDimensions (width, height);
20+
21+ // CHECK: [[t1_load:%[0-9]+]] = OpLoad %type_sampled_image %t1
22+ // CHECK-NEXT: [[image2:%[0-9]+]] = OpImage %type_2d_image [[t1_load]]
23+ // CHECK-NEXT: [[mip:%[0-9]+]] = OpLoad %uint %mipLevel
24+ // CHECK-NEXT: [[query2:%[0-9]+]] = OpImageQuerySizeLod %v2uint [[image2]] [[mip]]
25+ // CHECK-NEXT: [[query2_0:%[0-9]+]] = OpCompositeExtract %uint [[query2]] 0
26+ // CHECK-NEXT: OpStore %width [[query2_0]]
27+ // CHECK-NEXT: [[query2_1:%[0-9]+]] = OpCompositeExtract %uint [[query2]] 1
28+ // CHECK-NEXT: OpStore %height [[query2_1]]
29+ // CHECK-NEXT: [[query_level_2:%[0-9]+]] = OpImageQueryLevels %uint [[image2]]
30+ // CHECK-NEXT: OpStore %numLevels [[query_level_2]]
31+ t1.GetDimensions (mipLevel, width, height, numLevels);
32+
33+ float f_width, f_height, f_numLevels;
34+ // CHECK: [[t1_load:%[0-9]+]] = OpLoad %type_sampled_image %t1
35+ // CHECK-NEXT: [[image1:%[0-9]+]] = OpImage %type_2d_image [[t1_load]]
36+ // CHECK-NEXT: [[query1:%[0-9]+]] = OpImageQuerySizeLod %v2uint [[image1]] %int_0
37+ // CHECK-NEXT: [[query1_0:%[0-9]+]] = OpCompositeExtract %uint [[query1]] 0
38+ // CHECK-NEXT: [[f_query1_0:%[0-9]+]] = OpConvertUToF %float [[query1_0]]
39+ // CHECK-NEXT: OpStore %f_width [[f_query1_0]]
40+ // CHECK-NEXT: [[query1_1:%[0-9]+]] = OpCompositeExtract %uint [[query1]] 1
41+ // CHECK-NEXT: [[f_query1_1:%[0-9]+]] = OpConvertUToF %float [[query1_1]]
42+ // CHECK-NEXT: OpStore %f_height [[f_query1_1]]
43+ t1.GetDimensions (f_width, f_height);
44+
45+ // CHECK: [[t1_load:%[0-9]+]] = OpLoad %type_sampled_image %t1
46+ // CHECK-NEXT: [[image2:%[0-9]+]] = OpImage %type_2d_image [[t1_load]]
47+ // CHECK-NEXT: [[mip:%[0-9]+]] = OpLoad %uint %mipLevel
48+ // CHECK-NEXT: [[query2:%[0-9]+]] = OpImageQuerySizeLod %v2uint [[image2]] [[mip]]
49+ // CHECK-NEXT: [[query2_0:%[0-9]+]] = OpCompositeExtract %uint [[query2]] 0
50+ // CHECK-NEXT: [[f_query2_0:%[0-9]+]] = OpConvertUToF %float [[query2_0]]
51+ // CHECK-NEXT: OpStore %f_width [[f_query2_0]]
52+ // CHECK-NEXT: [[query2_1:%[0-9]+]] = OpCompositeExtract %uint [[query2]] 1
53+ // CHECK-NEXT: [[f_query2_1:%[0-9]+]] = OpConvertUToF %float [[query2_1]]
54+ // CHECK-NEXT: OpStore %f_height [[f_query2_1]]
55+ // CHECK-NEXT: [[query_level_2:%[0-9]+]] = OpImageQueryLevels %uint [[image2]]
56+ // CHECK-NEXT: [[f_query_level_2:%[0-9]+]] = OpConvertUToF %float [[query_level_2]]
57+ // CHECK-NEXT: OpStore %f_numLevels [[f_query_level_2]]
58+ t1.GetDimensions (mipLevel, f_width, f_height, f_numLevels);
59+
60+ int i_width, i_height, i_numLevels;
61+ // CHECK: [[t1_load:%[0-9]+]] = OpLoad %type_sampled_image %t1
62+ // CHECK-NEXT: [[image1:%[0-9]+]] = OpImage %type_2d_image [[t1_load]]
63+ // CHECK-NEXT: [[query1:%[0-9]+]] = OpImageQuerySizeLod %v2uint [[image1]] %int_0
64+ // CHECK-NEXT: [[query1_0:%[0-9]+]] = OpCompositeExtract %uint [[query1]] 0
65+ // CHECK-NEXT: [[query_0_int:%[0-9]+]] = OpBitcast %int [[query1_0]]
66+ // CHECK-NEXT: OpStore %i_width [[query_0_int]]
67+ // CHECK-NEXT: [[query1_1:%[0-9]+]] = OpCompositeExtract %uint [[query1]] 1
68+ // CHECK-NEXT: [[query_1_int:%[0-9]+]] = OpBitcast %int [[query1_1]]
69+ // CHECK-NEXT: OpStore %i_height [[query_1_int]]
70+ t1.GetDimensions (i_width, i_height);
71+
72+ // CHECK: [[t1_load:%[0-9]+]] = OpLoad %type_sampled_image %t1
73+ // CHECK-NEXT: [[image2:%[0-9]+]] = OpImage %type_2d_image [[t1_load]]
74+ // CHECK-NEXT: [[mip:%[0-9]+]] = OpLoad %uint %mipLevel
75+ // CHECK-NEXT: [[query2:%[0-9]+]] = OpImageQuerySizeLod %v2uint [[image2]] [[mip]]
76+ // CHECK-NEXT: [[query2_0:%[0-9]+]] = OpCompositeExtract %uint [[query2]] 0
77+ // CHECK-NEXT: [[query_0_int:%[0-9]+]] = OpBitcast %int [[query2_0]]
78+ // CHECK-NEXT: OpStore %i_width [[query_0_int]]
79+ // CHECK-NEXT: [[query2_1:%[0-9]+]] = OpCompositeExtract %uint [[query2]] 1
80+ // CHECK-NEXT: [[query_1_int:%[0-9]+]] = OpBitcast %int [[query2_1]]
81+ // CHECK-NEXT: OpStore %i_height [[query_1_int]]
82+ // CHECK-NEXT: [[query_level_2:%[0-9]+]] = OpImageQueryLevels %uint [[image2]]
83+ // CHECK-NEXT: [[query_level_2_int:%[0-9]+]] = OpBitcast %int [[query_level_2]]
84+ // CHECK-NEXT: OpStore %i_numLevels [[query_level_2_int]]
85+ t1.GetDimensions (mipLevel, i_width, i_height, i_numLevels);
86+
87+ #ifdef ERROR
88+ // ERROR: error: Output argument must be an l-value
89+ t1.GetDimensions (mipLevel, 0 , height, numLevels);
90+
91+ // ERROR: error: Output argument must be an l-value
92+ t1.GetDimensions (width, 20 );
93+ #endif
94+ }
0 commit comments