mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-09-20 20:55:42 +00:00
Pre-allocate map array in D3D12Resource, experimental race condition fix
This commit is contained in:
@@ -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));
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user