bug-13690: Clarification on vkFlushMappedMemory

Bug 13690 - Clarification on the behavior of vkFlushMappedMemory
svn ID: 30914 & 30888
diff --git a/include/vkLayer.h b/include/vkLayer.h
index ec6e8ac..0b629b8 100644
--- a/include/vkLayer.h
+++ b/include/vkLayer.h
@@ -46,7 +46,8 @@
     PFN_vkSetMemoryPriority SetMemoryPriority;
     PFN_vkMapMemory MapMemory;
     PFN_vkUnmapMemory UnmapMemory;
-    PFN_vkFlushMappedMemory FlushMappedMemory;
+    PFN_vkFlushMappedMemoryRanges FlushMappedMemoryRanges;
+    PFN_vkInvalidateMappedMemoryRanges InvalidateMappedMemoryRanges;
     PFN_vkPinSystemMemory PinSystemMemory;
     PFN_vkGetMultiDeviceCompatibility GetMultiDeviceCompatibility;
     PFN_vkOpenSharedMemory OpenSharedMemory;
diff --git a/include/vulkan.h b/include/vulkan.h
index 650d348..f4ac935 100644
--- a/include/vulkan.h
+++ b/include/vulkan.h
@@ -33,7 +33,7 @@
 #include "vk_platform.h"
 
 // Vulkan API version supported by this file
-#define VK_API_VERSION VK_MAKE_VERSION(0, 91, 0)
+#define VK_API_VERSION VK_MAKE_VERSION(0, 92, 0)
 
 #ifdef __cplusplus
 extern "C"
@@ -856,8 +856,9 @@
     VK_STRUCTURE_TYPE_UPDATE_AS_COPY                        = 50,
     VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO                  = 51,
     VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO           = 52,
+    VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE                   = 53,
 
-    VK_ENUM_RANGE(STRUCTURE_TYPE, APPLICATION_INFO, PIPELINE_LAYOUT_CREATE_INFO)
+    VK_ENUM_RANGE(STRUCTURE_TYPE, APPLICATION_INFO, MAPPED_MEMORY_RANGE)
 } VkStructureType;
 
 // Object type enumerant
@@ -980,7 +981,8 @@
 {
     VK_MEMORY_PROPERTY_DEVICE_ONLY                          = 0,            // If otherwise stated, then allocate memory on device
     VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT                     = VK_BIT(0),    // Memory should be mappable by host
-    VK_MEMORY_PROPERTY_HOST_DEVICE_COHERENT_BIT             = VK_BIT(1),    // Memory should be coherent between host and device accesses
+    VK_MEMORY_PROPERTY_HOST_NON_COHERENT_BIT                = VK_BIT(1),    // Memory may not have i/o coherency so vkFlushMappedMemoryRanges and
+                                                                            // vkInvalidateMappedMemoryRanges must be used flush/invalidate host cache
     VK_MEMORY_PROPERTY_HOST_UNCACHED_BIT                    = VK_BIT(2),    // Memory should not be cached by the host
     VK_MEMORY_PROPERTY_HOST_WRITE_COMBINED_BIT              = VK_BIT(3),    // Memory should support host write combining
     VK_MEMORY_PROPERTY_PREFER_HOST_LOCAL                    = VK_BIT(4),    // If set, prefer host access
@@ -991,7 +993,7 @@
 typedef VkFlags VkMemoryOutputFlags;
 typedef enum VkMemoryOutputFlagBits_
 {
-    VK_MEMORY_OUTPUT_CPU_WRITE_BIT                          = VK_BIT(0),    // Controls output coherency of CPU writes
+    VK_MEMORY_OUTPUT_HOST_WRITE_BIT                         = VK_BIT(0),    // Controls output coherency of host writes
     VK_MEMORY_OUTPUT_SHADER_WRITE_BIT                       = VK_BIT(1),    // Controls output coherency of generic shader writes
     VK_MEMORY_OUTPUT_COLOR_ATTACHMENT_BIT                   = VK_BIT(2),    // Controls output coherency of color attachment writes
     VK_MEMORY_OUTPUT_DEPTH_STENCIL_ATTACHMENT_BIT           = VK_BIT(3),    // Controls output coherency of depth/stencil attachment writes
@@ -1002,7 +1004,7 @@
 typedef VkFlags VkMemoryInputFlags;
 typedef enum VkMemoryInputFlagBits_
 {
-    VK_MEMORY_INPUT_CPU_READ_BIT                            = VK_BIT(0),    // Controls input coherency of CPU reads
+    VK_MEMORY_INPUT_HOST_READ_BIT                           = VK_BIT(0),    // Controls input coherency of host reads
     VK_MEMORY_INPUT_INDIRECT_COMMAND_BIT                    = VK_BIT(1),    // Controls input coherency of indirect command reads
     VK_MEMORY_INPUT_INDEX_FETCH_BIT                         = VK_BIT(2),    // Controls input coherency of index fetches
     VK_MEMORY_INPUT_VERTEX_ATTRIBUTE_FETCH_BIT              = VK_BIT(3),    // Controls input coherency of vertex attribute fetches
@@ -1405,9 +1407,17 @@
     VkDeviceSize                                granularity;                // Granularity on which vkQueueBindObjectMemoryRange can bind sub-ranges of memory specified in bytes (usually the page size)
     VkMemoryPropertyFlags                       memPropsAllowed;            // Allowed memory property flags
     VkMemoryPropertyFlags                       memPropsRequired;           // Required memory property flags
-    
 } VkMemoryRequirements;
 
+typedef struct VkMappedMemoryRange_
+{
+    VkStructureType                             sType;                      // Must be VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE
+    const void*                                 pNext;                      // Pointer to next structure
+    VkDeviceMemory                              mem;                        // Mapped memory object
+    VkDeviceSize                                offset;                     // Offset within the mapped memory the range starts from
+    VkDeviceSize                                size;                       // Size of the range within the mapped memory
+} VkMappedMemoryRange;
+
 typedef struct VkFormatProperties_
 {
     VkFormatFeatureFlags                        linearTilingFeatures;       // Format features in case of linear tiling
@@ -2145,7 +2155,8 @@
 typedef VkResult (VKAPI *PFN_vkSetMemoryPriority)(VkDevice device, VkDeviceMemory mem, VkMemoryPriority priority);
 typedef VkResult (VKAPI *PFN_vkMapMemory)(VkDevice device, VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void** ppData);
 typedef VkResult (VKAPI *PFN_vkUnmapMemory)(VkDevice device, VkDeviceMemory mem);
-typedef VkResult (VKAPI *PFN_vkFlushMappedMemory)(VkDevice device, VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size);
+typedef VkResult (VKAPI *PFN_vkFlushMappedMemoryRanges)(VkDevice device, uint32_t memRangeCount, const VkMappedMemoryRange* pMemRanges);
+typedef VkResult (VKAPI *PFN_vkInvalidateMappedMemoryRanges)(VkDevice device, uint32_t memRangeCount, const VkMappedMemoryRange* pMemRanges);
 typedef VkResult (VKAPI *PFN_vkPinSystemMemory)(VkDevice device, const void* pSysMem, size_t memSize, VkDeviceMemory* pMem);
 typedef VkResult (VKAPI *PFN_vkGetMultiDeviceCompatibility)(VkPhysicalDevice physicalDevice0, VkPhysicalDevice physicalDevice1, VkPhysicalDeviceCompatibilityInfo* pInfo);
 typedef VkResult (VKAPI *PFN_vkOpenSharedMemory)(VkDevice device, const VkMemoryOpenInfo* pOpenInfo, VkDeviceMemory* pMem);
@@ -2360,11 +2371,15 @@
     VkDevice                                    device,
     VkDeviceMemory                              mem);
 
-VkResult VKAPI vkFlushMappedMemory(
+VkResult VKAPI vkFlushMappedMemoryRanges(
     VkDevice                                    device,
-    VkDeviceMemory                              mem,
-    VkDeviceSize                                offset,
-    VkDeviceSize                                size);
+    uint32_t                                    memRangeCount,
+    const VkMappedMemoryRange*                  pMemRanges);
+
+VkResult VKAPI vkInvalidateMappedMemoryRanges(
+    VkDevice                                    device,
+    uint32_t                                    memRangeCount,
+    const VkMappedMemoryRange*                  pMemRanges);
 
 VkResult VKAPI vkPinSystemMemory(
     VkDevice                                    device,
diff --git a/layers/param_checker.cpp b/layers/param_checker.cpp
index f780714..01328bf 100644
--- a/layers/param_checker.cpp
+++ b/layers/param_checker.cpp
@@ -413,10 +413,23 @@
     return result;
 }
 
-VK_LAYER_EXPORT VkResult VKAPI vkFlushMappedMemory(VkDevice device, VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size)
+VK_LAYER_EXPORT VkResult VKAPI vkFlushMappedMemoryRanges(
+        VkDevice device,
+        uint32_t memRangeCount,
+        const VkMappedMemoryRange* pMemRanges)
 {
 
-    VkResult result = nextTable.FlushMappedMemory(device, mem, offset, size);
+    VkResult result = nextTable.FlushMappedMemoryRanges(device, memRangeCount, pMemRanges);
+    return result;
+}
+
+VK_LAYER_EXPORT VkResult VKAPI vkInvalidateMappedMemoryRanges(
+        VkDevice device,
+        uint32_t memRangeCount,
+        const VkMappedMemoryRange* pMemRanges)
+{
+
+    VkResult result = nextTable.InvalidateMappedMemoryRanges(device, memRangeCount, pMemRanges);
     return result;
 }
 
diff --git a/tests/blit_tests.cpp b/tests/blit_tests.cpp
index 5e50678..6ab7715 100644
--- a/tests/blit_tests.cpp
+++ b/tests/blit_tests.cpp
@@ -847,7 +847,7 @@
     // Additional commands could go into the buffer here before the wait.
 
     memory_barrier = bufs[1].buffer_memory_barrier(
-            VK_MEMORY_OUTPUT_TRANSFER_BIT, VK_MEMORY_INPUT_CPU_READ_BIT, 0, 4);
+            VK_MEMORY_OUTPUT_TRANSFER_BIT, VK_MEMORY_INPUT_HOST_READ_BIT, 0, 4);
     pmemory_barrier = &memory_barrier;
     vkCmdWaitEvents(cmd_.obj(), VK_WAIT_EVENT_TOP_OF_PIPE, 1, &event, 1, (const void **)&pmemory_barrier);
 
@@ -1350,13 +1350,13 @@
         img.init(dev_, img_info, reqs);
         add_memory_ref(img);
         const VkFlags all_cache_outputs =
-                VK_MEMORY_OUTPUT_CPU_WRITE_BIT |
+                VK_MEMORY_OUTPUT_HOST_WRITE_BIT |
                 VK_MEMORY_OUTPUT_SHADER_WRITE_BIT |
                 VK_MEMORY_OUTPUT_COLOR_ATTACHMENT_BIT |
                 VK_MEMORY_OUTPUT_DEPTH_STENCIL_ATTACHMENT_BIT |
                 VK_MEMORY_OUTPUT_TRANSFER_BIT;
         const VkFlags all_cache_inputs =
-                VK_MEMORY_INPUT_CPU_READ_BIT |
+                VK_MEMORY_INPUT_HOST_READ_BIT |
                 VK_MEMORY_INPUT_INDIRECT_COMMAND_BIT |
                 VK_MEMORY_INPUT_INDEX_FETCH_BIT |
                 VK_MEMORY_INPUT_VERTEX_ATTRIBUTE_FETCH_BIT |
@@ -1569,13 +1569,13 @@
         img.init(dev_, img_info, reqs);
         add_memory_ref(img);
         const VkFlags all_cache_outputs =
-                VK_MEMORY_OUTPUT_CPU_WRITE_BIT |
+                VK_MEMORY_OUTPUT_HOST_WRITE_BIT |
                 VK_MEMORY_OUTPUT_SHADER_WRITE_BIT |
                 VK_MEMORY_OUTPUT_COLOR_ATTACHMENT_BIT |
                 VK_MEMORY_OUTPUT_DEPTH_STENCIL_ATTACHMENT_BIT |
                 VK_MEMORY_OUTPUT_TRANSFER_BIT;
         const VkFlags all_cache_inputs =
-                VK_MEMORY_INPUT_CPU_READ_BIT |
+                VK_MEMORY_INPUT_HOST_READ_BIT |
                 VK_MEMORY_INPUT_INDIRECT_COMMAND_BIT |
                 VK_MEMORY_INPUT_INDEX_FETCH_BIT |
                 VK_MEMORY_INPUT_VERTEX_ATTRIBUTE_FETCH_BIT |
diff --git a/tests/vkrenderframework.cpp b/tests/vkrenderframework.cpp
index ae62008..580569b 100644
--- a/tests/vkrenderframework.cpp
+++ b/tests/vkrenderframework.cpp
@@ -419,13 +419,13 @@
         VkCommandBufferObj *cmd_buf,
         VkImageAspect aspect,
         VkFlags output_mask /*=
-            VK_MEMORY_OUTPUT_CPU_WRITE_BIT |
+            VK_MEMORY_OUTPUT_HOST_WRITE_BIT |
             VK_MEMORY_OUTPUT_SHADER_WRITE_BIT |
             VK_MEMORY_OUTPUT_COLOR_ATTACHMENT_BIT |
             VK_MEMORY_OUTPUT_DEPTH_STENCIL_ATTACHMENT_BIT |
             VK_MEMORY_OUTPUT_COPY_BIT*/,
         VkFlags input_mask /*=
-            VK_MEMORY_INPUT_CPU_READ_BIT |
+            VK_MEMORY_INPUT_HOST_READ_BIT |
             VK_MEMORY_INPUT_INDIRECT_COMMAND_BIT |
             VK_MEMORY_INPUT_INDEX_FETCH_BIT |
             VK_MEMORY_INPUT_VERTEX_ATTRIBUTE_FETCH_BIT |
@@ -455,13 +455,13 @@
 {
     VkFlags output_mask, input_mask;
     const VkFlags all_cache_outputs =
-            VK_MEMORY_OUTPUT_CPU_WRITE_BIT |
+            VK_MEMORY_OUTPUT_HOST_WRITE_BIT |
             VK_MEMORY_OUTPUT_SHADER_WRITE_BIT |
             VK_MEMORY_OUTPUT_COLOR_ATTACHMENT_BIT |
             VK_MEMORY_OUTPUT_DEPTH_STENCIL_ATTACHMENT_BIT |
             VK_MEMORY_OUTPUT_TRANSFER_BIT;
     const VkFlags all_cache_inputs =
-            VK_MEMORY_INPUT_CPU_READ_BIT |
+            VK_MEMORY_INPUT_HOST_READ_BIT |
             VK_MEMORY_INPUT_INDIRECT_COMMAND_BIT |
             VK_MEMORY_INPUT_INDEX_FETCH_BIT |
             VK_MEMORY_INPUT_VERTEX_ATTRIBUTE_FETCH_BIT |
@@ -792,13 +792,13 @@
 
 void VkConstantBufferObj::BufferMemoryBarrier(
         VkFlags outputMask /*=
-            VK_MEMORY_OUTPUT_CPU_WRITE_BIT |
+            VK_MEMORY_OUTPUT_HOST_WRITE_BIT |
             VK_MEMORY_OUTPUT_SHADER_WRITE_BIT |
             VK_MEMORY_OUTPUT_COLOR_ATTACHMENT_BIT |
             VK_MEMORY_OUTPUT_DEPTH_STENCIL_ATTACHMENT_BIT |
             VK_MEMORY_OUTPUT_COPY_BIT*/,
         VkFlags inputMask /*=
-            VK_MEMORY_INPUT_CPU_READ_BIT |
+            VK_MEMORY_INPUT_HOST_READ_BIT |
             VK_MEMORY_INPUT_INDIRECT_COMMAND_BIT |
             VK_MEMORY_INPUT_INDEX_FETCH_BIT |
             VK_MEMORY_INPUT_VERTEX_ATTRIBUTE_FETCH_BIT |
@@ -1196,7 +1196,7 @@
 {
     uint32_t i;
     const VkFlags output_mask =
-        VK_MEMORY_OUTPUT_CPU_WRITE_BIT |
+        VK_MEMORY_OUTPUT_HOST_WRITE_BIT |
         VK_MEMORY_OUTPUT_SHADER_WRITE_BIT |
         VK_MEMORY_OUTPUT_COLOR_ATTACHMENT_BIT |
         VK_MEMORY_OUTPUT_DEPTH_STENCIL_ATTACHMENT_BIT |
@@ -1271,13 +1271,13 @@
 {
     uint32_t i;
     const VkFlags output_mask =
-        VK_MEMORY_OUTPUT_CPU_WRITE_BIT |
+        VK_MEMORY_OUTPUT_HOST_WRITE_BIT |
         VK_MEMORY_OUTPUT_SHADER_WRITE_BIT |
         VK_MEMORY_OUTPUT_COLOR_ATTACHMENT_BIT |
         VK_MEMORY_OUTPUT_DEPTH_STENCIL_ATTACHMENT_BIT |
         VK_MEMORY_OUTPUT_TRANSFER_BIT;
     const VkFlags input_mask =
-        VK_MEMORY_INPUT_CPU_READ_BIT |
+        VK_MEMORY_INPUT_HOST_READ_BIT |
         VK_MEMORY_INPUT_INDIRECT_COMMAND_BIT |
         VK_MEMORY_INPUT_INDEX_FETCH_BIT |
         VK_MEMORY_INPUT_VERTEX_ATTRIBUTE_FETCH_BIT |
diff --git a/tests/vkrenderframework.h b/tests/vkrenderframework.h
index 8cce75c..587dba7 100644
--- a/tests/vkrenderframework.h
+++ b/tests/vkrenderframework.h
@@ -194,13 +194,13 @@
     ~VkConstantBufferObj();
     void BufferMemoryBarrier(
         VkFlags outputMask =
-            VK_MEMORY_OUTPUT_CPU_WRITE_BIT |
+            VK_MEMORY_OUTPUT_HOST_WRITE_BIT |
             VK_MEMORY_OUTPUT_SHADER_WRITE_BIT |
             VK_MEMORY_OUTPUT_COLOR_ATTACHMENT_BIT |
             VK_MEMORY_OUTPUT_DEPTH_STENCIL_ATTACHMENT_BIT |
             VK_MEMORY_OUTPUT_TRANSFER_BIT,
         VkFlags inputMask =
-            VK_MEMORY_INPUT_CPU_READ_BIT |
+            VK_MEMORY_INPUT_HOST_READ_BIT |
             VK_MEMORY_INPUT_INDIRECT_COMMAND_BIT |
             VK_MEMORY_INPUT_INDEX_FETCH_BIT |
             VK_MEMORY_INPUT_VERTEX_ATTRIBUTE_FETCH_BIT |
diff --git a/vk-layer-generate.py b/vk-layer-generate.py
index 680d3c4..326a47e 100755
--- a/vk-layer-generate.py
+++ b/vk-layer-generate.py
@@ -1170,7 +1170,7 @@
             using_line += '    // validate_memory_mapping_status(pMemRefs, memRefCount);\n'
             using_line += '    // validate_mem_ref_count(memRefCount);\n'
             using_line += '    loader_platform_thread_unlock_mutex(&objLock);\n'
-        elif 'MemoryRange' in proto.name:
+        elif 'QueueBindObjectMemoryRange' in proto.name or 'QueueBindImageMemoryRange' in proto.name:
             using_line = '    loader_platform_thread_lock_mutex(&objLock);\n'
             using_line += '    if (validateQueueFlags(queue) == VK_FALSE) {\n'
             using_line += '        char str[1024];\n'
diff --git a/vulkan.py b/vulkan.py
index 7aad8c9..96c46e1 100755
--- a/vulkan.py
+++ b/vulkan.py
@@ -321,11 +321,15 @@
             [Param("VkDevice", "device"),
              Param("VkDeviceMemory", "mem")]),
 
-        Proto("VkResult", "FlushMappedMemory",
+        Proto("VkResult", "FlushMappedMemoryRanges",
             [Param("VkDevice", "device"),
-             Param("VkDeviceMemory", "mem"),
-             Param("VkDeviceSize", "offset"),
-             Param("VkDeviceSize", "size")]),
+             Param("uint32_t", "memRangeCount"),
+             Param("const VkMappedMemoryRange*", "pMemRanges")]),
+
+        Proto("VkResult", "InvalidateMappedMemoryRanges",
+            [Param("VkDevice", "device"),
+             Param("uint32_t", "memRangeCount"),
+             Param("const VkMappedMemoryRange*", "pMemRanges")]),
 
         Proto("VkResult", "PinSystemMemory",
             [Param("VkDevice", "device"),