diff options
| author | Tobin Ehlis <tobin@lunarg.com> | 2015-10-08 13:13:50 -0600 |
|---|---|---|
| committer | Tobin Ehlis <tobin@lunarg.com> | 2015-10-08 13:23:21 -0600 |
| commit | 3039c229594c1d3fa837a6ae95b1fb648639d3d1 (patch) | |
| tree | 815697d7a2db7d8b75ce1b5f2b6bba269334cff2 /layers/draw_state.cpp | |
| parent | d121bb368bb7085e3688b03c3167735d510d8603 (diff) | |
| download | usermoji-3039c229594c1d3fa837a6ae95b1fb648639d3d1.tar.xz | |
layers: Add DrawState check to flag error on vkFreeDescriptorSets from ONE_SHOT Pool
Also added a layer validation test to flag this error
Diffstat (limited to 'layers/draw_state.cpp')
| -rw-r--r-- | layers/draw_state.cpp | 13 |
1 files changed, 12 insertions, 1 deletions
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")) |
