
Adds support for accessing individual resources from fixed-size global resource arrays. Design proposal: https://github.com/llvm/wg-hlsl/blob/main/proposals/0028-resource-arrays.md Enables indexing into globally scoped, fixed-size resource arrays to retrieve individual resources. The initialization logic is primarily handled during codegen. When a global resource array is indexed, the codegen translates the `ArraySubscriptExpr` AST node into a constructor call for the corresponding resource record type and binding. To support this behavior, Sema needs to ensure that: - The constructor for the specific resource type is instantiated. - An implicit binding attribute is added to resource arrays that lack explicit bindings (#152452). Closes #145424
38 lines
1.3 KiB
HLSL
38 lines
1.3 KiB
HLSL
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -emit-llvm -o - -disable-llvm-passes %s | FileCheck %s
|
|
|
|
// Verify that no per variable _Init_thread instructions are emitted for non-trivial static locals
|
|
// These would normally be emitted by the MicrosoftCXXABI, but the DirectX backend should exlude them
|
|
// Instead, check for the guardvar operations that should protect the constructor initialization should
|
|
// only take place once.
|
|
|
|
RWBuffer<int> buf[10];
|
|
|
|
void InitBuf(RWBuffer<int> buf) {
|
|
for (unsigned int i = 0; i < 100; i++)
|
|
buf[i] = 0;
|
|
}
|
|
|
|
// CHECK-NOT: _Init_thread_epoch
|
|
// CHECK: define internal void @_Z4mainv
|
|
// CHECK-NEXT: entry:
|
|
// CHECK-NEXT: [[Tmp0:%.*]] = alloca %"class.hlsl::RWBuffer"
|
|
// CHECK-NEXT: [[Tmp1:%.*]] = alloca %"class.hlsl::RWBuffer"
|
|
// CHECK-NEXT: [[Tmp2:%.*]] = load i8, ptr @_ZGVZ4mainvE5mybuf
|
|
// CHECK-NEXT: [[Tmp3:%.*]] = icmp eq i8 [[Tmp2]], 0
|
|
// CHECK-NEXT: br i1 [[Tmp3]]
|
|
// CHECK-NOT: _Init_thread_header
|
|
// CHECK: init.check:
|
|
// CHECK-NEXT: call void @_ZN4hlsl8RWBufferIiEC1EjijjPKc(
|
|
// CHECK-NEXT: store i8 1, ptr @_ZGVZ4mainvE5mybuf
|
|
// CHECK-NOT: _Init_thread_footer
|
|
|
|
|
|
[shader("compute")]
|
|
[numthreads(1,1,1)]
|
|
void main() {
|
|
// A non-trivially constructed static local will get checks to verify that it is generated just once
|
|
static RWBuffer<int> mybuf;
|
|
mybuf = buf[0];
|
|
InitBuf(mybuf);
|
|
}
|