Skip to content

Commit e3a0d4c

Browse files
krystian-andrzejewskiigcbot
authored andcommitted
Correct algorithm to compute HWTID
This change is to use state registers if WMTP is not supported by the shader type.
1 parent 556f355 commit e3a0d4c

File tree

1 file changed

+49
-31
lines changed

1 file changed

+49
-31
lines changed

IGC/Compiler/CISACodeGen/CShader.cpp

Lines changed: 49 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -895,7 +895,7 @@ CVariable* CShader::GetHWTID()
895895
m_HW_TID = GetNewVariable(1, ISA_TYPE_UD, EALIGN_DWORD, true, 1, "HWTID");
896896
encoder.SetNoMask();
897897
encoder.SetSrcSubReg(0, 0);
898-
encoder.And(m_HW_TID, GetSR0(), ImmToVariable(bitmask, ISA_TYPE_D));
898+
encoder.And(m_HW_TID, GetSR0(), ImmToVariable(bitmask, ISA_TYPE_UD));
899899
encoder.Push();
900900

901901
// Remove bit [10]
@@ -924,7 +924,7 @@ CVariable* CShader::GetHWTID()
924924
m_HW_TID = GetNewVariable(1, ISA_TYPE_UD, EALIGN_DWORD, true, 1, "HWTID");
925925
encoder.SetNoMask();
926926
encoder.SetSrcSubReg(0, 0);
927-
encoder.And(m_HW_TID, GetSR0(), ImmToVariable(bitmask, ISA_TYPE_D));
927+
encoder.And(m_HW_TID, GetSR0(), ImmToVariable(bitmask, ISA_TYPE_UD));
928928
encoder.Push();
929929

930930
// Remove bit [7:6]
@@ -946,42 +946,60 @@ CVariable* CShader::GetHWTID()
946946
// directly. HWTID is calculated by:
947947
// TID + 10 * [EUID:LogicalSSID]
948948

949-
m_HW_TID = GetNewVariable(1, ISA_TYPE_UD, EALIGN_DWORD, true, 1,
950-
"HWTID");
951-
encoder.SetNoMask();
952-
encoder.SetSrcSubReg(0, 0);
949+
if (m_Platform->supportsWMTPForShaderType(m_ctx->type))
950+
{
951+
m_HW_TID = GetNewVariable(1, ISA_TYPE_UD, EALIGN_DWORD, true, 1,
952+
"HWTID");
953+
encoder.SetNoMask();
954+
encoder.SetSrcSubReg(0, 0);
953955

954-
// m_HW_TID = msg0 & BITMASK(8)
955-
encoder.And(m_HW_TID, GetMSG0(), ImmToVariable(BITMASK(8), ISA_TYPE_UD));
956-
encoder.Push();
956+
// m_HW_TID = msg0 & BITMASK(8)
957+
encoder.And(m_HW_TID, GetMSG0(), ImmToVariable(BITMASK(8), ISA_TYPE_UD));
958+
encoder.Push();
957959

958-
CVariable *euID = GetNewVariable(1, ISA_TYPE_UD, EALIGN_DWORD,
959-
true, 1, "SR_4_6");
960-
// euID = sr0 & BITMASK(7)
961-
encoder.And(euID, GetSR0(), ImmToVariable(BITMASK(7), ISA_TYPE_UD));
962-
encoder.Push();
960+
CVariable* euID = GetNewVariable(1, ISA_TYPE_UD, EALIGN_DWORD,
961+
true, 1, "SR_4_6");
962+
// euID = sr0 & BITMASK(7)
963+
encoder.And(euID, GetSR0(), ImmToVariable(BITMASK(7), ISA_TYPE_UD));
964+
encoder.Push();
963965

964-
// m_HW_TID = m_HW_TID << 3
965-
encoder.Shl(m_HW_TID, m_HW_TID, ImmToVariable(3, ISA_TYPE_UD));
966-
encoder.Push();
966+
// m_HW_TID = m_HW_TID << 3
967+
encoder.Shl(m_HW_TID, m_HW_TID, ImmToVariable(3, ISA_TYPE_UD));
968+
encoder.Push();
967969

968-
// euID = euID >> 4
969-
encoder.Shr(euID, euID, ImmToVariable(4, ISA_TYPE_UD));
970-
encoder.Push();
970+
// euID = euID >> 4
971+
encoder.Shr(euID, euID, ImmToVariable(4, ISA_TYPE_UD));
972+
encoder.Push();
971973

972-
CVariable *tID = GetNewVariable(1, ISA_TYPE_UD, EALIGN_DWORD,
973-
true, 1, "SR_0_3");
974-
// tID = sr0 & BITMASK(4)
975-
encoder.And(tID, GetSR0(), ImmToVariable(BITMASK(4), ISA_TYPE_UD));
976-
encoder.Push();
974+
CVariable* tID = GetNewVariable(1, ISA_TYPE_UD, EALIGN_DWORD,
975+
true, 1, "SR_0_3");
976+
// tID = sr0 & BITMASK(4)
977+
encoder.And(tID, GetSR0(), ImmToVariable(BITMASK(4), ISA_TYPE_UD));
978+
encoder.Push();
977979

978-
// m_HW_TID = m_HW_TID | euID
979-
encoder.Or(m_HW_TID, m_HW_TID, euID);
980-
encoder.Push();
980+
// m_HW_TID = m_HW_TID | euID
981+
encoder.Or(m_HW_TID, m_HW_TID, euID);
982+
encoder.Push();
983+
984+
// m_HW_TID = m_HW_TID * 10 + tID
985+
encoder.Mad(m_HW_TID, m_HW_TID, ImmToVariable(10, ISA_TYPE_UD), tID);
986+
encoder.Push();
987+
}
988+
else
989+
{
990+
uint32_t bitmask = BITMASK(18);
991+
m_HW_TID = GetNewVariable(1, ISA_TYPE_UD, EALIGN_DWORD, true, 1, "HWTID");
992+
encoder.SetNoMask();
993+
encoder.SetSrcSubReg(0, 0);
994+
encoder.And(m_HW_TID, GetSR0(), ImmToVariable(bitmask, ISA_TYPE_UD));
995+
encoder.Push();
996+
997+
// Remove bit [13:12]
998+
RemoveBitRange(m_HW_TID, 12, 2);
999+
// Remove bit [7]
1000+
RemoveBitRange(m_HW_TID, 7, 1);
1001+
}
9811002

982-
// m_HW_TID = m_HW_TID * 10 + tID
983-
encoder.Mad(m_HW_TID, m_HW_TID, ImmToVariable(10, ISA_TYPE_UD), tID);
984-
encoder.Push();
9851003
return m_HW_TID;
9861004
}
9871005

0 commit comments

Comments
 (0)