diff --git a/renderdoc/core/replay_proxy.cpp b/renderdoc/core/replay_proxy.cpp index 20ea78714..1efc8d3e5 100644 --- a/renderdoc/core/replay_proxy.cpp +++ b/renderdoc/core/replay_proxy.cpp @@ -822,7 +822,8 @@ ShaderReflection *ReplayProxy::Proxied_GetShader(ParamSerialiser ¶mser, Retu const ReplayProxyPacket packet = eReplayProxy_GetShader; ShaderReflection *ret = NULL; - ShaderReflKey key(id, entry); + // only consider eventID part of the key on APIs where shaders are mutable + ShaderReflKey key(m_APIProps.shadersMutable ? m_EventID : 0, id, entry); if(retser.IsReading() && m_ShaderReflectionCache.find(key) != m_ShaderReflectionCache.end()) return m_ShaderReflectionCache[key]; @@ -1300,21 +1301,13 @@ void ReplayProxy::Proxied_ReplayLog(ParamSerialiser ¶mser, ReturnSerialiser if(paramser.IsReading() && !paramser.IsErrored() && !m_IsErrored) m_Remote->ReplayLog(endEventID, replayType); - if(m_RemoteServer) - m_PreviewEvent = endEventID; - if(retser.IsReading()) { m_TextureProxyCache.clear(); m_BufferProxyCache.clear(); - - if(m_APIProps.shadersMutable) - { - for(auto it = m_ShaderReflectionCache.begin(); it != m_ShaderReflectionCache.end(); ++it) - delete it->second; - m_ShaderReflectionCache.clear(); - } } + + m_EventID = endEventID; } void ReplayProxy::ReplayLog(uint32_t endEventID, ReplayLogType replayType) @@ -1916,7 +1909,7 @@ void ReplayProxy::RefreshPreviewWindow() m_Replay->RenderCheckerboard(); - const DrawcallDescription *curDraw = FindDraw(m_FrameRecord.drawcallList, m_PreviewEvent); + const DrawcallDescription *curDraw = FindDraw(m_FrameRecord.drawcallList, m_EventID); if(curDraw) { diff --git a/renderdoc/core/replay_proxy.h b/renderdoc/core/replay_proxy.h index 8bf2761fd..4f757adbf 100644 --- a/renderdoc/core/replay_proxy.h +++ b/renderdoc/core/replay_proxy.h @@ -597,11 +597,15 @@ private: struct ShaderReflKey { ShaderReflKey() {} - ShaderReflKey(ResourceId i, ShaderEntryPoint e) : id(i), entry(e) {} + ShaderReflKey(uint32_t eid, ResourceId i, ShaderEntryPoint e) : eventId(eid), id(i), entry(e) {} + uint32_t eventId; ResourceId id; ShaderEntryPoint entry; bool operator<(const ShaderReflKey &o) const { + if(eventId != o.eventId) + return eventId < o.eventId; + if(id != o.id) return id < o.id; @@ -637,7 +641,7 @@ private: // The previous windowing data, so we can detect changes and recreate the window WindowingData m_PreviewWindowingData; - uint32_t m_PreviewEvent = 0; + uint32_t m_EventID = 0; bool m_IsErrored = false;