Skip to content

Commit a6497c3

Browse files
author
Greg Roth
authored
Allow select() to work with samplers (microsoft#5508)
Add any_sampler builtin parameter type. This will match any sampler type as the select() built-in added with HLSL 2021 requires. Adds a new built-in overload that takes the any_sampler type and ensures that the last two arguments and return type match. Many of the changes were required because we never had to ensure object parameter types matched nor transmit that type to the return type before. Most of the changes to MatchArguments in SemaHLSL are addressing new issues this revealed. Non-basic types can pass the conversion check if they outright match. Adds testing to select() and the ternary operator that it supplements for these usages Fixes microsoft#4673
1 parent 871fba1 commit a6497c3

File tree

5 files changed

+230
-78
lines changed

5 files changed

+230
-78
lines changed

include/dxc/dxcapi.internal.h

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -53,23 +53,32 @@ enum LEGAL_INTRINSIC_TEMPLATES {
5353
static const BYTE INTRIN_COMPTYPE_FROM_TYPE_ELT0 = 0xff;
5454

5555
enum LEGAL_INTRINSIC_COMPTYPES {
56-
LICOMPTYPE_VOID = 0, // void, used for function returns
57-
LICOMPTYPE_BOOL = 1, // bool
58-
LICOMPTYPE_INT = 2, // i32, int-literal
59-
LICOMPTYPE_UINT = 3, // u32, int-literal
60-
LICOMPTYPE_ANY_INT = 4, // i32, u32, i64, u64, int-literal
61-
LICOMPTYPE_ANY_INT32 = 5, // i32, u32, int-literal
62-
LICOMPTYPE_UINT_ONLY = 6, // u32, u64, int-literal; no casts allowed
63-
LICOMPTYPE_FLOAT = 7, // f32, partial-precision-f32, float-literal
64-
LICOMPTYPE_ANY_FLOAT = 8, // f32, partial-precision-f32, f64, float-literal, min10-float, min16-float, half
65-
LICOMPTYPE_FLOAT_LIKE = 9, // f32, partial-precision-f32, float-literal, min10-float, min16-float, half
66-
LICOMPTYPE_FLOAT_DOUBLE = 10, // f32, partial-precision-f32, f64, float-literal
67-
LICOMPTYPE_DOUBLE = 11, // f64, float-literal
68-
LICOMPTYPE_DOUBLE_ONLY = 12, // f64; no casts allowed
69-
LICOMPTYPE_NUMERIC = 13, // float-literal, f32, partial-precision-f32, f64, min10-float, min16-float, int-literal, i32, u32, min12-int, min16-int, min16-uint, i64, u64
70-
LICOMPTYPE_NUMERIC32 = 14, // float-literal, f32, partial-precision-f32, int-literal, i32, u32
71-
LICOMPTYPE_NUMERIC32_ONLY = 15, // float-literal, f32, partial-precision-f32, int-literal, i32, u32; no casts allowed
72-
LICOMPTYPE_ANY = 16, // float-literal, f32, partial-precision-f32, f64, min10-float, min16-float, int-literal, i32, u32, min12-int, min16-int, min16-uint, bool, i64, u64
56+
LICOMPTYPE_VOID = 0, // void, used for function returns
57+
LICOMPTYPE_BOOL = 1, // bool
58+
LICOMPTYPE_INT = 2, // i32, int-literal
59+
LICOMPTYPE_UINT = 3, // u32, int-literal
60+
LICOMPTYPE_ANY_INT = 4, // i32, u32, i64, u64, int-literal
61+
LICOMPTYPE_ANY_INT32 = 5, // i32, u32, int-literal
62+
LICOMPTYPE_UINT_ONLY = 6, // u32, u64, int-literal; no casts allowed
63+
LICOMPTYPE_FLOAT = 7, // f32, partial-precision-f32, float-literal
64+
LICOMPTYPE_ANY_FLOAT = 8, // f32, partial-precision-f32, f64, float-literal,
65+
// min10-float, min16-float, half
66+
LICOMPTYPE_FLOAT_LIKE = 9, // f32, partial-precision-f32, float-literal,
67+
// min10-float, min16-float, half
68+
LICOMPTYPE_FLOAT_DOUBLE =
69+
10, // f32, partial-precision-f32, f64, float-literal
70+
LICOMPTYPE_DOUBLE = 11, // f64, float-literal
71+
LICOMPTYPE_DOUBLE_ONLY = 12, // f64; no casts allowed
72+
LICOMPTYPE_NUMERIC = 13, // float-literal, f32, partial-precision-f32, f64,
73+
// min10-float, min16-float, int-literal, i32, u32,
74+
// min12-int, min16-int, min16-uint, i64, u64
75+
LICOMPTYPE_NUMERIC32 =
76+
14, // float-literal, f32, partial-precision-f32, int-literal, i32, u32
77+
LICOMPTYPE_NUMERIC32_ONLY = 15, // float-literal, f32, partial-precision-f32,
78+
// int-literal, i32, u32; no casts allowed
79+
LICOMPTYPE_ANY = 16, // float-literal, f32, partial-precision-f32, f64,
80+
// min10-float, min16-float, int-literal, i32, u32,
81+
// min12-int, min16-int, min16-uint, bool, i64, u64
7382
LICOMPTYPE_SAMPLER1D = 17,
7483
LICOMPTYPE_SAMPLER2D = 18,
7584
LICOMPTYPE_SAMPLER3D = 19,
@@ -78,7 +87,7 @@ enum LEGAL_INTRINSIC_COMPTYPES {
7887
LICOMPTYPE_SAMPLER = 22,
7988
LICOMPTYPE_STRING = 23,
8089
LICOMPTYPE_WAVE = 24,
81-
LICOMPTYPE_UINT64 = 25, // u64, int-literal
90+
LICOMPTYPE_UINT64 = 25, // u64, int-literal
8291
LICOMPTYPE_FLOAT16 = 26,
8392
LICOMPTYPE_INT16 = 27,
8493
LICOMPTYPE_UINT16 = 28,
@@ -99,7 +108,8 @@ enum LEGAL_INTRINSIC_COMPTYPES {
99108
LICOMPTYPE_UINT8_4PACKED = 41,
100109
LICOMPTYPE_ANY_INT16_OR_32 = 42,
101110
LICOMPTYPE_SINT16_OR_32_ONLY = 43,
102-
LICOMPTYPE_COUNT = 44
111+
LICOMPTYPE_ANY_SAMPLER = 44,
112+
LICOMPTYPE_COUNT = 45
103113
};
104114

105115
static const BYTE IA_SPECIAL_BASE = 0xf0;

tools/clang/lib/Sema/SemaHLSL.cpp

Lines changed: 74 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -900,6 +900,7 @@ static const ArTypeObjectKind g_AnyTT[] =
900900
static const ArTypeObjectKind g_ObjectTT[] =
901901
{
902902
AR_TOBJ_OBJECT,
903+
AR_TOBJ_STRING,
903904
AR_TOBJ_UNKNOWN
904905
};
905906

@@ -1099,6 +1100,13 @@ static const ArBasicKind g_AnyCT[] =
10991100
AR_BASIC_UNKNOWN
11001101
};
11011102

1103+
static const ArBasicKind g_AnySamplerCT[] =
1104+
{
1105+
AR_OBJECT_SAMPLER,
1106+
AR_OBJECT_SAMPLERCOMPARISON,
1107+
AR_BASIC_UNKNOWN
1108+
};
1109+
11021110
static const ArBasicKind g_Sampler1DCT[] =
11031111
{
11041112
AR_OBJECT_SAMPLER1D,
@@ -1294,52 +1302,52 @@ static const ArBasicKind g_SInt16Or32OnlyCT[] =
12941302
};
12951303

12961304
// Basic kinds, indexed by a LEGAL_INTRINSIC_COMPTYPES value.
1297-
const ArBasicKind* g_LegalIntrinsicCompTypes[] =
1298-
{
1299-
g_NullCT, // LICOMPTYPE_VOID
1300-
g_BoolCT, // LICOMPTYPE_BOOL
1301-
g_IntCT, // LICOMPTYPE_INT
1302-
g_UIntCT, // LICOMPTYPE_UINT
1303-
g_AnyIntCT, // LICOMPTYPE_ANY_INT
1304-
g_AnyInt32CT, // LICOMPTYPE_ANY_INT32
1305-
g_UIntOnlyCT, // LICOMPTYPE_UINT_ONLY
1306-
g_FloatCT, // LICOMPTYPE_FLOAT
1307-
g_AnyFloatCT, // LICOMPTYPE_ANY_FLOAT
1308-
g_FloatLikeCT, // LICOMPTYPE_FLOAT_LIKE
1309-
g_FloatDoubleCT, // LICOMPTYPE_FLOAT_DOUBLE
1310-
g_DoubleCT, // LICOMPTYPE_DOUBLE
1311-
g_DoubleOnlyCT, // LICOMPTYPE_DOUBLE_ONLY
1312-
g_NumericCT, // LICOMPTYPE_NUMERIC
1313-
g_Numeric32CT, // LICOMPTYPE_NUMERIC32
1314-
g_Numeric32OnlyCT, // LICOMPTYPE_NUMERIC32_ONLY
1315-
g_AnyCT, // LICOMPTYPE_ANY
1316-
g_Sampler1DCT, // LICOMPTYPE_SAMPLER1D
1317-
g_Sampler2DCT, // LICOMPTYPE_SAMPLER2D
1318-
g_Sampler3DCT, // LICOMPTYPE_SAMPLER3D
1319-
g_SamplerCUBECT, // LICOMPTYPE_SAMPLERCUBE
1320-
g_SamplerCmpCT, // LICOMPTYPE_SAMPLERCMP
1321-
g_SamplerCT, // LICOMPTYPE_SAMPLER
1322-
g_StringCT, // LICOMPTYPE_STRING
1323-
g_WaveCT, // LICOMPTYPE_WAVE
1324-
g_UInt64CT, // LICOMPTYPE_UINT64
1325-
g_Float16CT, // LICOMPTYPE_FLOAT16
1326-
g_Int16CT, // LICOMPTYPE_INT16
1327-
g_UInt16CT, // LICOMPTYPE_UINT16
1328-
g_Numeric16OnlyCT, // LICOMPTYPE_NUMERIC16_ONLY
1329-
g_RayDescCT, // LICOMPTYPE_RAYDESC
1330-
g_AccelerationStructCT, // LICOMPTYPE_ACCELERATION_STRUCT,
1331-
g_UDTCT, // LICOMPTYPE_USER_DEFINED_TYPE
1332-
g_Texture2DCT, // LICOMPTYPE_TEXTURE2D
1333-
g_Texture2DArrayCT, // LICOMPTYPE_TEXTURE2DARRAY
1334-
g_ResourceCT, // LICOMPTYPE_RESOURCE
1335-
g_Int32OnlyCT, // LICOMPTYPE_INT32_ONLY
1336-
g_Int64OnlyCT, // LICOMPTYPE_INT64_ONLY
1337-
g_AnyInt64CT, // LICOMPTYPE_ANY_INT64
1338-
g_Float32OnlyCT, // LICOMPTYPE_FLOAT32_ONLY
1339-
g_Int8_4PackedCT, // LICOMPTYPE_INT8_4PACKED
1340-
g_UInt8_4PackedCT, // LICOMPTYPE_UINT8_4PACKED
1341-
g_AnyInt16Or32CT, // LICOMPTYPE_ANY_INT16_OR_32
1342-
g_SInt16Or32OnlyCT, // LICOMPTYPE_SINT16_OR_32_ONLY
1305+
const ArBasicKind *g_LegalIntrinsicCompTypes[] = {
1306+
g_NullCT, // LICOMPTYPE_VOID
1307+
g_BoolCT, // LICOMPTYPE_BOOL
1308+
g_IntCT, // LICOMPTYPE_INT
1309+
g_UIntCT, // LICOMPTYPE_UINT
1310+
g_AnyIntCT, // LICOMPTYPE_ANY_INT
1311+
g_AnyInt32CT, // LICOMPTYPE_ANY_INT32
1312+
g_UIntOnlyCT, // LICOMPTYPE_UINT_ONLY
1313+
g_FloatCT, // LICOMPTYPE_FLOAT
1314+
g_AnyFloatCT, // LICOMPTYPE_ANY_FLOAT
1315+
g_FloatLikeCT, // LICOMPTYPE_FLOAT_LIKE
1316+
g_FloatDoubleCT, // LICOMPTYPE_FLOAT_DOUBLE
1317+
g_DoubleCT, // LICOMPTYPE_DOUBLE
1318+
g_DoubleOnlyCT, // LICOMPTYPE_DOUBLE_ONLY
1319+
g_NumericCT, // LICOMPTYPE_NUMERIC
1320+
g_Numeric32CT, // LICOMPTYPE_NUMERIC32
1321+
g_Numeric32OnlyCT, // LICOMPTYPE_NUMERIC32_ONLY
1322+
g_AnyCT, // LICOMPTYPE_ANY
1323+
g_Sampler1DCT, // LICOMPTYPE_SAMPLER1D
1324+
g_Sampler2DCT, // LICOMPTYPE_SAMPLER2D
1325+
g_Sampler3DCT, // LICOMPTYPE_SAMPLER3D
1326+
g_SamplerCUBECT, // LICOMPTYPE_SAMPLERCUBE
1327+
g_SamplerCmpCT, // LICOMPTYPE_SAMPLERCMP
1328+
g_SamplerCT, // LICOMPTYPE_SAMPLER
1329+
g_StringCT, // LICOMPTYPE_STRING
1330+
g_WaveCT, // LICOMPTYPE_WAVE
1331+
g_UInt64CT, // LICOMPTYPE_UINT64
1332+
g_Float16CT, // LICOMPTYPE_FLOAT16
1333+
g_Int16CT, // LICOMPTYPE_INT16
1334+
g_UInt16CT, // LICOMPTYPE_UINT16
1335+
g_Numeric16OnlyCT, // LICOMPTYPE_NUMERIC16_ONLY
1336+
g_RayDescCT, // LICOMPTYPE_RAYDESC
1337+
g_AccelerationStructCT, // LICOMPTYPE_ACCELERATION_STRUCT,
1338+
g_UDTCT, // LICOMPTYPE_USER_DEFINED_TYPE
1339+
g_Texture2DCT, // LICOMPTYPE_TEXTURE2D
1340+
g_Texture2DArrayCT, // LICOMPTYPE_TEXTURE2DARRAY
1341+
g_ResourceCT, // LICOMPTYPE_RESOURCE
1342+
g_Int32OnlyCT, // LICOMPTYPE_INT32_ONLY
1343+
g_Int64OnlyCT, // LICOMPTYPE_INT64_ONLY
1344+
g_AnyInt64CT, // LICOMPTYPE_ANY_INT64
1345+
g_Float32OnlyCT, // LICOMPTYPE_FLOAT32_ONLY
1346+
g_Int8_4PackedCT, // LICOMPTYPE_INT8_4PACKED
1347+
g_UInt8_4PackedCT, // LICOMPTYPE_UINT8_4PACKED
1348+
g_AnyInt16Or32CT, // LICOMPTYPE_ANY_INT16_OR_32
1349+
g_SInt16Or32OnlyCT, // LICOMPTYPE_SINT16_OR_32_ONLY
1350+
g_AnySamplerCT, // LICOMPTYPE_ANY_SAMPLER
13431351
};
13441352
static_assert(ARRAYSIZE(g_LegalIntrinsicCompTypes) == LICOMPTYPE_COUNT,
13451353
"Intrinsic comp type table must be updated when new enumerants are added.");
@@ -2103,16 +2111,23 @@ static bool CombineBasicTypes(ArBasicKind LeftKind,
21032111
ArBasicKind RightKind,
21042112
_Out_ ArBasicKind* pOutKind)
21052113
{
2106-
if ((LeftKind < 0 || LeftKind >= AR_BASIC_COUNT) ||
2107-
(RightKind < 0 || RightKind >= AR_BASIC_COUNT)) {
2114+
// Make sure the kinds are both valid
2115+
if ((LeftKind < 0 || LeftKind >= AR_BASIC_MAXIMUM_COUNT) ||
2116+
(RightKind < 0 || RightKind >= AR_BASIC_MAXIMUM_COUNT)) {
21082117
return false;
21092118
}
21102119

2120+
// If kinds match perfectly, succeed without requiring they be basic
21112121
if (LeftKind == RightKind) {
21122122
*pOutKind = LeftKind;
21132123
return true;
21142124
}
21152125

2126+
// More complicated combination requires that the kinds be basic
2127+
if (LeftKind >= AR_BASIC_COUNT || RightKind >= AR_BASIC_COUNT) {
2128+
return false;
2129+
}
2130+
21162131
UINT uLeftProps = GetBasicKindProps(LeftKind);
21172132
UINT uRightProps = GetBasicKindProps(RightKind);
21182133
UINT uBits = GET_BPROP_BITS(uLeftProps) > GET_BPROP_BITS(uRightProps) ?
@@ -6203,11 +6218,7 @@ bool HLSLExternalSource::MatchArguments(
62036218
if (AR_TOBJ_UNKNOWN != Template[i]) {
62046219
if ((AR_TOBJ_SCALAR == Template[i]) && (AR_TOBJ_VECTOR == *pTT || AR_TOBJ_MATRIX == *pTT)) {
62056220
Template[i] = *pTT;
6206-
}
6207-
else if(AR_TOBJ_STRING == Template[i] && *pTT == AR_TOBJ_OBJECT) {
6208-
Template[i] = *pTT;
6209-
}
6210-
else {
6221+
} else {
62116222
while (AR_TOBJ_UNKNOWN != *pTT) {
62126223
if (Template[i] == *pTT)
62136224
break;
@@ -6370,12 +6381,11 @@ bool HLSLExternalSource::MatchArguments(
63706381
badArgIdx = std::min(badArgIdx, i);
63716382
}
63726383
pNewType = objectElement;
6373-
}
6374-
else if (pArgument->uLegalComponentTypes == LICOMPTYPE_TEXTURE2D
6375-
|| pArgument->uLegalComponentTypes == LICOMPTYPE_TEXTURE2DARRAY) {
6384+
} else if (i != 0 && Template[pArgument->uTemplateId] == AR_TOBJ_OBJECT) {
6385+
// For object parameters, just use the argument type
6386+
// Return type is assigned below
63766387
pNewType = Args[i - 1]->getType().getNonReferenceType();
6377-
}
6378-
else {
6388+
} else {
63796389
ArBasicKind pEltType;
63806390

63816391
// ComponentType, if the Id is special then it gets the
@@ -6449,6 +6459,12 @@ bool HLSLExternalSource::MatchArguments(
64496459
"have as many arguments and types as the intrinsic template");
64506460
}
64516461

6462+
// For object return types that need to match arguments, we need to slot in
6463+
// the full type here Can't do it sooner because when return is encountered
6464+
// above, the other arg types haven't been set
6465+
if (Template[pIntrinsic->pArgs[0].uTemplateId] == AR_TOBJ_OBJECT)
6466+
argTypes[0] = argTypes[pIntrinsic->pArgs[0].uComponentTypeId];
6467+
64526468
return badArgIdx == MaxIntrinsicArgs;
64536469
#undef CAB
64546470
}

0 commit comments

Comments
 (0)