From 16937f160e2b99faa6717a831ac90899306a09bb Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 17 Jun 2021 13:24:26 +0100 Subject: [PATCH] Fix a crash when push constants are provided insufficient data --- .../PipelineState/VulkanPipelineStateViewer.cpp | 12 ++++++++++-- renderdoc/api/replay/pipestate.inl | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp index 730c64e10..72f6349d6 100644 --- a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp @@ -1715,15 +1715,23 @@ void VulkanPipelineStateViewer::addConstantBlockRow(ShaderReflection *shaderDeta if(descriptorBind && descriptorBind->inlineBlock) { - vecrange = QFormatStr("%1 - %2") + vecrange = QFormatStr("%1 - %2 bytes") .arg(descriptorBind->byteOffset) .arg(descriptorBind->byteOffset + descriptorBind->byteSize); } else if(!cblock->compileConstants) { - vecrange = QFormatStr("%1 - %2") + vecrange = QFormatStr("%1 - %2 bytes") .arg(stage.pushConstantRangeByteOffset) .arg(stage.pushConstantRangeByteOffset + stage.pushConstantRangeByteSize); + + if(stage.pushConstantRangeByteOffset + stage.pushConstantRangeByteSize > + m_Ctx.CurVulkanPipelineState()->pushconsts.size()) + { + filledSlot = false; + vecrange += + tr(", only %1 bytes pushed").arg(m_Ctx.CurVulkanPipelineState()->pushconsts.size()); + } } } else diff --git a/renderdoc/api/replay/pipestate.inl b/renderdoc/api/replay/pipestate.inl index 968f77941..e226400b9 100644 --- a/renderdoc/api/replay/pipestate.inl +++ b/renderdoc/api/replay/pipestate.inl @@ -1071,7 +1071,7 @@ BoundCBuffer PipeState::GetConstantBuffer(ShaderStage stage, uint32_t BufIdx, ui if(ret.byteOffset > src->size()) ret.byteSize = 0; else if(ret.byteOffset + ret.byteSize > src->size()) - ret.byteSize = src->size() - (ret.byteOffset + ret.byteSize); + ret.byteSize = src->size() - ret.byteOffset; // consume the byteoffset here when copying data from the source data ret.inlineData.resize((size_t)ret.byteSize);