From 9130c607fe15aa36d209ef9fc694ecf5cbe2178f Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Tue, 7 Feb 2017 17:20:06 -0700 Subject: layers: Move ValidateMapImageLayouts out of CV Change-Id: Ib9d9c169b1306a7ed6f243bbb957719305340a2e --- layers/buffer_validation.cpp | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'layers/buffer_validation.cpp') diff --git a/layers/buffer_validation.cpp b/layers/buffer_validation.cpp index 789b40f2..fbb0d9ab 100644 --- a/layers/buffer_validation.cpp +++ b/layers/buffer_validation.cpp @@ -1783,3 +1783,34 @@ bool ValidateLayouts(core_validation::layer_data *device_data, VkDevice device, } return skip; } + +// For any image objects that overlap mapped memory, verify that their layouts are PREINIT or GENERAL +bool ValidateMapImageLayouts(core_validation::layer_data *dev_data, VkDevice device, DEVICE_MEM_INFO const *mem_info, VkDeviceSize offset, + VkDeviceSize end_offset) { + const debug_report_data *report_data = core_validation::GetReportData(dev_data); + bool skip_call = false; + // Iterate over all bound image ranges and verify that for any that overlap the + // map ranges, the layouts are VK_IMAGE_LAYOUT_PREINITIALIZED or VK_IMAGE_LAYOUT_GENERAL + // TODO : This can be optimized if we store ranges based on starting address and early exit when we pass our range + for (auto image_handle : mem_info->bound_images) { + auto img_it = mem_info->bound_ranges.find(image_handle); + if (img_it != mem_info->bound_ranges.end()) { + if (rangesIntersect(dev_data, &img_it->second, offset, end_offset)) { + std::vector layouts; + if (FindLayouts(dev_data, VkImage(image_handle), layouts)) { + for (auto layout : layouts) { + if (layout != VK_IMAGE_LAYOUT_PREINITIALIZED && layout != VK_IMAGE_LAYOUT_GENERAL) { + skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, + (VkDebugReportObjectTypeEXT)0, 0, __LINE__, DRAWSTATE_INVALID_IMAGE_LAYOUT, "DS", + "Cannot map an image with layout %s. Only " + "GENERAL or PREINITIALIZED are supported.", + string_VkImageLayout(layout)); + } + } + } + } + } + } + return skip_call; +} + -- cgit v1.2.3