build: Update to header v1.4.361
diff --git a/CMakeLists.txt b/CMakeLists.txt
index aa048aa..7a21337 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -6,7 +6,7 @@
 cmake_minimum_required(VERSION 3.22.1)
 
 # The VERSION field is generated with the "--generated-version" flag in the generate_source.py script
-project(VUL VERSION 1.4.360 LANGUAGES CXX)
+project(VUL VERSION 1.4.361 LANGUAGES CXX)
 
 set_property(GLOBAL PROPERTY USE_FOLDERS ON) # Remove when min is 3.26, see CMP0143
 
diff --git a/include/vulkan/utility/vk_safe_struct.hpp b/include/vulkan/utility/vk_safe_struct.hpp
index 9337f42..f259211 100644
--- a/include/vulkan/utility/vk_safe_struct.hpp
+++ b/include/vulkan/utility/vk_safe_struct.hpp
@@ -25549,6 +25549,27 @@
         return reinterpret_cast<VkPhysicalDeviceCooperativeMatrixDecodeVectorFeaturesNV const*>(this);
     }
 };
+struct safe_VkPhysicalDevicePrivateDataBaseHandleFeaturesNV {
+    VkStructureType sType;
+    void* pNext{};
+    VkBool32 privateDataBaseHandle;
+
+    safe_VkPhysicalDevicePrivateDataBaseHandleFeaturesNV(const VkPhysicalDevicePrivateDataBaseHandleFeaturesNV* in_struct,
+                                                         PNextCopyState* copy_state = {}, bool copy_pnext = true);
+    safe_VkPhysicalDevicePrivateDataBaseHandleFeaturesNV(const safe_VkPhysicalDevicePrivateDataBaseHandleFeaturesNV& copy_src);
+    safe_VkPhysicalDevicePrivateDataBaseHandleFeaturesNV& operator=(
+        const safe_VkPhysicalDevicePrivateDataBaseHandleFeaturesNV& copy_src);
+    safe_VkPhysicalDevicePrivateDataBaseHandleFeaturesNV();
+    ~safe_VkPhysicalDevicePrivateDataBaseHandleFeaturesNV();
+    void initialize(const VkPhysicalDevicePrivateDataBaseHandleFeaturesNV* in_struct, PNextCopyState* copy_state = {});
+    void initialize(const safe_VkPhysicalDevicePrivateDataBaseHandleFeaturesNV* copy_src, PNextCopyState* copy_state = {});
+    VkPhysicalDevicePrivateDataBaseHandleFeaturesNV* ptr() {
+        return reinterpret_cast<VkPhysicalDevicePrivateDataBaseHandleFeaturesNV*>(this);
+    }
+    VkPhysicalDevicePrivateDataBaseHandleFeaturesNV const* ptr() const {
+        return reinterpret_cast<VkPhysicalDevicePrivateDataBaseHandleFeaturesNV const*>(this);
+    }
+};
 struct safe_VkAccelerationStructureGeometryTrianglesDataKHR {
     VkStructureType sType;
     const void* pNext{};
diff --git a/include/vulkan/utility/vk_struct_helper.hpp b/include/vulkan/utility/vk_struct_helper.hpp
index c8217aa..96ae014 100644
--- a/include/vulkan/utility/vk_struct_helper.hpp
+++ b/include/vulkan/utility/vk_struct_helper.hpp
@@ -1315,6 +1315,7 @@
 template <> inline VkStructureType GetSType<VkPhysicalDeviceImageTilingControlFeaturesEXT>() { return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_TILING_CONTROL_FEATURES_EXT; }
 template <> inline VkStructureType GetSType<VkImageTilingControlCreateInfoEXT>() { return VK_STRUCTURE_TYPE_IMAGE_TILING_CONTROL_CREATE_INFO_EXT; }
 template <> inline VkStructureType GetSType<VkPhysicalDeviceCooperativeMatrixDecodeVectorFeaturesNV>() { return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_DECODE_VECTOR_FEATURES_NV; }
+template <> inline VkStructureType GetSType<VkPhysicalDevicePrivateDataBaseHandleFeaturesNV>() { return VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_BASE_HANDLE_FEATURES_NV; }
 template <> inline VkStructureType GetSType<VkAccelerationStructureGeometryTrianglesDataKHR>() { return VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_TRIANGLES_DATA_KHR; }
 template <> inline VkStructureType GetSType<VkAccelerationStructureGeometryAabbsDataKHR>() { return VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_AABBS_DATA_KHR; }
 template <> inline VkStructureType GetSType<VkAccelerationStructureGeometryInstancesDataKHR>() { return VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_INSTANCES_DATA_KHR; }
diff --git a/include/vulkan/vk_enum_string_helper.h b/include/vulkan/vk_enum_string_helper.h
index 84e2304..ac55546 100644
--- a/include/vulkan/vk_enum_string_helper.h
+++ b/include/vulkan/vk_enum_string_helper.h
@@ -2642,6 +2642,8 @@
             return "VK_STRUCTURE_TYPE_IMAGE_TILING_CONTROL_CREATE_INFO_EXT";
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_DECODE_VECTOR_FEATURES_NV:
             return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_DECODE_VECTOR_FEATURES_NV";
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_BASE_HANDLE_FEATURES_NV:
+            return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_BASE_HANDLE_FEATURES_NV";
         default:
             return "Unhandled VkStructureType";
     }
@@ -8586,6 +8588,31 @@
     return ret;
 }
 #endif // __cplusplus
+static inline const char* string_VkPrivateDataSlotCreateFlagBits(VkPrivateDataSlotCreateFlagBits input_value) {
+    switch (input_value) {
+        case VK_PRIVATE_DATA_SLOT_CREATE_BASE_OBJECT_HANDLE_BIT_NV:
+            return "VK_PRIVATE_DATA_SLOT_CREATE_BASE_OBJECT_HANDLE_BIT_NV";
+        default:
+            return "Unhandled VkPrivateDataSlotCreateFlagBits";
+    }
+}
+
+#ifdef __cplusplus
+static inline std::string string_VkPrivateDataSlotCreateFlags(VkPrivateDataSlotCreateFlags input_value) {
+    std::string ret;
+    int index = 0;
+    while(input_value) {
+        if (input_value & 1) {
+            if( !ret.empty()) ret.append("|");
+            ret.append(string_VkPrivateDataSlotCreateFlagBits(static_cast<VkPrivateDataSlotCreateFlagBits>(1U << index)));
+        }
+        ++index;
+        input_value >>= 1;
+    }
+    if (ret.empty()) ret.append("VkPrivateDataSlotCreateFlags(0)");
+    return ret;
+}
+#endif // __cplusplus
 static inline const char* string_VkPipelineStageFlagBits2(uint64_t input_value) {
     if (input_value == VK_PIPELINE_STAGE_2_NONE) return "VK_PIPELINE_STAGE_2_NONE";
     if (input_value == VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT) return "VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT";
@@ -14882,6 +14909,8 @@
             return "VkImageTilingControlCreateInfoEXT";
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_DECODE_VECTOR_FEATURES_NV:
             return "VkPhysicalDeviceCooperativeMatrixDecodeVectorFeaturesNV";
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_BASE_HANDLE_FEATURES_NV:
+            return "VkPhysicalDevicePrivateDataBaseHandleFeaturesNV";
         case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_TRIANGLES_DATA_KHR:
             return "VkAccelerationStructureGeometryTrianglesDataKHR";
         case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_AABBS_DATA_KHR:
diff --git a/scripts/known_good.json b/scripts/known_good.json
index fc9ebf9..5e2cb06 100644
--- a/scripts/known_good.json
+++ b/scripts/known_good.json
@@ -7,7 +7,7 @@
             "sub_dir": "Vulkan-Headers",
             "build_dir": "Vulkan-Headers/build",
             "install_dir": "Vulkan-Headers/build/install",
-            "commit": "v1.4.360"
+            "commit": "v1.4.361"
         },
         {
             "name": "googletest",
diff --git a/src/vulkan/vk_safe_struct_utils.cpp b/src/vulkan/vk_safe_struct_utils.cpp
index 29aa05d..67f5cf1 100644
--- a/src/vulkan/vk_safe_struct_utils.cpp
+++ b/src/vulkan/vk_safe_struct_utils.cpp
@@ -2540,6 +2540,9 @@
             case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_DECODE_VECTOR_FEATURES_NV:
                 safe_pNext = new safe_VkPhysicalDeviceCooperativeMatrixDecodeVectorFeaturesNV(reinterpret_cast<const VkPhysicalDeviceCooperativeMatrixDecodeVectorFeaturesNV *>(pNext), copy_state, false);
                 break;
+            case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_BASE_HANDLE_FEATURES_NV:
+                safe_pNext = new safe_VkPhysicalDevicePrivateDataBaseHandleFeaturesNV(reinterpret_cast<const VkPhysicalDevicePrivateDataBaseHandleFeaturesNV *>(pNext), copy_state, false);
+                break;
             case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR:
                 safe_pNext = new safe_VkWriteDescriptorSetAccelerationStructureKHR(reinterpret_cast<const VkWriteDescriptorSetAccelerationStructureKHR *>(pNext), copy_state, false);
                 break;
@@ -5091,6 +5094,9 @@
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_DECODE_VECTOR_FEATURES_NV:
             delete reinterpret_cast<safe_VkPhysicalDeviceCooperativeMatrixDecodeVectorFeaturesNV *>(header);
             break;
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_BASE_HANDLE_FEATURES_NV:
+            delete reinterpret_cast<safe_VkPhysicalDevicePrivateDataBaseHandleFeaturesNV *>(header);
+            break;
         case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR:
             delete reinterpret_cast<safe_VkWriteDescriptorSetAccelerationStructureKHR *>(header);
             break;
diff --git a/src/vulkan/vk_safe_struct_vendor.cpp b/src/vulkan/vk_safe_struct_vendor.cpp
index d33b8d7..438d0e0 100644
--- a/src/vulkan/vk_safe_struct_vendor.cpp
+++ b/src/vulkan/vk_safe_struct_vendor.cpp
@@ -26407,6 +26407,56 @@
     pNext = SafePnextCopy(copy_src->pNext);
 }
 
+safe_VkPhysicalDevicePrivateDataBaseHandleFeaturesNV::safe_VkPhysicalDevicePrivateDataBaseHandleFeaturesNV(
+    const VkPhysicalDevicePrivateDataBaseHandleFeaturesNV* in_struct, [[maybe_unused]] PNextCopyState* copy_state, bool copy_pnext)
+    : sType(in_struct->sType), privateDataBaseHandle(in_struct->privateDataBaseHandle) {
+    if (copy_pnext) {
+        pNext = SafePnextCopy(in_struct->pNext, copy_state);
+    }
+}
+
+safe_VkPhysicalDevicePrivateDataBaseHandleFeaturesNV::safe_VkPhysicalDevicePrivateDataBaseHandleFeaturesNV()
+    : sType(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_BASE_HANDLE_FEATURES_NV), pNext(nullptr), privateDataBaseHandle() {}
+
+safe_VkPhysicalDevicePrivateDataBaseHandleFeaturesNV::safe_VkPhysicalDevicePrivateDataBaseHandleFeaturesNV(
+    const safe_VkPhysicalDevicePrivateDataBaseHandleFeaturesNV& copy_src) {
+    sType = copy_src.sType;
+    privateDataBaseHandle = copy_src.privateDataBaseHandle;
+    pNext = SafePnextCopy(copy_src.pNext);
+}
+
+safe_VkPhysicalDevicePrivateDataBaseHandleFeaturesNV& safe_VkPhysicalDevicePrivateDataBaseHandleFeaturesNV::operator=(
+    const safe_VkPhysicalDevicePrivateDataBaseHandleFeaturesNV& copy_src) {
+    if (&copy_src == this) return *this;
+
+    FreePnextChain(pNext);
+
+    sType = copy_src.sType;
+    privateDataBaseHandle = copy_src.privateDataBaseHandle;
+    pNext = SafePnextCopy(copy_src.pNext);
+
+    return *this;
+}
+
+safe_VkPhysicalDevicePrivateDataBaseHandleFeaturesNV::~safe_VkPhysicalDevicePrivateDataBaseHandleFeaturesNV() {
+    FreePnextChain(pNext);
+}
+
+void safe_VkPhysicalDevicePrivateDataBaseHandleFeaturesNV::initialize(
+    const VkPhysicalDevicePrivateDataBaseHandleFeaturesNV* in_struct, [[maybe_unused]] PNextCopyState* copy_state) {
+    FreePnextChain(pNext);
+    sType = in_struct->sType;
+    privateDataBaseHandle = in_struct->privateDataBaseHandle;
+    pNext = SafePnextCopy(in_struct->pNext, copy_state);
+}
+
+void safe_VkPhysicalDevicePrivateDataBaseHandleFeaturesNV::initialize(
+    const safe_VkPhysicalDevicePrivateDataBaseHandleFeaturesNV* copy_src, [[maybe_unused]] PNextCopyState* copy_state) {
+    sType = copy_src->sType;
+    privateDataBaseHandle = copy_src->privateDataBaseHandle;
+    pNext = SafePnextCopy(copy_src->pNext);
+}
+
 }  // namespace vku
 
 // NOLINTEND