aboutsummaryrefslogtreecommitdiff
path: root/layers/buffer_validation.cpp
diff options
context:
space:
mode:
authorMark Lobodzinski <mark@lunarg.com>2017-02-07 17:20:06 -0700
committerMark Lobodzinski <mark@lunarg.com>2017-02-08 10:25:28 -0700
commit9130c607fe15aa36d209ef9fc694ecf5cbe2178f (patch)
treec07251575023462b878cad9b70a12cf53be5eba1 /layers/buffer_validation.cpp
parent33128800424932d91b06b574e05b91d89f9cedf2 (diff)
downloadusermoji-9130c607fe15aa36d209ef9fc694ecf5cbe2178f.tar.xz
layers: Move ValidateMapImageLayouts out of CV
Change-Id: Ib9d9c169b1306a7ed6f243bbb957719305340a2e
Diffstat (limited to 'layers/buffer_validation.cpp')
-rw-r--r--layers/buffer_validation.cpp31
1 files changed, 31 insertions, 0 deletions
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<VkImageLayout> 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;
+}
+