From 3039c229594c1d3fa837a6ae95b1fb648639d3d1 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Thu, 8 Oct 2015 13:13:50 -0600 Subject: layers: Add DrawState check to flag error on vkFreeDescriptorSets from ONE_SHOT Pool Also added a layer validation test to flag this error --- layers/draw_state.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'layers/draw_state.cpp') diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp index 78be8660..01ed2d5a 100644 --- a/layers/draw_state.cpp +++ b/layers/draw_state.cpp @@ -1829,7 +1829,7 @@ VK_LAYER_EXPORT VkResult VKAPI vkCreateDescriptorPool(VkDevice device, const VkD memcpy((void*)pNewNode->createInfo.pTypeCount, pCreateInfo->pTypeCount, typeCountSize); } pNewNode->poolUsage = pCreateInfo->poolUsage; - pNewNode->maxSets = pCreateInfo->maxSets; + pNewNode->maxSets = pCreateInfo->maxSets; pNewNode->pool = *pDescriptorPool; dev_data->poolMap[pDescriptorPool->handle] = pNewNode; } @@ -1904,7 +1904,16 @@ VK_LAYER_EXPORT VkResult VKAPI vkAllocDescriptorSets(VkDevice device, VkDescript VK_LAYER_EXPORT VkResult VKAPI vkFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t count, const VkDescriptorSet* pDescriptorSets) { + VkBool32 skipCall = VK_FALSE; layer_data* dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); + POOL_NODE *pPoolNode = getPoolNode(dev_data, descriptorPool); + if (pPoolNode && (VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT == pPoolNode->poolUsage)) { + // Can't Free from a ONE_SHOT pool + skipCall |= log_msg(mdd(device), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE, (uint64_t)device, 0, DRAWSTATE_CANT_FREE_FROM_ONE_SHOT_POOL, "DS", + "It is invalid to call vkFreeDescriptorSets() with a pool created with usage type VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT."); + } + if (skipCall) + return VK_ERROR_VALIDATION_FAILED; VkResult result = dev_data->device_dispatch_table->FreeDescriptorSets(device, descriptorPool, count, pDescriptorSets); // TODO : Clean up any internal data structures using this obj. return result; @@ -3283,6 +3292,8 @@ VK_LAYER_EXPORT PFN_vkVoidFunction VKAPI vkGetDeviceProcAddr(VkDevice dev, const return (PFN_vkVoidFunction) vkResetDescriptorPool; if (!strcmp(funcName, "vkAllocDescriptorSets")) return (PFN_vkVoidFunction) vkAllocDescriptorSets; + if (!strcmp(funcName, "vkFreeDescriptorSets")) + return (PFN_vkVoidFunction) vkFreeDescriptorSets; if (!strcmp(funcName, "vkUpdateDescriptorSets")) return (PFN_vkVoidFunction) vkUpdateDescriptorSets; if (!strcmp(funcName, "vkCreateCommandBuffer")) -- cgit v1.2.3