[llvm-branch-commits] [clang] [HLSL] Implement TextureCube resource type (PR #218520)

via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Mon Aug 24 13:50:04 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang

@llvm/pr-subscribers-backend-mips

Author: Deric C. (Icohedron)

<details>
<summary>Changes</summary>

Fixes https://github.com/llvm/llvm-project/issues/194740 

This PR implements the TextureCube type in HLSL. 
It registers a new TextureCube type much like the existing Texture2D, but excludes methods that do not apply to cube textures.

Texture tests have also been modified to add support for TextureCube. Some tests simply add a new RUN line for TextureCube, while others needed new check prefixes and macros to accomodate the texels, offsets, etc.

Assisted by: Claude Opus 5

---

<sub>Stack created with <a href="https://github.com/github/gh-stack">GitHub Stacks CLI</a> • <a href="https://gh.io/stacks-feedback">Give Feedback 💬</a></sub>

---

Patch is 340.93 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/218520.diff


26 Files Affected:

- (modified) clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.cpp (+181-140) 
- (modified) clang/lib/Sema/HLSLExternalSemaSource.cpp (+21) 
- (modified) clang/test/AST/HLSL/Textures-scalar-AST.hlsl (+548-525) 
- (modified) clang/test/AST/HLSL/Textures-shorthand-AST.hlsl (+4) 
- (modified) clang/test/AST/HLSL/Textures-vector-AST.hlsl (+544-521) 
- (modified) clang/test/CodeGenHLSL/resources/Textures-CalculateLevelOfDetail.hlsl (+12) 
- (modified) clang/test/CodeGenHLSL/resources/Textures-Gather.hlsl (+65-34) 
- (modified) clang/test/CodeGenHLSL/resources/Textures-Sample.hlsl (+91-58) 
- (modified) clang/test/CodeGenHLSL/resources/Textures-SampleBias.hlsl (+72-39) 
- (modified) clang/test/CodeGenHLSL/resources/Textures-SampleCmp.hlsl (+81-48) 
- (modified) clang/test/CodeGenHLSL/resources/Textures-SampleCmpLevelZero.hlsl (+52-27) 
- (modified) clang/test/CodeGenHLSL/resources/Textures-SampleGrad.hlsl (+103-72) 
- (modified) clang/test/CodeGenHLSL/resources/Textures-SampleLevel.hlsl (+69-38) 
- (modified) clang/test/CodeGenHLSL/resources/Textures-default-explicit-binding.hlsl (+16-2) 
- (modified) clang/test/CodeGenHLSL/resources/Textures-default.hlsl (+19-4) 
- (modified) clang/test/CodeGenHLSL/resources/Textures-shorthand-contexts.hlsl (+17-3) 
- (modified) clang/test/SemaHLSL/Resources/Textures-CalculateLevelOfDetail.hlsl (+12-5) 
- (modified) clang/test/SemaHLSL/Resources/Textures-SampleBias.hlsl (+55-16) 
- (modified) clang/test/SemaHLSL/Resources/Textures-SampleCmp.hlsl (+50-16) 
- (modified) clang/test/SemaHLSL/Resources/Textures-SampleCmpLevelZero.hlsl (+42-13) 
- (modified) clang/test/SemaHLSL/Resources/Textures-SampleGrad.hlsl (+57-18) 
- (modified) clang/test/SemaHLSL/Resources/Textures-SampleLevel.hlsl (+47-13) 
- (modified) clang/test/SemaHLSL/Resources/Textures-Sema.hlsl (+52-19) 
- (modified) clang/test/SemaHLSL/Resources/Textures-declaration-order.hlsl (+7) 
- (modified) clang/test/SemaHLSL/Resources/Textures-mips-errors.hlsl (+4-4) 
- (modified) clang/test/SemaHLSL/Resources/Textures-unsupported-methods-errors.hlsl (+22-5) 


``````````diff
diff --git a/clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.cpp b/clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.cpp
index 8636daa3cad35..1b2836cc4e374 100644
--- a/clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.cpp
+++ b/clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.cpp
@@ -1468,6 +1468,10 @@ BuiltinTypeDeclBuilder &
 BuiltinTypeDeclBuilder::addArraySubscriptOperators(ResourceDimension Dim,
                                                    bool IsArray) {
   assert(!Record->isCompleteDefinition() && "record is already complete");
+
+  if (Dim == ResourceDimension::Cube)
+    return *this;
+
   ASTContext &AST = Record->getASTContext();
 
   uint32_t VecSize = 1;
@@ -1604,6 +1608,10 @@ CXXRecordDecl *BuiltinTypeDeclBuilder::addMipsType(ResourceDimension Dim,
 BuiltinTypeDeclBuilder &
 BuiltinTypeDeclBuilder::addMipsMember(ResourceDimension Dim) {
   assert(!Record->isCompleteDefinition() && "record is already complete");
+
+  if (Dim == ResourceDimension::Cube)
+    return *this;
+
   ASTContext &AST = Record->getASTContext();
   QualType ReturnType = getHandleElementType();
 
@@ -1620,6 +1628,10 @@ BuiltinTypeDeclBuilder &
 BuiltinTypeDeclBuilder::addTextureLoadMethods(ResourceDimension Dim,
                                               bool IsArray) {
   assert(!Record->isCompleteDefinition() && "record is already complete");
+
+  if (Dim == ResourceDimension::Cube)
+    return *this;
+
   ASTContext &AST = Record->getASTContext();
   uint32_t OffsetSize = getResourceDimensions(Dim);
   uint32_t CoordSize = OffsetSize + (IsArray ? 2 : 1);
@@ -1810,28 +1822,31 @@ BuiltinTypeDeclBuilder::addSampleMethods(ResourceDimension Dim, bool IsArray) {
       .returnValue(PH::LastStmt)
       .finalize();
 
-  // T Sample(SamplerState s, float2 location, int2 offset)
-  BuiltinTypeMethodBuilder(*this, "Sample", ReturnType)
-      .addParam("Sampler", SamplerStateType)
-      .addParam("Location", CoordTy)
-      .addParam("Offset", OffsetTy)
-      .accessHandleFieldOnResource(PH::_0)
-      .callBuiltin("__builtin_hlsl_resource_sample", ReturnType, PH::Handle,
-                   PH::LastStmt, PH::_1, PH::_2)
-      .returnValue(PH::LastStmt)
-      .finalize();
+  // Cube textures do not support offsets.
+  if (Dim != ResourceDimension::Cube) {
+    // T Sample(SamplerState s, float2 location, int2 offset)
+    BuiltinTypeMethodBuilder(*this, "Sample", ReturnType)
+        .addParam("Sampler", SamplerStateType)
+        .addParam("Location", CoordTy)
+        .addParam("Offset", OffsetTy)
+        .accessHandleFieldOnResource(PH::_0)
+        .callBuiltin("__builtin_hlsl_resource_sample", ReturnType, PH::Handle,
+                     PH::LastStmt, PH::_1, PH::_2)
+        .returnValue(PH::LastStmt)
+        .finalize();
 
-  // T Sample(SamplerState s, float2 location, int2 offset, float clamp)
-  BuiltinTypeMethodBuilder(*this, "Sample", ReturnType)
-      .addParam("Sampler", SamplerStateType)
-      .addParam("Location", CoordTy)
-      .addParam("Offset", OffsetTy)
-      .addParam("Clamp", FloatTy)
-      .accessHandleFieldOnResource(PH::_0)
-      .callBuiltin("__builtin_hlsl_resource_sample", ReturnType, PH::Handle,
-                   PH::LastStmt, PH::_1, PH::_2, PH::_3)
-      .returnValue(PH::LastStmt)
-      .finalize();
+    // T Sample(SamplerState s, float2 location, int2 offset, float clamp)
+    BuiltinTypeMethodBuilder(*this, "Sample", ReturnType)
+        .addParam("Sampler", SamplerStateType)
+        .addParam("Location", CoordTy)
+        .addParam("Offset", OffsetTy)
+        .addParam("Clamp", FloatTy)
+        .accessHandleFieldOnResource(PH::_0)
+        .callBuiltin("__builtin_hlsl_resource_sample", ReturnType, PH::Handle,
+                     PH::LastStmt, PH::_1, PH::_2, PH::_3)
+        .returnValue(PH::LastStmt)
+        .finalize();
+  }
 
   // Sample uses implicit derivatives to calculate the mip level.
   return addDerivativeAvailability("Sample");
@@ -1864,31 +1879,34 @@ BuiltinTypeDeclBuilder::addSampleBiasMethods(ResourceDimension Dim,
       .returnValue(PH::LastStmt)
       .finalize();
 
-  // T SampleBias(SamplerState s, float2 location, float bias, int2 offset)
-  BuiltinTypeMethodBuilder(*this, "SampleBias", ReturnType)
-      .addParam("Sampler", SamplerStateType)
-      .addParam("Location", CoordTy)
-      .addParam("Bias", FloatTy)
-      .addParam("Offset", OffsetTy)
-      .accessHandleFieldOnResource(PH::_0)
-      .callBuiltin("__builtin_hlsl_resource_sample_bias", ReturnType,
-                   PH::Handle, PH::LastStmt, PH::_1, PH::_2, PH::_3)
-      .returnValue(PH::LastStmt)
-      .finalize();
+  // Cube textures do not support offsets.
+  if (Dim != ResourceDimension::Cube) {
+    // T SampleBias(SamplerState s, float2 location, float bias, int2 offset)
+    BuiltinTypeMethodBuilder(*this, "SampleBias", ReturnType)
+        .addParam("Sampler", SamplerStateType)
+        .addParam("Location", CoordTy)
+        .addParam("Bias", FloatTy)
+        .addParam("Offset", OffsetTy)
+        .accessHandleFieldOnResource(PH::_0)
+        .callBuiltin("__builtin_hlsl_resource_sample_bias", ReturnType,
+                     PH::Handle, PH::LastStmt, PH::_1, PH::_2, PH::_3)
+        .returnValue(PH::LastStmt)
+        .finalize();
 
-  // T SampleBias(SamplerState s, float2 location, float bias, int2 offset,
-  // float clamp)
-  BuiltinTypeMethodBuilder(*this, "SampleBias", ReturnType)
-      .addParam("Sampler", SamplerStateType)
-      .addParam("Location", CoordTy)
-      .addParam("Bias", FloatTy)
-      .addParam("Offset", OffsetTy)
-      .addParam("Clamp", FloatTy)
-      .accessHandleFieldOnResource(PH::_0)
-      .callBuiltin("__builtin_hlsl_resource_sample_bias", ReturnType,
-                   PH::Handle, PH::LastStmt, PH::_1, PH::_2, PH::_3, PH::_4)
-      .returnValue(PH::LastStmt)
-      .finalize();
+    // T SampleBias(SamplerState s, float2 location, float bias, int2 offset,
+    // float clamp)
+    BuiltinTypeMethodBuilder(*this, "SampleBias", ReturnType)
+        .addParam("Sampler", SamplerStateType)
+        .addParam("Location", CoordTy)
+        .addParam("Bias", FloatTy)
+        .addParam("Offset", OffsetTy)
+        .addParam("Clamp", FloatTy)
+        .accessHandleFieldOnResource(PH::_0)
+        .callBuiltin("__builtin_hlsl_resource_sample_bias", ReturnType,
+                     PH::Handle, PH::LastStmt, PH::_1, PH::_2, PH::_3, PH::_4)
+        .returnValue(PH::LastStmt)
+        .finalize();
+  }
 
   // SampleBias uses implicit derivatives to calculate the mip level.
   return addDerivativeAvailability("SampleBias");
@@ -1923,35 +1941,40 @@ BuiltinTypeDeclBuilder::addSampleGradMethods(ResourceDimension Dim,
       .returnValue(PH::LastStmt)
       .finalize();
 
-  // T SampleGrad(SamplerState s, float2 location, float2 ddx, float2 ddy,
-  // int2 offset)
-  BuiltinTypeMethodBuilder(*this, "SampleGrad", ReturnType)
-      .addParam("Sampler", SamplerStateType)
-      .addParam("Location", CoordTy)
-      .addParam("DDX", OffsetFloatTy)
-      .addParam("DDY", OffsetFloatTy)
-      .addParam("Offset", OffsetTy)
-      .accessHandleFieldOnResource(PH::_0)
-      .callBuiltin("__builtin_hlsl_resource_sample_grad", ReturnType,
-                   PH::Handle, PH::LastStmt, PH::_1, PH::_2, PH::_3, PH::_4)
-      .returnValue(PH::LastStmt)
-      .finalize();
+  // Cube textures do not support offsets.
+  if (Dim != ResourceDimension::Cube) {
+    // T SampleGrad(SamplerState s, float2 location, float2 ddx, float2 ddy,
+    // int2 offset)
+    BuiltinTypeMethodBuilder(*this, "SampleGrad", ReturnType)
+        .addParam("Sampler", SamplerStateType)
+        .addParam("Location", CoordTy)
+        .addParam("DDX", OffsetFloatTy)
+        .addParam("DDY", OffsetFloatTy)
+        .addParam("Offset", OffsetTy)
+        .accessHandleFieldOnResource(PH::_0)
+        .callBuiltin("__builtin_hlsl_resource_sample_grad", ReturnType,
+                     PH::Handle, PH::LastStmt, PH::_1, PH::_2, PH::_3, PH::_4)
+        .returnValue(PH::LastStmt)
+        .finalize();
 
-  // T SampleGrad(SamplerState s, float2 location, float2 ddx, float2 ddy,
-  // int2 offset, float clamp)
-  return BuiltinTypeMethodBuilder(*this, "SampleGrad", ReturnType)
-      .addParam("Sampler", SamplerStateType)
-      .addParam("Location", CoordTy)
-      .addParam("DDX", OffsetFloatTy)
-      .addParam("DDY", OffsetFloatTy)
-      .addParam("Offset", OffsetTy)
-      .addParam("Clamp", FloatTy)
-      .accessHandleFieldOnResource(PH::_0)
-      .callBuiltin("__builtin_hlsl_resource_sample_grad", ReturnType,
-                   PH::Handle, PH::LastStmt, PH::_1, PH::_2, PH::_3, PH::_4,
-                   PH::_5)
-      .returnValue(PH::LastStmt)
-      .finalize();
+    // T SampleGrad(SamplerState s, float2 location, float2 ddx, float2 ddy,
+    // int2 offset, float clamp)
+    BuiltinTypeMethodBuilder(*this, "SampleGrad", ReturnType)
+        .addParam("Sampler", SamplerStateType)
+        .addParam("Location", CoordTy)
+        .addParam("DDX", OffsetFloatTy)
+        .addParam("DDY", OffsetFloatTy)
+        .addParam("Offset", OffsetTy)
+        .addParam("Clamp", FloatTy)
+        .accessHandleFieldOnResource(PH::_0)
+        .callBuiltin("__builtin_hlsl_resource_sample_grad", ReturnType,
+                     PH::Handle, PH::LastStmt, PH::_1, PH::_2, PH::_3, PH::_4,
+                     PH::_5)
+        .returnValue(PH::LastStmt)
+        .finalize();
+  }
+
+  return *this;
 }
 
 BuiltinTypeDeclBuilder &
@@ -1981,17 +2004,22 @@ BuiltinTypeDeclBuilder::addSampleLevelMethods(ResourceDimension Dim,
       .returnValue(PH::LastStmt)
       .finalize();
 
-  // T SampleLevel(SamplerState s, float2 location, float lod, int2 offset)
-  return BuiltinTypeMethodBuilder(*this, "SampleLevel", ReturnType)
-      .addParam("Sampler", SamplerStateType)
-      .addParam("Location", CoordTy)
-      .addParam("LOD", FloatTy)
-      .addParam("Offset", OffsetTy)
-      .accessHandleFieldOnResource(PH::_0)
-      .callBuiltin("__builtin_hlsl_resource_sample_level", ReturnType,
-                   PH::Handle, PH::LastStmt, PH::_1, PH::_2, PH::_3)
-      .returnValue(PH::LastStmt)
-      .finalize();
+  // Cube textures do not support offsets.
+  if (Dim != ResourceDimension::Cube) {
+    // T SampleLevel(SamplerState s, float2 location, float lod, int2 offset)
+    BuiltinTypeMethodBuilder(*this, "SampleLevel", ReturnType)
+        .addParam("Sampler", SamplerStateType)
+        .addParam("Location", CoordTy)
+        .addParam("LOD", FloatTy)
+        .addParam("Offset", OffsetTy)
+        .accessHandleFieldOnResource(PH::_0)
+        .callBuiltin("__builtin_hlsl_resource_sample_level", ReturnType,
+                     PH::Handle, PH::LastStmt, PH::_1, PH::_2, PH::_3)
+        .returnValue(PH::LastStmt)
+        .finalize();
+  }
+
+  return *this;
 }
 
 BuiltinTypeDeclBuilder &
@@ -2021,32 +2049,35 @@ BuiltinTypeDeclBuilder::addSampleCmpMethods(ResourceDimension Dim,
       .returnValue(PH::LastStmt)
       .finalize();
 
-  // T SampleCmp(SamplerComparisonState s, float2 location, float compare_value,
-  // int2 offset)
-  BuiltinTypeMethodBuilder(*this, "SampleCmp", ReturnType)
-      .addParam("Sampler", SamplerComparisonStateType)
-      .addParam("Location", CoordTy)
-      .addParam("CompareValue", FloatTy)
-      .addParam("Offset", OffsetTy)
-      .accessHandleFieldOnResource(PH::_0)
-      .callBuiltin("__builtin_hlsl_resource_sample_cmp", ReturnType, PH::Handle,
-                   PH::LastStmt, PH::_1, PH::_2, PH::_3)
-      .returnValue(PH::LastStmt)
-      .finalize();
+  // Cube textures do not support offsets.
+  if (Dim != ResourceDimension::Cube) {
+    // T SampleCmp(SamplerComparisonState s, float2 location, float
+    // compare_value, int2 offset)
+    BuiltinTypeMethodBuilder(*this, "SampleCmp", ReturnType)
+        .addParam("Sampler", SamplerComparisonStateType)
+        .addParam("Location", CoordTy)
+        .addParam("CompareValue", FloatTy)
+        .addParam("Offset", OffsetTy)
+        .accessHandleFieldOnResource(PH::_0)
+        .callBuiltin("__builtin_hlsl_resource_sample_cmp", ReturnType,
+                     PH::Handle, PH::LastStmt, PH::_1, PH::_2, PH::_3)
+        .returnValue(PH::LastStmt)
+        .finalize();
 
-  // T SampleCmp(SamplerComparisonState s, float2 location, float compare_value,
-  // int2 offset, float clamp)
-  BuiltinTypeMethodBuilder(*this, "SampleCmp", ReturnType)
-      .addParam("Sampler", SamplerComparisonStateType)
-      .addParam("Location", CoordTy)
-      .addParam("CompareValue", FloatTy)
-      .addParam("Offset", OffsetTy)
-      .addParam("Clamp", FloatTy)
-      .accessHandleFieldOnResource(PH::_0)
-      .callBuiltin("__builtin_hlsl_resource_sample_cmp", ReturnType, PH::Handle,
-                   PH::LastStmt, PH::_1, PH::_2, PH::_3, PH::_4)
-      .returnValue(PH::LastStmt)
-      .finalize();
+    // T SampleCmp(SamplerComparisonState s, float2 location, float
+    // compare_value, int2 offset, float clamp)
+    BuiltinTypeMethodBuilder(*this, "SampleCmp", ReturnType)
+        .addParam("Sampler", SamplerComparisonStateType)
+        .addParam("Location", CoordTy)
+        .addParam("CompareValue", FloatTy)
+        .addParam("Offset", OffsetTy)
+        .addParam("Clamp", FloatTy)
+        .accessHandleFieldOnResource(PH::_0)
+        .callBuiltin("__builtin_hlsl_resource_sample_cmp", ReturnType,
+                     PH::Handle, PH::LastStmt, PH::_1, PH::_2, PH::_3, PH::_4)
+        .returnValue(PH::LastStmt)
+        .finalize();
+  }
 
   // SampleCmp uses implicit derivatives to calculate the mip level.
   return addDerivativeAvailability("SampleCmp");
@@ -2080,18 +2111,24 @@ BuiltinTypeDeclBuilder::addSampleCmpLevelZeroMethods(ResourceDimension Dim,
       .returnValue(PH::LastStmt)
       .finalize();
 
-  // T SampleCmpLevelZero(SamplerComparisonState s, float2 location, float
-  // compare_value, int2 offset)
-  return BuiltinTypeMethodBuilder(*this, "SampleCmpLevelZero", ReturnType)
-      .addParam("Sampler", SamplerComparisonStateType)
-      .addParam("Location", CoordTy)
-      .addParam("CompareValue", FloatTy)
-      .addParam("Offset", OffsetTy)
-      .accessHandleFieldOnResource(PH::_0)
-      .callBuiltin("__builtin_hlsl_resource_sample_cmp_level_zero", ReturnType,
-                   PH::Handle, PH::LastStmt, PH::_1, PH::_2, PH::_3)
-      .returnValue(PH::LastStmt)
-      .finalize();
+  // Cube textures do not support offsets.
+  if (Dim != ResourceDimension::Cube) {
+    // T SampleCmpLevelZero(SamplerComparisonState s, float2 location, float
+    // compare_value, int2 offset)
+    BuiltinTypeMethodBuilder(*this, "SampleCmpLevelZero", ReturnType)
+        .addParam("Sampler", SamplerComparisonStateType)
+        .addParam("Location", CoordTy)
+        .addParam("CompareValue", FloatTy)
+        .addParam("Offset", OffsetTy)
+        .accessHandleFieldOnResource(PH::_0)
+        .callBuiltin("__builtin_hlsl_resource_sample_cmp_level_zero",
+                     ReturnType, PH::Handle, PH::LastStmt, PH::_1, PH::_2,
+                     PH::_3)
+        .returnValue(PH::LastStmt)
+        .finalize();
+  }
+
+  return *this;
 }
 
 BuiltinTypeDeclBuilder &
@@ -2229,15 +2266,17 @@ BuiltinTypeDeclBuilder::addGatherMethods(ResourceDimension Dim, bool IsArray) {
         .finalize();
 
     // ret GatherVariant(SamplerState s, float2 location, int2 offset)
-    BuiltinTypeMethodBuilder(*this, V.Name, ReturnType)
-        .addParam("Sampler", SamplerStateType)
-        .addParam("Location", CoordTy)
-        .addParam("Offset", OffsetTy)
-        .accessHandleFieldOnResource(PH::_0)
-        .callBuiltin("__builtin_hlsl_resource_gather", ReturnType, PH::Handle,
-                     PH::LastStmt, PH::_1,
-                     getConstantUnsignedIntExpr(V.Component), PH::_2)
-        .finalize();
+    // Cube textures do not support offsets.
+    if (Dim != ResourceDimension::Cube)
+      BuiltinTypeMethodBuilder(*this, V.Name, ReturnType)
+          .addParam("Sampler", SamplerStateType)
+          .addParam("Location", CoordTy)
+          .addParam("Offset", OffsetTy)
+          .accessHandleFieldOnResource(PH::_0)
+          .callBuiltin("__builtin_hlsl_resource_gather", ReturnType, PH::Handle,
+                       PH::LastStmt, PH::_1,
+                       getConstantUnsignedIntExpr(V.Component), PH::_2)
+          .finalize();
   }
 
   return *this;
@@ -2287,16 +2326,18 @@ BuiltinTypeDeclBuilder::addGatherCmpMethods(ResourceDimension Dim,
 
     // ret GatherCmpVariant(SamplerComparisonState s, float2 location, float
     // compare_value, int2 offset)
-    BuiltinTypeMethodBuilder(*this, V.Name, ReturnType)
-        .addParam("Sampler", SamplerComparisonStateType)
-        .addParam("Location", CoordTy)
-        .addParam("CompareValue", FloatTy)
-        .addParam("Offset", OffsetTy)
-        .accessHandleFieldOnResource(PH::_0)
-        .callBuiltin("__builtin_hlsl_resource_gather_cmp", ReturnType,
-                     PH::Handle, PH::LastStmt, PH::_1, PH::_2,
-                     getConstantUnsignedIntExpr(V.Component), PH::_3)
-        .finalize();
+    // Cube textures do not support offsets.
+    if (Dim != ResourceDimension::Cube)
+      BuiltinTypeMethodBuilder(*this, V.Name, ReturnType)
+          .addParam("Sampler", SamplerComparisonStateType)
+          .addParam("Location", CoordTy)
+          .addParam("CompareValue", FloatTy)
+          .addParam("Offset", OffsetTy)
+          .accessHandleFieldOnResource(PH::_0)
+          .callBuiltin("__builtin_hlsl_resource_gather_cmp", ReturnType,
+                       PH::Handle, PH::LastStmt, PH::_1, PH::_2,
+                       getConstantUnsignedIntExpr(V.Component), PH::_3)
+          .finalize();
   }
 
   return *this;
diff --git a/clang/lib/Sema/HLSLExternalSemaSource.cpp b/clang/lib/Sema/HLSLExternalSemaSource.cpp
index f8fe990210fbb..07945a0030164 100644
--- a/clang/lib/Sema/HLSLExternalSemaSource.cpp
+++ b/clang/lib/Sema/HLSLExternalSemaSource.cpp
@@ -807,6 +807,27 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
                        ResourceDimension::Dim2D)
         .completeDefinition();
   });
+
+  // TextureCube — SRV cube texture. Locations are float3 direction vectors.
+  // Cube textures do not support Load, operator[], mips or offsets.
+  Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "TextureCube")
+             .addSimpleTemplateParams({"element_type"}, {Float4Ty},
+                                      TypedBufferConcept)
+             .finalizeForwardDeclaration();
+
+  onCompletion(Decl, [this](CXXRecordDecl *Decl) {
+    setupTextureType(Decl, *SemaPtr, ResourceClass::SRV, /*IsROV=*/false,
+                     /*IsArray=*/false, ResourceDimension::Cube)
+        .completeDefinition();
+  });
+
+  auto *PartialSpecCube = addVectorTexturePartialSpecialization(
+      *SemaPtr, HLSLNamespace, Decl->getDescribedClassTemplate());
+  onCompletion(PartialSpecCube, [this](CXXRecordDecl *Decl) {
+    setupTextureType(Decl, *SemaPtr, ResourceClass::SRV, /*IsROV=*/false,
+                     /*IsArray=*/false, ResourceDimension::Cube)
+        .completeDefinition();
+  });
 }
 
 // Build a single overload of an HLSL atomic intrinsic in the hlsl namespace.
diff --git a/clang/test/AST/HLSL/Textures-scalar-AST.hlsl b/clang/test/AST/HLSL/Textures-scalar-AST.hlsl
index 449373e2b7dfc..ab3d517d39ad9 100644
--- a/clang/test/AST/HLSL/Textures-scalar-AST.hlsl
+++ b/clang/test/AST/HLSL/Textures-scalar-AST.hlsl
@@ -1,21 +1,32 @@
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
-// RUN:   -disable-llvm-passes -finclude-default-header -DTEXTURE=Texture2D \
-// RUN:   -DCOORD_TYPE=float2 -DGRAD_TYPE=float2 -DLOD_LOCATION=loc \
-// RUN:   -DOFFSET_ARG="int2(1, 2)" -o - %s \
-// RUN:   | FileCheck %s --check-prefixes=CHECK -DTEXTURE=Texture2D \
-// RUN:   -DDIM_NAME=2D -DDIM=2 -DCOORD_DIM=2 -DLOAD_DIM=3 \
+// RUN:   -disable-llvm-passes -finclude-default-header -DHAS_OFFSET \
+// RUN:   -DHAS_GETDIM_XY -DTEXTURE=Texture2D -DCOORD_TYPE=float2 \
+// RUN:   -DGRAD_TYPE=float2 -DLOD_LOCATION=loc -DOFFSET_ARG="int2(1, 2)" -o - \
+// RUN:   %s \
+// RUN:   | FileCheck %s --check-prefixes=CHECK,TEXEL,OFFSET,GETDIM-XY \
+// RUN:   -DTEXTURE=Texture2D -DDIM_NAME=2D -DDIM=2 -DCOORD_DIM=2 -DLOAD_DIM=3 \
 // RUN:   -DINDEX_TYPE="vector<unsigned int, 2>"
 // ...
[truncated]

``````````

</details>


https://github.com/llvm/llvm-project/pull/218520


More information about the llvm-branch-commits mailing list