From d6013eb6cb6409067170c1f50916c11f7c7c6ce4 Mon Sep 17 00:00:00 2001 From: Cort Stratton Date: Wed, 22 Nov 2017 17:23:16 -0800 Subject: layers: Check EXT_validation_cache's sole non-trivial VU A cache can't be merged with itself. --- layers/core_validation.cpp | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) (limited to 'layers/core_validation.cpp') diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 4fcb268b..f974395e 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -4517,14 +4517,26 @@ VKAPI_ATTR VkResult VKAPI_CALL GetValidationCacheDataEXT(VkDevice device, VkVali } VKAPI_ATTR VkResult VKAPI_CALL MergeValidationCachesEXT(VkDevice device, VkValidationCacheEXT dstCache, uint32_t srcCacheCount, - const VkValidationCacheEXT *pSrcCaches) { + const VkValidationCacheEXT *pSrcCaches) { + layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); + bool skip = false; auto dst = (ValidationCache *)dstCache; - auto src = (ValidationCache const * const *)pSrcCaches; - - for (uint32_t i = 0; i < srcCacheCount; i++) - dst->Merge(src[i]); + auto src = (ValidationCache const *const *)pSrcCaches; + VkResult result = VK_SUCCESS; + for (uint32_t i = 0; i < srcCacheCount; i++) { + if (src[i] == dst) { + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT, + 0, __LINE__, VALIDATION_ERROR_3e600c00, "DS", + "vkMergeValidationCachesEXT: dstCache (0x%" PRIxLEAST64 ") must not appear in pSrcCaches array. %s", + HandleToUint64(dstCache), validation_error_map[VALIDATION_ERROR_3e600c00]); + result = VK_ERROR_VALIDATION_FAILED_EXT; + } + if (!skip) { + dst->Merge(src[i]); + } + } - return VK_SUCCESS; + return result; } // utility function to set collective state for pipeline -- cgit v1.2.3