From b4ebc13c9d08fc6a91a708561409cdadd3dc7d40 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 25 Nov 2015 17:31:58 +0100 Subject: [PATCH] Support push constants display in UI --- .../driver/shaders/spirv/spirv_disassemble.cpp | 12 ++++++++---- renderdoc/driver/vulkan/vk_replay.cpp | 14 +++++++++++++- .../PipelineState/VulkanPipelineStateViewer.cs | 16 ++++++++++++++-- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp b/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp index a24231967..d41d3b210 100644 --- a/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp @@ -2466,8 +2466,12 @@ void SPVModule::MakeReflection(ShaderReflection *reflection, ShaderBindpointMapp AddSignatureParameter(nm, inst->var->type, inst->decorations, *sigarray, isInput ? &mapping->InputAttributes : NULL); } - else if(inst->var->storage == spv::StorageClassUniform || inst->var->storage == spv::StorageClassUniformConstant) + else if(inst->var->storage == spv::StorageClassUniform || + inst->var->storage == spv::StorageClassUniformConstant || + inst->var->storage == spv::StorageClassPushConstant) { + bool pushConst = (inst->var->storage == spv::StorageClassPushConstant); + SPVTypeData *type = inst->var->type; if(type->type == SPVTypeData::ePointer) type = type->baseType; @@ -2489,7 +2493,7 @@ void SPVModule::MakeReflection(ShaderReflection *reflection, ShaderBindpointMapp cblock.name = type->name; else cblock.name = StringFormat::Fmt("uniforms%u", inst->id); - cblock.bufferBacked = true; + cblock.bufferBacked = !pushConst; BindpointMap bindmap = {0}; // set can be implicitly 0, but the binding must be set explicitly. @@ -2528,8 +2532,8 @@ void SPVModule::MakeReflection(ShaderReflection *reflection, ShaderBindpointMapp } // should never have elements that have no binding declared but - // are used - RDCASSERT(!bindmap.used || bindmap.bind >= 0); + // are used, unless it's push constants (which is handled elsewhere) + RDCASSERT(!bindmap.used || !cblock.bufferBacked || bindmap.bind >= 0); cblocks.push_back(cblockpair(bindmap, cblock)); } diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index d665bbfdc..721c8fc3c 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -3265,7 +3265,19 @@ void VulkanReplay::FillCBufferVariables(ResourceId shader, uint32_t cbufSlot, ve ConstantBlock &c = refl.ConstantBlocks[cbufSlot]; size_t zero = 0; - FillCBufferVariables(c.variables, outvars, data, zero); + + if(c.bufferBacked) + { + FillCBufferVariables(c.variables, outvars, data, zero); + } + else + { + vector pushdata; + pushdata.resize(sizeof(m_pDriver->m_PartialReplayData.state.pushconsts)); + memcpy(&pushdata[0], m_pDriver->m_PartialReplayData.state.pushconsts, pushdata.size()); + FillCBufferVariables(c.variables, outvars, pushdata, zero); + } + } bool VulkanReplay::GetMinMax(ResourceId texid, uint32_t sliceFace, uint32_t mip, uint32_t sample, float *minval, float *maxval) diff --git a/renderdocui/Windows/PipelineState/VulkanPipelineStateViewer.cs b/renderdocui/Windows/PipelineState/VulkanPipelineStateViewer.cs index 9498d95a0..107194b98 100644 --- a/renderdocui/Windows/PipelineState/VulkanPipelineStateViewer.cs +++ b/renderdocui/Windows/PipelineState/VulkanPipelineStateViewer.cs @@ -640,8 +640,8 @@ namespace renderdocui.Windows.PipelineState var slotBinds = pipe.DescSets[bindMap.bindset].bindings[bindMap.bind].binds; - // consider it filled if any array element is filled - bool filledSlot = false; + // consider it filled if any array element is filled (or it's push constants) + bool filledSlot = !b.bufferBacked; for (UInt32 idx = 0; idx < bindMap.arraySize; idx++) filledSlot |= slotBinds[idx].res != ResourceId.Null; @@ -701,6 +701,18 @@ namespace renderdocui.Windows.PipelineState string sizestr = String.Format("{0} Variables, {1} bytes", numvars, length); string vecrange = String.Format("{0} - {1}", descriptorBind.offset, descriptorBind.offset + descriptorBind.size); + if (!b.bufferBacked) + { + setname = ""; + slotname = b.name; + name = "Push constants"; + vecrange = ""; + sizestr = String.Format("{0} Variables", numvars); + + // could maybe get range from ShaderVariable.reg if it's filled out + // from SPIR-V side. + } + var node = parentNodes.Add(new object[] { "", setname, slotname, name, vecrange, sizestr }); node.Image = global::renderdocui.Properties.Resources.action;