From f986b715b4a44eaddd149ac3f03e45d784b4218f Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 11 Apr 2016 20:54:13 +0200 Subject: [PATCH] Don't pass invalid array to API if user code didn't bind sets properly --- renderdoc/driver/vulkan/vk_state.cpp | 30 +++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/renderdoc/driver/vulkan/vk_state.cpp b/renderdoc/driver/vulkan/vk_state.cpp index 260dbda47..d13d799d7 100644 --- a/renderdoc/driver/vulkan/vk_state.cpp +++ b/renderdoc/driver/vulkan/vk_state.cpp @@ -161,9 +161,37 @@ void VulkanRenderState::BindPipeline(VkCommandBuffer cmd) if(i < graphics.descSets.size() && graphics.descSets[i] != ResourceId()) { // if there are dynamic buffers, pass along the offsets + + uint32_t *dynamicOffsets = NULL; + + if(descLayout.dynamicCount > 0) + { + dynamicOffsets = &graphics.offsets[i][0]; + + if(graphics.offsets[i].size() < descLayout.dynamicCount) + { + dynamicOffsets = new uint32_t[descLayout.dynamicCount]; + for(uint32_t o = 0; o < descLayout.dynamicCount; o++) + { + if(o < graphics.offsets[i].size()) + { + dynamicOffsets[o] = graphics.offsets[i][o]; + } + else + { + dynamicOffsets[o] = 0; + RDCWARN("Missing dynamic offset for set %u!", (uint32_t)i); + } + } + } + } + ObjDisp(cmd)->CmdBindDescriptorSets(Unwrap(cmd), VK_PIPELINE_BIND_POINT_GRAPHICS, Unwrap(layout), (uint32_t)i, 1, UnwrapPtr(GetResourceManager()->GetCurrentHandle(graphics.descSets[i])), - descLayout.dynamicCount, descLayout.dynamicCount == 0 ? NULL : &graphics.offsets[i][0]); + descLayout.dynamicCount, dynamicOffsets); + + if(graphics.offsets[i].size() < descLayout.dynamicCount) + SAFE_DELETE_ARRAY(dynamicOffsets); } else {