diff options
| author | Mark Lobodzinski <mark@lunarg.com> | 2017-02-07 17:20:06 -0700 |
|---|---|---|
| committer | Mark Lobodzinski <mark@lunarg.com> | 2017-02-08 10:25:28 -0700 |
| commit | 9130c607fe15aa36d209ef9fc694ecf5cbe2178f (patch) | |
| tree | c07251575023462b878cad9b70a12cf53be5eba1 | |
| parent | 33128800424932d91b06b574e05b91d89f9cedf2 (diff) | |
| download | usermoji-9130c607fe15aa36d209ef9fc694ecf5cbe2178f.tar.xz | |
layers: Move ValidateMapImageLayouts out of CV
Change-Id: Ib9d9c169b1306a7ed6f243bbb957719305340a2e
| -rw-r--r-- | layers/buffer_validation.cpp | 31 | ||||
| -rw-r--r-- | layers/buffer_validation.h | 3 | ||||
| -rw-r--r-- | layers/core_validation.cpp | 34 | ||||
| -rw-r--r-- | layers/core_validation_types.h | 1 |
4 files changed, 37 insertions, 32 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; +} + diff --git a/layers/buffer_validation.h b/layers/buffer_validation.h index 5375722a..4ade0e6b 100644 --- a/layers/buffer_validation.h +++ b/layers/buffer_validation.h @@ -150,4 +150,7 @@ bool ValidateLayoutVsAttachmentDescription(const debug_report_data *report_data, bool ValidateLayouts(core_validation::layer_data *dev_data, VkDevice device, const VkRenderPassCreateInfo *pCreateInfo); +bool ValidateMapImageLayouts(core_validation::layer_data *dev_data, VkDevice device, DEVICE_MEM_INFO const *mem_info, + VkDeviceSize offset, VkDeviceSize end_offset); + #endif // CORE_VALIDATION_BUFFER_VALIDATION_H_ diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 60431051..3f3bed4b 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -5295,7 +5295,7 @@ static bool rangesIntersect(layer_data const *dev_data, MEMORY_RANGE const *rang return true; } // Simplified rangesIntersect that calls above function to check range1 for intersection with offset & end addresses -static bool rangesIntersect(layer_data const *dev_data, MEMORY_RANGE const *range1, VkDeviceSize offset, VkDeviceSize end) { +bool rangesIntersect(layer_data const *dev_data, MEMORY_RANGE const *range1, VkDeviceSize offset, VkDeviceSize end) { // Create a local MEMORY_RANGE struct to wrap offset/size MEMORY_RANGE range_wrap; // Synch linear with range1 to avoid padding and potential validation error case @@ -10381,36 +10381,6 @@ VKAPI_ATTR void VKAPI_CALL CmdExecuteCommands(VkCommandBuffer commandBuffer, uin if (!skip_call) dev_data->dispatch_table.CmdExecuteCommands(commandBuffer, commandBuffersCount, pCommandBuffers); } -// For any image objects that overlap mapped memory, verify that their layouts are PREINIT or GENERAL -static bool ValidateMapImageLayouts(VkDevice device, DEVICE_MEM_INFO const *mem_info, VkDeviceSize offset, - VkDeviceSize end_offset) { - bool skip_call = false; - layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); - // 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(dev_data->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; -} - VKAPI_ATTR VkResult VKAPI_CALL MapMemory(VkDevice device, VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size, VkFlags flags, void **ppData) { layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -10423,7 +10393,7 @@ VKAPI_ATTR VkResult VKAPI_CALL MapMemory(VkDevice device, VkDeviceMemory mem, Vk // TODO : This could me more fine-grained to track just region that is valid mem_info->global_valid = true; auto end_offset = (VK_WHOLE_SIZE == size) ? mem_info->alloc_info.allocationSize - 1 : offset + size - 1; - skip_call |= ValidateMapImageLayouts(device, mem_info, offset, end_offset); + skip_call |= ValidateMapImageLayouts(dev_data, device, mem_info, offset, end_offset); // TODO : Do we need to create new "bound_range" for the mapped range? SetMemRangesValid(dev_data, mem_info, offset, end_offset); if ((dev_data->phys_dev_mem_props.memoryTypes[mem_info->alloc_info.memoryTypeIndex].propertyFlags & diff --git a/layers/core_validation_types.h b/layers/core_validation_types.h index d7d2cdd6..13c30599 100644 --- a/layers/core_validation_types.h +++ b/layers/core_validation_types.h @@ -771,6 +771,7 @@ bool ValidateImageUsageFlags(layer_data *dev_data, IMAGE_STATE const *image_stat bool ValidateImageSubrangeLevelLayerCounts(layer_data *dev_data, const VkImageSubresourceRange &subresourceRange, const char *func_name, UNIQUE_VALIDATION_ERROR_CODE layer_msg_code, UNIQUE_VALIDATION_ERROR_CODE level_msg_code); +bool rangesIntersect(layer_data const *dev_data, MEMORY_RANGE const *range1, VkDeviceSize offset, VkDeviceSize end); // Prototypes for layer_data accessor functions. These should be in their own header file at some point PFN_vkGetPhysicalDeviceFormatProperties GetFormatPropertiesPointer(layer_data *); |
