Skip to content

Commit 87fc5b5

Browse files
jeffnnGreg Roth
authored andcommitted
PIX: Symbol manager: don't allow static members to contribute to member offsets (#4952)
* Ignore static members * Remove filecheck macros from test code (cherry picked from commit bef540d)
1 parent 8588ecb commit 87fc5b5

2 files changed

Lines changed: 61 additions & 1 deletion

File tree

lib/DxilDia/DxilDiaSymbolManager.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1570,6 +1570,11 @@ HRESULT dxil_dia::hlsl_symbols::SymbolManagerInit::CreateCompositeType(DWORD dwP
15701570
} else {
15711571
for (llvm::DINode *N : CT->getElements()) {
15721572
if (auto *Field = llvm::dyn_cast<llvm::DIType>(N)) {
1573+
std::unique_ptr<UDTScope> UDTScopeOverride;
1574+
if (Field->isStaticMember()) {
1575+
// Static members do not contribute to sizes or offsets.
1576+
UDTScopeOverride.reset(new UDTScope(&m_pCurUDT, nullptr));
1577+
}
15731578
DWORD dwUnusedFieldID;
15741579
IFR(CreateType(Field, &dwUnusedFieldID));
15751580
if (Field->getTag() == llvm::dwarf::DW_TAG_inheritance) {

tools/clang/unittests/HLSL/PixTest.cpp

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,8 +227,9 @@ class PixTest {
227227
TEST_METHOD(PixTypeManager_InheritancePointerTypedef)
228228
TEST_METHOD(PixTypeManager_MatricesInBase)
229229
TEST_METHOD(PixTypeManager_SamplersAndResources)
230+
TEST_METHOD(PixTypeManager_XBoxDiaAssert)
230231

231-
TEST_METHOD(VirtualRegisters_InstructionCounts)
232+
TEST_METHOD(VirtualRegisters_InstructionCounts)
232233
TEST_METHOD(VirtualRegisters_AlignedOffsets)
233234

234235
TEST_METHOD(RootSignatureUpgrade_SubObjects)
@@ -2088,6 +2089,60 @@ void main()
20882089
VERIFY_SUCCEEDED(pDiaDataSource->openSession(&pDiaSession));
20892090
}
20902091

2092+
TEST_F(PixTest, PixTypeManager_XBoxDiaAssert) {
2093+
if (m_ver.SkipDxilVersion(1, 5))
2094+
return;
2095+
2096+
const char *hlsl = R"(
2097+
struct VSOut
2098+
{
2099+
float4 vPosition : SV_POSITION;
2100+
float4 vLightAndFog : COLOR0_center;
2101+
float4 vTexCoords : TEXCOORD1;
2102+
};
2103+
2104+
struct HSPatchData
2105+
{
2106+
float edges[3] : SV_TessFactor;
2107+
float inside : SV_InsideTessFactor;
2108+
};
2109+
2110+
HSPatchData HSPatchFunc(const InputPatch<VSOut, 3> tri)
2111+
{
2112+
2113+
float dist = (tri[0].vPosition.w + tri[1].vPosition.w + tri[2].vPosition.w) / 3;
2114+
2115+
2116+
float tf = max(1, dist / 100.f);
2117+
2118+
HSPatchData pd;
2119+
pd.edges[0] = pd.edges[1] = pd.edges[2] = tf;
2120+
pd.inside = tf;
2121+
2122+
return pd;
2123+
}
2124+
2125+
[domain("tri")]
2126+
[partitioning("fractional_odd")]
2127+
[outputtopology("triangle_cw")]
2128+
[patchconstantfunc("HSPatchFunc")]
2129+
[outputcontrolpoints(3)]
2130+
[RootSignature("RootFlags(ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT), " "DescriptorTable(SRV(t0, numDescriptors=2), visibility=SHADER_VISIBILITY_ALL)," "DescriptorTable(Sampler(s0, numDescriptors=2), visibility=SHADER_VISIBILITY_PIXEL)," "DescriptorTable(CBV(b0, numDescriptors=1), visibility=SHADER_VISIBILITY_ALL)," "DescriptorTable(CBV(b1, numDescriptors=1), visibility=SHADER_VISIBILITY_ALL)," "DescriptorTable(CBV(b2, numDescriptors=1), visibility=SHADER_VISIBILITY_ALL)," "DescriptorTable(SRV(t3, numDescriptors=1), visibility=SHADER_VISIBILITY_ALL)," "DescriptorTable(UAV(u9, numDescriptors=2), visibility=SHADER_VISIBILITY_ALL),")]
2131+
VSOut main( const uint id : SV_OutputControlPointID,
2132+
const InputPatch< VSOut, 3 > triIn )
2133+
{
2134+
return triIn[id];
2135+
}
2136+
)";
2137+
2138+
CComPtr<IDiaDataSource> pDiaDataSource;
2139+
CComPtr<IDiaSession> pDiaSession;
2140+
CompileAndRunAnnotationAndLoadDiaSource(m_dllSupport, hlsl, L"hs_6_0",
2141+
&pDiaDataSource);
2142+
2143+
VERIFY_SUCCEEDED(pDiaDataSource->openSession(&pDiaSession));
2144+
}
2145+
20912146
CComPtr<IDxcBlob> PixTest::RunShaderAccessTrackingPass(IDxcBlob *blob) {
20922147
CComPtr<IDxcOptimizer> pOptimizer;
20932148
VERIFY_SUCCEEDED(

0 commit comments

Comments
 (0)