Add resource usage for CPU writes to resources

This commit is contained in:
baldurk
2020-02-05 13:53:59 +00:00
parent 6c974fd026
commit dd3c63e8ca
13 changed files with 197 additions and 10 deletions
+8 -2
View File
@@ -932,6 +932,8 @@ QString ToQStr(const ResourceUsage usage, const GraphicsAPI apitype)
{
switch(usage)
{
case ResourceUsage::Unused: return lit("Unused");
case ResourceUsage::VertexBuffer: return lit("Vertex Buffer");
case ResourceUsage::IndexBuffer: return lit("Index Buffer");
@@ -978,7 +980,8 @@ QString ToQStr(const ResourceUsage usage, const GraphicsAPI apitype)
case ResourceUsage::CopyDst: return lit("Copy - Dest");
case ResourceUsage::Barrier: return lit("Barrier");
default: break;
case ResourceUsage::CPUWrite: return lit("CPU Write");
}
}
else if(apitype == GraphicsAPI::OpenGL || apitype == GraphicsAPI::Vulkan)
@@ -987,6 +990,8 @@ QString ToQStr(const ResourceUsage usage, const GraphicsAPI apitype)
switch(usage)
{
case ResourceUsage::Unused: return lit("Unused");
case ResourceUsage::VertexBuffer: return lit("Vertex Buffer");
case ResourceUsage::IndexBuffer: return lit("Index Buffer");
@@ -1035,7 +1040,8 @@ QString ToQStr(const ResourceUsage usage, const GraphicsAPI apitype)
case ResourceUsage::CopyDst: return lit("Copy - Dest");
case ResourceUsage::Barrier: return lit("Barrier");
default: break;
case ResourceUsage::CPUWrite: return lit("CPU Write");
}
}
+2
View File
@@ -783,6 +783,8 @@ rdcstr DoStringise(const ResourceUsage &el)
STRINGISE_ENUM_CLASS_NAMED(CopyDst, "Copy - Destination");
STRINGISE_ENUM_CLASS_NAMED(Barrier, "Barrier");
STRINGISE_ENUM_CLASS_NAMED(CPUWrite, "CPU Write");
}
END_ENUM_STRINGISE();
}
+2
View File
@@ -2403,6 +2403,8 @@ enum class ResourceUsage : uint32_t
CopyDst,
Barrier,
CPUWrite,
};
DECLARE_REFLECTION_ENUM(ResourceUsage);
@@ -229,6 +229,12 @@ bool WrappedID3D11DeviceContext::Serialise_UpdateSubresource1(
"Replaying a call to UpdateSubresource1() without D3D11.1 available");
}
}
if(IsLoading(m_State))
{
m_ResourceUses[GetIDForResource(pDstResource)].push_back(
EventUsage(m_CurEventID, ResourceUsage::CPUWrite));
}
}
}
else
@@ -345,6 +351,12 @@ bool WrappedID3D11DeviceContext::Serialise_UpdateSubresource1(
"Replaying a call to UpdateSubresource1() without D3D11.1 available");
}
}
if(IsLoading(m_State))
{
m_ResourceUses[GetIDForResource(pDstResource)].push_back(
EventUsage(m_CurEventID, ResourceUsage::CPUWrite));
}
}
}
@@ -431,6 +443,41 @@ bool WrappedID3D11DeviceContext::Serialise_CopySubresourceRegion1(
MessageSource::UnsupportedConfiguration,
"Replaying a call to CopySubresourceRegion1() without D3D11.1 available");
}
if(IsLoading(m_State))
{
ResourceId dstLiveID = GetIDForResource(pDstResource);
ResourceId srcLiveID = GetIDForResource(pSrcResource);
ResourceId dstOrigID = GetResourceManager()->GetOriginalID(dstLiveID);
ResourceId srcOrigID = GetResourceManager()->GetOriginalID(srcLiveID);
AddEvent();
DrawcallDescription draw;
draw.name = "CopySubresourceRegion1(" + ToStr(dstOrigID) + ", " + ToStr(srcOrigID) + ")";
draw.flags |= DrawFlags::Copy;
if(pDstResource && pSrcResource)
{
draw.copySource = srcOrigID;
draw.copyDestination = dstOrigID;
if(m_CurEventID)
{
if(dstLiveID == srcLiveID)
{
m_ResourceUses[dstLiveID].push_back(EventUsage(m_CurEventID, ResourceUsage::Copy));
}
else
{
m_ResourceUses[dstLiveID].push_back(EventUsage(m_CurEventID, ResourceUsage::CopyDst));
m_ResourceUses[srcLiveID].push_back(EventUsage(m_CurEventID, ResourceUsage::CopySrc));
}
}
}
AddDrawcall(draw, true);
}
}
return true;
@@ -7835,8 +7835,12 @@ bool WrappedID3D11DeviceContext::Serialise_Unmap(SerialiserType &ser, ID3D11Reso
MapWrittenData = (byte *)intercept.app.pData;
if(IsLoading(m_State) && m_CurEventID > 0 && (diffStart < diffEnd))
{
RecordUpdateStats(pResource, diffEnd - diffStart, false);
m_ResourceUses[mapIdx.resource].push_back(EventUsage(m_CurEventID, ResourceUsage::CPUWrite));
}
if(diffStart >= diffEnd)
{
// do nothing
@@ -1561,6 +1561,11 @@ void D3D12CommandData::AddUsage(D3D12DrawcallTreeNode &drawNode, ResourceId id,
drawNode.resourceUsage.push_back(make_rdcpair(id, EventUsage(EID, usage)));
}
void D3D12CommandData::AddUsage(ResourceId id, ResourceUsage usage)
{
m_ResourceUses[id].push_back(EventUsage(m_RootEventID, usage));
}
void D3D12CommandData::AddUsage(const D3D12RenderState &state, D3D12DrawcallTreeNode &drawNode)
{
DrawcallDescription &d = drawNode.draw;
+1
View File
@@ -376,4 +376,5 @@ struct D3D12CommandData
void AddEvent();
void AddUsage(const D3D12RenderState &state, D3D12DrawcallTreeNode &drawNode);
void AddUsage(D3D12DrawcallTreeNode &drawNode, ResourceId id, uint32_t EID, ResourceUsage usage);
void AddUsage(ResourceId id, ResourceUsage usage);
};
+10 -4
View File
@@ -1289,11 +1289,14 @@ bool WrappedID3D12Device::Serialise_MapDataWrite(SerialiserType &ser, ID3D12Reso
// don't do anything if end <= begin because the range is empty.
if(IsReplayingAndReading() && Resource && range.End > range.Begin)
{
D3D12CommandData &cmd = *m_Queue->GetCommandData();
if(IsLoading(m_State))
cmd.AddUsage(GetResID(Resource), ResourceUsage::CPUWrite);
ResourceId origid = GetResourceManager()->GetOriginalID(GetResID(Resource));
if(m_UploadResourceIds.find(origid) != m_UploadResourceIds.end())
{
D3D12CommandData &cmd = *m_Queue->GetCommandData();
ID3D12Resource *uploadBuf = GetUploadBuffer(cmd.m_CurChunkOffset, rangeSize);
SetObjName(uploadBuf,
@@ -1444,11 +1447,14 @@ bool WrappedID3D12Device::Serialise_WriteToSubresource(SerialiserType &ser, ID3D
if(IsReplayingAndReading() && Resource)
{
D3D12CommandData &cmd = *m_Queue->GetCommandData();
if(IsLoading(m_State))
cmd.AddUsage(GetResID(Resource), ResourceUsage::CPUWrite);
ResourceId origid = GetResourceManager()->GetOriginalID(GetResID(Resource));
if(m_UploadResourceIds.find(origid) != m_UploadResourceIds.end())
{
D3D12CommandData &cmd = *m_Queue->GetCommandData();
ID3D12Resource *uploadBuf = GetUploadBuffer(cmd.m_CurChunkOffset, dataSize);
// during reading, fill out the buffer itself
+2
View File
@@ -2641,6 +2641,8 @@ bool WrappedOpenGL::Serialise_ContextInit(ReadSerialiser &ser)
// global FBO0 to redirect to.
ResourceId global_fbo0 = GetResourceManager()->GetID(FramebufferRes(GetCtx(), m_Global_FBO0));
GetReplay()->GetResourceDesc(global_fbo0).SetCustomName("Backbuffer FBO");
GetResourceManager()->ReplaceResource(FBO0_ID, global_fbo0);
AddResource(FBO0_ID, ResourceType::SwapchainImage, "");
@@ -568,12 +568,13 @@ bool WrappedOpenGL::Serialise_glNamedBufferDataEXT(SerialiserType &ser, GLuint b
if(IsReplayingAndReading())
{
ResourceId id = GetResourceManager()->GetID(buffer);
// never allow resizing down, even if the application did so. If we encounter that, adjust the
// size and upload any data with a subdata call
if(bytesize < m_Buffers[GetResourceManager()->GetID(buffer)].size)
if(bytesize < m_Buffers[id].size)
{
GL.glNamedBufferDataEXT(
buffer.name, (GLsizeiptr)m_Buffers[GetResourceManager()->GetID(buffer)].size, NULL, usage);
GL.glNamedBufferDataEXT(buffer.name, (GLsizeiptr)m_Buffers[id].size, NULL, usage);
GL.glNamedBufferSubDataEXT(buffer.name, 0, (GLsizeiptr)bytesize, data);
}
@@ -581,9 +582,12 @@ bool WrappedOpenGL::Serialise_glNamedBufferDataEXT(SerialiserType &ser, GLuint b
{
GL.glNamedBufferDataEXT(buffer.name, (GLsizeiptr)bytesize, data, usage);
m_Buffers[GetResourceManager()->GetID(buffer)].size = bytesize;
m_Buffers[id].size = bytesize;
}
if(IsLoading(m_State) && m_CurEventID > 0)
m_ResourceUses[id].push_back(EventUsage(m_CurEventID, ResourceUsage::CPUWrite));
AddResourceInitChunk(buffer);
}
@@ -909,6 +913,10 @@ bool WrappedOpenGL::Serialise_glNamedBufferSubDataEXT(SerialiserType &ser, GLuin
if(IsReplayingAndReading())
{
if(IsLoading(m_State) && m_CurEventID > 0)
m_ResourceUses[GetResourceManager()->GetID(buffer)].push_back(
EventUsage(m_CurEventID, ResourceUsage::CPUWrite));
GL.glNamedBufferSubDataEXT(buffer.name, (GLintptr)offset, (GLsizeiptr)bytesize, data);
AddResourceInitChunk(buffer);
@@ -1049,6 +1057,35 @@ bool WrappedOpenGL::Serialise_glNamedCopyBufferSubDataEXT(SerialiserType &ser,
{
GL.glNamedCopyBufferSubDataEXT(readBuffer.name, writeBuffer.name, (GLintptr)readOffset,
(GLintptr)writeOffset, (GLsizeiptr)size);
if(IsLoading(m_State))
{
AddEvent();
ResourceId srcid = GetResourceManager()->GetID(readBuffer);
ResourceId dstid = GetResourceManager()->GetID(writeBuffer);
DrawcallDescription draw;
draw.name = StringFormat::Fmt("%s(%s, %s)", ToStr(gl_CurChunk).c_str(),
ToStr(GetResourceManager()->GetOriginalID(srcid)).c_str(),
ToStr(GetResourceManager()->GetOriginalID(dstid)).c_str());
draw.flags |= DrawFlags::Copy;
draw.copySource = GetResourceManager()->GetOriginalID(srcid);
draw.copyDestination = GetResourceManager()->GetOriginalID(dstid);
AddDrawcall(draw, true);
if(srcid == dstid)
{
m_ResourceUses[srcid].push_back(EventUsage(m_CurEventID, ResourceUsage::Copy));
}
else
{
m_ResourceUses[srcid].push_back(EventUsage(m_CurEventID, ResourceUsage::CopySrc));
m_ResourceUses[dstid].push_back(EventUsage(m_CurEventID, ResourceUsage::CopyDst));
}
}
}
return true;
@@ -2365,6 +2402,10 @@ bool WrappedOpenGL::Serialise_glUnmapNamedBufferEXT(SerialiserType &ser, GLuint
if(IsReplayingAndReading() && diffEnd > diffStart && MapWrittenData && length > 0)
{
if(IsLoading(m_State) && m_CurEventID > 0)
m_ResourceUses[GetResourceManager()->GetID(buffer)].push_back(
EventUsage(m_CurEventID, ResourceUsage::CPUWrite));
void *ptr = GL.glMapNamedBufferRangeEXT(buffer.name, (GLintptr)(offset + diffStart),
GLsizeiptr(diffEnd - diffStart), GL_MAP_WRITE_BIT);
if(ptr)
@@ -2553,6 +2594,10 @@ bool WrappedOpenGL::Serialise_glFlushMappedNamedBufferRangeEXT(SerialiserType &s
if(IsReplayingAndReading() && buffer.name && FlushedData && length > 0)
{
if(IsLoading(m_State) && m_CurEventID > 0)
m_ResourceUses[GetResourceManager()->GetID(buffer)].push_back(
EventUsage(m_CurEventID, ResourceUsage::CPUWrite));
// perform a map of the range and copy the data, to emulate the modified region being flushed
void *ptr = GL.glMapNamedBufferRangeEXT(buffer.name, (GLintptr)(MapOffset + offset),
(GLsizeiptr)length, GL_MAP_WRITE_BIT);
@@ -2317,6 +2317,10 @@ bool WrappedOpenGL::Serialise_glTextureImage1DEXT(SerialiserType &ser, GLuint te
GL.glBindBuffer(eGL_PIXEL_UNPACK_BUFFER, unpackbuf);
GL.glPixelStorei(eGL_UNPACK_ALIGNMENT, align);
if(IsLoading(m_State) && m_CurEventID > 0)
m_ResourceUses[GetResourceManager()->GetID(texture)].push_back(
EventUsage(m_CurEventID, ResourceUsage::CPUWrite));
AddResourceInitChunk(texture);
}
@@ -2561,6 +2565,10 @@ bool WrappedOpenGL::Serialise_glTextureImage2DEXT(SerialiserType &ser, GLuint te
GL.glBindBuffer(eGL_PIXEL_UNPACK_BUFFER, unpackbuf);
GL.glPixelStorei(eGL_UNPACK_ALIGNMENT, align);
if(IsLoading(m_State) && m_CurEventID > 0)
m_ResourceUses[GetResourceManager()->GetID(texture)].push_back(
EventUsage(m_CurEventID, ResourceUsage::CPUWrite));
AddResourceInitChunk(texture);
}
@@ -2787,6 +2795,10 @@ bool WrappedOpenGL::Serialise_glTextureImage3DEXT(SerialiserType &ser, GLuint te
GL.glBindBuffer(eGL_PIXEL_UNPACK_BUFFER, unpackbuf);
GL.glPixelStorei(eGL_UNPACK_ALIGNMENT, align);
if(IsLoading(m_State) && m_CurEventID > 0)
m_ResourceUses[GetResourceManager()->GetID(texture)].push_back(
EventUsage(m_CurEventID, ResourceUsage::CPUWrite));
AddResourceInitChunk(texture);
}
@@ -3018,6 +3030,10 @@ bool WrappedOpenGL::Serialise_glCompressedTextureImage1DEXT(SerialiserType &ser,
GL.glBindBuffer(eGL_PIXEL_UNPACK_BUFFER, unpackbuf);
GL.glPixelStorei(eGL_UNPACK_ALIGNMENT, align);
if(IsLoading(m_State) && m_CurEventID > 0)
m_ResourceUses[GetResourceManager()->GetID(texture)].push_back(
EventUsage(m_CurEventID, ResourceUsage::CPUWrite));
AddResourceInitChunk(texture);
}
@@ -3363,6 +3379,10 @@ bool WrappedOpenGL::Serialise_glCompressedTextureImage2DEXT(SerialiserType &ser,
GL.glBindBuffer(eGL_PIXEL_UNPACK_BUFFER, unpackbuf);
GL.glPixelStorei(eGL_UNPACK_ALIGNMENT, align);
if(IsLoading(m_State) && m_CurEventID > 0)
m_ResourceUses[GetResourceManager()->GetID(texture)].push_back(
EventUsage(m_CurEventID, ResourceUsage::CPUWrite));
AddResourceInitChunk(texture);
}
@@ -3596,6 +3616,10 @@ bool WrappedOpenGL::Serialise_glCompressedTextureImage3DEXT(SerialiserType &ser,
GL.glBindBuffer(eGL_PIXEL_UNPACK_BUFFER, unpackbuf);
GL.glPixelStorei(eGL_UNPACK_ALIGNMENT, align);
if(IsLoading(m_State) && m_CurEventID > 0)
m_ResourceUses[GetResourceManager()->GetID(texture)].push_back(
EventUsage(m_CurEventID, ResourceUsage::CPUWrite));
AddResourceInitChunk(texture);
}
@@ -3783,6 +3807,10 @@ bool WrappedOpenGL::Serialise_glCopyTextureImage1DEXT(SerialiserType &ser, GLuin
GL.glCopyTextureImage1DEXT(texture.name, target, level, internalformat, x, y, width, border);
if(IsLoading(m_State) && m_CurEventID > 0)
m_ResourceUses[GetResourceManager()->GetID(texture)].push_back(
EventUsage(m_CurEventID, ResourceUsage::CopyDst));
AddResourceInitChunk(texture);
}
@@ -3943,6 +3971,10 @@ bool WrappedOpenGL::Serialise_glCopyTextureImage2DEXT(SerialiserType &ser, GLuin
GL.glCopyTextureImage2DEXT(texture.name, target, level, internalformat, x, y, width, height,
border);
if(IsLoading(m_State) && m_CurEventID > 0)
m_ResourceUses[GetResourceManager()->GetID(texture)].push_back(
EventUsage(m_CurEventID, ResourceUsage::CopyDst));
AddResourceInitChunk(texture);
}
return true;
@@ -4922,6 +4954,10 @@ bool WrappedOpenGL::Serialise_glTextureSubImage1DEXT(SerialiserType &ser, GLuint
FreeAlignedBuffer((byte *)pixels);
}
if(IsLoading(m_State) && m_CurEventID > 0)
m_ResourceUses[GetResourceManager()->GetID(texture)].push_back(
EventUsage(m_CurEventID, ResourceUsage::CPUWrite));
AddResourceInitChunk(texture);
}
@@ -5145,6 +5181,10 @@ bool WrappedOpenGL::Serialise_glTextureSubImage2DEXT(SerialiserType &ser, GLuint
FreeAlignedBuffer((byte *)pixels);
}
if(IsLoading(m_State) && m_CurEventID > 0)
m_ResourceUses[GetResourceManager()->GetID(texture)].push_back(
EventUsage(m_CurEventID, ResourceUsage::CPUWrite));
AddResourceInitChunk(texture);
}
@@ -5376,6 +5416,10 @@ bool WrappedOpenGL::Serialise_glTextureSubImage3DEXT(SerialiserType &ser, GLuint
FreeAlignedBuffer((byte *)pixels);
}
if(IsLoading(m_State) && m_CurEventID > 0)
m_ResourceUses[GetResourceManager()->GetID(texture)].push_back(
EventUsage(m_CurEventID, ResourceUsage::CPUWrite));
AddResourceInitChunk(texture);
}
@@ -5590,6 +5634,10 @@ bool WrappedOpenGL::Serialise_glCompressedTextureSubImage1DEXT(SerialiserType &s
FreeAlignedBuffer((byte *)pixels);
}
if(IsLoading(m_State) && m_CurEventID > 0)
m_ResourceUses[GetResourceManager()->GetID(texture)].push_back(
EventUsage(m_CurEventID, ResourceUsage::CPUWrite));
AddResourceInitChunk(texture);
}
@@ -5810,6 +5858,10 @@ bool WrappedOpenGL::Serialise_glCompressedTextureSubImage2DEXT(SerialiserType &s
FreeAlignedBuffer((byte *)pixels);
}
if(IsLoading(m_State) && m_CurEventID > 0)
m_ResourceUses[GetResourceManager()->GetID(texture)].push_back(
EventUsage(m_CurEventID, ResourceUsage::CPUWrite));
AddResourceInitChunk(texture);
}
@@ -6039,6 +6091,10 @@ bool WrappedOpenGL::Serialise_glCompressedTextureSubImage3DEXT(
FreeAlignedBuffer((byte *)pixels);
}
if(IsLoading(m_State) && m_CurEventID > 0)
m_ResourceUses[GetResourceManager()->GetID(texture)].push_back(
EventUsage(m_CurEventID, ResourceUsage::CPUWrite));
AddResourceInitChunk(texture);
}
@@ -627,6 +627,9 @@ bool WrappedVulkan::Serialise_vkUnmapMemory(SerialiserType &ser, VkDevice device
if(IsReplayingAndReading() && memory != VK_NULL_HANDLE)
{
if(IsLoading(m_State))
m_ResourceUses[GetResID(memory)].push_back(EventUsage(m_RootEventID, ResourceUsage::CPUWrite));
VkResult vkr = ObjDisp(device)->MapMemory(Unwrap(device), Unwrap(memory), MapOffset, MapSize, 0,
(void **)&MapData);
if(vkr != VK_SUCCESS)
@@ -752,6 +755,10 @@ bool WrappedVulkan::Serialise_vkFlushMappedMemoryRanges(SerialiserType &ser, VkD
if(IsReplayingAndReading() && MemRange.memory != VK_NULL_HANDLE && MemRange.size > 0)
{
if(IsLoading(m_State))
m_ResourceUses[GetResID(MemRange.memory)].push_back(
EventUsage(m_RootEventID, ResourceUsage::CPUWrite));
VkResult ret =
ObjDisp(device)->MapMemory(Unwrap(device), Unwrap(MemRange.memory), MemRange.offset,
MemRange.size, 0, (void **)&MappedData);
+4
View File
@@ -1530,6 +1530,10 @@ rdcarray<PixelModification> ReplayController::PixelHistory(ResourceId target, ui
// read-only, not a valid pixel history event
continue;
case ResourceUsage::CPUWrite:
// writing but CPU-only, don't include
continue;
case ResourceUsage::Unused:
case ResourceUsage::StreamOut:
case ResourceUsage::VS_RWResource: