@@ -900,6 +900,7 @@ static const ArTypeObjectKind g_AnyTT[] =
900900static 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+
11021110static 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};
13441352static_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