Pre-allocate map array in D3D12Resource, experimental race condition fix

This commit is contained in:
baldurk
2018-04-26 18:21:20 +01:00
parent fe0b7ba3c1
commit c520f637d1
3 changed files with 32 additions and 27 deletions
@@ -1309,6 +1309,9 @@ HRESULT WrappedID3D12Device::CreateCommittedResource(const D3D12_HEAP_PROPERTIES
record->Length = 0;
wrapped->SetResourceRecord(record);
record->m_MapsCount = GetNumSubresources(this, pDesc);
record->m_Maps = new D3D12ResourceRecord::MapData[record->m_MapsCount];
record->AddChunk(scope.Get());
{
@@ -1550,6 +1553,9 @@ HRESULT WrappedID3D12Device::CreatePlacedResource(ID3D12Heap *pHeap, UINT64 Heap
record->Length = 0;
wrapped->SetResourceRecord(record);
record->m_MapsCount = GetNumSubresources(this, pDesc);
record->m_Maps = new D3D12ResourceRecord::MapData[record->m_MapsCount];
RDCASSERT(pHeap);
record->AddParent(GetRecord(pHeap));
+9 -2
View File
@@ -389,10 +389,16 @@ struct D3D12ResourceRecord : public ResourceRecord
type(Resource_Unknown),
ContainsExecuteIndirect(false),
cmdInfo(NULL),
m_Maps(NULL),
m_MapsCount(0),
bakedCommands(NULL)
{
}
~D3D12ResourceRecord() { SAFE_DELETE(cmdInfo); }
~D3D12ResourceRecord()
{
SAFE_DELETE(cmdInfo);
SAFE_DELETE_ARRAY(m_Maps);
}
void Bake()
{
RDCASSERT(cmdInfo);
@@ -434,7 +440,8 @@ struct D3D12ResourceRecord : public ResourceRecord
byte *shadowPtr;
};
vector<MapData> m_Map;
MapData *m_Maps;
size_t m_MapsCount;
};
typedef vector<D3D12_RESOURCE_STATES> SubresourceStateVector;
+17 -25
View File
@@ -285,10 +285,11 @@ WrappedID3D12Resource::~WrappedID3D12Resource()
// perform an implicit unmap on release
if(GetResourceRecord())
{
vector<D3D12ResourceRecord::MapData> &map = GetResourceRecord()->m_Map;
D3D12ResourceRecord::MapData *map = GetResourceRecord()->m_Maps;
size_t mapcount = GetResourceRecord()->m_MapsCount;
// may not have a map if e.g. no pointer was requested
for(size_t i = 0; i < map.size(); i++)
for(size_t i = 0; i < mapcount; i++)
{
if(map[i].refcount > 0)
{
@@ -315,9 +316,10 @@ WrappedID3D12Resource::~WrappedID3D12Resource()
byte *WrappedID3D12Resource::GetMap(UINT Subresource)
{
vector<D3D12ResourceRecord::MapData> &map = GetResourceRecord()->m_Map;
D3D12ResourceRecord::MapData *map = GetResourceRecord()->m_Maps;
size_t mapcount = GetResourceRecord()->m_MapsCount;
if(Subresource < map.size())
if(Subresource < mapcount)
return map[Subresource].realPtr;
return NULL;
@@ -325,20 +327,14 @@ byte *WrappedID3D12Resource::GetMap(UINT Subresource)
byte *WrappedID3D12Resource::GetShadow(UINT Subresource)
{
vector<D3D12ResourceRecord::MapData> &map = GetResourceRecord()->m_Map;
if(Subresource >= map.size())
map.resize(Subresource + 1);
D3D12ResourceRecord::MapData *map = GetResourceRecord()->m_Maps;
return map[Subresource].shadowPtr;
}
void WrappedID3D12Resource::AllocShadow(UINT Subresource, size_t size)
{
vector<D3D12ResourceRecord::MapData> &map = GetResourceRecord()->m_Map;
if(Subresource >= map.size())
map.resize(Subresource + 1);
D3D12ResourceRecord::MapData *map = GetResourceRecord()->m_Maps;
if(map[Subresource].shadowPtr == NULL)
map[Subresource].shadowPtr = AllocAlignedBuffer(size);
@@ -346,9 +342,10 @@ void WrappedID3D12Resource::AllocShadow(UINT Subresource, size_t size)
void WrappedID3D12Resource::FreeShadow()
{
vector<D3D12ResourceRecord::MapData> &map = GetResourceRecord()->m_Map;
D3D12ResourceRecord::MapData *map = GetResourceRecord()->m_Maps;
size_t mapcount = GetResourceRecord()->m_MapsCount;
for(size_t i = 0; i < map.size(); i++)
for(size_t i = 0; i < mapcount; i++)
{
FreeAlignedBuffer(map[i].shadowPtr);
map[i].shadowPtr = NULL;
@@ -377,13 +374,7 @@ HRESULT STDMETHODCALLTYPE WrappedID3D12Resource::Map(UINT Subresource,
if(SUCCEEDED(hr) && GetResourceRecord())
{
vector<D3D12ResourceRecord::MapData> &map = GetResourceRecord()->m_Map;
if(Subresource >= map.size())
map.resize(Subresource + 1);
// the map pointer should be NULL or identical (if we are in a nested Map)
RDCASSERT(map[Subresource].realPtr == mapPtr || map[Subresource].realPtr == NULL);
D3D12ResourceRecord::MapData *map = GetResourceRecord()->m_Maps;
map[Subresource].realPtr = (byte *)mapPtr;
@@ -401,10 +392,11 @@ void STDMETHODCALLTYPE WrappedID3D12Resource::Unmap(UINT Subresource, const D3D1
{
if(GetResourceRecord())
{
vector<D3D12ResourceRecord::MapData> &map = GetResourceRecord()->m_Map;
D3D12ResourceRecord::MapData *map = GetResourceRecord()->m_Maps;
size_t mapcount = GetResourceRecord()->m_MapsCount;
// may not have a map if e.g. no pointer was requested
if(Subresource < map.size())
if(Subresource < mapcount)
{
int32_t refcount = Atomic::Dec32(&map[Subresource].refcount);
@@ -435,9 +427,9 @@ HRESULT STDMETHODCALLTYPE WrappedID3D12Resource::WriteToSubresource(UINT DstSubr
if(GetResourceRecord())
{
vector<D3D12ResourceRecord::MapData> &map = GetResourceRecord()->m_Map;
size_t mapcount = GetResourceRecord()->m_MapsCount;
if(DstSubresource < map.size())
if(DstSubresource < mapcount)
{
m_pDevice->WriteToSubresource(this, DstSubresource, pDstBox, pSrcData, SrcDepthPitch,
SrcDepthPitch);