From 04f1d4a3780fff1a4317ebe73b5a873a2222082f Mon Sep 17 00:00:00 2001 From: baldurk Date: Sun, 11 Jan 2015 00:20:50 +0000 Subject: [PATCH] Centralise debug message processing, and allow adding custom warnings * This will allow the adding of things like 'redundant api call' for calls that have no effect, as well as potential problems like drawing with an empty viewport, or similar things that are common problems. Reading out- of-bounds on buffers etc is a good example of 'defined' behaviour that is probably not desired. * These heuristics could also identify potential performance problems. * It also supports adding debug messages after log-load time, so you could do an additional extra-strength pass, or do a detailed check of one draw call (e.g. a broken draw, to try and figure out the problem). If there are any unread debug messages, the status bar will flash and the debug messages window will show a count as (N). --- renderdoc/api/replay/data_types.h | 23 ++- renderdoc/api/replay/renderdoc_replay.h | 1 + renderdoc/api/replay/replay_enums.h | 10 + renderdoc/core/image_viewer.cpp | 1 + renderdoc/core/replay_proxy.cpp | 25 ++- renderdoc/core/replay_proxy.h | 3 + renderdoc/driver/d3d11/d3d11_context.cpp | 1 + renderdoc/driver/d3d11/d3d11_context.h | 2 +- .../driver/d3d11/d3d11_context1_wrap.cpp | 3 +- renderdoc/driver/d3d11/d3d11_context_wrap.cpp | 63 ++---- renderdoc/driver/d3d11/d3d11_device.cpp | 8 + renderdoc/driver/d3d11/d3d11_device.h | 3 + renderdoc/driver/d3d11/d3d11_replay.cpp | 5 + renderdoc/driver/d3d11/d3d11_replay.h | 2 + renderdoc/driver/d3d11/shaders/dxbc_debug.cpp | 18 ++ renderdoc/driver/gl/gl_driver.cpp | 16 +- renderdoc/driver/gl/gl_driver.h | 3 +- renderdoc/driver/gl/gl_replay.cpp | 5 + renderdoc/driver/gl/gl_replay.h | 2 + .../driver/gl/wrappers/gl_draw_funcs.cpp | 135 +++---------- renderdoc/replay/replay_driver.h | 2 + renderdoc/replay/replay_renderer.cpp | 13 ++ renderdoc/replay/replay_renderer.h | 1 + renderdocui/Code/Core.cs | 15 ++ renderdocui/Interop/Enums.cs | 25 +++ renderdocui/Interop/FetchInfo.cs | 8 +- renderdocui/Interop/ReplayRenderer.cs | 18 ++ renderdocui/Windows/DebugMessages.Designer.cs | 38 +++- renderdocui/Windows/DebugMessages.cs | 144 ++++++++----- renderdocui/Windows/DebugMessages.resx | 3 + renderdocui/Windows/MainWindow.Designer.cs | 190 ++++++++++-------- renderdocui/Windows/MainWindow.cs | 83 +++++++- 32 files changed, 547 insertions(+), 322 deletions(-) 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; })); }));