@@ -446,16 +446,7 @@ namespace IGC
446
446
SIMD_SKIP_ML, // 8: skip this SIMD due to ML engine prediction.
447
447
SIMD_FORCE_CONTENT, // 9: force this simd due to shader content (simd32 if WaveActive, barriers + interlocks)
448
448
SIMD_FORCE_HINT, // 10: force this simd by hint(s) (now for WaveSize only)
449
- SIMD_INFO_RESERVED // 11: *** If new entry is added, make sure it still fits in m_SIMDInfo ***
450
- };
451
-
452
- enum SIMDInfoOffset
453
- {
454
- SIMD8_OFFSET = 0 ,
455
- SIMD16_OFFSET = SIMD_INFO_RESERVED,
456
- SIMD32_OFFSET = SIMD_INFO_RESERVED*2 ,
457
- DUAL_SIMD8_OFFSET = SIMD_INFO_RESERVED * 3 ,
458
- QUAD_SIMD8_DYNAMIC_OFFSET = SIMD_INFO_RESERVED*6 ,
449
+ SIMD_INFO_RESERVED // 11: *** If new entry is added, make sure it still fits in each m_SIMDInfo Ex:m_simd8_SIMDInfo ***
459
450
};
460
451
461
452
struct SKernelProgram
@@ -493,7 +484,11 @@ namespace IGC
493
484
494
485
SSimplePushInfo simplePushInfoArr[g_c_maxNumberOfBufferPushed];
495
486
496
- uint64_t SIMDInfo = 0 ;
487
+ uint32_t simd8_SIMDInfo = 0 ;
488
+ uint32_t simd16_SIMDInfo = 0 ;
489
+ uint32_t simd32_SIMDInfo = 0 ;
490
+ uint32_t dual_simd8_SIMDInfo = 0 ;
491
+ uint32_t quad_simd8_dynamic_SIMDInfo = 0 ;
497
492
void * m_StagingCtx;
498
493
bool m_RequestStage2;
499
494
};
@@ -1019,7 +1014,11 @@ namespace IGC
1019
1014
std::vector<int > m_gsNonDefaultIdxMap;
1020
1015
std::vector<int > m_psIdxMap;
1021
1016
DWORD LtoUsedMask = 0 ;
1022
- uint64_t m_SIMDInfo = 0 ;
1017
+ uint32_t m_simd8_SIMDInfo = 0 ;
1018
+ uint32_t m_simd16_SIMDInfo = 0 ;
1019
+ uint32_t m_simd32_SIMDInfo = 0 ;
1020
+ uint32_t m_dual_simd8_SIMDInfo = 0 ;
1021
+ uint32_t m_quad_simd8_dynamic_SIMDInfo = 0 ;
1023
1022
uint32_t HdcEnableIndexSize = 0 ;
1024
1023
std::vector<RoutingIndex> HdcEnableIndexValues;
1025
1024
@@ -1065,7 +1064,7 @@ namespace IGC
1065
1064
const bool createResourceDimTypes = true ,
1066
1065
LLVMContextWrapper* LLVMContext = nullptr )// /< LLVM context to use, if null a new one will be created
1067
1066
: type(_type), platform(_platform), btiLayout(_bitLayout), m_DriverInfo(driverInfo),
1068
- llvmCtxWrapper (LLVMContext), m_SIMDInfo( 0 )
1067
+ llvmCtxWrapper (LLVMContext)
1069
1068
{
1070
1069
if (llvmCtxWrapper == nullptr )
1071
1070
{
@@ -1167,57 +1166,63 @@ namespace IGC
1167
1166
1168
1167
bool isSWSubTriangleOpacityCullingEmulationEnabled () const ;
1169
1168
1170
- unsigned int GetSIMDInfoOffset (SIMDMode simd, ShaderDispatchMode mode)
1171
- {
1172
- unsigned int offset = 0 ;
1169
+ enum Action { Set, Clear };
1173
1170
1174
- switch (mode) {
1171
+ // ModifySIMDInfo is used by both Set and ClearSIMDInfo. Since Clear function doesn't have bit information, it defaults
1172
+ // to SIMD_INFO_RESERVED if the argument is not passed. bit will not be used when action is Action::clear
1173
+ void ModifySIMDInfo (SIMDMode simd, ShaderDispatchMode mode, Action action, SIMDInfoBit bit = SIMD_INFO_RESERVED)
1174
+ {
1175
+ uint32_t bit_value = 1UL << bit;
1176
+ bool clear = action == Action::Clear ? true : false ;
1177
+ switch (mode)
1178
+ {
1175
1179
case ShaderDispatchMode::NOT_APPLICABLE:
1176
- switch (simd) {
1180
+ switch (simd)
1181
+ {
1177
1182
case SIMDMode::SIMD8:
1178
- offset = SIMD8_OFFSET ;
1183
+ m_simd8_SIMDInfo = clear ? 0 : m_simd8_SIMDInfo | bit_value ;
1179
1184
break ;
1180
1185
case SIMDMode::SIMD16:
1181
- offset = SIMD16_OFFSET ;
1186
+ m_simd16_SIMDInfo = clear ? 0 : m_simd16_SIMDInfo | bit_value ;
1182
1187
break ;
1183
1188
case SIMDMode::SIMD32:
1184
- offset = SIMD32_OFFSET ;
1189
+ m_simd32_SIMDInfo = clear ? 0 : m_simd32_SIMDInfo | bit_value ;
1185
1190
break ;
1186
1191
default :
1192
+ IGC_ASSERT_MESSAGE (0 , " Unknown SIMD Mode" );
1187
1193
break ;
1188
1194
}
1189
1195
break ;
1190
1196
1191
1197
case ShaderDispatchMode::DUAL_SIMD8:
1192
- offset = DUAL_SIMD8_OFFSET ;
1198
+ m_dual_simd8_SIMDInfo = clear ? 0 : m_dual_simd8_SIMDInfo | bit_value ;
1193
1199
break ;
1194
1200
case ShaderDispatchMode::QUAD_SIMD8_DYNAMIC:
1195
- offset = QUAD_SIMD8_DYNAMIC_OFFSET ;
1201
+ m_quad_simd8_dynamic_SIMDInfo = clear ? 0 : m_quad_simd8_dynamic_SIMDInfo | bit_value ;
1196
1202
break ;
1197
1203
1198
1204
default :
1205
+ IGC_ASSERT_MESSAGE (0 , " Unknown SIMD Mode" );
1199
1206
break ;
1200
1207
}
1201
- IGC_ASSERT (offset < 64 );
1202
- return offset;
1203
1208
}
1204
1209
1205
1210
void SetSIMDInfo (SIMDInfoBit bit, SIMDMode simd, ShaderDispatchMode mode)
1206
1211
{
1207
- unsigned int offset = GetSIMDInfoOffset (simd, mode);
1208
- unsigned int shift = bit + offset;
1209
- IGC_ASSERT (shift < 64 );
1210
- m_SIMDInfo |= 1ULL << shift;
1212
+ IGC_ASSERT (bit < SIMD_INFO_RESERVED);
1213
+ ModifySIMDInfo (simd, mode, Action::Set, bit);
1211
1214
}
1212
1215
1213
1216
void ClearSIMDInfo (SIMDMode simd, ShaderDispatchMode mode)
1214
1217
{
1215
- unsigned int offset = GetSIMDInfoOffset (simd, mode);
1216
- IGC_ASSERT (offset < 64 );
1217
- m_SIMDInfo &= ~(0xffULL << offset);
1218
+ ModifySIMDInfo (simd, mode, Action::Clear);
1218
1219
}
1219
1220
1220
- uint64_t GetSIMDInfo () { return m_SIMDInfo; }
1221
+ uint32_t GetSimd8SIMDInfo () const { return m_simd8_SIMDInfo; }
1222
+ uint32_t GetSimd16SIMDInfo () const { return m_simd16_SIMDInfo; }
1223
+ uint32_t GetSimd32SIMDInfo () const { return m_simd32_SIMDInfo; }
1224
+ uint32_t GetDualSimd8SIMDInfo () const { return m_dual_simd8_SIMDInfo; }
1225
+ uint32_t GetQuadSimd8DynamicSIMDInfo () const { return m_quad_simd8_dynamic_SIMDInfo; }
1221
1226
1222
1227
SIMDMode GetSIMDMode () const ;
1223
1228
0 commit comments