@@ -900,6 +900,7 @@ static const ArTypeObjectKind g_AnyTT[] =
900
900
static const ArTypeObjectKind g_ObjectTT[] =
901
901
{
902
902
AR_TOBJ_OBJECT,
903
+ AR_TOBJ_STRING,
903
904
AR_TOBJ_UNKNOWN
904
905
};
905
906
@@ -1099,6 +1100,13 @@ static const ArBasicKind g_AnyCT[] =
1099
1100
AR_BASIC_UNKNOWN
1100
1101
};
1101
1102
1103
+ static const ArBasicKind g_AnySamplerCT[] =
1104
+ {
1105
+ AR_OBJECT_SAMPLER,
1106
+ AR_OBJECT_SAMPLERCOMPARISON,
1107
+ AR_BASIC_UNKNOWN
1108
+ };
1109
+
1102
1110
static const ArBasicKind g_Sampler1DCT[] =
1103
1111
{
1104
1112
AR_OBJECT_SAMPLER1D,
@@ -1294,52 +1302,52 @@ static const ArBasicKind g_SInt16Or32OnlyCT[] =
1294
1302
};
1295
1303
1296
1304
// 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
1343
1351
};
1344
1352
static_assert (ARRAYSIZE(g_LegalIntrinsicCompTypes) == LICOMPTYPE_COUNT,
1345
1353
"Intrinsic comp type table must be updated when new enumerants are added.");
@@ -2103,16 +2111,23 @@ static bool CombineBasicTypes(ArBasicKind LeftKind,
2103
2111
ArBasicKind RightKind,
2104
2112
_Out_ ArBasicKind* pOutKind)
2105
2113
{
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)) {
2108
2117
return false ;
2109
2118
}
2110
2119
2120
+ // If kinds match perfectly, succeed without requiring they be basic
2111
2121
if (LeftKind == RightKind) {
2112
2122
*pOutKind = LeftKind;
2113
2123
return true ;
2114
2124
}
2115
2125
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
+
2116
2131
UINT uLeftProps = GetBasicKindProps (LeftKind);
2117
2132
UINT uRightProps = GetBasicKindProps (RightKind);
2118
2133
UINT uBits = GET_BPROP_BITS (uLeftProps) > GET_BPROP_BITS (uRightProps) ?
@@ -6203,11 +6218,7 @@ bool HLSLExternalSource::MatchArguments(
6203
6218
if (AR_TOBJ_UNKNOWN != Template[i]) {
6204
6219
if ((AR_TOBJ_SCALAR == Template[i]) && (AR_TOBJ_VECTOR == *pTT || AR_TOBJ_MATRIX == *pTT)) {
6205
6220
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 {
6211
6222
while (AR_TOBJ_UNKNOWN != *pTT) {
6212
6223
if (Template[i] == *pTT)
6213
6224
break ;
@@ -6370,12 +6381,11 @@ bool HLSLExternalSource::MatchArguments(
6370
6381
badArgIdx = std::min (badArgIdx, i);
6371
6382
}
6372
6383
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
6376
6387
pNewType = Args[i - 1 ]->getType ().getNonReferenceType ();
6377
- }
6378
- else {
6388
+ } else {
6379
6389
ArBasicKind pEltType;
6380
6390
6381
6391
// ComponentType, if the Id is special then it gets the
@@ -6449,6 +6459,12 @@ bool HLSLExternalSource::MatchArguments(
6449
6459
" have as many arguments and types as the intrinsic template" );
6450
6460
}
6451
6461
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
+
6452
6468
return badArgIdx == MaxIntrinsicArgs;
6453
6469
#undef CAB
6454
6470
}
0 commit comments