Signed-off-by: Philipp Zabel <p.za...@pengutronix.de>
---
 ...x-find_-support-when-cross-compiling.patch |  32 +++
 ...r-VK_IMAGE_TILING_DRM_FORMAT_MODIFIE.patch | 201 ++++++++++++++++++
 .../vulkan-validationlayers-1.3.246.1/series  |   5 +
 rules/vulkan-validationlayers.make            |   7 +-
 4 files changed, 241 insertions(+), 4 deletions(-)
 create mode 100644 
patches/vulkan-validationlayers-1.3.246.1/0001-Revert-cmake-Fix-find_-support-when-cross-compiling.patch
 create mode 100644 
patches/vulkan-validationlayers-1.3.246.1/0002-layers-Fix-UB-for-VK_IMAGE_TILING_DRM_FORMAT_MODIFIE.patch
 create mode 100644 patches/vulkan-validationlayers-1.3.246.1/series

diff --git 
a/patches/vulkan-validationlayers-1.3.246.1/0001-Revert-cmake-Fix-find_-support-when-cross-compiling.patch
 
b/patches/vulkan-validationlayers-1.3.246.1/0001-Revert-cmake-Fix-find_-support-when-cross-compiling.patch
new file mode 100644
index 000000000000..c3e3338b0009
--- /dev/null
+++ 
b/patches/vulkan-validationlayers-1.3.246.1/0001-Revert-cmake-Fix-find_-support-when-cross-compiling.patch
@@ -0,0 +1,32 @@
+From: Philipp Zabel <p.za...@pengutronix.de>
+Date: Tue, 16 May 2023 10:04:03 +0200
+Subject: [PATCH] Revert "cmake: Fix find_* support when cross compiling"
+
+PTXdist uses CMAKE_FIND_ROOT_PATH [1] to instruct CMake where to find
+package information when cross-compiling. Stop overwriting this with
+the contents of CMAKE_PREFIX_PATH [2] in the build system.
+
+[1] https://cmake.org/cmake/help/v3.25/variable/CMAKE_FIND_ROOT_PATH.html
+[2] https://cmake.org/cmake/help/v3.25/variable/CMAKE_PREFIX_PATH.html
+
+This reverts commit b7c5ad2eed4405140fd062e5b915950011f4d7d0.
+
+Signed-off-by: Philipp Zabel <p.za...@pengutronix.de>
+---
+ scripts/CMakeLists.txt | 6 +-----
+ 1 file changed, 1 insertion(+), 5 deletions(-)
+
+diff --git a/scripts/CMakeLists.txt b/scripts/CMakeLists.txt
+index f3536cc2a05e..a71de73111a2 100644
+--- a/scripts/CMakeLists.txt
++++ b/scripts/CMakeLists.txt
+@@ -127,8 +127,4 @@ if (MIMALLOC_INSTALL_DIR)
+     list(APPEND CMAKE_PREFIX_PATH ${MIMALLOC_INSTALL_DIR})
+ endif()
+ 
+-if (CMAKE_CROSSCOMPILING)
+-    set(CMAKE_FIND_ROOT_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE)
+-else()
+-    set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE)
+-endif()
++set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE)
diff --git 
a/patches/vulkan-validationlayers-1.3.246.1/0002-layers-Fix-UB-for-VK_IMAGE_TILING_DRM_FORMAT_MODIFIE.patch
 
b/patches/vulkan-validationlayers-1.3.246.1/0002-layers-Fix-UB-for-VK_IMAGE_TILING_DRM_FORMAT_MODIFIE.patch
new file mode 100644
index 000000000000..3b625e31120f
--- /dev/null
+++ 
b/patches/vulkan-validationlayers-1.3.246.1/0002-layers-Fix-UB-for-VK_IMAGE_TILING_DRM_FORMAT_MODIFIE.patch
@@ -0,0 +1,201 @@
+From: Niklas Haas <g...@haasn.dev>
+Date: Thu, 20 Apr 2023 11:51:49 +0200
+Subject: [PATCH] layers: Fix UB for VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT
+
+Several codepaths in the layers called into
+vkGetPhysicalDeviceImageFormatProperties2KHR without including a valid
+VkPhysicalDeviceImageDrmFormatModifierInfoEXT, despite this being a
+requirement for images with DRM format modifier tiling.
+
+For the vkBindImageMemory check, there is a hypothetical possibility of
+the driver returning VK_ERROR_OUT_OF_HOST_MEMORY when querying the
+image's DRM format. In this case, for lack of anything better to do, we
+preserve the current behavior.
+
+It might make more sense to query the DRM format modifier immediately
+after image creation and cache it inside the image state, but I didn't
+want to make that (more invasive) change myself.
+
+As an aside, we also correctly specify the specified `sharingMode` when
+querying for DRM modifier support, which the current code failed to do
+properly.
+
+Co-authored-by: Simon Ser <cont...@emersion.fr>
+
+closes #5649
+closes #5687
+
+(cherry picked from commit ce2c6eff3457a331efd64da800c5ac393285cf40)
+
+Signed-off-by: Philipp Zabel <p.za...@pengutronix.de>
+---
+ layers/core_checks/device_memory_validation.cpp | 18 ++++++-
+ layers/core_checks/image_validation.cpp         | 72 ++++++++++++++++---------
+ 2 files changed, 62 insertions(+), 28 deletions(-)
+
+diff --git a/layers/core_checks/device_memory_validation.cpp 
b/layers/core_checks/device_memory_validation.cpp
+index 4a98d6f0922d..555985957dce 100644
+--- a/layers/core_checks/device_memory_validation.cpp
++++ b/layers/core_checks/device_memory_validation.cpp
+@@ -887,7 +887,7 @@ bool CoreChecks::PreCallValidateMapMemory(VkDevice device, 
VkDeviceMemory mem, V
+     return skip;
+ }
+ 
+-bool CoreChecks::PreCallValidateMapMemory2KHR(VkDevice device, const 
VkMemoryMapInfoKHR* pMemoryMapInfo, void **ppData) const {
++bool CoreChecks::PreCallValidateMapMemory2KHR(VkDevice device, const 
VkMemoryMapInfoKHR *pMemoryMapInfo, void **ppData) const {
+     bool skip = false;
+     auto mem_info = Get<DEVICE_MEMORY_STATE>(pMemoryMapInfo->memory);
+     if (mem_info) {
+@@ -905,7 +905,7 @@ bool CoreChecks::PreCallValidateUnmapMemory(VkDevice 
device, VkDeviceMemory mem)
+     return skip;
+ }
+ 
+-bool CoreChecks::PreCallValidateUnmapMemory2KHR(VkDevice device, const 
VkMemoryUnmapInfoKHR* pMemoryUnmapInfo) const {
++bool CoreChecks::PreCallValidateUnmapMemory2KHR(VkDevice device, const 
VkMemoryUnmapInfoKHR *pMemoryUnmapInfo) const {
+     bool skip = false;
+     auto mem_info = Get<DEVICE_MEMORY_STATE>(pMemoryUnmapInfo->memory);
+     if (mem_info && !mem_info->mapped_range.size) {
+@@ -1269,6 +1269,10 @@ bool CoreChecks::ValidateBindImageMemory(uint32_t 
bindInfoCount, const VkBindIma
+ 
+                 // Validate export memory handles
+                 if (mem_info->export_handle_type_flags != 0) {
++                    auto drm_format_modifier = 
LvlInitStruct<VkPhysicalDeviceImageDrmFormatModifierInfoEXT>();
++                    drm_format_modifier.sharingMode = 
image_state->createInfo.sharingMode;
++                    drm_format_modifier.queueFamilyIndexCount = 
image_state->createInfo.queueFamilyIndexCount;
++                    drm_format_modifier.pQueueFamilyIndices = 
image_state->createInfo.pQueueFamilyIndices;
+                     auto external_info = 
LvlInitStruct<VkPhysicalDeviceExternalImageFormatInfo>();
+                     auto image_info = 
LvlInitStruct<VkPhysicalDeviceImageFormatInfo2>(&external_info);
+                     image_info.format = image_state->createInfo.format;
+@@ -1283,6 +1287,16 @@ bool CoreChecks::ValidateBindImageMemory(uint32_t 
bindInfoCount, const VkBindIma
+                     // Check export operation support
+                     auto check_export_support = 
[&](VkExternalMemoryHandleTypeFlagBits flag) {
+                         external_info.handleType = flag;
++                        external_info.pNext = NULL;
++                        if (image_state->createInfo.tiling == 
VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) {
++                            auto drm_modifier_properties = 
LvlInitStruct<VkImageDrmFormatModifierPropertiesEXT>();
++                            auto result =
++                                
DispatchGetImageDrmFormatModifierPropertiesEXT(device, bind_info.image, 
&drm_modifier_properties);
++                            if (result == VK_SUCCESS) {
++                                external_info.pNext = &drm_format_modifier;
++                                drm_format_modifier.drmFormatModifier = 
drm_modifier_properties.drmFormatModifier;
++                            }
++                        }
+                         auto result =
+                             
DispatchGetPhysicalDeviceImageFormatProperties2(physical_device, &image_info, 
&image_properties);
+                         if (result != VK_SUCCESS) {
+diff --git a/layers/core_checks/image_validation.cpp 
b/layers/core_checks/image_validation.cpp
+index c56b5dabdd27..35a84c86f8ef 100644
+--- a/layers/core_checks/image_validation.cpp
++++ b/layers/core_checks/image_validation.cpp
+@@ -176,30 +176,35 @@ bool CoreChecks::PreCallValidateCreateImage(VkDevice 
device, const VkImageCreate
+         }
+     }
+ 
+-    VkImageFormatProperties format_limits = {};
++    auto image_format_properties = LvlInitStruct<VkImageFormatProperties2>();
++    auto image_format_info = 
LvlInitStruct<VkPhysicalDeviceImageFormatInfo2>();
++    image_format_info.type = pCreateInfo->imageType;
++    image_format_info.format = pCreateInfo->format;
++    image_format_info.tiling = pCreateInfo->tiling;
++    image_format_info.usage = pCreateInfo->usage;
++    image_format_info.flags = pCreateInfo->flags;
+     VkResult result = VK_SUCCESS;
+     if (pCreateInfo->tiling != VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) {
+-        result = 
DispatchGetPhysicalDeviceImageFormatProperties(physical_device, 
pCreateInfo->format, pCreateInfo->imageType,
+-                                                                
pCreateInfo->tiling, pCreateInfo->usage, pCreateInfo->flags,
+-                                                                
&format_limits);
++        if 
(IsExtEnabled(device_extensions.vk_khr_get_physical_device_properties2)) {
++            result = 
DispatchGetPhysicalDeviceImageFormatProperties2(physical_device, 
&image_format_info, &image_format_properties);
++        } else {
++            result = 
DispatchGetPhysicalDeviceImageFormatProperties(physical_device, 
pCreateInfo->format, pCreateInfo->imageType,
++                                                                    
pCreateInfo->tiling, pCreateInfo->usage, pCreateInfo->flags,
++                                                                    
&image_format_properties.imageFormatProperties);
++        }
+     } else {
+         auto modifier_list = 
LvlFindInChain<VkImageDrmFormatModifierListCreateInfoEXT>(pCreateInfo->pNext);
+         auto explicit_modifier = 
LvlFindInChain<VkImageDrmFormatModifierExplicitCreateInfoEXT>(pCreateInfo->pNext);
++        auto drm_format_modifier = 
LvlInitStruct<VkPhysicalDeviceImageDrmFormatModifierInfoEXT>();
++        image_format_info.pNext = &drm_format_modifier;
++        drm_format_modifier.sharingMode = pCreateInfo->sharingMode;
++        drm_format_modifier.queueFamilyIndexCount = 
pCreateInfo->queueFamilyIndexCount;
++        drm_format_modifier.pQueueFamilyIndices = 
pCreateInfo->pQueueFamilyIndices;
+         if (modifier_list) {
+             for (uint32_t i = 0; i < modifier_list->drmFormatModifierCount; 
i++) {
+-                auto drm_format_modifier = 
LvlInitStruct<VkPhysicalDeviceImageDrmFormatModifierInfoEXT>();
+                 drm_format_modifier.drmFormatModifier = 
modifier_list->pDrmFormatModifiers[i];
+-                auto image_format_info = 
LvlInitStruct<VkPhysicalDeviceImageFormatInfo2>(&drm_format_modifier);
+-                image_format_info.type = pCreateInfo->imageType;
+-                image_format_info.format = pCreateInfo->format;
+-                image_format_info.tiling = pCreateInfo->tiling;
+-                image_format_info.usage = pCreateInfo->usage;
+-                image_format_info.flags = pCreateInfo->flags;
+-                auto image_format_properties = 
LvlInitStruct<VkImageFormatProperties2>();
+-
+                 result =
+                     
DispatchGetPhysicalDeviceImageFormatProperties2(physical_device, 
&image_format_info, &image_format_properties);
+-                format_limits = image_format_properties.imageFormatProperties;
+ 
+                 /* The application gives a list of modifier and the driver
+                  * selects one. If one is wrong, stop there.
+@@ -207,18 +212,8 @@ bool CoreChecks::PreCallValidateCreateImage(VkDevice 
device, const VkImageCreate
+                 if (result != VK_SUCCESS) break;
+             }
+         } else if (explicit_modifier) {
+-            auto drm_format_modifier = 
LvlInitStruct<VkPhysicalDeviceImageDrmFormatModifierInfoEXT>();
+             drm_format_modifier.drmFormatModifier = 
explicit_modifier->drmFormatModifier;
+-            auto image_format_info = 
LvlInitStruct<VkPhysicalDeviceImageFormatInfo2>(&drm_format_modifier);
+-            image_format_info.type = pCreateInfo->imageType;
+-            image_format_info.format = pCreateInfo->format;
+-            image_format_info.tiling = pCreateInfo->tiling;
+-            image_format_info.usage = pCreateInfo->usage;
+-            image_format_info.flags = pCreateInfo->flags;
+-            auto image_format_properties = 
LvlInitStruct<VkImageFormatProperties2>();
+-
+             result = 
DispatchGetPhysicalDeviceImageFormatProperties2(physical_device, 
&image_format_info, &image_format_properties);
+-            format_limits = image_format_properties.imageFormatProperties;
+         }
+     }
+ 
+@@ -238,6 +233,7 @@ bool CoreChecks::PreCallValidateCreateImage(VkDevice 
device, const VkImageCreate
+         }
+ #endif  // VK_USE_PLATFORM_ANDROID_KHR
+     } else {
++        const auto format_limits = 
image_format_properties.imageFormatProperties;
+         if (pCreateInfo->mipLevels > format_limits.maxMipLevels) {
+             skip |= LogError(device, "VUID-VkImageCreateInfo-mipLevels-02255",
+                              "vkCreateImage(): Image mip levels=%d exceed 
image format maxMipLevels=%d for format %s.",
+@@ -468,8 +464,32 @@ bool CoreChecks::PreCallValidateCreateImage(VkDevice 
device, const VkImageCreate
+ 
+         auto external_image_properties = 
LvlInitStruct<VkExternalImageFormatProperties>();
+         auto image_properties = 
LvlInitStruct<VkImageFormatProperties2>(&external_image_properties);
+-        result = 
DispatchGetPhysicalDeviceImageFormatProperties2(physical_device, &image_info, 
&image_properties);
+-        const auto compatible_types = 
external_image_properties.externalMemoryProperties.compatibleHandleTypes;
++        VkExternalMemoryHandleTypeFlags compatible_types = 0;
++        if (pCreateInfo->tiling != VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) {
++            result = 
DispatchGetPhysicalDeviceImageFormatProperties2(physical_device, &image_info, 
&image_properties);
++            compatible_types = 
external_image_properties.externalMemoryProperties.compatibleHandleTypes;
++        } else {
++            auto modifier_list = 
LvlFindInChain<VkImageDrmFormatModifierListCreateInfoEXT>(pCreateInfo->pNext);
++            auto explicit_modifier = 
LvlFindInChain<VkImageDrmFormatModifierExplicitCreateInfoEXT>(pCreateInfo->pNext);
++            auto drm_format_modifier = 
LvlInitStruct<VkPhysicalDeviceImageDrmFormatModifierInfoEXT>();
++            external_image_info.pNext = &drm_format_modifier;
++            drm_format_modifier.sharingMode = pCreateInfo->sharingMode;
++            drm_format_modifier.queueFamilyIndexCount = 
pCreateInfo->queueFamilyIndexCount;
++            drm_format_modifier.pQueueFamilyIndices = 
pCreateInfo->pQueueFamilyIndices;
++            if (modifier_list) {
++                for (uint32_t i = 0; i < 
modifier_list->drmFormatModifierCount; i++) {
++                    drm_format_modifier.drmFormatModifier = 
modifier_list->pDrmFormatModifiers[i];
++                    result = 
DispatchGetPhysicalDeviceImageFormatProperties2(physical_device, &image_info, 
&image_properties);
++                    compatible_types |= 
external_image_properties.externalMemoryProperties.compatibleHandleTypes;
++                    if (result != VK_SUCCESS)
++                        break;
++                }
++            } else if (explicit_modifier) {
++                drm_format_modifier.drmFormatModifier = 
explicit_modifier->drmFormatModifier;
++                result = 
DispatchGetPhysicalDeviceImageFormatProperties2(physical_device, &image_info, 
&image_properties);
++                compatible_types = 
external_image_properties.externalMemoryProperties.compatibleHandleTypes;
++            }
++        }
+ 
+         if (result != VK_SUCCESS) {
+             skip |= LogError(
diff --git a/patches/vulkan-validationlayers-1.3.246.1/series 
b/patches/vulkan-validationlayers-1.3.246.1/series
new file mode 100644
index 000000000000..33102174e7c3
--- /dev/null
+++ b/patches/vulkan-validationlayers-1.3.246.1/series
@@ -0,0 +1,5 @@
+# generated by git-ptx-patches
+#tag:base --start-number 1
+0001-Revert-cmake-Fix-find_-support-when-cross-compiling.patch
+0002-layers-Fix-UB-for-VK_IMAGE_TILING_DRM_FORMAT_MODIFIE.patch
+# e0d6af34fb6700edc57f14684c9a4c44  - git-ptx-patches magic
diff --git a/rules/vulkan-validationlayers.make 
b/rules/vulkan-validationlayers.make
index d895cb498624..a497ca942c37 100644
--- a/rules/vulkan-validationlayers.make
+++ b/rules/vulkan-validationlayers.make
@@ -14,8 +14,8 @@ PACKAGES-$(PTXCONF_VULKAN_VALIDATIONLAYERS) += 
vulkan-validationlayers
 #
 # Paths and names
 #
-VULKAN_VALIDATIONLAYERS_VERSION        := 1.3.243.0
-VULKAN_VALIDATIONLAYERS_MD5    := 75cec7ae6450ba60db40cf1a3c84bb11
+VULKAN_VALIDATIONLAYERS_VERSION        := 1.3.246.1
+VULKAN_VALIDATIONLAYERS_MD5    := beba63c5c96fadd027ee3c3bd230b19e
 VULKAN_VALIDATIONLAYERS                := 
vulkan-validationlayers-$(VULKAN_VALIDATIONLAYERS_VERSION)
 VULKAN_VALIDATIONLAYERS_SUFFIX := tar.gz
 VULKAN_VALIDATIONLAYERS_URL    := 
https://github.com/KhronosGroup/Vulkan-ValidationLayers/archive/sdk-$(VULKAN_VALIDATIONLAYERS_VERSION).$(VULKAN_VALIDATIONLAYERS_SUFFIX)
@@ -43,8 +43,7 @@ VULKAN_VALIDATIONLAYERS_CONF_OPT      := \
        -DUSE_ROBIN_HOOD_HASHING=OFF \
        -DVVL_CLANG_TIDY=OFF \
        -DVVL_CPP_STANDARD=20 \
-       -DVVL_ENABLE_ASAN=OFF \
-       -DVVL_ENABLE_TSAN=OFF
+       -DVVL_ENABLE_ASAN=OFF
 
 # ----------------------------------------------------------------------------
 # Target-Install
-- 
2.39.2


Reply via email to