Skip to content

Commit ffb9c6c

Browse files
committed
Rebase associations after patching state object desc
1 parent b06e703 commit ffb9c6c

File tree

1 file changed

+21
-4
lines changed

1 file changed

+21
-4
lines changed

renderdoc/driver/d3d12/d3d12_device_wrap5.cpp

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ HRESULT WrappedID3D12Device::CreateStateObject(const D3D12_STATE_OBJECT_DESC *pD
177177

178178
rdcarray<ID3D12RootSignature *> rootsigs;
179179
rdcarray<ID3D12StateObject *> collections;
180+
size_t numAssocs = 0;
180181
for(size_t i = 0; i < subobjects.size(); i++)
181182
{
182183
subobjects[i] = pDesc->pSubobjects[i];
@@ -192,28 +193,44 @@ HRESULT WrappedID3D12Device::CreateStateObject(const D3D12_STATE_OBJECT_DESC *pD
192193
D3D12_EXISTING_COLLECTION_DESC *coll = (D3D12_EXISTING_COLLECTION_DESC *)subobjects[i].pDesc;
193194
collections.push_back(coll->pExistingCollection);
194195
}
196+
else if(subobjects[i].Type == D3D12_STATE_SUBOBJECT_TYPE_SUBOBJECT_TO_EXPORTS_ASSOCIATION)
197+
{
198+
numAssocs++;
199+
}
195200
}
196201

197-
rdcarray<D3D12_GLOBAL_ROOT_SIGNATURE> rootsigObjs;
202+
rdcarray<D3D12_GLOBAL_ROOT_SIGNATURE> unwrappedRootsigObjs;
203+
rdcarray<D3D12_SUBOBJECT_TO_EXPORTS_ASSOCIATION> rebasedAssocs;
198204
rdcarray<D3D12_EXISTING_COLLECTION_DESC> collObjs;
199-
rootsigObjs.resize(rootsigs.size());
205+
unwrappedRootsigObjs.resize(rootsigs.size());
200206
collObjs.resize(collections.size());
207+
rebasedAssocs.reserve(numAssocs);
201208

202209
for(size_t i = 0, r = 0, c = 0; i < subobjects.size(); i++)
203210
{
204211
if(subobjects[i].Type == D3D12_STATE_SUBOBJECT_TYPE_GLOBAL_ROOT_SIGNATURE ||
205212
subobjects[i].Type == D3D12_STATE_SUBOBJECT_TYPE_LOCAL_ROOT_SIGNATURE)
206213
{
207214
D3D12_GLOBAL_ROOT_SIGNATURE *rootsig = (D3D12_GLOBAL_ROOT_SIGNATURE *)subobjects[i].pDesc;
208-
rootsigObjs[r].pGlobalRootSignature = Unwrap(rootsig->pGlobalRootSignature);
209-
subobjects[i].pDesc = &rootsigObjs[r++];
215+
unwrappedRootsigObjs[r].pGlobalRootSignature = Unwrap(rootsig->pGlobalRootSignature);
216+
subobjects[i].pDesc = &unwrappedRootsigObjs[r++];
210217
}
211218
else if(subobjects[i].Type == D3D12_STATE_SUBOBJECT_TYPE_EXISTING_COLLECTION)
212219
{
213220
D3D12_EXISTING_COLLECTION_DESC *coll = (D3D12_EXISTING_COLLECTION_DESC *)subobjects[i].pDesc;
214221
collObjs[c] = *coll;
215222
collObjs[c].pExistingCollection = Unwrap(collObjs[c].pExistingCollection);
216223
}
224+
else if(subobjects[i].Type == D3D12_STATE_SUBOBJECT_TYPE_SUBOBJECT_TO_EXPORTS_ASSOCIATION)
225+
{
226+
D3D12_SUBOBJECT_TO_EXPORTS_ASSOCIATION assoc =
227+
*(D3D12_SUBOBJECT_TO_EXPORTS_ASSOCIATION *)subobjects[i].pDesc;
228+
229+
size_t idx = assoc.pSubobjectToAssociate - pDesc->pSubobjects;
230+
assoc.pSubobjectToAssociate = subobjects.data() + idx;
231+
rebasedAssocs.push_back(assoc);
232+
subobjects[i].pDesc = &rebasedAssocs.back();
233+
}
217234
}
218235

219236
unwrappedDesc.pSubobjects = subobjects.data();

0 commit comments

Comments
 (0)