Explorar o código

Add GetDimensions() method for TextureCube(Array). (#1023)

Ehsan %!s(int64=7) %!d(string=hai) anos
pai
achega
334c232e8e

+ 10 - 0
tools/clang/lib/SPIRV/SPIRVEmitter.cpp

@@ -2519,6 +2519,14 @@ SPIRVEmitter::processBufferTextureGetDimensions(const CXXMemberCallExpr *expr) {
 
   // For Texture2DMSArray, arguments are: width, height, elements, NumSamples
 
+  // For TextureCube, arguments are either:
+  // a) width, height
+  // b) MipLevel, width, height, NumLevels
+
+  // For TextureCubeArray, arguments are either:
+  // a) width, height, elements
+  // b) MipLevel, width, height, elements, NumLevels
+
   // Note: SPIR-V Spec requires return type of OpImageQuerySize(Lod) to be a
   // scalar/vector of integers. SPIR-V Spec also requires return type of
   // OpImageQueryLevels and OpImageQuerySamples to be scalar integers.
@@ -2539,8 +2547,10 @@ SPIRVEmitter::processBufferTextureGetDimensions(const CXXMemberCallExpr *expr) {
 
   if ((typeName == "Texture1D" && numArgs > 1) ||
       (typeName == "Texture2D" && numArgs > 2) ||
+      (typeName == "TextureCube" && numArgs > 2) ||
       (typeName == "Texture3D" && numArgs > 3) ||
       (typeName == "Texture1DArray" && numArgs > 2) ||
+      (typeName == "TextureCubeArray" && numArgs > 3) ||
       (typeName == "Texture2DArray" && numArgs > 3)) {
     mipLevel = expr->getArg(0);
     numLevels = expr->getArg(numArgs - 1);

+ 43 - 0
tools/clang/test/CodeGenSPIRV/texture.get-dimensions.hlsl

@@ -9,6 +9,8 @@ Texture2DArray   <float> t4;
 Texture3D        <float> t5;
 Texture2DMS      <float> t6;
 Texture2DMSArray <float> t7;
+TextureCube      <float> t8;
+TextureCubeArray <float> t9;
 
 void main() {
   uint mipLevel = 1;
@@ -289,4 +291,45 @@ void main() {
 // CHECK-NEXT:                      OpStore %f_numSamples [[f_query17]]
   t7.GetDimensions(f_width, f_height, f_elements, f_numSamples);
 
+// CHECK:             [[t8:%\d+]] = OpLoad %type_cube_image %t8
+// CHECK-NEXT:   [[query18:%\d+]] = OpImageQuerySizeLod %v2uint [[t8]] %int_0
+// CHECK-NEXT: [[query18_0:%\d+]] = OpCompositeExtract %uint [[query18]] 0
+// CHECK-NEXT:                      OpStore %width [[query18_0]]
+// CHECK-NEXT: [[query18_1:%\d+]] = OpCompositeExtract %uint [[query18]] 1
+// CHECK-NEXT:                      OpStore %height [[query18_1]]
+  t8.GetDimensions(width, height);
+  
+// CHECK:             [[t8:%\d+]] = OpLoad %type_cube_image %t8
+// CHECK-NEXT:       [[mip:%\d+]] = OpLoad %uint %mipLevel
+// CHECK-NEXT:   [[query19:%\d+]] = OpImageQuerySizeLod %v2uint [[t8]] [[mip]]
+// CHECK-NEXT: [[query19_0:%\d+]] = OpCompositeExtract %uint [[query19]] 0
+// CHECK-NEXT:                      OpStore %width [[query19_0]]
+// CHECK-NEXT: [[query19_1:%\d+]] = OpCompositeExtract %uint [[query19]] 1
+// CHECK-NEXT:                      OpStore %height [[query19_1]]
+// CHECK-NEXT:   [[query20:%\d+]] = OpImageQueryLevels %uint [[t8]]
+// CHECK-NEXT:                      OpStore %numLevels [[query20]]
+  t8.GetDimensions(mipLevel, width, height, numLevels);
+
+// CHECK:             [[t9:%\d+]] = OpLoad %type_cube_image_array %t9
+// CHECK-NEXT:   [[query21:%\d+]] = OpImageQuerySizeLod %v3uint [[t9]] %int_0
+// CHECK-NEXT: [[query21_0:%\d+]] = OpCompositeExtract %uint [[query21]] 0
+// CHECK-NEXT:                      OpStore %width [[query21_0]]
+// CHECK-NEXT: [[query21_1:%\d+]] = OpCompositeExtract %uint [[query21]] 1
+// CHECK-NEXT:                      OpStore %height [[query21_1]]
+// CHECK-NEXT: [[query21_2:%\d+]] = OpCompositeExtract %uint [[query21]] 2
+// CHECK-NEXT:                      OpStore %elements [[query21_2]]
+  t9.GetDimensions(width, height, elements);
+  
+// CHECK:             [[t9:%\d+]] = OpLoad %type_cube_image_array %t9
+// CHECK-NEXT:       [[mip:%\d+]] = OpLoad %uint %mipLevel
+// CHECK-NEXT:   [[query22:%\d+]] = OpImageQuerySizeLod %v3uint [[t9]] [[mip]]
+// CHECK-NEXT: [[query22_0:%\d+]] = OpCompositeExtract %uint [[query22]] 0
+// CHECK-NEXT:                      OpStore %width [[query22_0]]
+// CHECK-NEXT: [[query22_1:%\d+]] = OpCompositeExtract %uint [[query22]] 1
+// CHECK-NEXT:                      OpStore %height [[query22_1]]
+// CHECK-NEXT: [[query22_2:%\d+]] = OpCompositeExtract %uint [[query22]] 2
+// CHECK-NEXT:                      OpStore %elements [[query22_2]]
+// CHECK-NEXT:   [[query23:%\d+]] = OpImageQueryLevels %uint [[t9]]
+// CHECK-NEXT:                      OpStore %numLevels [[query23]]
+  t9.GetDimensions(mipLevel, width, height, elements, numLevels);
 }