Skip to content

Commit 99a8202

Browse files
[SPIR-V] Add error for rasterizer ordered view types (microsoft#5781)
I meant to send this a couple weeks ago. I'll be sending in a PR soon that implements this so up to you if you think it makes sense to merge this first.
1 parent 8e70fa2 commit 99a8202

11 files changed

+74
-6
lines changed

tools/clang/include/clang/SPIRV/AstTypeProbe.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,9 @@ bool isOpaqueStructType(QualType type);
292292
/// operated on with a relaxed precision.
293293
bool isRelaxedPrecisionType(QualType, const SpirvCodeGenOptions &);
294294

295+
/// Returns true if the given type is a rasterizer ordered view.
296+
bool isRasterizerOrderedView(QualType type);
297+
295298
/// Returns true if the given type is a bool or vector of bool type.
296299
bool isBoolOrVecOfBoolType(QualType type);
297300

tools/clang/lib/SPIRV/AstTypeProbe.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1187,6 +1187,25 @@ bool isRelaxedPrecisionType(QualType type, const SpirvCodeGenOptions &opts) {
11871187
return false;
11881188
}
11891189

1190+
bool isRasterizerOrderedView(QualType type) {
1191+
// Strip outer arrayness first
1192+
while (type->isArrayType())
1193+
type = type->getAsArrayTypeUnsafe()->getElementType();
1194+
1195+
if (const RecordType *recordType = type->getAs<RecordType>()) {
1196+
StringRef name = recordType->getDecl()->getName();
1197+
return name == "RasterizerOrderedBuffer" ||
1198+
name == "RasterizerOrderedByteAddressBuffer" ||
1199+
name == "RasterizerOrderedStructuredBuffer" ||
1200+
name == "RasterizerOrderedTexture1D" ||
1201+
name == "RasterizerOrderedTexture1DArray" ||
1202+
name == "RasterizerOrderedTexture2D" ||
1203+
name == "RasterizerOrderedTexture2DArray" ||
1204+
name == "RasterizerOrderedTexture3D";
1205+
}
1206+
return false;
1207+
}
1208+
11901209
/// Returns true if the given type is a bool or vector of bool type.
11911210
bool isBoolOrVecOfBoolType(QualType type) {
11921211
QualType elemType = {};

tools/clang/lib/SPIRV/LowerTypeVisitor.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -630,6 +630,10 @@ const SpirvType *LowerTypeVisitor::lowerResourceType(QualType type,
630630

631631
assert(type->isStructureOrClassType());
632632

633+
if (isRasterizerOrderedView(type)) {
634+
emitError("rasterizer ordered views are unimplemented", srcLoc);
635+
}
636+
633637
const auto *recordType = type->getAs<RecordType>();
634638
assert(recordType);
635639
const llvm::StringRef name = recordType->getDecl()->getName();
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// RUN: not %dxc -T ps_6_6 -E main -fcgl %s -spirv 2>&1 | FileCheck %s
2+
3+
// CHECK: error: rasterizer ordered views are unimplemented
4+
RasterizerOrderedBuffer<uint> rob;
5+
6+
void main() { }
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// RUN: not %dxc -T ps_6_6 -E main -fcgl %s -spirv 2>&1 | FileCheck %s
2+
3+
// TODO: Once these are implemented, we will want to add tests checking that
4+
// RasterizerOrdered* types have all the functionality of RW* types
5+
6+
// CHECK: error: rasterizer ordered views are unimplemented
7+
RasterizerOrderedByteAddressBuffer rob;
8+
9+
void main() { }
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// RUN: not %dxc -T ps_6_6 -E main -fcgl %s -spirv 2>&1 | FileCheck %s
2+
3+
// CHECK: error: rasterizer ordered views are unimplemented
4+
RasterizerOrderedStructuredBuffer<uint> rob;
5+
6+
void main() { }
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// RUN: not %dxc -T ps_6_6 -E main -fcgl %s -spirv 2>&1 | FileCheck %s
2+
3+
// CHECK: error: rasterizer ordered views are unimplemented
4+
RasterizerOrderedTexture1DArray<uint> rot;
5+
6+
void main() { }
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// RUN: not %dxc -T ps_6_6 -E main -fcgl %s -spirv 2>&1 | FileCheck %s
2+
3+
// CHECK: error: rasterizer ordered views are unimplemented
4+
RasterizerOrderedTexture1D<uint> rot;
5+
6+
void main() { }
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// RUN: not %dxc -T ps_6_6 -E main -fcgl %s -spirv 2>&1 | FileCheck %s
2+
3+
// CHECK: error: rasterizer ordered views are unimplemented
4+
RasterizerOrderedTexture2DArray<uint> rot;
5+
6+
void main() { }
Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
1-
// RUN: not %dxc -T ps_6_6 -E main -fcgl %s -spirv 2>&1 | FileCheck %s
2-
RasterizerOrderedTexture2D<uint> rot;
1+
// RUN: not %dxc -T ps_6_6 -E main -fcgl %s -spirv 2>&1 | FileCheck %s
32

4-
static const struct {
5-
// CHECK: error: initializer for type 'RasterizerOrderedTexture2D<unsigned int>' unimplemented
6-
RasterizerOrderedTexture2D<uint> rot_field;
7-
} cstruct = {rot};
3+
// CHECK: error: rasterizer ordered views are unimplemented
4+
RasterizerOrderedTexture2D<uint> rot;
85

96
void main() { }

0 commit comments

Comments
 (0)