layers: Remove image member from DEVICE_MEM_INFO
authorTobin Ehlis <tobine@google.com>
Thu, 4 Aug 2016 13:53:46 +0000 (07:53 -0600)
committerTobin Ehlis <tobine@google.com>
Tue, 9 Aug 2016 16:21:19 +0000 (10:21 -0600)
The image member is broken and was superceded by objBindings which track
all objects bound to a single memory allocation.

This is also temporarily disabling a check for image layout when mapping
memory, but that check was broken and will be fixed in subsequent CL.

layers/core_validation.cpp
layers/core_validation_types.h

index 8eec89f..1258b34 100644 (file)
@@ -5347,7 +5347,6 @@ VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const Vk
         if (mem_info) {
             remove_memory_ranges(reinterpret_cast<uint64_t &>(image), img_node->mem, mem_info->imageRanges);
             clear_object_binding(dev_data, reinterpret_cast<uint64_t &>(image), VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT);
-            mem_info->image = VK_NULL_HANDLE;
         }
         // Remove image from imageMap
         dev_data->imageMap.erase(img_node->image);
@@ -10037,18 +10036,27 @@ static bool ValidateMapImageLayouts(VkDevice device, VkDeviceMemory mem) {
     bool skip_call = false;
     layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
     auto mem_info = getMemObjInfo(dev_data, mem);
-    if ((mem_info) && (mem_info->image != VK_NULL_HANDLE)) {
-        std::vector<VkImageLayout> layouts;
-        if (FindLayouts(dev_data, mem_info->image, 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));
-                }
-            }
-        }
+    if (mem_info) {
+        // TODO : Update this code to only check images that overlap given map range
+        //        for (auto bound_object : mem_info->objBindings) {
+        //            if (bound_object.type == VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT) {
+        //                std::vector<VkImageLayout> layouts;
+        //                if (FindLayouts(dev_data, VkImage(bound_object.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;
 }
@@ -10227,7 +10235,6 @@ VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, V
         if (!skip_call) {
             result = dev_data->device_dispatch_table->BindImageMemory(device, image, mem, memoryOffset);
             lock.lock();
-            dev_data->memObjMap[mem].get()->image = image;
             image_node->mem = mem;
             image_node->memOffset = memoryOffset;
             image_node->memSize = memRequirements.size;
index cfbeaf0..217ba15 100644 (file)
@@ -225,12 +225,12 @@ struct DEVICE_MEM_INFO {
     std::unordered_set<VkCommandBuffer> commandBufferBindings; // cmd buffers referencing this memory
     std::vector<MEMORY_RANGE> bufferRanges;
     std::vector<MEMORY_RANGE> imageRanges;
-    VkImage image; // If memory is bound to image, this will have VkImage handle, else VK_NULL_HANDLE
+
     MemRange memRange;
     void *pData, *pDriverData;
     DEVICE_MEM_INFO(void *disp_object, const VkDeviceMemory in_mem, const VkMemoryAllocateInfo *p_alloc_info)
-        : object(disp_object), valid(false), stencil_valid(false), mem(in_mem), allocInfo(*p_alloc_info),
-          image(VK_NULL_HANDLE), memRange{}, pData(0), pDriverData(0){};
+        : object(disp_object), valid(false), stencil_valid(false), mem(in_mem), allocInfo(*p_alloc_info), memRange{}, pData(0),
+          pDriverData(0){};
 };
 
 class SWAPCHAIN_NODE {