@@ -251,6 +251,46 @@ void ShaderOptimizer::ApplyProfileToShaderCreateInfo(
251251 {
252252 options.pOptions ->disableFMA = shaderCreate.tuningOptions .disableFMA ;
253253 }
254+ #if VKI_BUILD_GFX12
255+ if (shaderCreate.apply .workgroupRoundRobin )
256+ {
257+ options.pOptions ->workgroupRoundRobin = shaderCreate.tuningOptions .workgroupRoundRobin ;
258+ }
259+
260+ if (shaderCreate.apply .mallPolicy )
261+ {
262+ options.pOptions ->cachePolicyLlc .resourceCount = shaderCreate.tuningOptions .mallResourceCount ;
263+ options.pOptions ->cachePolicyLlc .noAllocs = shaderCreate.tuningOptions .noAllocs ;
264+ }
265+
266+ if (shaderCreate.apply .temporalHintBufferRead )
267+ {
268+ options.pOptions ->temporalHintShaderControl |=
269+ (shaderCreate.tuningOptions .temporalHintBufferRead + CompilerTemporalHintOffset)
270+ << Vkgc::TemporalHintBufferRead;
271+ }
272+
273+ if (shaderCreate.apply .temporalHintBufferWrite )
274+ {
275+ options.pOptions ->temporalHintShaderControl |=
276+ (shaderCreate.tuningOptions .temporalHintBufferWrite + CompilerTemporalHintOffset)
277+ << Vkgc::TemporalHintBufferWrite;
278+ }
279+
280+ if (shaderCreate.apply .temporalHintImageRead )
281+ {
282+ options.pOptions ->temporalHintShaderControl |=
283+ (shaderCreate.tuningOptions .temporalHintImageRead + CompilerTemporalHintOffset)
284+ << Vkgc::TemporalHintImageRead;
285+ }
286+
287+ if (shaderCreate.apply .temporalHintImageWrite )
288+ {
289+ options.pOptions ->temporalHintShaderControl |=
290+ (shaderCreate.tuningOptions .temporalHintImageWrite + CompilerTemporalHintOffset)
291+ << Vkgc::TemporalHintImageWrite;
292+ }
293+ #endif
254294 if (shaderCreate.apply .workaroundStorageImageFormats )
255295 {
256296 options.pOptions ->workaroundStorageImageFormats = true ;
@@ -536,6 +576,49 @@ void ShaderOptimizer::OverrideShaderThreadGroupSize(
536576 }
537577}
538578
579+ #if VKI_BUILD_GFX12
580+ // =====================================================================================================================
581+ bool ShaderOptimizer::OverrideReverseWorkgroupOrder (
582+ ShaderStage shaderStage,
583+ const PipelineOptimizerKey& pipelineKey
584+ ) const
585+ {
586+ bool overrideReverseWorkgroupOrderHw = false ;
587+
588+ for (uint32_t entry = 0 ; entry < m_appProfile.entryCount ; ++entry)
589+ {
590+ const PipelineProfileEntry& profileEntry = m_appProfile.pEntries [entry];
591+
592+ if (GetFirstMatchingShader (profileEntry.pattern , InvalidShaderIndex, pipelineKey) != InvalidShaderIndex)
593+ {
594+ const auto & shaders = profileEntry.action .shaders ;
595+
596+ if (shaders[shaderStage].shaderCreate .apply .reverseWorkgroupOrderHw )
597+ {
598+ overrideReverseWorkgroupOrderHw = shaders[shaderStage].shaderCreate .tuningOptions .reverseWorkgroupOrderHw ;
599+ }
600+ }
601+ }
602+
603+ for (uint32_t entry = 0 ; entry < m_tuningProfile.entryCount ; ++entry)
604+ {
605+ const PipelineProfileEntry& profileEntry = m_tuningProfile.pEntries [entry];
606+
607+ if (GetFirstMatchingShader (profileEntry.pattern , InvalidShaderIndex, pipelineKey) != InvalidShaderIndex)
608+ {
609+ const auto & shaders = profileEntry.action .shaders ;
610+
611+ if (shaders[shaderStage].shaderCreate .apply .reverseWorkgroupOrderHw )
612+ {
613+ overrideReverseWorkgroupOrderHw = shaders[shaderStage].shaderCreate .tuningOptions .reverseWorkgroupOrderHw ;
614+ }
615+ }
616+ }
617+
618+ return overrideReverseWorkgroupOrderHw;
619+ }
620+ #endif
621+
539622// =====================================================================================================================
540623void ShaderOptimizer::OverrideGraphicsPipelineCreateInfo (
541624 const PipelineOptimizerKey& pipelineKey,
@@ -1014,6 +1097,13 @@ void ShaderOptimizer::BuildTuningProfile()
10141097 pAction->shaderCreate .apply .allowReZ = m_settings.overrideAllowReZ ;
10151098 pAction->shaderCreate .apply .disableLoopUnrolls = m_settings.overrideDisableLoopUnrolls ;
10161099
1100+ #if VKI_BUILD_GFX12
1101+ if (m_settings.overrideWorkgroupRoundRobin )
1102+ {
1103+ pAction->shaderCreate .apply .workgroupRoundRobin = true ;
1104+ pAction->shaderCreate .tuningOptions .workgroupRoundRobin = m_settings.overrideWorkgroupRoundRobin ;
1105+ }
1106+ #endif
10171107 if (m_settings.overrideUseSiScheduler )
10181108 {
10191109 pAction->shaderCreate .apply .useSiScheduler = true ;
@@ -1171,6 +1261,60 @@ void ShaderOptimizer::BuildTuningProfile()
11711261 break ;
11721262 }
11731263 }
1264+ #if VKI_BUILD_GFX12
1265+ if (m_settings.overrideTemporalHintBufferRead != TemporalHints::TH_Default)
1266+ {
1267+ pAction->shaderCreate .apply .temporalHintBufferRead = true ;
1268+ pAction->shaderCreate .tuningOptions .temporalHintBufferRead =
1269+ m_settings.overrideTemporalHintBufferRead ;
1270+ }
1271+
1272+ if (m_settings.overrideTemporalHintBufferWrite != TemporalHints::TH_Default)
1273+ {
1274+ pAction->shaderCreate .apply .temporalHintBufferWrite = true ;
1275+ pAction->shaderCreate .tuningOptions .temporalHintBufferWrite =
1276+ m_settings.overrideTemporalHintBufferWrite ;
1277+ }
1278+
1279+ if (m_settings.overrideTemporalHintImageRead != TemporalHints::TH_Default)
1280+ {
1281+ pAction->shaderCreate .apply .temporalHintImageRead = true ;
1282+ pAction->shaderCreate .tuningOptions .temporalHintImageRead =
1283+ m_settings.overrideTemporalHintImageRead ;
1284+ }
1285+
1286+ if (m_settings.overrideTemporalHintImageWrite != TemporalHints::TH_Default)
1287+ {
1288+ pAction->shaderCreate .apply .temporalHintImageWrite = true ;
1289+ pAction->shaderCreate .tuningOptions .temporalHintImageWrite =
1290+ m_settings.overrideTemporalHintImageWrite ;
1291+ }
1292+
1293+ Util::File hashListFile;
1294+ if (hashListFile.Open (m_settings.overrideCachePolicyLlc , Util::FileAccessRead) == Util::Result::Success)
1295+ {
1296+ // Each line of the file is a hex string which start with "0x", like this
1297+ // 0x000000 - set=0, binding=0, NOALLOC=0
1298+ // 0x200020 - set=0, binding=1, NOALLOC=1
1299+ // 0x200001 - set=1, binding=0, NOALLOC=1
1300+ pAction->shaderCreate .tuningOptions .mallResourceCount = 0 ;
1301+ char hash[256 ] = {};
1302+ while ((hashListFile.ReadLine (hash, sizeof (hash), nullptr ) == Util::Result::Success))
1303+ {
1304+ // Only read hex string
1305+ if ((hash[0 ] == ' 0' ) && (hash[1 ] == ' x' ))
1306+ {
1307+ uint32_t llcResource = strtoul (hash, nullptr , 16 );
1308+ pAction->shaderCreate .tuningOptions .
1309+ noAllocs[pAction->shaderCreate .tuningOptions .mallResourceCount ++] = llcResource;
1310+ }
1311+ }
1312+ if (pAction->shaderCreate .tuningOptions .mallResourceCount > 0 )
1313+ {
1314+ pAction->shaderCreate .apply .mallPolicy = 1 ;
1315+ }
1316+ }
1317+ #endif
11741318 }
11751319 }
11761320}
0 commit comments