diff --git a/renderdoc/api/replay/replay_enums.h b/renderdoc/api/replay/replay_enums.h index e87a54d40..cd671f2ae 100644 --- a/renderdoc/api/replay/replay_enums.h +++ b/renderdoc/api/replay/replay_enums.h @@ -345,6 +345,14 @@ enum ResourceUsage eUsage_OM_DSV, eUsage_Clear, + + eUsage_GenMips, + eUsage_Resolve, + eUsage_ResolveSrc, + eUsage_ResolveDst, + eUsage_Copy, + eUsage_CopySrc, + eUsage_CopyDst, }; enum DrawcallFlags @@ -358,14 +366,17 @@ enum DrawcallFlags eDraw_PushMarker = 0x20, eDraw_Present = 0x40, eDraw_MultiDraw = 0x80, + eDraw_Copy = 0x100, + eDraw_Resolve = 0x200, + eDraw_GenMips = 0x400, // flags - eDraw_UseIBuffer = 0x0100, - eDraw_Instanced = 0x0200, - eDraw_Auto = 0x0400, - eDraw_Indirect = 0x0800, - eDraw_ClearColour = 0x1000, - eDraw_ClearDepth = 0x2000, + eDraw_UseIBuffer = 0x01000, + eDraw_Instanced = 0x02000, + eDraw_Auto = 0x04000, + eDraw_Indirect = 0x08000, + eDraw_ClearColour = 0x10000, + eDraw_ClearDepth = 0x20000, }; enum SolidShadeMode diff --git a/renderdoc/driver/d3d11/d3d11_context_wrap.cpp b/renderdoc/driver/d3d11/d3d11_context_wrap.cpp index 9a29c5c8f..6fadbd8fc 100644 --- a/renderdoc/driver/d3d11/d3d11_context_wrap.cpp +++ b/renderdoc/driver/d3d11/d3d11_context_wrap.cpp @@ -4797,6 +4797,44 @@ bool WrappedID3D11DeviceContext::Serialise_CopySubresourceRegion( ID3D11Resource SourceSubresource, box); } + const string desc = m_pSerialiser->GetDebugStr(); + + // version 5 added this as a drawcall, we can assume for older logs there's just no debug messages + if(m_pDevice->GetLogVersion() >= 0x000006) + Serialise_DebugMessages(); + + if(m_State == READING) + { + std::string dstName = GetDebugName(m_pDevice->GetResourceManager()->GetLiveResource(Destination)); + std::string srcName = GetDebugName(m_pDevice->GetResourceManager()->GetLiveResource(Source)); + + if(dstName == "") dstName = ToStr::Get(Destination); + if(srcName == "") srcName = ToStr::Get(Source); + + AddEvent(COPY_SUBRESOURCE_REGION, desc); + string name = "CopySubresourceRegion(" + dstName + ", " + srcName + ")"; + + FetchDrawcall draw; + draw.name = name; + draw.flags |= eDraw_Copy; + + AddDrawcall(draw, true); + + if(m_pDevice->GetResourceManager()->HasLiveResource(Destination) && + m_pDevice->GetResourceManager()->HasLiveResource(Source)) + { + if(Destination == Source) + { + m_ResourceUses[m_pDevice->GetResourceManager()->GetLiveID(Destination)].push_back(EventUsage(m_CurEventID, eUsage_Copy)); + } + else + { + m_ResourceUses[m_pDevice->GetResourceManager()->GetLiveID(Destination)].push_back(EventUsage(m_CurEventID, eUsage_CopyDst)); + m_ResourceUses[m_pDevice->GetResourceManager()->GetLiveID(Source)].push_back(EventUsage(m_CurEventID, eUsage_CopySrc)); + } + } + } + return true; } @@ -4890,6 +4928,44 @@ bool WrappedID3D11DeviceContext::Serialise_CopyResource(ID3D11Resource *pDstReso m_pDevice->GetResourceManager()->UnwrapResource((ID3D11Resource*)m_pDevice->GetResourceManager()->GetLiveResource(Source))); } + const string desc = m_pSerialiser->GetDebugStr(); + + // version 5 added this as a drawcall, we can assume for older logs there's just no debug messages + if(m_pDevice->GetLogVersion() >= 0x000006) + Serialise_DebugMessages(); + + if(m_State == READING) + { + std::string dstName = GetDebugName(m_pDevice->GetResourceManager()->GetLiveResource(Destination)); + std::string srcName = GetDebugName(m_pDevice->GetResourceManager()->GetLiveResource(Source)); + + if(dstName == "") dstName = ToStr::Get(Destination); + if(srcName == "") srcName = ToStr::Get(Source); + + AddEvent(COPY_RESOURCE, desc); + string name = "CopyResource(" + dstName + ", " + srcName + ")"; + + FetchDrawcall draw; + draw.name = name; + draw.flags |= eDraw_Copy; + + AddDrawcall(draw, true); + + if(m_pDevice->GetResourceManager()->HasLiveResource(Destination) && + m_pDevice->GetResourceManager()->HasLiveResource(Source)) + { + if(Destination == Source) + { + m_ResourceUses[m_pDevice->GetResourceManager()->GetLiveID(Destination)].push_back(EventUsage(m_CurEventID, eUsage_Copy)); + } + else + { + m_ResourceUses[m_pDevice->GetResourceManager()->GetLiveID(Destination)].push_back(EventUsage(m_CurEventID, eUsage_CopyDst)); + m_ResourceUses[m_pDevice->GetResourceManager()->GetLiveID(Source)].push_back(EventUsage(m_CurEventID, eUsage_CopySrc)); + } + } + } + return true; } @@ -5307,6 +5383,44 @@ bool WrappedID3D11DeviceContext::Serialise_ResolveSubresource(ID3D11Resource *pD SourceSubresource, Format); } + const string desc = m_pSerialiser->GetDebugStr(); + + // version 5 added this as a drawcall, we can assume for older logs there's just no debug messages + if(m_pDevice->GetLogVersion() >= 0x000006) + Serialise_DebugMessages(); + + if(m_State == READING) + { + std::string dstName = GetDebugName(m_pDevice->GetResourceManager()->GetLiveResource(DestResource)); + std::string srcName = GetDebugName(m_pDevice->GetResourceManager()->GetLiveResource(SourceResource)); + + if(dstName == "") dstName = ToStr::Get(DestResource); + if(srcName == "") srcName = ToStr::Get(SourceResource); + + AddEvent(RESOLVE_SUBRESOURCE, desc); + string name = "ResolveSubresource(" + dstName + ", " + srcName + ")"; + + FetchDrawcall draw; + draw.name = name; + draw.flags |= eDraw_Resolve; + + AddDrawcall(draw, true); + + if(m_pDevice->GetResourceManager()->HasLiveResource(DestResource) && + m_pDevice->GetResourceManager()->HasLiveResource(SourceResource)) + { + if(DestResource == SourceResource) + { + m_ResourceUses[m_pDevice->GetResourceManager()->GetLiveID(DestResource)].push_back(EventUsage(m_CurEventID, eUsage_Resolve)); + } + else + { + m_ResourceUses[m_pDevice->GetResourceManager()->GetLiveID(DestResource)].push_back(EventUsage(m_CurEventID, eUsage_ResolveDst)); + m_ResourceUses[m_pDevice->GetResourceManager()->GetLiveID(SourceResource)].push_back(EventUsage(m_CurEventID, eUsage_ResolveSrc)); + } + } + } + return true; } @@ -5395,6 +5509,41 @@ bool WrappedID3D11DeviceContext::Serialise_GenerateMips(ID3D11ShaderResourceView m_pRealContext->GenerateMips(UNWRAP(WrappedID3D11ShaderResourceView, m_pDevice->GetResourceManager()->GetLiveResource(ShaderResourceView))); } + const string desc = m_pSerialiser->GetDebugStr(); + + // version 5 added this as a drawcall, we can assume for older logs there's just no debug messages + if(m_pDevice->GetLogVersion() >= 0x000006) + Serialise_DebugMessages(); + + if(m_State == READING) + { + ResourceId id = ShaderResourceView; + + if(m_pDevice->GetResourceManager()->HasLiveResource(ShaderResourceView)) + { + id = ((WrappedID3D11ShaderResourceView *)m_pDevice->GetResourceManager()->GetLiveResource(ShaderResourceView))->GetResourceResID(); + m_ResourceUses[id].push_back(EventUsage(m_CurEventID, eUsage_GenMips)); + id = m_pDevice->GetResourceManager()->GetOriginalID(id); + } + + std::string resName = GetDebugName(m_pDevice->GetResourceManager()->GetLiveResource(id)); + + if(resName == "") resName = ToStr::Get(id); + + AddEvent(GENERATE_MIPS, desc); + string name = "GenerateMips(" + resName + ")"; + + FetchDrawcall draw; + draw.name = name; + draw.flags |= eDraw_GenMips; + + AddDrawcall(draw, true); + + if(m_pDevice->GetResourceManager()->HasLiveResource(ShaderResourceView)) + m_ResourceUses[((WrappedID3D11ShaderResourceView *)m_pDevice->GetResourceManager()->GetLiveResource(ShaderResourceView))->GetResourceResID()] + .push_back(EventUsage(m_CurEventID, eUsage_GenMips)); + } + return true; } @@ -5617,7 +5766,7 @@ bool WrappedID3D11DeviceContext::Serialise_ClearUnorderedAccessViewUint(ID3D11Un ToStr::Get(Values[0]) + ", " + ToStr::Get(Values[1]) + ", " + ToStr::Get(Values[2]) + ", " + - ToStr::Get(Values[3]) + ", " + + ToStr::Get(Values[3]) + ")"; FetchDrawcall draw; diff --git a/renderdoc/driver/d3d11/d3d11_device.cpp b/renderdoc/driver/d3d11/d3d11_device.cpp index 67061e541..738ad1601 100644 --- a/renderdoc/driver/d3d11/d3d11_device.cpp +++ b/renderdoc/driver/d3d11/d3d11_device.cpp @@ -205,6 +205,7 @@ D3D11InitParams::D3D11InitParams() // Here we list which non-current versions we support, and what changed const uint32_t D3D11InitParams::D3D11_OLD_VERSIONS[D3D11InitParams::D3D11_NUM_SUPPORTED_OLD_VERSIONS] = { 0x0000004, // from 0x4 to 0x5, we added the stream-out hidden counters in the context's Serialise_BeginCaptureFrame + 0x0000005, // from 0x5 to 0x6, several new calls were made 'drawcalls', like Copy & GenerateMips, with serialised debug messages }; ReplayCreateStatus D3D11InitParams::Serialise() diff --git a/renderdoc/driver/d3d11/d3d11_device.h b/renderdoc/driver/d3d11/d3d11_device.h index 3c3842d63..9030e25e5 100644 --- a/renderdoc/driver/d3d11/d3d11_device.h +++ b/renderdoc/driver/d3d11/d3d11_device.h @@ -66,10 +66,10 @@ struct D3D11InitParams : public RDCInitParams UINT NumFeatureLevels; D3D_FEATURE_LEVEL FeatureLevels[16]; - static const uint32_t D3D11_SERIALISE_VERSION = 0x0000005; + static const uint32_t D3D11_SERIALISE_VERSION = 0x0000006; // backwards compatibility for old logs described at the declaration of this array - static const uint32_t D3D11_NUM_SUPPORTED_OLD_VERSIONS = 1; + static const uint32_t D3D11_NUM_SUPPORTED_OLD_VERSIONS = 2; static const uint32_t D3D11_OLD_VERSIONS[D3D11_NUM_SUPPORTED_OLD_VERSIONS]; // version number internal to d3d11 stream diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index 0ad9a5914..25ce517c2 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -55,7 +55,7 @@ struct GLInitParams : public RDCInitParams uint32_t width; uint32_t height; - static const uint32_t GL_SERIALISE_VERSION = 0x0000009; + static const uint32_t GL_SERIALISE_VERSION = 0x000000A; // version number internal to opengl stream uint32_t SerialiseVersion; diff --git a/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp index 7fabba1af..8ea28af72 100644 --- a/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp @@ -1259,6 +1259,24 @@ bool WrappedOpenGL::Serialise_glBlitNamedFramebuffer(GLuint readFramebuffer, GLu m_Real.glBlitNamedFramebuffer(readFramebuffer, drawFramebuffer, sX0, sY0, sX1, sY1, dX0, dY0, dX1, dY1, msk, flt); } + const string desc = m_pSerialiser->GetDebugStr(); + + Serialise_DebugMessages(); + + if(m_State == READING) + { + AddEvent(BLIT_FRAMEBUFFER, desc); + string name = "glBlitFramebuffer(" + + ToStr::Get(readId) + ", " + + ToStr::Get(drawId) + ")"; + + FetchDrawcall draw; + draw.name = name; + draw.flags |= eDraw_Resolve; + + AddDrawcall(draw, true); + } + return true; } diff --git a/renderdoc/driver/gl/wrappers/gl_texture_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_texture_funcs.cpp index 5009297d0..20e87352d 100644 --- a/renderdoc/driver/gl/wrappers/gl_texture_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_texture_funcs.cpp @@ -633,7 +633,7 @@ bool WrappedOpenGL::Serialise_glGenerateTextureMipmapEXT(GLuint texture, GLenum SERIALISE_ELEMENT(GLenum, Target, target); SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(TextureRes(GetCtx(), texture))); - if(m_State == READING) + if(m_State <= EXECUTING) { if(Target != eGL_NONE) m_Real.glGenerateTextureMipmapEXT(GetResourceManager()->GetLiveResource(id).name, Target); @@ -641,6 +641,22 @@ bool WrappedOpenGL::Serialise_glGenerateTextureMipmapEXT(GLuint texture, GLenum m_Real.glGenerateTextureMipmap(GetResourceManager()->GetLiveResource(id).name); } + const string desc = m_pSerialiser->GetDebugStr(); + + Serialise_DebugMessages(); + + if(m_State == READING) + { + AddEvent(GENERATE_MIPMAP, desc); + string name = "glGenerateMipmap(" + ToStr::Get(id) + ")"; + + FetchDrawcall draw; + draw.name = name; + draw.flags |= eDraw_GenMips; + + AddDrawcall(draw, true); + } + return true; } @@ -659,10 +675,7 @@ void WrappedOpenGL::Common_glGenerateTextureMipmapEXT(GLResourceRecord *record, } else if(m_State == WRITING_IDLE) { - SCOPED_SERIALISE_CONTEXT(GENERATE_MIPMAP); - Serialise_glGenerateTextureMipmapEXT(record->Resource.name, target); - - record->AddChunk(scope.Get()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); } } @@ -742,6 +755,25 @@ bool WrappedOpenGL::Serialise_glCopyImageSubData(GLuint srcName, GLenum srcTarge dstres.name, DestTarget, DestLevel, DestX, DestY, DestZ, SourceWidth, SourceHeight, SourceDepth); } + + const string desc = m_pSerialiser->GetDebugStr(); + + Serialise_DebugMessages(); + + if(m_State == READING) + { + AddEvent(COPY_SUBIMAGE, desc); + string name = "glCopyImageSubData(" + + ToStr::Get(srcid) + ", " + + ToStr::Get(dstid) + ")"; + + FetchDrawcall draw; + draw.name = name; + draw.flags |= eDraw_Copy; + + AddDrawcall(draw, true); + } + return true; } diff --git a/renderdoc/replay/type_helpers.cpp b/renderdoc/replay/type_helpers.cpp index 8482815ea..bad931961 100644 --- a/renderdoc/replay/type_helpers.cpp +++ b/renderdoc/replay/type_helpers.cpp @@ -42,7 +42,7 @@ string ToStrHelper::Get(const ResourceId &el) { char tostrBuf[256] = {0}; - StringFormat::snprintf(tostrBuf, 255, "Resource ID %llu", el.id); + StringFormat::snprintf(tostrBuf, 255, "ID %llu", el.id); return tostrBuf; } diff --git a/renderdocui/Interop/Enums.cs b/renderdocui/Interop/Enums.cs index 02bd6e8ac..c93ab4ef7 100644 --- a/renderdocui/Interop/Enums.cs +++ b/renderdocui/Interop/Enums.cs @@ -342,28 +342,39 @@ namespace renderdoc OM_DSV, Clear, + + GenMips, + Resolve, + ResolveSrc, + ResolveDst, + Copy, + CopySrc, + CopyDst, }; [Flags] public enum DrawcallFlags { // types - Clear = 0x01, - Drawcall = 0x02, - Dispatch = 0x04, - CmdList = 0x08, - SetMarker = 0x10, - PushMarker = 0x20, - Present = 0x40, - MultiDraw = 0x80, + Clear = 0x01, + Drawcall = 0x02, + Dispatch = 0x04, + CmdList = 0x08, + SetMarker = 0x10, + PushMarker = 0x20, + Present = 0x40, + MultiDraw = 0x80, + Copy = 0x100, + Resolve = 0x200, + GenMips = 0x400, // flags - UseIBuffer = 0x100, - Instanced = 0x200, - Auto = 0x400, - Indirect = 0x800, - ClearColour = 0x1000, - ClearDepth = 0x2000, + UseIBuffer = 0x01000, + Instanced = 0x02000, + Auto = 0x04000, + Indirect = 0x08000, + ClearColour = 0x10000, + ClearDepth = 0x20000, }; public enum SolidShadeMode @@ -560,6 +571,14 @@ namespace renderdoc case ResourceUsage.OM_DSV: return "Depthstencil"; case ResourceUsage.Clear: return "Clear"; + + case ResourceUsage.GenMips: return "Generate Mips"; + case ResourceUsage.Resolve: return "Resolve"; + case ResourceUsage.ResolveSrc: return "Resolve - Source"; + case ResourceUsage.ResolveDst: return "Resolve - Dest"; + case ResourceUsage.Copy: return "Copy"; + case ResourceUsage.CopySrc: return "Copy - Source"; + case ResourceUsage.CopyDst: return "Copy - Dest"; } return "Unknown Usage String"; diff --git a/renderdocui/Windows/TimelineBar.cs b/renderdocui/Windows/TimelineBar.cs index 0ff472cd2..9ce390115 100644 --- a/renderdocui/Windows/TimelineBar.cs +++ b/renderdocui/Windows/TimelineBar.cs @@ -621,7 +621,10 @@ namespace renderdocui.Windows { // read/write if (u.usage == ResourceUsage.CS_UAV || - u.usage == ResourceUsage.PS_UAV) + u.usage == ResourceUsage.PS_UAV || + u.usage == ResourceUsage.GenMips || + u.usage == ResourceUsage.Copy || + u.usage == ResourceUsage.Resolve) { DrawPip(g, Color.Orchid, highlightBarRect, 3, d, s.draws.Count, start, widths[i], ""); DrawPip(g, Color.Lime, highlightBarRect, 4, d, s.draws.Count, start, widths[i], ""); @@ -630,7 +633,9 @@ namespace renderdocui.Windows // write else if (u.usage == ResourceUsage.SO || u.usage == ResourceUsage.OM_DSV || - u.usage == ResourceUsage.OM_RTV) + u.usage == ResourceUsage.OM_RTV || + u.usage == ResourceUsage.CopyDst || + u.usage == ResourceUsage.ResolveDst) { DrawPip(g, Color.Orchid, highlightBarRect, 1, d, s.draws.Count, start, widths[i], ""); MarkWrite(s.draws[d].eventID);