From 03b7229badae1af69c28d406aacd67e2f4269015 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 28 Oct 2020 13:34:08 +0000 Subject: [PATCH] Support choosing multiview viewport in vertex debugging on vulkan --- qrenderdoc/Windows/BufferViewer.cpp | 5 +++-- renderdoc/api/replay/renderdoc_replay.h | 4 +++- renderdoc/core/image_viewer.cpp | 3 ++- renderdoc/core/replay_proxy.cpp | 12 +++++++----- renderdoc/core/replay_proxy.h | 2 +- renderdoc/driver/d3d11/d3d11_replay.h | 3 ++- renderdoc/driver/d3d11/d3d11_shaderdebug.cpp | 2 +- renderdoc/driver/d3d12/d3d12_replay.h | 3 ++- renderdoc/driver/d3d12/d3d12_shaderdebug.cpp | 2 +- renderdoc/driver/gl/gl_replay.cpp | 2 +- renderdoc/driver/gl/gl_replay.h | 3 ++- renderdoc/driver/vulkan/vk_replay.h | 3 ++- renderdoc/driver/vulkan/vk_shaderdebug.cpp | 12 ++++++++++-- renderdoc/replay/replay_controller.cpp | 5 +++-- renderdoc/replay/replay_controller.h | 2 +- renderdoc/replay/replay_driver.h | 2 +- 16 files changed, 42 insertions(+), 23 deletions(-) diff --git a/qrenderdoc/Windows/BufferViewer.cpp b/qrenderdoc/Windows/BufferViewer.cpp index 1396cfa4c..bac3edb31 100644 --- a/qrenderdoc/Windows/BufferViewer.cpp +++ b/qrenderdoc/Windows/BufferViewer.cpp @@ -4184,12 +4184,13 @@ void BufferViewer::debugVertex() m_CurView->model()->data(m_CurView->model()->index(idx.row(), 0), Qt::DisplayRole).toUInt(); uint32_t index = m_CurView->model()->data(m_CurView->model()->index(idx.row(), 1), Qt::DisplayRole).toUInt(); + uint32_t view = m_Config.curView; bool done = false; ShaderDebugTrace *trace = NULL; - m_Ctx.Replay().AsyncInvoke([this, &done, &trace, vertid, index](IReplayController *r) { - trace = r->DebugVertex(vertid, m_Config.curInstance, index); + m_Ctx.Replay().AsyncInvoke([this, &done, &trace, vertid, index, view](IReplayController *r) { + trace = r->DebugVertex(vertid, m_Config.curInstance, index, view); if(trace->debugger == NULL) { diff --git a/renderdoc/api/replay/renderdoc_replay.h b/renderdoc/api/replay/renderdoc_replay.h index 43b3fe04c..0b5df5866 100644 --- a/renderdoc/api/replay/renderdoc_replay.h +++ b/renderdoc/api/replay/renderdoc_replay.h @@ -836,11 +836,13 @@ bucket when the pixel values are divided between ``minval`` and ``maxval``. :param int instid: The instance ID as a 0-based index up to the number of instances in the draw. :param int idx: The actual index used to look up vertex inputs, either from the vertex ID for non- indexed draws or drawn from the index buffer. This must have all drawcall offsets applied. +:param int view: The index of the multiview viewport to use, or 0 if multiview is not in use. :return: The resulting trace resulting from debugging. Destroy with :meth:`FreeTrace`. :rtype: ShaderDebugTrace )"); - virtual ShaderDebugTrace *DebugVertex(uint32_t vertid, uint32_t instid, uint32_t idx) = 0; + virtual ShaderDebugTrace *DebugVertex(uint32_t vertid, uint32_t instid, uint32_t idx, + uint32_t view) = 0; DOCUMENT(R"(Retrieve a debugging trace from running a pixel shader. diff --git a/renderdoc/core/image_viewer.cpp b/renderdoc/core/image_viewer.cpp index f39bcad08..63e61bcab 100644 --- a/renderdoc/core/image_viewer.cpp +++ b/renderdoc/core/image_viewer.cpp @@ -273,7 +273,8 @@ public: { return rdcarray(); } - ShaderDebugTrace *DebugVertex(uint32_t eventId, uint32_t vertid, uint32_t instid, uint32_t idx) + ShaderDebugTrace *DebugVertex(uint32_t eventId, uint32_t vertid, uint32_t instid, uint32_t idx, + uint32_t view) { return new ShaderDebugTrace(); } diff --git a/renderdoc/core/replay_proxy.cpp b/renderdoc/core/replay_proxy.cpp index 3549d49c3..f14fd85a8 100644 --- a/renderdoc/core/replay_proxy.cpp +++ b/renderdoc/core/replay_proxy.cpp @@ -1455,7 +1455,8 @@ rdcarray ReplayProxy::PixelHistory(rdcarray event template ShaderDebugTrace *ReplayProxy::Proxied_DebugVertex(ParamSerialiser ¶mser, ReturnSerialiser &retser, uint32_t eventId, - uint32_t vertid, uint32_t instid, uint32_t idx) + uint32_t vertid, uint32_t instid, uint32_t idx, + uint32_t view) { const ReplayProxyPacket expectedPacket = eReplayProxy_DebugVertex; ReplayProxyPacket packet = eReplayProxy_DebugVertex; @@ -1467,13 +1468,14 @@ ShaderDebugTrace *ReplayProxy::Proxied_DebugVertex(ParamSerialiser ¶mser, SERIALISE_ELEMENT(vertid); SERIALISE_ELEMENT(instid); SERIALISE_ELEMENT(idx); + SERIALISE_ELEMENT(view); END_PARAMS(); } { REMOTE_EXECUTION(); if(paramser.IsReading() && !paramser.IsErrored() && !m_IsErrored) - ret = m_Remote->DebugVertex(eventId, vertid, instid, idx); + ret = m_Remote->DebugVertex(eventId, vertid, instid, idx, view); else ret = new ShaderDebugTrace; } @@ -1484,9 +1486,9 @@ ShaderDebugTrace *ReplayProxy::Proxied_DebugVertex(ParamSerialiser ¶mser, } ShaderDebugTrace *ReplayProxy::DebugVertex(uint32_t eventId, uint32_t vertid, uint32_t instid, - uint32_t idx) + uint32_t idx, uint32_t view) { - PROXY_FUNCTION(DebugVertex, eventId, vertid, instid, idx); + PROXY_FUNCTION(DebugVertex, eventId, vertid, instid, idx, view); } template @@ -2819,7 +2821,7 @@ bool ReplayProxy::Tick(int type) } case eReplayProxy_ReplaceResource: ReplaceResource(ResourceId(), ResourceId()); break; case eReplayProxy_RemoveReplacement: RemoveReplacement(ResourceId()); break; - case eReplayProxy_DebugVertex: DebugVertex(0, 0, 0, 0); break; + case eReplayProxy_DebugVertex: DebugVertex(0, 0, 0, 0, 0); break; case eReplayProxy_DebugPixel: DebugPixel(0, 0, 0, 0, 0); break; case eReplayProxy_DebugThread: { diff --git a/renderdoc/core/replay_proxy.h b/renderdoc/core/replay_proxy.h index 74e12e65a..f0614d1ba 100644 --- a/renderdoc/core/replay_proxy.h +++ b/renderdoc/core/replay_proxy.h @@ -524,7 +524,7 @@ public: ResourceId target, uint32_t x, uint32_t y, const Subresource &sub, CompType typeCast); IMPLEMENT_FUNCTION_PROXIED(ShaderDebugTrace *, DebugVertex, uint32_t eventId, uint32_t vertid, - uint32_t instid, uint32_t idx); + uint32_t instid, uint32_t idx, uint32_t view); IMPLEMENT_FUNCTION_PROXIED(ShaderDebugTrace *, DebugPixel, uint32_t eventId, uint32_t x, uint32_t y, uint32_t sample, uint32_t primitive); IMPLEMENT_FUNCTION_PROXIED(ShaderDebugTrace *, DebugThread, uint32_t eventId, diff --git a/renderdoc/driver/d3d11/d3d11_replay.h b/renderdoc/driver/d3d11/d3d11_replay.h index ccc1f01ad..9b7f4f240 100644 --- a/renderdoc/driver/d3d11/d3d11_replay.h +++ b/renderdoc/driver/d3d11/d3d11_replay.h @@ -231,7 +231,8 @@ public: rdcarray PixelHistory(rdcarray events, ResourceId target, uint32_t x, uint32_t y, const Subresource &sub, CompType typeCast); - ShaderDebugTrace *DebugVertex(uint32_t eventId, uint32_t vertid, uint32_t instid, uint32_t idx); + ShaderDebugTrace *DebugVertex(uint32_t eventId, uint32_t vertid, uint32_t instid, uint32_t idx, + uint32_t view); ShaderDebugTrace *DebugPixel(uint32_t eventId, uint32_t x, uint32_t y, uint32_t sample, uint32_t primitive); ShaderDebugTrace *DebugThread(uint32_t eventId, const uint32_t groupid[3], diff --git a/renderdoc/driver/d3d11/d3d11_shaderdebug.cpp b/renderdoc/driver/d3d11/d3d11_shaderdebug.cpp index 19be17a6c..9cb5739e3 100644 --- a/renderdoc/driver/d3d11/d3d11_shaderdebug.cpp +++ b/renderdoc/driver/d3d11/d3d11_shaderdebug.cpp @@ -1709,7 +1709,7 @@ void AddCBuffersToGlobalState(const DXBCBytecode::Program &program, D3D11DebugMa } ShaderDebugTrace *D3D11Replay::DebugVertex(uint32_t eventId, uint32_t vertid, uint32_t instid, - uint32_t idx) + uint32_t idx, uint32_t view) { using namespace DXBCBytecode; using namespace DXBCDebug; diff --git a/renderdoc/driver/d3d12/d3d12_replay.h b/renderdoc/driver/d3d12/d3d12_replay.h index dac939b3a..7439ef528 100644 --- a/renderdoc/driver/d3d12/d3d12_replay.h +++ b/renderdoc/driver/d3d12/d3d12_replay.h @@ -186,7 +186,8 @@ public: rdcarray PixelHistory(rdcarray events, ResourceId target, uint32_t x, uint32_t y, const Subresource &sub, CompType typeCast); - ShaderDebugTrace *DebugVertex(uint32_t eventId, uint32_t vertid, uint32_t instid, uint32_t idx); + ShaderDebugTrace *DebugVertex(uint32_t eventId, uint32_t vertid, uint32_t instid, uint32_t idx, + uint32_t view); ShaderDebugTrace *DebugPixel(uint32_t eventId, uint32_t x, uint32_t y, uint32_t sample, uint32_t primitive); ShaderDebugTrace *DebugThread(uint32_t eventId, const uint32_t groupid[3], diff --git a/renderdoc/driver/d3d12/d3d12_shaderdebug.cpp b/renderdoc/driver/d3d12/d3d12_shaderdebug.cpp index 9cfdd6cc8..66f534ace 100644 --- a/renderdoc/driver/d3d12/d3d12_shaderdebug.cpp +++ b/renderdoc/driver/d3d12/d3d12_shaderdebug.cpp @@ -1749,7 +1749,7 @@ void GatherConstantBuffers(WrappedID3D12Device *pDevice, const DXBCBytecode::Pro } ShaderDebugTrace *D3D12Replay::DebugVertex(uint32_t eventId, uint32_t vertid, uint32_t instid, - uint32_t idx) + uint32_t idx, uint32_t view) { using namespace DXBCBytecode; using namespace DXBCDebug; diff --git a/renderdoc/driver/gl/gl_replay.cpp b/renderdoc/driver/gl/gl_replay.cpp index 59afdb525..9c23e7a27 100644 --- a/renderdoc/driver/gl/gl_replay.cpp +++ b/renderdoc/driver/gl/gl_replay.cpp @@ -3657,7 +3657,7 @@ rdcarray GLReplay::PixelHistory(rdcarray events, } ShaderDebugTrace *GLReplay::DebugVertex(uint32_t eventId, uint32_t vertid, uint32_t instid, - uint32_t idx) + uint32_t idx, uint32_t view) { GLNOTIMP("DebugVertex"); return new ShaderDebugTrace(); diff --git a/renderdoc/driver/gl/gl_replay.h b/renderdoc/driver/gl/gl_replay.h index acbd8496e..fde8de735 100644 --- a/renderdoc/driver/gl/gl_replay.h +++ b/renderdoc/driver/gl/gl_replay.h @@ -218,7 +218,8 @@ public: rdcarray PixelHistory(rdcarray events, ResourceId target, uint32_t x, uint32_t y, const Subresource &sub, CompType typeCast); - ShaderDebugTrace *DebugVertex(uint32_t eventId, uint32_t vertid, uint32_t instid, uint32_t idx); + ShaderDebugTrace *DebugVertex(uint32_t eventId, uint32_t vertid, uint32_t instid, uint32_t idx, + uint32_t view); ShaderDebugTrace *DebugPixel(uint32_t eventId, uint32_t x, uint32_t y, uint32_t sample, uint32_t primitive); ShaderDebugTrace *DebugThread(uint32_t eventId, const uint32_t groupid[3], diff --git a/renderdoc/driver/vulkan/vk_replay.h b/renderdoc/driver/vulkan/vk_replay.h index a491da5f3..0ec4a77ea 100644 --- a/renderdoc/driver/vulkan/vk_replay.h +++ b/renderdoc/driver/vulkan/vk_replay.h @@ -376,7 +376,8 @@ public: rdcarray PixelHistory(rdcarray events, ResourceId target, uint32_t x, uint32_t y, const Subresource &sub, CompType typeCast); - ShaderDebugTrace *DebugVertex(uint32_t eventId, uint32_t vertid, uint32_t instid, uint32_t idx); + ShaderDebugTrace *DebugVertex(uint32_t eventId, uint32_t vertid, uint32_t instid, uint32_t idx, + uint32_t view); ShaderDebugTrace *DebugPixel(uint32_t eventId, uint32_t x, uint32_t y, uint32_t sample, uint32_t primitive); ShaderDebugTrace *DebugThread(uint32_t eventId, const uint32_t groupid[3], diff --git a/renderdoc/driver/vulkan/vk_shaderdebug.cpp b/renderdoc/driver/vulkan/vk_shaderdebug.cpp index 761d94f53..76bf9b1d6 100644 --- a/renderdoc/driver/vulkan/vk_shaderdebug.cpp +++ b/renderdoc/driver/vulkan/vk_shaderdebug.cpp @@ -3435,7 +3435,7 @@ static void CreatePSInputFetcher(rdcarray &fragspv, uint32_t &structSt } ShaderDebugTrace *VulkanReplay::DebugVertex(uint32_t eventId, uint32_t vertid, uint32_t instid, - uint32_t idx) + uint32_t idx, uint32_t view) { if(!GetAPIProperties().shaderDebugging) { @@ -3447,7 +3447,7 @@ ShaderDebugTrace *VulkanReplay::DebugVertex(uint32_t eventId, uint32_t vertid, u VulkanCreationInfo &c = m_pDriver->m_CreationInfo; rdcstr regionName = - StringFormat::Fmt("DebugVertex @ %u of (%u,%u,%u)", eventId, vertid, instid, idx); + StringFormat::Fmt("DebugVertex @ %u of (%u,%u,%u,%u)", eventId, vertid, instid, idx, view); VkMarkerRegion region(regionName); @@ -3491,6 +3491,13 @@ ShaderDebugTrace *VulkanReplay::DebugVertex(uint32_t eventId, uint32_t vertid, u VulkanAPIWrapper *apiWrapper = new VulkanAPIWrapper(m_pDriver, c, VK_SHADER_STAGE_VERTEX_BIT, eventId); + // clamp the view index to the number of multiviews, just to be sure + size_t numViews = c.m_RenderPass[state.renderPass].subpasses[state.subpass].multiviews.size(); + if(numViews > 1) + view = RDCMIN((uint32_t)numViews - 1, view); + else + view = 0; + std::map &builtins = apiWrapper->builtin_inputs; builtins[ShaderBuiltin::BaseInstance] = ShaderVariable(rdcstr(), draw->instanceOffset, 0U, 0U, 0U); builtins[ShaderBuiltin::BaseVertex] = ShaderVariable( @@ -3503,6 +3510,7 @@ ShaderDebugTrace *VulkanReplay::DebugVertex(uint32_t eventId, uint32_t vertid, u else builtins[ShaderBuiltin::VertexIndex] = ShaderVariable(rdcstr(), vertid + vertOffset, 0U, 0U, 0U); builtins[ShaderBuiltin::InstanceIndex] = ShaderVariable(rdcstr(), instid + instOffset, 0U, 0U, 0U); + builtins[ShaderBuiltin::ViewportIndex] = ShaderVariable(rdcstr(), view, 0U, 0U, 0U); rdcarray &locations = apiWrapper->location_inputs; for(const VulkanCreationInfo::Pipeline::Attribute &attr : pipe.vertexAttrs) diff --git a/renderdoc/replay/replay_controller.cpp b/renderdoc/replay/replay_controller.cpp index ca1b3ac7f..1aa1cce21 100644 --- a/renderdoc/replay/replay_controller.cpp +++ b/renderdoc/replay/replay_controller.cpp @@ -1582,11 +1582,12 @@ rdcarray ReplayController::GetHistogram(ResourceId textureId, const Su return hist; } -ShaderDebugTrace *ReplayController::DebugVertex(uint32_t vertid, uint32_t instid, uint32_t idx) +ShaderDebugTrace *ReplayController::DebugVertex(uint32_t vertid, uint32_t instid, uint32_t idx, + uint32_t view) { CHECK_REPLAY_THREAD(); - ShaderDebugTrace *ret = m_pDevice->DebugVertex(m_EventID, vertid, instid, idx); + ShaderDebugTrace *ret = m_pDevice->DebugVertex(m_EventID, vertid, instid, idx, view); SetFrameEvent(m_EventID, true); diff --git a/renderdoc/replay/replay_controller.h b/renderdoc/replay/replay_controller.h index 312115298..4ec4ccd0b 100644 --- a/renderdoc/replay/replay_controller.h +++ b/renderdoc/replay/replay_controller.h @@ -185,7 +185,7 @@ public: float minval, float maxval, bool channels[4]); rdcarray PixelHistory(ResourceId target, uint32_t x, uint32_t y, const Subresource &sub, CompType typeCast); - ShaderDebugTrace *DebugVertex(uint32_t vertid, uint32_t instid, uint32_t idx); + ShaderDebugTrace *DebugVertex(uint32_t vertid, uint32_t instid, uint32_t idx, uint32_t view); ShaderDebugTrace *DebugPixel(uint32_t x, uint32_t y, uint32_t sample, uint32_t primitive); ShaderDebugTrace *DebugThread(const uint32_t groupid[3], const uint32_t threadid[3]); rdcarray ContinueDebug(ShaderDebugger *debugger); diff --git a/renderdoc/replay/replay_driver.h b/renderdoc/replay/replay_driver.h index afa9de134..0ad303abe 100644 --- a/renderdoc/replay/replay_driver.h +++ b/renderdoc/replay/replay_driver.h @@ -200,7 +200,7 @@ public: uint32_t x, uint32_t y, const Subresource &sub, CompType typeCast) = 0; virtual ShaderDebugTrace *DebugVertex(uint32_t eventId, uint32_t vertid, uint32_t instid, - uint32_t idx) = 0; + uint32_t idx, uint32_t view) = 0; virtual ShaderDebugTrace *DebugPixel(uint32_t eventId, uint32_t x, uint32_t y, uint32_t sample, uint32_t primitive) = 0; virtual ShaderDebugTrace *DebugThread(uint32_t eventId, const uint32_t groupid[3],