diff --git a/.pick_status.json b/.pick_status.json index 8814fa7eef1..786eb8ea2e7 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -544,7 +544,7 @@ "description": "anv: Fix FlushMappedMemoryRanges for odd mmap offsets", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null }, diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index 2d35df48aed..50c690f96bd 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -4030,8 +4030,9 @@ VkResult anv_MapMemory( mem->map = map; mem->map_size = map_size; + mem->map_delta = (offset - map_offset); - *ppData = mem->map + (offset - map_offset); + *ppData = mem->map + mem->map_delta; return VK_SUCCESS; } @@ -4050,6 +4051,7 @@ void anv_UnmapMemory( mem->map = NULL; mem->map_size = 0; + mem->map_delta = 0; } static void @@ -4059,14 +4061,15 @@ clflush_mapped_ranges(struct anv_device *device, { for (uint32_t i = 0; i < count; i++) { ANV_FROM_HANDLE(anv_device_memory, mem, ranges[i].memory); - if (ranges[i].offset >= mem->map_size) + uint64_t map_offset = ranges[i].offset + mem->map_delta; + if (map_offset >= mem->map_size) continue; if (mem->type->propertyFlags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) continue; - intel_clflush_range(mem->map + ranges[i].offset, - MIN2(ranges[i].size, mem->map_size - ranges[i].offset)); + intel_clflush_range(mem->map + map_offset, + MIN2(ranges[i].size, mem->map_size - map_offset)); } } diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 41cfdef733c..f81d4a3c82a 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -1769,6 +1769,9 @@ struct anv_device_memory { VkDeviceSize map_size; void * map; + /* The map, from the user PoV is map + map_delta */ + uint32_t map_delta; + /* If set, we are holding reference to AHardwareBuffer * which we must release when memory is freed. */