aboutsummaryrefslogtreecommitdiff
path: root/layers/core_validation.cpp
diff options
context:
space:
mode:
authorCort Stratton <cort@google.com>2017-11-22 17:23:16 -0800
committerChris Forbes <chrisf@ijw.co.nz>2017-11-28 16:27:21 -0800
commitd6013eb6cb6409067170c1f50916c11f7c7c6ce4 (patch)
treef6f8c9f1a743b603128989840563a7a1027d479e /layers/core_validation.cpp
parentaacfb0e601e7140ca9741cd0ba147aca6b152fa9 (diff)
downloadusermoji-d6013eb6cb6409067170c1f50916c11f7c7c6ce4.tar.xz
layers: Check EXT_validation_cache's sole non-trivial VU
A cache can't be merged with itself.
Diffstat (limited to 'layers/core_validation.cpp')
-rw-r--r--layers/core_validation.cpp24
1 files changed, 18 insertions, 6 deletions
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