diff --git a/renderdoc/api/replay/data_types.h b/renderdoc/api/replay/data_types.h index b261f5c74..486d41bf8 100644 --- a/renderdoc/api/replay/data_types.h +++ b/renderdoc/api/replay/data_types.h @@ -106,15 +106,6 @@ struct FetchTexture uint64_t byteSize; }; -struct FetchFrameInfo -{ - uint32_t frameNumber; - uint32_t firstEvent; - uint64_t fileOffset; - uint64_t captureTime; - ResourceId immContextId; -}; - struct FetchAPIEvent { uint32_t eventID; @@ -130,12 +121,24 @@ struct FetchAPIEvent struct DebugMessage { + uint32_t eventID; DebugMessageCategory category; DebugMessageSeverity severity; + DebugMessageSource source; uint32_t messageID; rdctype::str description; }; +struct FetchFrameInfo +{ + uint32_t frameNumber; + uint32_t firstEvent; + uint64_t fileOffset; + uint64_t captureTime; + ResourceId immContextId; + rdctype::array debugMessages; +}; + struct EventUsage { EventUsage() @@ -199,8 +202,6 @@ struct FetchDrawcall rdctype::array events; rdctype::array children; - - rdctype::array debugMessages; }; struct APIProperties diff --git a/renderdoc/api/replay/renderdoc_replay.h b/renderdoc/api/replay/renderdoc_replay.h index 4ad2a8f06..03f955121 100644 --- a/renderdoc/api/replay/renderdoc_replay.h +++ b/renderdoc/api/replay/renderdoc_replay.h @@ -151,6 +151,7 @@ extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetTextures(ReplayRe extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetBuffers(ReplayRenderer *rend, rdctype::array *bufs); extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetResolve(ReplayRenderer *rend, uint64_t *callstack, uint32_t callstackLen, rdctype::array *trace); extern "C" RENDERDOC_API ShaderReflection* RENDERDOC_CC ReplayRenderer_GetShaderDetails(ReplayRenderer *rend, ResourceId shader); +extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetDebugMessages(ReplayRenderer *rend, rdctype::array *msgs); extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_PixelHistory(ReplayRenderer *rend, ResourceId target, uint32_t x, uint32_t y, uint32_t sampleIdx, rdctype::array *history); extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_DebugVertex(ReplayRenderer *rend, uint32_t vertid, uint32_t instid, uint32_t idx, uint32_t instOffset, uint32_t vertOffset, ShaderDebugTrace *trace); diff --git a/renderdoc/api/replay/replay_enums.h b/renderdoc/api/replay/replay_enums.h index e4a9edf0b..678e2850f 100644 --- a/renderdoc/api/replay/replay_enums.h +++ b/renderdoc/api/replay/replay_enums.h @@ -286,6 +286,16 @@ enum DebugMessageSeverity eDbgSeverity_Info, }; +enum DebugMessageSource +{ + eDbgSource_API = 0, + eDbgSource_RedundantAPIUse, + eDbgSource_IncorrectAPIUse, + eDbgSource_GeneralPerformance, + eDbgSource_GCNPerformance, + eDbgSource_RuntimeWarning, +}; + enum ResourceUsage { eUsage_None, diff --git a/renderdoc/core/image_viewer.cpp b/renderdoc/core/image_viewer.cpp index ecf573664..5e142b295 100644 --- a/renderdoc/core/image_viewer.cpp +++ b/renderdoc/core/image_viewer.cpp @@ -105,6 +105,7 @@ class ImageViewer : public IReplayDriver void ReadLogInitialisation() {} void RenderMesh(uint32_t frameID, const vector &events, MeshDisplay cfg) {} vector GetBuffers() { return vector(); } + vector GetDebugMessages() { return vector(); } FetchBuffer GetBuffer(ResourceId id) { FetchBuffer ret; RDCEraseEl(ret); return ret; } void SavePipelineState() {} GLPipelineState GetGLPipelineState() { return GLPipelineState(); } diff --git a/renderdoc/core/replay_proxy.cpp b/renderdoc/core/replay_proxy.cpp index 53b162dc1..9ceabf21b 100644 --- a/renderdoc/core/replay_proxy.cpp +++ b/renderdoc/core/replay_proxy.cpp @@ -521,7 +521,6 @@ void Serialiser::Serialise(const char *name, FetchDrawcall &el) Serialise("", el.events); Serialise("", el.children); - Serialise("", el.debugMessages); } template<> @@ -747,7 +746,7 @@ bool ProxySerialiser::Tick() GetTexture(ResourceId()); break; case eCommand_GetBuffers: - GetTextures(); + GetBuffers(); break; case eCommand_GetBuffer: GetTexture(ResourceId()); @@ -755,6 +754,9 @@ bool ProxySerialiser::Tick() case eCommand_GetShader: GetShader(ResourceId()); break; + case eCommand_GetDebugMessages: + GetDebugMessages(); + break; case eCommand_SavePipelineState: SavePipelineState(); break; @@ -911,6 +913,25 @@ vector ProxySerialiser::GetTextures() return ret; } +vector ProxySerialiser::GetDebugMessages() +{ + vector ret; + + if(m_ReplayHost) + { + ret = m_Remote->GetDebugMessages(); + } + else + { + if(!SendReplayCommand(eCommand_GetDebugMessages)) + return ret; + } + + m_FromReplaySerialiser->Serialise("", ret); + + return ret; +} + FetchTexture ProxySerialiser::GetTexture(ResourceId id) { FetchTexture ret; diff --git a/renderdoc/core/replay_proxy.h b/renderdoc/core/replay_proxy.h index 6626a909d..ac2fbe482 100644 --- a/renderdoc/core/replay_proxy.h +++ b/renderdoc/core/replay_proxy.h @@ -40,6 +40,7 @@ enum CommandPacketType eCommand_GetBuffers, eCommand_GetBuffer, eCommand_GetShader, + eCommand_GetDebugMessages, eCommand_GetBufferData, eCommand_GetTextureData, @@ -262,6 +263,8 @@ class ProxySerialiser : public IReplayDriver, Callstack::StackResolver FetchTexture GetTexture(ResourceId id); APIProperties GetAPIProperties(); + + vector GetDebugMessages(); void SavePipelineState(); D3D11PipelineState GetD3D11PipelineState() { return m_D3D11PipelineState; } diff --git a/renderdoc/driver/d3d11/d3d11_context.cpp b/renderdoc/driver/d3d11/d3d11_context.cpp index 7837f521d..f7d0c3dc3 100644 --- a/renderdoc/driver/d3d11/d3d11_context.cpp +++ b/renderdoc/driver/d3d11/d3d11_context.cpp @@ -1230,6 +1230,7 @@ void WrappedID3D11DeviceContext::ReplayLog(LogState readType, uint32_t startEven if(m_State == READING) { m_pDevice->GetFrameRecord().back().drawcallList = m_ParentDrawcall.Bake(); + m_pDevice->GetFrameRecord().back().frameInfo.debugMessages = m_pDevice->GetDebugMessages(); m_ParentDrawcall.children.clear(); diff --git a/renderdoc/driver/d3d11/d3d11_context.h b/renderdoc/driver/d3d11/d3d11_context.h index 9efdfac6a..c0184288b 100644 --- a/renderdoc/driver/d3d11/d3d11_context.h +++ b/renderdoc/driver/d3d11/d3d11_context.h @@ -229,7 +229,7 @@ private: const char *GetChunkName(D3D11ChunkType idx); - vector Serialise_DebugMessages(); + void Serialise_DebugMessages(); void DrainAnnotationQueue(); diff --git a/renderdoc/driver/d3d11/d3d11_context1_wrap.cpp b/renderdoc/driver/d3d11/d3d11_context1_wrap.cpp index bac445a57..cb77e3951 100644 --- a/renderdoc/driver/d3d11/d3d11_context1_wrap.cpp +++ b/renderdoc/driver/d3d11/d3d11_context1_wrap.cpp @@ -391,7 +391,7 @@ bool WrappedID3D11DeviceContext::Serialise_ClearView(ID3D11View *pView, const FL const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -411,7 +411,6 @@ bool WrappedID3D11DeviceContext::Serialise_ClearView(ID3D11View *pView, const FL draw.flags |= eDraw_Clear; draw.duration = 0.1f; - draw.debugMessages = debugMessages; AddDrawcall(draw, true); } diff --git a/renderdoc/driver/d3d11/d3d11_context_wrap.cpp b/renderdoc/driver/d3d11/d3d11_context_wrap.cpp index 8807cc1c9..1c98f01cf 100644 --- a/renderdoc/driver/d3d11/d3d11_context_wrap.cpp +++ b/renderdoc/driver/d3d11/d3d11_context_wrap.cpp @@ -3284,7 +3284,7 @@ void WrappedID3D11DeviceContext::OMSetDepthStencilState(ID3D11DepthStencilState #pragma region Draw -vector WrappedID3D11DeviceContext::Serialise_DebugMessages() +void WrappedID3D11DeviceContext::Serialise_DebugMessages() { SCOPED_SERIALISE_CONTEXT(DEBUG_MESSAGES); @@ -3347,16 +3347,19 @@ vector WrappedID3D11DeviceContext::Serialise_DebugMessages() if(m_State == READING) { DebugMessage msg; + msg.eventID = m_CurEventID; + msg.source = eDbgSource_API; msg.category = (DebugMessageCategory)Category; msg.severity = (DebugMessageSeverity)Severity; msg.messageID = ID; msg.description = Description; + + if(GetType() == D3D11_DEVICE_CONTEXT_DEFERRED) + msg.eventID = m_pDevice->GetImmediateContext()->GetEventID(); - debugMessages.push_back(msg); + m_pDevice->AddDebugMessage(msg); } } - - return debugMessages; } @@ -3376,7 +3379,7 @@ bool WrappedID3D11DeviceContext::Serialise_DrawIndexedInstanced(UINT IndexCountP const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -3394,8 +3397,6 @@ bool WrappedID3D11DeviceContext::Serialise_DrawIndexedInstanced(UINT IndexCountP draw.flags |= eDraw_Drawcall|eDraw_Instanced|eDraw_UseIBuffer; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); } @@ -3441,7 +3442,7 @@ bool WrappedID3D11DeviceContext::Serialise_DrawInstanced(UINT VertexCountPerInst const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -3458,8 +3459,6 @@ bool WrappedID3D11DeviceContext::Serialise_DrawInstanced(UINT VertexCountPerInst draw.flags |= eDraw_Drawcall|eDraw_Instanced; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); } @@ -3503,7 +3502,7 @@ bool WrappedID3D11DeviceContext::Serialise_DrawIndexed(UINT IndexCount_, UINT St const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -3518,8 +3517,6 @@ bool WrappedID3D11DeviceContext::Serialise_DrawIndexed(UINT IndexCount_, UINT St draw.flags |= eDraw_Drawcall|eDraw_UseIBuffer; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); } @@ -3562,7 +3559,7 @@ bool WrappedID3D11DeviceContext::Serialise_Draw(UINT VertexCount_, UINT StartVer const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -3576,8 +3573,6 @@ bool WrappedID3D11DeviceContext::Serialise_Draw(UINT VertexCount_, UINT StartVer draw.flags |= eDraw_Drawcall; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); } @@ -3666,7 +3661,7 @@ bool WrappedID3D11DeviceContext::Serialise_DrawAuto() const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -3682,8 +3677,6 @@ bool WrappedID3D11DeviceContext::Serialise_DrawAuto() draw.instanceOffset = 0; draw.numInstances = 1; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); } @@ -3726,7 +3719,7 @@ bool WrappedID3D11DeviceContext::Serialise_DrawIndexedInstancedIndirect(ID3D11Bu const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -3759,8 +3752,6 @@ bool WrappedID3D11DeviceContext::Serialise_DrawIndexedInstancedIndirect(ID3D11Bu draw.flags |= eDraw_Drawcall|eDraw_Instanced|eDraw_UseIBuffer|eDraw_Indirect; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); } @@ -3806,7 +3797,7 @@ bool WrappedID3D11DeviceContext::Serialise_DrawInstancedIndirect(ID3D11Buffer *p const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -3835,8 +3826,6 @@ bool WrappedID3D11DeviceContext::Serialise_DrawInstancedIndirect(ID3D11Buffer *p draw.flags |= eDraw_Drawcall|eDraw_Instanced|eDraw_Indirect; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); } @@ -4345,7 +4334,7 @@ bool WrappedID3D11DeviceContext::Serialise_ExecuteCommandList(ID3D11CommandList const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -4355,8 +4344,6 @@ bool WrappedID3D11DeviceContext::Serialise_ExecuteCommandList(ID3D11CommandList draw.name = name; draw.flags |= eDraw_CmdList|eDraw_PushMarker; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); auto cmdDrawChildren = m_CmdLists.find(cmdList); @@ -4443,7 +4430,7 @@ bool WrappedID3D11DeviceContext::Serialise_Dispatch(UINT ThreadGroupCountX_, UIN const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -4457,8 +4444,6 @@ bool WrappedID3D11DeviceContext::Serialise_Dispatch(UINT ThreadGroupCountX_, UIN draw.name = name; draw.flags |= eDraw_Dispatch; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); } @@ -4501,7 +4486,7 @@ bool WrappedID3D11DeviceContext::Serialise_DispatchIndirect(ID3D11Buffer *pBuffe const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -4525,8 +4510,6 @@ bool WrappedID3D11DeviceContext::Serialise_DispatchIndirect(ID3D11Buffer *pBuffe draw.name = name; draw.flags |= eDraw_Dispatch|eDraw_Indirect; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); } @@ -4589,7 +4572,7 @@ bool WrappedID3D11DeviceContext::Serialise_FinishCommandList(BOOL RestoreDeferre const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -4600,8 +4583,6 @@ bool WrappedID3D11DeviceContext::Serialise_FinishCommandList(BOOL RestoreDeferre draw.name = name; draw.flags |= eDraw_CmdList; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); m_pDevice->GetImmediateContext()->m_CmdLists[cmdList] = m_ParentDrawcall; @@ -5447,7 +5428,7 @@ bool WrappedID3D11DeviceContext::Serialise_ClearRenderTargetView(ID3D11RenderTar const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -5463,8 +5444,6 @@ bool WrappedID3D11DeviceContext::Serialise_ClearRenderTargetView(ID3D11RenderTar draw.name = name; draw.flags |= eDraw_Clear|eDraw_ClearColour; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); if(m_pDevice->GetResourceManager()->HasLiveResource(View)) @@ -5806,7 +5785,7 @@ bool WrappedID3D11DeviceContext::Serialise_ClearDepthStencilView(ID3D11DepthSten const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -5820,8 +5799,6 @@ bool WrappedID3D11DeviceContext::Serialise_ClearDepthStencilView(ID3D11DepthSten draw.name = name; draw.flags |= eDraw_Clear|eDraw_ClearDepth; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); if(m_pDevice->GetResourceManager()->HasLiveResource(View)) diff --git a/renderdoc/driver/d3d11/d3d11_device.cpp b/renderdoc/driver/d3d11/d3d11_device.cpp index f033b35e3..1711ef519 100644 --- a/renderdoc/driver/d3d11/d3d11_device.cpp +++ b/renderdoc/driver/d3d11/d3d11_device.cpp @@ -664,6 +664,12 @@ void WrappedID3D11Device::LazyInit() vector WrappedID3D11Device::GetDebugMessages() { vector ret; + + if(m_State < WRITING) + { + ret.swap(m_DebugMessages); + return ret; + } if(!m_pInfoQueue) return ret; @@ -681,6 +687,8 @@ vector WrappedID3D11Device::GetDebugMessages() m_pInfoQueue->GetMessage(i, message, &len); DebugMessage msg; + msg.eventID = 0; + msg.source = eDbgSource_API; msg.category = eDbgCategory_Miscellaneous; msg.severity = eDbgSeverity_Medium; diff --git a/renderdoc/driver/d3d11/d3d11_device.h b/renderdoc/driver/d3d11/d3d11_device.h index 75ff009d6..5f7257c0c 100644 --- a/renderdoc/driver/d3d11/d3d11_device.h +++ b/renderdoc/driver/d3d11/d3d11_device.h @@ -213,6 +213,8 @@ private: vector m_FrameTimes; double m_TotalTime, m_AvgFrametime, m_MinFrametime, m_MaxFrametime; + vector m_DebugMessages; + vector m_FrameRecord; const FetchDrawcall *GetDrawcall(const FetchDrawcall *draw, uint32_t eventID); public: @@ -250,6 +252,7 @@ public: const FetchDrawcall *GetDrawcall(uint32_t frameID, uint32_t eventID); vector GetDebugMessages(); + void AddDebugMessage(DebugMessage msg) { m_DebugMessages.push_back(msg); } const vector &GetLayoutDesc(ID3D11InputLayout *layout) { return m_LayoutDescs[layout]; } ShaderReflection *GetLayoutDXBC(ID3D11InputLayout *layout) { return m_LayoutDXBC[layout]; } diff --git a/renderdoc/driver/d3d11/d3d11_replay.cpp b/renderdoc/driver/d3d11/d3d11_replay.cpp index 3bdf70742..4918bcb94 100644 --- a/renderdoc/driver/d3d11/d3d11_replay.cpp +++ b/renderdoc/driver/d3d11/d3d11_replay.cpp @@ -317,6 +317,11 @@ vector D3D11Replay::GetUsage(ResourceId id) return m_pDevice->GetImmediateContext()->GetUsage(id); } +vector D3D11Replay::GetDebugMessages() +{ + return m_pDevice->GetDebugMessages(); +} + APIProperties D3D11Replay::GetAPIProperties() { APIProperties ret; diff --git a/renderdoc/driver/d3d11/d3d11_replay.h b/renderdoc/driver/d3d11/d3d11_replay.h index bdc29aec3..f2c6d2b48 100644 --- a/renderdoc/driver/d3d11/d3d11_replay.h +++ b/renderdoc/driver/d3d11/d3d11_replay.h @@ -50,6 +50,8 @@ class D3D11Replay : public IReplayDriver vector GetTextures(); FetchTexture GetTexture(ResourceId id); + + vector GetDebugMessages(); ShaderReflection *GetShader(ResourceId id); diff --git a/renderdoc/driver/d3d11/shaders/dxbc_debug.cpp b/renderdoc/driver/d3d11/shaders/dxbc_debug.cpp index e317f445a..138b3518f 100644 --- a/renderdoc/driver/d3d11/shaders/dxbc_debug.cpp +++ b/renderdoc/driver/d3d11/shaders/dxbc_debug.cpp @@ -2551,11 +2551,29 @@ State State::GetNext(GlobalState &global, State quad[4]) const else { RDCERR("Unexpected UAV dimension %d passed to bufinfo", uavDesc.ViewDimension); + + DebugMessage msg = {0}; + msg.source = eDbgSource_RuntimeWarning; + msg.category = eDbgCategory_Shaders; + msg.severity = eDbgSeverity_Medium; + char time[512] = {0}; + StringFormat::sntimef(time, 511, "%H:%M:%S"); + msg.description = StringFormat::Fmt("%s- Shader debugging %d: %s\nUAV being queried by bufinfo is not a buffer", time, s.nextInstruction, op.str); + device->AddDebugMessage(msg); } } else { RDCERR("UAV is NULL being queried by bufinfo"); + + DebugMessage msg = {0}; + msg.source = eDbgSource_RuntimeWarning; + msg.category = eDbgCategory_Shaders; + msg.severity = eDbgSeverity_Medium; + char time[512] = {0}; + StringFormat::sntimef(time, 511, "%H:%M:%S"); + msg.description = StringFormat::Fmt("%s- Shader debugging %d: %s\nUAV being queried by bufinfo is NULL", time, s.nextInstruction, op.str); + device->AddDebugMessage(msg); } SAFE_RELEASE(uav); diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 13a993fc6..9b788039e 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -1778,7 +1778,14 @@ void WrappedOpenGL::FinishCapture() //m_SuccessfulCapture = false; } -vector WrappedOpenGL::Serialise_DebugMessages() +vector WrappedOpenGL::GetDebugMessages() +{ + vector ret; + ret.swap(m_DebugMessages); + return ret; +} + +void WrappedOpenGL::Serialise_DebugMessages() { SCOPED_SERIALISE_CONTEXT(DEBUG_MESSAGES); @@ -1838,16 +1845,16 @@ vector WrappedOpenGL::Serialise_DebugMessages() if(m_State == READING) { DebugMessage msg; + msg.eventID = m_CurEventID; + msg.source = eDbgSource_API; msg.category = (DebugMessageCategory)Category; msg.severity = (DebugMessageSeverity)Severity; msg.messageID = ID; msg.description = Description; - debugMessages.push_back(msg); + m_DebugMessages.push_back(msg); } } - - return debugMessages; } bool WrappedOpenGL::RecordUpdateCheck(GLResourceRecord *record) @@ -2934,6 +2941,7 @@ void WrappedOpenGL::ContextReplayLog(LogState readType, uint32_t startEventID, u if(m_State == READING) { GetFrameRecord().back().drawcallList = m_ParentDrawcall.Bake(); + GetFrameRecord().back().frameInfo.debugMessages = GetDebugMessages(); m_ParentDrawcall.children.clear(); } diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index cfb290d4e..c50db891a 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -97,7 +97,8 @@ class WrappedOpenGL const GLHookSet &GetHookset() { return m_Real; } vector m_DebugMessages; - vector Serialise_DebugMessages(); + void Serialise_DebugMessages(); + vector GetDebugMessages(); GLDEBUGPROC m_RealDebugFunc; const void *m_RealDebugFuncParam; diff --git a/renderdoc/driver/gl/gl_replay.cpp b/renderdoc/driver/gl/gl_replay.cpp index 43553bb3d..c29d9f906 100644 --- a/renderdoc/driver/gl/gl_replay.cpp +++ b/renderdoc/driver/gl/gl_replay.cpp @@ -703,6 +703,11 @@ FetchBuffer GLReplay::GetBuffer(ResourceId id) return ret; } +vector GLReplay::GetDebugMessages() +{ + return m_pDriver->GetDebugMessages(); +} + ShaderReflection *GLReplay::GetShader(ResourceId id) { WrappedOpenGL &gl = *m_pDriver; diff --git a/renderdoc/driver/gl/gl_replay.h b/renderdoc/driver/gl/gl_replay.h index 8f5a22b67..e057bdc4d 100644 --- a/renderdoc/driver/gl/gl_replay.h +++ b/renderdoc/driver/gl/gl_replay.h @@ -54,6 +54,8 @@ class GLReplay : public IReplayDriver ShaderReflection *GetShader(ResourceId id); + vector GetDebugMessages(); + vector GetUsage(ResourceId id); vector GetFrameRecord(); diff --git a/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp index ae2b86737..96af7bbff 100644 --- a/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp @@ -39,7 +39,7 @@ bool WrappedOpenGL::Serialise_glDispatchCompute(GLuint num_groups_x, GLuint num_ const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -53,8 +53,6 @@ bool WrappedOpenGL::Serialise_glDispatchCompute(GLuint num_groups_x, GLuint num_ draw.name = name; draw.flags |= eDraw_Dispatch; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); } @@ -90,7 +88,7 @@ bool WrappedOpenGL::Serialise_glDispatchComputeGroupSizeARB(GLuint num_groups_x, const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -107,8 +105,6 @@ bool WrappedOpenGL::Serialise_glDispatchComputeGroupSizeARB(GLuint num_groups_x, draw.name = name; draw.flags |= eDraw_Dispatch; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); } @@ -139,7 +135,7 @@ bool WrappedOpenGL::Serialise_glDispatchComputeIndirect(GLintptr indirect) const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -156,8 +152,6 @@ bool WrappedOpenGL::Serialise_glDispatchComputeIndirect(GLintptr indirect) draw.name = name; draw.flags |= eDraw_Dispatch|eDraw_Indirect; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); } @@ -262,7 +256,7 @@ bool WrappedOpenGL::Serialise_glDrawTransformFeedback(GLenum mode, GLuint id) const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -282,8 +276,6 @@ bool WrappedOpenGL::Serialise_glDrawTransformFeedback(GLenum mode, GLuint id) draw.flags |= eDraw_Drawcall; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); } @@ -318,7 +310,7 @@ bool WrappedOpenGL::Serialise_glDrawTransformFeedbackInstanced(GLenum mode, GLui const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -338,8 +330,6 @@ bool WrappedOpenGL::Serialise_glDrawTransformFeedbackInstanced(GLenum mode, GLui draw.flags |= eDraw_Drawcall; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); } @@ -374,7 +364,7 @@ bool WrappedOpenGL::Serialise_glDrawTransformFeedbackStream(GLenum mode, GLuint const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -394,8 +384,6 @@ bool WrappedOpenGL::Serialise_glDrawTransformFeedbackStream(GLenum mode, GLuint draw.flags |= eDraw_Drawcall; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); } @@ -431,7 +419,7 @@ bool WrappedOpenGL::Serialise_glDrawTransformFeedbackStreamInstanced(GLenum mode const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -451,8 +439,6 @@ bool WrappedOpenGL::Serialise_glDrawTransformFeedbackStreamInstanced(GLenum mode draw.flags |= eDraw_Drawcall; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); } @@ -488,7 +474,7 @@ bool WrappedOpenGL::Serialise_glDrawArrays(GLenum mode, GLint first, GLsizei cou const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -508,8 +494,6 @@ bool WrappedOpenGL::Serialise_glDrawArrays(GLenum mode, GLint first, GLsizei cou draw.flags |= eDraw_Drawcall; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); } @@ -543,7 +527,7 @@ bool WrappedOpenGL::Serialise_glDrawArraysIndirect(GLenum mode, const void *indi const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -567,8 +551,6 @@ bool WrappedOpenGL::Serialise_glDrawArraysIndirect(GLenum mode, const void *indi draw.flags |= eDraw_Drawcall|eDraw_Instanced|eDraw_Indirect; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); } @@ -604,7 +586,7 @@ bool WrappedOpenGL::Serialise_glDrawArraysInstanced(GLenum mode, GLint first, GL const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -625,8 +607,6 @@ bool WrappedOpenGL::Serialise_glDrawArraysInstanced(GLenum mode, GLint first, GL draw.flags |= eDraw_Drawcall|eDraw_Instanced; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); } @@ -663,7 +643,7 @@ bool WrappedOpenGL::Serialise_glDrawArraysInstancedBaseInstance(GLenum mode, GLi const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -685,8 +665,6 @@ bool WrappedOpenGL::Serialise_glDrawArraysInstancedBaseInstance(GLenum mode, GLi draw.flags |= eDraw_Drawcall|eDraw_Instanced; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); } @@ -722,7 +700,7 @@ bool WrappedOpenGL::Serialise_glDrawElements(GLenum mode, GLsizei count, GLenum const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -748,8 +726,6 @@ bool WrappedOpenGL::Serialise_glDrawElements(GLenum mode, GLsizei count, GLenum draw.flags |= eDraw_Drawcall|eDraw_UseIBuffer; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); } @@ -786,7 +762,7 @@ bool WrappedOpenGL::Serialise_glDrawElementsIndirect(GLenum mode, GLenum type, c const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -817,8 +793,6 @@ bool WrappedOpenGL::Serialise_glDrawElementsIndirect(GLenum mode, GLenum type, c draw.flags |= eDraw_Drawcall|eDraw_UseIBuffer|eDraw_Instanced|eDraw_Indirect; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); } @@ -857,7 +831,7 @@ bool WrappedOpenGL::Serialise_glDrawRangeElements(GLenum mode, GLuint start, GLu const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -883,8 +857,6 @@ bool WrappedOpenGL::Serialise_glDrawRangeElements(GLenum mode, GLuint start, GLu draw.flags |= eDraw_Drawcall|eDraw_UseIBuffer; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); } @@ -925,7 +897,7 @@ bool WrappedOpenGL::Serialise_glDrawRangeElementsBaseVertex(GLenum mode, GLuint const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -952,8 +924,6 @@ bool WrappedOpenGL::Serialise_glDrawRangeElementsBaseVertex(GLenum mode, GLuint draw.flags |= eDraw_Drawcall|eDraw_UseIBuffer; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); } @@ -992,7 +962,7 @@ bool WrappedOpenGL::Serialise_glDrawElementsBaseVertex(GLenum mode, GLsizei coun const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -1019,8 +989,6 @@ bool WrappedOpenGL::Serialise_glDrawElementsBaseVertex(GLenum mode, GLsizei coun draw.flags |= eDraw_Drawcall|eDraw_UseIBuffer; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); } @@ -1059,7 +1027,7 @@ bool WrappedOpenGL::Serialise_glDrawElementsInstanced(GLenum mode, GLsizei count const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -1086,8 +1054,6 @@ bool WrappedOpenGL::Serialise_glDrawElementsInstanced(GLenum mode, GLsizei count draw.flags |= eDraw_Drawcall|eDraw_UseIBuffer; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); } @@ -1127,7 +1093,7 @@ bool WrappedOpenGL::Serialise_glDrawElementsInstancedBaseInstance(GLenum mode, G const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -1155,8 +1121,6 @@ bool WrappedOpenGL::Serialise_glDrawElementsInstancedBaseInstance(GLenum mode, G draw.flags |= eDraw_Drawcall|eDraw_UseIBuffer; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); } @@ -1196,7 +1160,7 @@ bool WrappedOpenGL::Serialise_glDrawElementsInstancedBaseVertex(GLenum mode, GLs const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -1224,8 +1188,6 @@ bool WrappedOpenGL::Serialise_glDrawElementsInstancedBaseVertex(GLenum mode, GLs draw.flags |= eDraw_Drawcall|eDraw_UseIBuffer; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); } @@ -1266,7 +1228,7 @@ bool WrappedOpenGL::Serialise_glDrawElementsInstancedBaseVertexBaseInstance(GLen const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -1295,8 +1257,6 @@ bool WrappedOpenGL::Serialise_glDrawElementsInstancedBaseVertexBaseInstance(GLen draw.flags |= eDraw_Drawcall|eDraw_UseIBuffer; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); } @@ -1374,7 +1334,7 @@ bool WrappedOpenGL::Serialise_glMultiDrawArrays(GLenum mode, const GLint *first, const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -1398,9 +1358,6 @@ bool WrappedOpenGL::Serialise_glMultiDrawArrays(GLenum mode, const GLint *first, draw.numIndices = countArray[i]; draw.vertexOffset = firstArray[i]; - if(i == 0) - draw.debugMessages = debugMessages; - draw.name = "glMultiDrawArrays[" + ToStr::Get(i) + "](" + ToStr::Get(draw.numIndices) + ", " + ToStr::Get(draw.vertexOffset) + ")"; @@ -1517,7 +1474,7 @@ bool WrappedOpenGL::Serialise_glMultiDrawElements(GLenum mode, const GLsizei *co const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -1543,9 +1500,6 @@ bool WrappedOpenGL::Serialise_glMultiDrawElements(GLenum mode, const GLsizei *co draw.numIndices = countArray[i]; draw.indexOffset = (uint32_t) uint64_t(idxOffsArray[i])&0xFFFFFFFF; - if(i == 0) - draw.debugMessages = debugMessages; - draw.name = "glMultiDrawElements[" + ToStr::Get(i) + "](" + ToStr::Get(draw.numIndices) + ", " + ToStr::Get(draw.indexOffset) + ")"; @@ -1663,7 +1617,7 @@ bool WrappedOpenGL::Serialise_glMultiDrawElementsBaseVertex(GLenum mode, const G const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -1690,9 +1644,6 @@ bool WrappedOpenGL::Serialise_glMultiDrawElementsBaseVertex(GLenum mode, const G draw.indexOffset = (uint32_t) uint64_t(idxOffsArray[i])&0xFFFFFFFF; draw.vertexOffset = baseArray[i]; - if(i == 0) - draw.debugMessages = debugMessages; - draw.name = "glMultiDrawElementsBaseVertex[" + ToStr::Get(i) + "](" + ToStr::Get(draw.numIndices) + ", " + ToStr::Get(draw.indexOffset) + ", " + @@ -1800,7 +1751,7 @@ bool WrappedOpenGL::Serialise_glMultiDrawArraysIndirect(GLenum mode, const void const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -1838,9 +1789,6 @@ bool WrappedOpenGL::Serialise_glMultiDrawArraysIndirect(GLenum mode, const void draw.vertexOffset = params.first; draw.instanceOffset = params.baseInstance; - if(i == 0) - draw.debugMessages = debugMessages; - draw.name = "glMultiDrawArraysIndirect[" + ToStr::Get(i) + "](<" + ToStr::Get(draw.numIndices) + ", " + ToStr::Get(draw.numInstances) + ", " + @@ -1952,7 +1900,7 @@ bool WrappedOpenGL::Serialise_glMultiDrawElementsIndirect(GLenum mode, GLenum ty const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -1992,9 +1940,6 @@ bool WrappedOpenGL::Serialise_glMultiDrawElementsIndirect(GLenum mode, GLenum ty draw.vertexOffset = params.baseVertex; draw.instanceOffset = params.baseInstance; - if(i == 0) - draw.debugMessages = debugMessages; - draw.name = "glMultiDrawElementsIndirect[" + ToStr::Get(i) + "](<" + ToStr::Get(draw.numIndices) + ", " + ToStr::Get(draw.numInstances) + ", " + @@ -2109,7 +2054,7 @@ bool WrappedOpenGL::Serialise_glMultiDrawArraysIndirectCountARB(GLenum mode, GLi const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -2148,9 +2093,6 @@ bool WrappedOpenGL::Serialise_glMultiDrawArraysIndirectCountARB(GLenum mode, GLi draw.vertexOffset = params.first; draw.instanceOffset = params.baseInstance; - if(i == 0) - draw.debugMessages = debugMessages; - draw.name = "glMultiDrawArraysIndirect[" + ToStr::Get(i) + "](<" + ToStr::Get(draw.numIndices) + ", " + ToStr::Get(draw.numInstances) + ", " + @@ -2273,7 +2215,7 @@ bool WrappedOpenGL::Serialise_glMultiDrawElementsIndirectCountARB(GLenum mode, G const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -2314,9 +2256,6 @@ bool WrappedOpenGL::Serialise_glMultiDrawElementsIndirectCountARB(GLenum mode, G draw.vertexOffset = params.baseVertex; draw.instanceOffset = params.baseInstance; - if(i == 0) - draw.debugMessages = debugMessages; - draw.name = "glMultiDrawElementsIndirect[" + ToStr::Get(i) + "](" + ToStr::Get(draw.numIndices) + ", " + ToStr::Get(draw.numInstances) + ", " + @@ -2382,7 +2321,7 @@ bool WrappedOpenGL::Serialise_glClearBufferfv(GLenum buffer, GLint drawbuffer, c const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -2395,8 +2334,6 @@ bool WrappedOpenGL::Serialise_glClearBufferfv(GLenum buffer, GLint drawbuffer, c draw.name = name; draw.flags |= eDraw_Clear; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); } @@ -2442,7 +2379,7 @@ bool WrappedOpenGL::Serialise_glClearBufferiv(GLenum buffer, GLint drawbuffer, c const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -2455,8 +2392,6 @@ bool WrappedOpenGL::Serialise_glClearBufferiv(GLenum buffer, GLint drawbuffer, c draw.name = name; draw.flags |= eDraw_Clear; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); } @@ -2494,7 +2429,7 @@ bool WrappedOpenGL::Serialise_glClearBufferuiv(GLenum buffer, GLint drawbuffer, const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -2507,8 +2442,6 @@ bool WrappedOpenGL::Serialise_glClearBufferuiv(GLenum buffer, GLint drawbuffer, draw.name = name; draw.flags |= eDraw_Clear; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); } @@ -2540,7 +2473,7 @@ bool WrappedOpenGL::Serialise_glClearBufferfi(GLenum buffer, GLint drawbuffer, G const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -2553,8 +2486,6 @@ bool WrappedOpenGL::Serialise_glClearBufferfi(GLenum buffer, GLint drawbuffer, G draw.name = name; draw.flags |= eDraw_Clear; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); } @@ -2787,7 +2718,7 @@ bool WrappedOpenGL::Serialise_glClear(GLbitfield mask) const string desc = m_pSerialiser->GetDebugStr(); - vector debugMessages = Serialise_DebugMessages(); + Serialise_DebugMessages(); if(m_State == READING) { @@ -2813,8 +2744,6 @@ bool WrappedOpenGL::Serialise_glClear(GLbitfield mask) draw.name = name; draw.flags |= eDraw_Clear; - draw.debugMessages = debugMessages; - AddDrawcall(draw, true); } diff --git a/renderdoc/replay/replay_driver.h b/renderdoc/replay/replay_driver.h index 42f78cacb..cfa03407b 100644 --- a/renderdoc/replay/replay_driver.h +++ b/renderdoc/replay/replay_driver.h @@ -60,6 +60,8 @@ class IRemoteDriver virtual vector GetTextures() = 0; virtual FetchTexture GetTexture(ResourceId id) = 0; + virtual vector GetDebugMessages() = 0; + virtual ShaderReflection *GetShader(ResourceId id) = 0; virtual vector GetUsage(ResourceId id) = 0; diff --git a/renderdoc/replay/replay_renderer.cpp b/renderdoc/replay/replay_renderer.cpp index 38455ea99..f08eb2aa0 100644 --- a/renderdoc/replay/replay_renderer.cpp +++ b/renderdoc/replay/replay_renderer.cpp @@ -334,6 +334,17 @@ bool ReplayRenderer::GetResolve(uint64_t *callstack, uint32_t callstackLen, rdct return true; } +bool ReplayRenderer::GetDebugMessages(rdctype::array *msgs) +{ + if(msgs) + { + *msgs = m_pDevice->GetDebugMessages(); + return true; + } + + return false; +} + bool ReplayRenderer::GetUsage(ResourceId id, rdctype::array *usage) { if(usage) @@ -1481,6 +1492,8 @@ extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetResolve(ReplayRen { return rend->GetResolve(callstack, callstackLen, trace); } extern "C" RENDERDOC_API ShaderReflection* RENDERDOC_CC ReplayRenderer_GetShaderDetails(ReplayRenderer *rend, ResourceId shader) { return rend->GetShaderDetails(shader); } +extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_GetDebugMessages(ReplayRenderer *rend, rdctype::array *msgs) +{ return rend->GetDebugMessages(msgs); } extern "C" RENDERDOC_API bool32 RENDERDOC_CC ReplayRenderer_PixelHistory(ReplayRenderer *rend, ResourceId target, uint32_t x, uint32_t y, uint32_t sampleIdx, rdctype::array *history) { return rend->PixelHistory(target, x, y, sampleIdx, history); } diff --git a/renderdoc/replay/replay_renderer.h b/renderdoc/replay/replay_renderer.h index 4104749db..7cacb114b 100644 --- a/renderdoc/replay/replay_renderer.h +++ b/renderdoc/replay/replay_renderer.h @@ -159,6 +159,7 @@ struct ReplayRenderer bool GetBuffers(rdctype::array *bufs); bool GetResolve(uint64_t *callstack, uint32_t callstackLen, rdctype::array *trace); ShaderReflection *GetShaderDetails(ResourceId shader); + bool GetDebugMessages(rdctype::array *msgs); bool PixelHistory(ResourceId target, uint32_t x, uint32_t y, uint32_t sampleIdx, rdctype::array *history); bool DebugVertex(uint32_t vertid, uint32_t instid, uint32_t idx, uint32_t instOffset, uint32_t vertOffset, ShaderDebugTrace *trace); diff --git a/renderdocui/Code/Core.cs b/renderdocui/Code/Core.cs index 87b54a0a8..b2f0ae387 100644 --- a/renderdocui/Code/Core.cs +++ b/renderdocui/Code/Core.cs @@ -127,6 +127,15 @@ namespace renderdocui.Code public FetchTexture[] CurTextures { get { return m_Textures; } } public FetchBuffer[] CurBuffers { get { return m_Buffers; } } + public List DebugMessages = new List(); + public int UnreadMessageCount = 0; + public void AddMessages(DebugMessage[] msgs) + { + UnreadMessageCount += msgs.Length; + foreach(var msg in msgs) + DebugMessages.Add(msg); + } + // the RenderManager can be used when you want to perform an operation, it will let you Invoke or // BeginInvoke onto the thread that's used to access the renderdoc project. public RenderManager Renderer { get { return m_Renderer; } } @@ -492,6 +501,9 @@ namespace renderdocui.Code m_GLPipelineState = r.GetGLPipelineState(); m_PipelineState.SetStates(m_APIProperties, m_D3D11PipelineState, m_GLPipelineState); + UnreadMessageCount = 0; + AddMessages(m_FrameInfo[0].debugMessages); + postloadProgress = 1.0f; }); @@ -556,6 +568,9 @@ namespace renderdocui.Code m_GLPipelineState = null; m_PipelineState.SetStates(null, null, null); + DebugMessages.Clear(); + UnreadMessageCount = 0; + m_LogLoaded = false; foreach (var logviewer in m_LogViewers) diff --git a/renderdocui/Interop/Enums.cs b/renderdocui/Interop/Enums.cs index 829238154..17ac327b1 100644 --- a/renderdocui/Interop/Enums.cs +++ b/renderdocui/Interop/Enums.cs @@ -263,6 +263,16 @@ namespace renderdoc Compute, }; + public enum DebugMessageSource + { + API = 0, + RedundantAPIUse, + IncorrectAPIUse, + GeneralPerformance, + GCNPerformance, + RuntimeWarning, + }; + public enum DebugMessageCategory { Defined = 0, @@ -396,6 +406,21 @@ namespace renderdoc public static class EnumString { + public static string Str(this DebugMessageSource source) + { + switch (source) + { + case DebugMessageSource.API: return "API's debug messages"; + case DebugMessageSource.RedundantAPIUse: return "Redundant use of API"; + case DebugMessageSource.IncorrectAPIUse: return "Incorrect use of API"; + case DebugMessageSource.GeneralPerformance: return "General Performance issues"; + case DebugMessageSource.GCNPerformance: return "GCN (AMD) Performance issues"; + case DebugMessageSource.RuntimeWarning: return "Issues raised while debugging"; + } + + return "Unknown Source"; + } + public static string Str(this VarType type) { switch (type) diff --git a/renderdocui/Interop/FetchInfo.cs b/renderdocui/Interop/FetchInfo.cs index e39282e78..589259358 100644 --- a/renderdocui/Interop/FetchInfo.cs +++ b/renderdocui/Interop/FetchInfo.cs @@ -273,6 +273,9 @@ namespace renderdoc public UInt64 fileOffset; public UInt64 captureTime; public ResourceId immContextId; + + [CustomMarshalAs(CustomUnmanagedType.TemplatedArray)] + public DebugMessage[] debugMessages; }; [StructLayout(LayoutKind.Sequential)] @@ -294,8 +297,10 @@ namespace renderdoc [StructLayout(LayoutKind.Sequential)] public class DebugMessage { + public UInt32 eventID; public DebugMessageCategory category; public DebugMessageSeverity severity; + public DebugMessageSource source; public UInt32 messageID; [CustomMarshalAs(CustomUnmanagedType.UTF8TemplatedString)] public string description; @@ -347,9 +352,6 @@ namespace renderdoc public FetchAPIEvent[] events; [CustomMarshalAs(CustomUnmanagedType.TemplatedArray)] public FetchDrawcall[] children; - - [CustomMarshalAs(CustomUnmanagedType.TemplatedArray)] - public DebugMessage[] debugMessages; }; [StructLayout(LayoutKind.Sequential)] diff --git a/renderdocui/Interop/ReplayRenderer.cs b/renderdocui/Interop/ReplayRenderer.cs index a740eb440..bc8d3916d 100644 --- a/renderdocui/Interop/ReplayRenderer.cs +++ b/renderdocui/Interop/ReplayRenderer.cs @@ -218,6 +218,8 @@ namespace renderdoc private static extern bool ReplayRenderer_GetResolve(IntPtr real, UInt64[] callstack, UInt32 callstackLen, IntPtr outtrace); [DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] private static extern IntPtr ReplayRenderer_GetShaderDetails(IntPtr real, ResourceId shader); + [DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] + private static extern bool ReplayRenderer_GetDebugMessages(IntPtr real, IntPtr outmsgs); [DllImport("renderdoc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] private static extern bool ReplayRenderer_PixelHistory(IntPtr real, ResourceId target, UInt32 x, UInt32 y, UInt32 sampleIdx, IntPtr history); @@ -511,6 +513,22 @@ namespace renderdoc return ret; } + public DebugMessage[] GetDebugMessages() + { + IntPtr mem = CustomMarshal.Alloc(typeof(templated_array)); + + bool success = ReplayRenderer_GetDebugMessages(m_Real, mem); + + DebugMessage[] ret = null; + + if (success) + ret = (DebugMessage[])CustomMarshal.GetTemplatedArray(mem, typeof(DebugMessage), true); + + CustomMarshal.Free(mem); + + return ret; + } + public PixelModification[] PixelHistory(ResourceId target, UInt32 x, UInt32 y, UInt32 sampleIdx) { IntPtr mem = CustomMarshal.Alloc(typeof(templated_array)); diff --git a/renderdocui/Windows/DebugMessages.Designer.cs b/renderdocui/Windows/DebugMessages.Designer.cs index 69b578de4..27ded4403 100644 --- a/renderdocui/Windows/DebugMessages.Designer.cs +++ b/renderdocui/Windows/DebugMessages.Designer.cs @@ -33,6 +33,7 @@ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DebugMessages)); this.messages = new System.Windows.Forms.DataGridView(); this.dataGridViewTextBoxColumn8 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Source = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.dataGridViewTextBoxColumn9 = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.dataGridViewTextBoxColumn10 = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.ID = new System.Windows.Forms.DataGridViewTextBoxColumn(); @@ -40,6 +41,7 @@ this.rightClickMenu = new System.Windows.Forms.ContextMenuStrip(this.components); this.hideIndividual = new System.Windows.Forms.ToolStripMenuItem(); this.hideType = new System.Windows.Forms.ToolStripMenuItem(); + this.hideSource = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripContainer1 = new System.Windows.Forms.ToolStripContainer(); this.toolStrip1 = new System.Windows.Forms.ToolStrip(); this.displayHidden = new System.Windows.Forms.ToolStripButton(); @@ -62,6 +64,7 @@ this.messages.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this.messages.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { this.dataGridViewTextBoxColumn8, + this.Source, this.dataGridViewTextBoxColumn9, this.dataGridViewTextBoxColumn10, this.ID, @@ -81,11 +84,12 @@ this.messages.ReadOnly = true; this.messages.RowHeadersVisible = false; this.messages.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; - this.messages.Size = new System.Drawing.Size(547, 314); + this.messages.Size = new System.Drawing.Size(729, 438); this.messages.TabIndex = 10; this.messages.VirtualMode = true; this.messages.CellDoubleClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.messages_CellDoubleClick); this.messages.CellFormatting += new System.Windows.Forms.DataGridViewCellFormattingEventHandler(this.messages_CellFormatting); + this.messages.CellPainting += new System.Windows.Forms.DataGridViewCellPaintingEventHandler(this.messages_CellPainting); this.messages.CellValueNeeded += new System.Windows.Forms.DataGridViewCellValueEventHandler(this.messages_CellValueNeeded); this.messages.MouseDown += new System.Windows.Forms.MouseEventHandler(this.messages_MouseDown); // @@ -97,6 +101,13 @@ this.dataGridViewTextBoxColumn8.ReadOnly = true; this.dataGridViewTextBoxColumn8.Width = 50; // + // Source + // + this.Source.HeaderText = "Source"; + this.Source.Name = "Source"; + this.Source.ReadOnly = true; + this.Source.Width = 66; + // // dataGridViewTextBoxColumn9 // this.dataGridViewTextBoxColumn9.HeaderText = "Severity"; @@ -133,9 +144,10 @@ // this.rightClickMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.hideIndividual, - this.hideType}); + this.hideType, + this.hideSource}); this.rightClickMenu.Name = "rightClickMenu"; - this.rightClickMenu.Size = new System.Drawing.Size(238, 48); + this.rightClickMenu.Size = new System.Drawing.Size(238, 70); this.rightClickMenu.Opening += new System.ComponentModel.CancelEventHandler(this.rightClickMenu_Opening); // // hideIndividual @@ -152,17 +164,24 @@ this.hideType.Text = "Show/Hide this message type"; this.hideType.Click += new System.EventHandler(this.hideType_Click); // + // hideSource + // + this.hideSource.Name = "hideSource"; + this.hideSource.Size = new System.Drawing.Size(237, 22); + this.hideSource.Text = "Show/Hide this message source"; + this.hideSource.Click += new System.EventHandler(this.hideSource_Click); + // // toolStripContainer1 // // // toolStripContainer1.ContentPanel // this.toolStripContainer1.ContentPanel.Controls.Add(this.messages); - this.toolStripContainer1.ContentPanel.Size = new System.Drawing.Size(547, 314); + this.toolStripContainer1.ContentPanel.Size = new System.Drawing.Size(729, 438); this.toolStripContainer1.Dock = System.Windows.Forms.DockStyle.Fill; this.toolStripContainer1.Location = new System.Drawing.Point(0, 0); this.toolStripContainer1.Name = "toolStripContainer1"; - this.toolStripContainer1.Size = new System.Drawing.Size(547, 339); + this.toolStripContainer1.Size = new System.Drawing.Size(729, 463); this.toolStripContainer1.TabIndex = 11; this.toolStripContainer1.Text = "toolStripContainer1"; // @@ -173,11 +192,12 @@ // toolStrip1 // this.toolStrip1.Dock = System.Windows.Forms.DockStyle.None; + this.toolStrip1.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.displayHidden}); this.toolStrip1.Location = new System.Drawing.Point(3, 0); this.toolStrip1.Name = "toolStrip1"; - this.toolStrip1.Size = new System.Drawing.Size(140, 25); + this.toolStrip1.Size = new System.Drawing.Size(164, 25); this.toolStrip1.TabIndex = 0; // // displayHidden @@ -195,11 +215,9 @@ // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(547, 339); + this.ClientSize = new System.Drawing.Size(729, 463); this.Controls.Add(this.toolStripContainer1); - this.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.Name = "DebugMessages"; - this.Text = "API Debug Messages"; this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.DebugMessages_FormClosed); this.Shown += new System.EventHandler(this.DebugMessages_Shown); ((System.ComponentModel.ISupportInitialize)(this.messages)).EndInit(); @@ -225,10 +243,12 @@ private System.Windows.Forms.ToolStripMenuItem hideIndividual; private System.Windows.Forms.ToolStripMenuItem hideType; private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn8; + private System.Windows.Forms.DataGridViewTextBoxColumn Source; private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn9; private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn10; private System.Windows.Forms.DataGridViewTextBoxColumn ID; private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn12; + private System.Windows.Forms.ToolStripMenuItem hideSource; } } \ No newline at end of file diff --git a/renderdocui/Windows/DebugMessages.cs b/renderdocui/Windows/DebugMessages.cs index 2e3009724..26e605bbf 100644 --- a/renderdocui/Windows/DebugMessages.cs +++ b/renderdocui/Windows/DebugMessages.cs @@ -41,16 +41,8 @@ namespace renderdocui.Windows { private Core m_Core; - struct DebugMessage - { - public DebugMessage(int i, UInt32 e, renderdoc.DebugMessage m) { Index = i; EventID = e; Message = m; } - public int Index; - public UInt32 EventID; - public renderdoc.DebugMessage Message; - }; - - List m_Messages = new List(); List m_VisibleMessages = new List(); + int m_NumMessages = 0; public DebugMessages(Core core) { @@ -59,49 +51,28 @@ namespace renderdocui.Windows Icon = global::renderdocui.Properties.Resources.icon; m_Core = core; + + RefreshMessageList(); } public void OnLogfileClosed() { - m_Messages.Clear(); m_VisibleMessages.Clear(); + m_NumMessages = 0; messages.RowCount = 0; - } - public void AddDebugMessages(FetchDrawcall[] drawcalls) - { - foreach (var draw in drawcalls) - { - if (draw.context != m_Core.FrameInfo[m_Core.CurFrame].immContextId) - continue; - - if(draw.children.Length > 0) - AddDebugMessages(draw.children); - - if (draw.debugMessages != null) - { - foreach (var msg in draw.debugMessages) - { - int i = m_Messages.Count; - m_VisibleMessages.Add(i); - m_Messages.Add(new DebugMessage(i, draw.eventID, msg)); - } - } - } + RefreshMessageList(); } public void OnLogfileLoaded() { - m_Messages.Clear(); m_VisibleMessages.Clear(); + m_NumMessages = 0; messages.RowCount = 0; messages.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCells; - for (UInt32 f = 0; f < m_Core.FrameInfo.Length; f++) - AddDebugMessages(m_Core.GetDrawcalls(f)); - - messages.RowCount = m_Messages.Count; + RefreshMessageList(); } public void OnEventSelected(UInt32 frameID, UInt32 eventID) @@ -117,25 +88,36 @@ namespace renderdocui.Windows private void messages_CellDoubleClick(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex < m_VisibleMessages.Count) - m_Core.SetEventID(null, 0, m_Messages[m_VisibleMessages[e.RowIndex]].EventID); + m_Core.SetEventID(null, 0, m_Core.DebugMessages[m_VisibleMessages[e.RowIndex]].eventID); } private bool m_SuppressRefresh = false; - void RefreshMessageList() + public void RefreshMessageList() { if (m_SuppressRefresh) return; + // add any new messages as default visible + for (int i = m_NumMessages; i < m_Core.DebugMessages.Count; i++) + m_VisibleMessages.Add(i); + + m_NumMessages = m_Core.DebugMessages.Count; + if (displayHidden.Checked) { messages.RowCount = 0; - messages.RowCount = m_Messages.Count; + messages.RowCount = m_Core.DebugMessages.Count; } else { messages.RowCount = 0; messages.RowCount = m_VisibleMessages.Count; } + + if (m_Core.UnreadMessageCount > 0) + Text = String.Format("({0}) Errors and Warnings", m_Core.UnreadMessageCount); + else + Text = "Errors and Warnings"; } bool IsRowVisible(int row) @@ -217,22 +199,59 @@ namespace renderdocui.Windows int msgIdx = GetMessageIndex(typerow.Index); - renderdoc.DebugMessage msg = m_Messages[msgIdx].Message; + DebugMessage msg = m_Core.DebugMessages[msgIdx]; bool hiderows = IsRowVisible(msgIdx); m_SuppressRefresh = true; - foreach (var message in m_Messages) + for(int i=0; i < m_Core.DebugMessages.Count; i++) { - if (message.Message.category == msg.category && - message.Message.severity == msg.severity && - message.Message.messageID == msg.messageID) + var message = m_Core.DebugMessages[i]; + + if (message.category == msg.category && + message.severity == msg.severity && + message.messageID == msg.messageID) { if (hiderows) - HideRow(message.Index); + HideRow(i); else - ShowRow(message.Index); + ShowRow(i); + } + } + + m_SuppressRefresh = false; + + RefreshMessageList(); + + messages.ClearSelection(); + } + } + + private void hideSource_Click(object sender, EventArgs e) + { + if (messages.SelectedRows.Count == 1) + { + DataGridViewRow typerow = messages.SelectedRows[0]; + + int msgIdx = GetMessageIndex(typerow.Index); + + DebugMessage msg = m_Core.DebugMessages[msgIdx]; + + bool hiderows = IsRowVisible(msgIdx); + + m_SuppressRefresh = true; + + for (int i = 0; i < m_Core.DebugMessages.Count; i++) + { + var message = m_Core.DebugMessages[i]; + + if (message.source == msg.source) + { + if (hiderows) + HideRow(i); + else + ShowRow(i); } } @@ -271,13 +290,14 @@ namespace renderdocui.Windows int msgIdx = GetMessageIndex(e.RowIndex); if (e.ColumnIndex < 0 || e.ColumnIndex >= messages.ColumnCount) return; - if (msgIdx < 0 || msgIdx >= m_Messages.Count) return; + if (msgIdx < 0 || msgIdx >= m_Core.DebugMessages.Count) return; - if (e.ColumnIndex == 0) e.Value = m_Messages[msgIdx].EventID; - if (e.ColumnIndex == 1) e.Value = m_Messages[msgIdx].Message.severity.ToString(); - if (e.ColumnIndex == 2) e.Value = m_Messages[msgIdx].Message.category.ToString(); - if (e.ColumnIndex == 3) e.Value = m_Messages[msgIdx].Message.messageID.ToString(); - if (e.ColumnIndex == 4) e.Value = m_Messages[msgIdx].Message.description; + if (e.ColumnIndex == 0) e.Value = m_Core.DebugMessages[msgIdx].eventID; + if (e.ColumnIndex == 1) e.Value = m_Core.DebugMessages[msgIdx].source.Str(); + if (e.ColumnIndex == 2) e.Value = m_Core.DebugMessages[msgIdx].severity.ToString(); + if (e.ColumnIndex == 3) e.Value = m_Core.DebugMessages[msgIdx].category.ToString(); + if (e.ColumnIndex == 4) e.Value = m_Core.DebugMessages[msgIdx].messageID.ToString(); + if (e.ColumnIndex == 5) e.Value = m_Core.DebugMessages[msgIdx].description; } private void messages_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) @@ -285,14 +305,30 @@ namespace renderdocui.Windows int msgIdx = GetMessageIndex(e.RowIndex); if (e.ColumnIndex < 0 || e.ColumnIndex >= messages.ColumnCount) return; - if (msgIdx < 0 || msgIdx >= m_Messages.Count) return; + if (msgIdx < 0 || msgIdx >= m_Core.DebugMessages.Count) return; - if (!IsRowVisible(msgIdx)) e.CellStyle.BackColor = Color.Salmon; + if (!IsRowVisible(msgIdx)) + e.CellStyle.BackColor = Color.Salmon; + else if (m_Core.DebugMessages[msgIdx].source == DebugMessageSource.RuntimeWarning) + e.CellStyle.BackColor = Color.Aquamarine; } private void DebugMessages_FormClosed(object sender, FormClosedEventArgs e) { m_Core.RemoveLogViewer(this); } + + private void messages_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) + { + // use BeginInvoke so we don't resize the messages mid-paint + this.BeginInvoke(new Action(() => + { + if (m_Core.UnreadMessageCount > 0) + { + m_Core.UnreadMessageCount = 0; + RefreshMessageList(); + } + })); + } } } diff --git a/renderdocui/Windows/DebugMessages.resx b/renderdocui/Windows/DebugMessages.resx index a0c377c80..cfe7c20ad 100644 --- a/renderdocui/Windows/DebugMessages.resx +++ b/renderdocui/Windows/DebugMessages.resx @@ -120,6 +120,9 @@ True + + True + True diff --git a/renderdocui/Windows/MainWindow.Designer.cs b/renderdocui/Windows/MainWindow.Designer.cs index b3f5994c4..e5db4e41d 100644 --- a/renderdocui/Windows/MainWindow.Designer.cs +++ b/renderdocui/Windows/MainWindow.Designer.cs @@ -28,21 +28,21 @@ /// private void InitializeComponent() { - WeifenLuo.WinFormsUI.Docking.DockPanelSkin dockPanelSkin1 = new WeifenLuo.WinFormsUI.Docking.DockPanelSkin(); - WeifenLuo.WinFormsUI.Docking.AutoHideStripSkin autoHideStripSkin1 = new WeifenLuo.WinFormsUI.Docking.AutoHideStripSkin(); - WeifenLuo.WinFormsUI.Docking.DockPanelGradient dockPanelGradient1 = new WeifenLuo.WinFormsUI.Docking.DockPanelGradient(); - WeifenLuo.WinFormsUI.Docking.TabGradient tabGradient1 = new WeifenLuo.WinFormsUI.Docking.TabGradient(); - WeifenLuo.WinFormsUI.Docking.DockPaneStripSkin dockPaneStripSkin1 = new WeifenLuo.WinFormsUI.Docking.DockPaneStripSkin(); - WeifenLuo.WinFormsUI.Docking.DockPaneStripGradient dockPaneStripGradient1 = new WeifenLuo.WinFormsUI.Docking.DockPaneStripGradient(); - WeifenLuo.WinFormsUI.Docking.TabGradient tabGradient2 = new WeifenLuo.WinFormsUI.Docking.TabGradient(); - WeifenLuo.WinFormsUI.Docking.DockPanelGradient dockPanelGradient2 = new WeifenLuo.WinFormsUI.Docking.DockPanelGradient(); - WeifenLuo.WinFormsUI.Docking.TabGradient tabGradient3 = new WeifenLuo.WinFormsUI.Docking.TabGradient(); - WeifenLuo.WinFormsUI.Docking.DockPaneStripToolWindowGradient dockPaneStripToolWindowGradient1 = new WeifenLuo.WinFormsUI.Docking.DockPaneStripToolWindowGradient(); - WeifenLuo.WinFormsUI.Docking.TabGradient tabGradient4 = new WeifenLuo.WinFormsUI.Docking.TabGradient(); - WeifenLuo.WinFormsUI.Docking.TabGradient tabGradient5 = new WeifenLuo.WinFormsUI.Docking.TabGradient(); - WeifenLuo.WinFormsUI.Docking.DockPanelGradient dockPanelGradient3 = new WeifenLuo.WinFormsUI.Docking.DockPanelGradient(); - WeifenLuo.WinFormsUI.Docking.TabGradient tabGradient6 = new WeifenLuo.WinFormsUI.Docking.TabGradient(); - WeifenLuo.WinFormsUI.Docking.TabGradient tabGradient7 = new WeifenLuo.WinFormsUI.Docking.TabGradient(); + WeifenLuo.WinFormsUI.Docking.DockPanelSkin dockPanelSkin4 = new WeifenLuo.WinFormsUI.Docking.DockPanelSkin(); + WeifenLuo.WinFormsUI.Docking.AutoHideStripSkin autoHideStripSkin4 = new WeifenLuo.WinFormsUI.Docking.AutoHideStripSkin(); + WeifenLuo.WinFormsUI.Docking.DockPanelGradient dockPanelGradient10 = new WeifenLuo.WinFormsUI.Docking.DockPanelGradient(); + WeifenLuo.WinFormsUI.Docking.TabGradient tabGradient22 = new WeifenLuo.WinFormsUI.Docking.TabGradient(); + WeifenLuo.WinFormsUI.Docking.DockPaneStripSkin dockPaneStripSkin4 = new WeifenLuo.WinFormsUI.Docking.DockPaneStripSkin(); + WeifenLuo.WinFormsUI.Docking.DockPaneStripGradient dockPaneStripGradient4 = new WeifenLuo.WinFormsUI.Docking.DockPaneStripGradient(); + WeifenLuo.WinFormsUI.Docking.TabGradient tabGradient23 = new WeifenLuo.WinFormsUI.Docking.TabGradient(); + WeifenLuo.WinFormsUI.Docking.DockPanelGradient dockPanelGradient11 = new WeifenLuo.WinFormsUI.Docking.DockPanelGradient(); + WeifenLuo.WinFormsUI.Docking.TabGradient tabGradient24 = new WeifenLuo.WinFormsUI.Docking.TabGradient(); + WeifenLuo.WinFormsUI.Docking.DockPaneStripToolWindowGradient dockPaneStripToolWindowGradient4 = new WeifenLuo.WinFormsUI.Docking.DockPaneStripToolWindowGradient(); + WeifenLuo.WinFormsUI.Docking.TabGradient tabGradient25 = new WeifenLuo.WinFormsUI.Docking.TabGradient(); + WeifenLuo.WinFormsUI.Docking.TabGradient tabGradient26 = new WeifenLuo.WinFormsUI.Docking.TabGradient(); + WeifenLuo.WinFormsUI.Docking.DockPanelGradient dockPanelGradient12 = new WeifenLuo.WinFormsUI.Docking.DockPanelGradient(); + WeifenLuo.WinFormsUI.Docking.TabGradient tabGradient27 = new WeifenLuo.WinFormsUI.Docking.TabGradient(); + WeifenLuo.WinFormsUI.Docking.TabGradient tabGradient28 = new WeifenLuo.WinFormsUI.Docking.TabGradient(); this.menuStrip1 = new System.Windows.Forms.MenuStrip(); this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.captureLogToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -81,6 +81,7 @@ this.layoutLoad5 = new System.Windows.Forms.ToolStripMenuItem(); this.layoutLoad6 = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.pythonShellToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.eventViewerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.textureToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.D3D11PipelineStateToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -106,11 +107,11 @@ this.openDialog = new System.Windows.Forms.OpenFileDialog(); this.toolStripContainer1 = new System.Windows.Forms.ToolStripContainer(); this.statusStrip = new System.Windows.Forms.StatusStrip(); + this.statusIcon = new System.Windows.Forms.ToolStripStatusLabel(); this.statusText = new System.Windows.Forms.ToolStripStatusLabel(); this.statusProgress = new System.Windows.Forms.ToolStripProgressBar(); this.dockPanel = new WeifenLuo.WinFormsUI.Docking.DockPanel(); this.saveDialog = new System.Windows.Forms.SaveFileDialog(); - this.pythonShellToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.menuStrip1.SuspendLayout(); this.toolStripContainer1.BottomToolStripPanel.SuspendLayout(); this.toolStripContainer1.ContentPanel.SuspendLayout(); @@ -294,13 +295,13 @@ this.layoutSave5, this.layoutSave6}); this.toolStripMenuItem1.Name = "toolStripMenuItem1"; - this.toolStripMenuItem1.Size = new System.Drawing.Size(155, 22); + this.toolStripMenuItem1.Size = new System.Drawing.Size(192, 22); this.toolStripMenuItem1.Text = "&Save Layout"; // // layoutSaveDefault // this.layoutSaveDefault.Name = "layoutSaveDefault"; - this.layoutSaveDefault.Size = new System.Drawing.Size(152, 22); + this.layoutSaveDefault.Size = new System.Drawing.Size(145, 22); this.layoutSaveDefault.Tag = "0"; this.layoutSaveDefault.Text = "&Default Layout"; this.layoutSaveDefault.Click += new System.EventHandler(this.saveLayout_Click); @@ -308,12 +309,12 @@ // toolStripSeparator3 // this.toolStripSeparator3.Name = "toolStripSeparator3"; - this.toolStripSeparator3.Size = new System.Drawing.Size(149, 6); + this.toolStripSeparator3.Size = new System.Drawing.Size(142, 6); // // layoutSave1 // this.layoutSave1.Name = "layoutSave1"; - this.layoutSave1.Size = new System.Drawing.Size(152, 22); + this.layoutSave1.Size = new System.Drawing.Size(145, 22); this.layoutSave1.Tag = "1"; this.layoutSave1.Text = "Layout &1"; this.layoutSave1.Click += new System.EventHandler(this.saveLayout_Click); @@ -321,7 +322,7 @@ // layoutSave2 // this.layoutSave2.Name = "layoutSave2"; - this.layoutSave2.Size = new System.Drawing.Size(152, 22); + this.layoutSave2.Size = new System.Drawing.Size(145, 22); this.layoutSave2.Tag = "2"; this.layoutSave2.Text = "Layout &2"; this.layoutSave2.Click += new System.EventHandler(this.saveLayout_Click); @@ -329,7 +330,7 @@ // layoutSave3 // this.layoutSave3.Name = "layoutSave3"; - this.layoutSave3.Size = new System.Drawing.Size(152, 22); + this.layoutSave3.Size = new System.Drawing.Size(145, 22); this.layoutSave3.Tag = "3"; this.layoutSave3.Text = "Layout &3"; this.layoutSave3.Click += new System.EventHandler(this.saveLayout_Click); @@ -337,7 +338,7 @@ // layoutSave4 // this.layoutSave4.Name = "layoutSave4"; - this.layoutSave4.Size = new System.Drawing.Size(152, 22); + this.layoutSave4.Size = new System.Drawing.Size(145, 22); this.layoutSave4.Tag = "4"; this.layoutSave4.Text = "Layout &4"; this.layoutSave4.Click += new System.EventHandler(this.saveLayout_Click); @@ -345,7 +346,7 @@ // layoutSave5 // this.layoutSave5.Name = "layoutSave5"; - this.layoutSave5.Size = new System.Drawing.Size(152, 22); + this.layoutSave5.Size = new System.Drawing.Size(145, 22); this.layoutSave5.Tag = "5"; this.layoutSave5.Text = "Layout &5"; this.layoutSave5.Click += new System.EventHandler(this.saveLayout_Click); @@ -353,7 +354,7 @@ // layoutSave6 // this.layoutSave6.Name = "layoutSave6"; - this.layoutSave6.Size = new System.Drawing.Size(152, 22); + this.layoutSave6.Size = new System.Drawing.Size(145, 22); this.layoutSave6.Tag = "6"; this.layoutSave6.Text = "Layout &6"; this.layoutSave6.Click += new System.EventHandler(this.saveLayout_Click); @@ -370,7 +371,7 @@ this.layoutLoad5, this.layoutLoad6}); this.saveLayoutToolStripMenuItem.Name = "saveLayoutToolStripMenuItem"; - this.saveLayoutToolStripMenuItem.Size = new System.Drawing.Size(155, 22); + this.saveLayoutToolStripMenuItem.Size = new System.Drawing.Size(192, 22); this.saveLayoutToolStripMenuItem.Text = "&Load Layout"; // // layoutLoadDefault @@ -437,54 +438,61 @@ // toolStripSeparator1 // this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(152, 6); + this.toolStripSeparator1.Size = new System.Drawing.Size(189, 6); + // + // pythonShellToolStripMenuItem + // + this.pythonShellToolStripMenuItem.Name = "pythonShellToolStripMenuItem"; + this.pythonShellToolStripMenuItem.Size = new System.Drawing.Size(192, 22); + this.pythonShellToolStripMenuItem.Text = "P&ython Shell"; + this.pythonShellToolStripMenuItem.Click += new System.EventHandler(this.pythonShellToolStripMenuItem_Click); // // eventViewerToolStripMenuItem // this.eventViewerToolStripMenuItem.Name = "eventViewerToolStripMenuItem"; - this.eventViewerToolStripMenuItem.Size = new System.Drawing.Size(155, 22); + this.eventViewerToolStripMenuItem.Size = new System.Drawing.Size(192, 22); this.eventViewerToolStripMenuItem.Text = "&Event Viewer"; this.eventViewerToolStripMenuItem.Click += new System.EventHandler(this.eventViewerToolStripMenuItem_Click); // // textureToolStripMenuItem // this.textureToolStripMenuItem.Name = "textureToolStripMenuItem"; - this.textureToolStripMenuItem.Size = new System.Drawing.Size(155, 22); + this.textureToolStripMenuItem.Size = new System.Drawing.Size(192, 22); this.textureToolStripMenuItem.Text = "&Texture Viewer"; this.textureToolStripMenuItem.Click += new System.EventHandler(this.textureToolStripMenuItem_Click); // // D3D11PipelineStateToolStripMenuItem // this.D3D11PipelineStateToolStripMenuItem.Name = "D3D11PipelineStateToolStripMenuItem"; - this.D3D11PipelineStateToolStripMenuItem.Size = new System.Drawing.Size(155, 22); + this.D3D11PipelineStateToolStripMenuItem.Size = new System.Drawing.Size(192, 22); this.D3D11PipelineStateToolStripMenuItem.Text = "&Pipeline State"; this.D3D11PipelineStateToolStripMenuItem.Click += new System.EventHandler(this.PipelineStateToolStripMenuItem_Click); // // aPIInspectorToolStripMenuItem // this.aPIInspectorToolStripMenuItem.Name = "aPIInspectorToolStripMenuItem"; - this.aPIInspectorToolStripMenuItem.Size = new System.Drawing.Size(155, 22); + this.aPIInspectorToolStripMenuItem.Size = new System.Drawing.Size(192, 22); this.aPIInspectorToolStripMenuItem.Text = "&API Inspector"; this.aPIInspectorToolStripMenuItem.Click += new System.EventHandler(this.APIInspectorToolStripMenuItem_Click); // // meshOutputToolStripMenuItem // this.meshOutputToolStripMenuItem.Name = "meshOutputToolStripMenuItem"; - this.meshOutputToolStripMenuItem.Size = new System.Drawing.Size(155, 22); + this.meshOutputToolStripMenuItem.Size = new System.Drawing.Size(192, 22); this.meshOutputToolStripMenuItem.Text = "&Mesh Output"; this.meshOutputToolStripMenuItem.Click += new System.EventHandler(this.meshOutputToolStripMenuItem_Click); // // debugMessagesToolStripMenuItem // this.debugMessagesToolStripMenuItem.Name = "debugMessagesToolStripMenuItem"; - this.debugMessagesToolStripMenuItem.Size = new System.Drawing.Size(155, 22); - this.debugMessagesToolStripMenuItem.Text = "&Debug Messages"; + this.debugMessagesToolStripMenuItem.Size = new System.Drawing.Size(192, 22); + this.debugMessagesToolStripMenuItem.Text = "Log Errors and &Warnings"; this.debugMessagesToolStripMenuItem.Click += new System.EventHandler(this.debugMessagesToolStripMenuItem_Click); // // timelineToolStripMenuItem // this.timelineToolStripMenuItem.Name = "timelineToolStripMenuItem"; - this.timelineToolStripMenuItem.Size = new System.Drawing.Size(155, 22); + this.timelineToolStripMenuItem.Size = new System.Drawing.Size(192, 22); this.timelineToolStripMenuItem.Text = "T&imeline"; this.timelineToolStripMenuItem.Click += new System.EventHandler(this.timelineToolStripMenuItem_Click); // @@ -641,6 +649,7 @@ // this.statusStrip.Dock = System.Windows.Forms.DockStyle.None; this.statusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.statusIcon, this.statusText, this.statusProgress}); this.statusStrip.Location = new System.Drawing.Point(0, 0); @@ -648,11 +657,22 @@ this.statusStrip.Size = new System.Drawing.Size(1272, 22); this.statusStrip.TabIndex = 0; // + // statusIcon + // + this.statusIcon.AutoSize = false; + this.statusIcon.DoubleClickEnabled = true; + this.statusIcon.Name = "statusIcon"; + this.statusIcon.Size = new System.Drawing.Size(20, 17); + this.statusIcon.Text = "Icon"; + this.statusIcon.DoubleClick += new System.EventHandler(this.status_DoubleClick); + // // statusText // + this.statusText.DoubleClickEnabled = true; this.statusText.Name = "statusText"; this.statusText.Size = new System.Drawing.Size(63, 17); this.statusText.Text = "Status Text"; + this.statusText.DoubleClick += new System.EventHandler(this.status_DoubleClick); // // statusProgress // @@ -673,52 +693,52 @@ this.dockPanel.Location = new System.Drawing.Point(0, 0); this.dockPanel.Name = "dockPanel"; this.dockPanel.Size = new System.Drawing.Size(1272, 727); - dockPanelGradient1.EndColor = System.Drawing.SystemColors.ControlLight; - dockPanelGradient1.StartColor = System.Drawing.SystemColors.ControlLight; - autoHideStripSkin1.DockStripGradient = dockPanelGradient1; - tabGradient1.EndColor = System.Drawing.SystemColors.Control; - tabGradient1.StartColor = System.Drawing.SystemColors.Control; - tabGradient1.TextColor = System.Drawing.SystemColors.ControlDarkDark; - autoHideStripSkin1.TabGradient = tabGradient1; - autoHideStripSkin1.TextFont = new System.Drawing.Font("Tahoma", 8.25F); - dockPanelSkin1.AutoHideStripSkin = autoHideStripSkin1; - tabGradient2.EndColor = System.Drawing.SystemColors.ControlLightLight; - tabGradient2.StartColor = System.Drawing.SystemColors.ControlLightLight; - tabGradient2.TextColor = System.Drawing.SystemColors.ControlText; - dockPaneStripGradient1.ActiveTabGradient = tabGradient2; - dockPanelGradient2.EndColor = System.Drawing.SystemColors.Control; - dockPanelGradient2.StartColor = System.Drawing.SystemColors.Control; - dockPaneStripGradient1.DockStripGradient = dockPanelGradient2; - tabGradient3.EndColor = System.Drawing.SystemColors.ControlLight; - tabGradient3.StartColor = System.Drawing.SystemColors.ControlLight; - tabGradient3.TextColor = System.Drawing.SystemColors.ControlText; - dockPaneStripGradient1.InactiveTabGradient = tabGradient3; - dockPaneStripSkin1.DocumentGradient = dockPaneStripGradient1; - dockPaneStripSkin1.TextFont = new System.Drawing.Font("Tahoma", 8.25F); - tabGradient4.EndColor = System.Drawing.SystemColors.ActiveCaption; - tabGradient4.LinearGradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; - tabGradient4.StartColor = System.Drawing.SystemColors.GradientActiveCaption; - tabGradient4.TextColor = System.Drawing.SystemColors.ActiveCaptionText; - dockPaneStripToolWindowGradient1.ActiveCaptionGradient = tabGradient4; - tabGradient5.EndColor = System.Drawing.SystemColors.Control; - tabGradient5.StartColor = System.Drawing.SystemColors.Control; - tabGradient5.TextColor = System.Drawing.SystemColors.ControlText; - dockPaneStripToolWindowGradient1.ActiveTabGradient = tabGradient5; - dockPanelGradient3.EndColor = System.Drawing.SystemColors.ControlLight; - dockPanelGradient3.StartColor = System.Drawing.SystemColors.ControlLight; - dockPaneStripToolWindowGradient1.DockStripGradient = dockPanelGradient3; - tabGradient6.EndColor = System.Drawing.SystemColors.InactiveCaption; - tabGradient6.LinearGradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; - tabGradient6.StartColor = System.Drawing.SystemColors.GradientInactiveCaption; - tabGradient6.TextColor = System.Drawing.SystemColors.InactiveCaptionText; - dockPaneStripToolWindowGradient1.InactiveCaptionGradient = tabGradient6; - tabGradient7.EndColor = System.Drawing.Color.Transparent; - tabGradient7.StartColor = System.Drawing.Color.Transparent; - tabGradient7.TextColor = System.Drawing.SystemColors.ControlDarkDark; - dockPaneStripToolWindowGradient1.InactiveTabGradient = tabGradient7; - dockPaneStripSkin1.ToolWindowGradient = dockPaneStripToolWindowGradient1; - dockPanelSkin1.DockPaneStripSkin = dockPaneStripSkin1; - this.dockPanel.Skin = dockPanelSkin1; + dockPanelGradient10.EndColor = System.Drawing.SystemColors.ControlLight; + dockPanelGradient10.StartColor = System.Drawing.SystemColors.ControlLight; + autoHideStripSkin4.DockStripGradient = dockPanelGradient10; + tabGradient22.EndColor = System.Drawing.SystemColors.Control; + tabGradient22.StartColor = System.Drawing.SystemColors.Control; + tabGradient22.TextColor = System.Drawing.SystemColors.ControlDarkDark; + autoHideStripSkin4.TabGradient = tabGradient22; + autoHideStripSkin4.TextFont = new System.Drawing.Font("Tahoma", 8.25F); + dockPanelSkin4.AutoHideStripSkin = autoHideStripSkin4; + tabGradient23.EndColor = System.Drawing.SystemColors.ControlLightLight; + tabGradient23.StartColor = System.Drawing.SystemColors.ControlLightLight; + tabGradient23.TextColor = System.Drawing.SystemColors.ControlText; + dockPaneStripGradient4.ActiveTabGradient = tabGradient23; + dockPanelGradient11.EndColor = System.Drawing.SystemColors.Control; + dockPanelGradient11.StartColor = System.Drawing.SystemColors.Control; + dockPaneStripGradient4.DockStripGradient = dockPanelGradient11; + tabGradient24.EndColor = System.Drawing.SystemColors.ControlLight; + tabGradient24.StartColor = System.Drawing.SystemColors.ControlLight; + tabGradient24.TextColor = System.Drawing.SystemColors.ControlText; + dockPaneStripGradient4.InactiveTabGradient = tabGradient24; + dockPaneStripSkin4.DocumentGradient = dockPaneStripGradient4; + dockPaneStripSkin4.TextFont = new System.Drawing.Font("Tahoma", 8.25F); + tabGradient25.EndColor = System.Drawing.SystemColors.ActiveCaption; + tabGradient25.LinearGradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + tabGradient25.StartColor = System.Drawing.SystemColors.GradientActiveCaption; + tabGradient25.TextColor = System.Drawing.SystemColors.ActiveCaptionText; + dockPaneStripToolWindowGradient4.ActiveCaptionGradient = tabGradient25; + tabGradient26.EndColor = System.Drawing.SystemColors.Control; + tabGradient26.StartColor = System.Drawing.SystemColors.Control; + tabGradient26.TextColor = System.Drawing.SystemColors.ControlText; + dockPaneStripToolWindowGradient4.ActiveTabGradient = tabGradient26; + dockPanelGradient12.EndColor = System.Drawing.SystemColors.ControlLight; + dockPanelGradient12.StartColor = System.Drawing.SystemColors.ControlLight; + dockPaneStripToolWindowGradient4.DockStripGradient = dockPanelGradient12; + tabGradient27.EndColor = System.Drawing.SystemColors.InactiveCaption; + tabGradient27.LinearGradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + tabGradient27.StartColor = System.Drawing.SystemColors.GradientInactiveCaption; + tabGradient27.TextColor = System.Drawing.SystemColors.InactiveCaptionText; + dockPaneStripToolWindowGradient4.InactiveCaptionGradient = tabGradient27; + tabGradient28.EndColor = System.Drawing.Color.Transparent; + tabGradient28.StartColor = System.Drawing.Color.Transparent; + tabGradient28.TextColor = System.Drawing.SystemColors.ControlDarkDark; + dockPaneStripToolWindowGradient4.InactiveTabGradient = tabGradient28; + dockPaneStripSkin4.ToolWindowGradient = dockPaneStripToolWindowGradient4; + dockPanelSkin4.DockPaneStripSkin = dockPaneStripSkin4; + this.dockPanel.Skin = dockPanelSkin4; this.dockPanel.TabIndex = 0; // // saveDialog @@ -727,13 +747,6 @@ this.saveDialog.Filter = "Log Files (*.rdc)|*.rdc"; this.saveDialog.Title = "Save Log As"; // - // pythonShellToolStripMenuItem - // - this.pythonShellToolStripMenuItem.Name = "pythonShellToolStripMenuItem"; - this.pythonShellToolStripMenuItem.Size = new System.Drawing.Size(155, 22); - this.pythonShellToolStripMenuItem.Text = "P&ython Shell"; - this.pythonShellToolStripMenuItem.Click += new System.EventHandler(this.pythonShellToolStripMenuItem_Click); - // // MainWindow // this.AllowDrop = true; @@ -836,6 +849,7 @@ private System.Windows.Forms.ToolStripMenuItem nightlybuildsToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem sourceOnGithubToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem pythonShellToolStripMenuItem; + private System.Windows.Forms.ToolStripStatusLabel statusIcon; } } \ No newline at end of file diff --git a/renderdocui/Windows/MainWindow.cs b/renderdocui/Windows/MainWindow.cs index 13928da8b..6c49df04c 100644 --- a/renderdocui/Windows/MainWindow.cs +++ b/renderdocui/Windows/MainWindow.cs @@ -135,6 +135,8 @@ namespace renderdocui.Windows renderdocplugin.PluginHelpers.GetPlugins(); + statusIcon.Text = ""; + statusIcon.Image = null; statusText.Text = ""; SetTitle(); @@ -255,6 +257,7 @@ namespace renderdocui.Windows { statusProgress.Visible = false; statusText.Text = ""; + statusIcon.Image = null; } else { @@ -271,8 +274,12 @@ namespace renderdocui.Windows public void OnLogfileClosed() { statusText.Text = ""; + statusIcon.Image = null; statusProgress.Visible = false; + m_MessageTick.Dispose(); + m_MessageTick = null; + logStatisticsToolStripMenuItem.Enabled = false; resolveSymbolsToolStripMenuItem.Enabled = false; @@ -287,9 +294,82 @@ namespace renderdocui.Windows SetTitle(); } + private static void MessageCheck(object m) + { + if (!(m is MainWindow)) return; + + var me = (MainWindow)m; + + if (me.m_Core.LogLoaded) + { + me.m_Core.Renderer.BeginInvoke((ReplayRenderer r) => + { + DebugMessage[] msgs = r.GetDebugMessages(); + + me.BeginInvoke(new Action(() => + { + if (msgs.Length > 0) + { + me.m_Core.AddMessages(msgs); + me.m_Core.GetDebugMessages().RefreshMessageList(); + } + + if (me.m_Core.UnreadMessageCount > 0) + { + me.m_MessageAlternate = !me.m_MessageAlternate; + } + else + { + me.m_MessageAlternate = false; + } + + me.LogHasErrors = (me.m_Core.DebugMessages.Count > 0); + })); + }); + } + + if (me == null) return; + if (me.m_MessageTick != null) me.m_MessageTick.Change(500, System.Threading.Timeout.Infinite); + } + + private System.Threading.Timer m_MessageTick = null; + private bool m_MessageAlternate = false; + + private bool LogHasErrors + { + set + { + if (value == true) + { + statusIcon.Image = m_MessageAlternate + ? null + : global::renderdocui.Properties.Resources.delete; + statusText.Text = String.Format("{0} loaded. Log has {1} errors, warnings or performance notes. " + + "See the 'Log Errors and Warnings' window.", Path.GetFileName(m_Core.LogFileName), m_Core.DebugMessages.Count); + if (m_Core.UnreadMessageCount > 0) + { + statusText.Text += String.Format(" {0} Unread.", m_Core.UnreadMessageCount); + } + } + else + { + statusIcon.Image = global::renderdocui.Properties.Resources.tick; + statusText.Text = String.Format("{0} loaded. No problems detected.", Path.GetFileName(m_Core.LogFileName)); + } + } + } + + private void status_DoubleClick(object sender, EventArgs e) + { + m_Core.GetDebugMessages().Show(dockPanel); + } + public void OnLogfileLoaded() { - statusText.Text = ""; + LogHasErrors = (m_Core.DebugMessages.Count > 0); + + m_MessageTick = new System.Threading.Timer(MessageCheck, this as object, 500, System.Threading.Timeout.Infinite); + statusProgress.Visible = false; m_Core.Renderer.BeginInvoke((ReplayRenderer r) => { @@ -670,6 +750,7 @@ namespace renderdocui.Windows BeginInvoke(new Action(() => { statusText.Text = ""; + statusIcon.Image = null; statusProgress.Visible = false; })); }));