Introduce VideoHppGenerator. (#1618)
authorAndreas Süßenbach <asuessenbach@nvidia.com>
Tue, 11 Jul 2023 13:39:17 +0000 (15:39 +0200)
committerGitHub <noreply@github.com>
Tue, 11 Jul 2023 13:39:17 +0000 (15:39 +0200)
CMakeLists.txt
VideoHppGenerator.cpp [new file with mode: 0644]
VideoHppGenerator.hpp [new file with mode: 0644]
VulkanHppGenerator.cpp
VulkanHppGenerator.hpp
XMLHelper.hpp [new file with mode: 0644]
vulkan/vulkan_video.hpp [new file with mode: 0644]

index 22c5c31..c7a2bd4 100644 (file)
@@ -38,6 +38,8 @@ else()
        cmake_minimum_required( VERSION 3.12 )
 endif()
 
+project( VulkanHppGenerator LANGUAGES CXX )
+
 function( vulkan_hpp__setup_platform )
        set( options )
        set( oneValueArgs NAME )
@@ -348,20 +350,24 @@ if( VULKAN_HPP_ENABLE_EXPERIMENTAL_CPP20_MODULES )
        target_include_directories( VulkanHppModule PUBLIC "${CMAKE_SOURCE_DIR}/Vulkan-Headers/include" )
 endif()
 
-# The generator project !
-project( VulkanHppGenerator LANGUAGES CXX )
-
-add_executable( ${PROJECT_NAME} VulkanHppGenerator.cpp VulkanHppGenerator.hpp ${TINYXML2_SOURCES} ${TINYXML2_HEADERS} )
-
-vulkan_hpp__setup_warning_level( NAME ${PROJECT_NAME} )
+# The generator executable
+add_executable( VulkanHppGenerator VulkanHppGenerator.cpp VulkanHppGenerator.hpp XMLHelper.hpp ${TINYXML2_SOURCES} ${TINYXML2_HEADERS} )
+vulkan_hpp__setup_warning_level( NAME VulkanHppGenerator )
+target_compile_definitions( VulkanHppGenerator PUBLIC BASE_PATH="${CMAKE_SOURCE_DIR}" VK_SPEC="${vk_spec}" )
+target_include_directories( VulkanHppGenerator PRIVATE ${VULKAN_HPP_TINYXML2_SRC_DIR} )
+set_target_properties( VulkanHppGenerator PROPERTIES CXX_STANDARD 20 CXX_STANDARD_REQUIRED ON )
 
-target_compile_definitions( ${PROJECT_NAME} PUBLIC BASE_PATH="${CMAKE_SOURCE_DIR}" VK_SPEC="${vk_spec}" )
+# The video generator executable
+add_executable( VideoHppGenerator VideoHppGenerator.cpp VideoHppGenerator.hpp XMLHelper.hpp ${TINYXML2_SOURCES} ${TINYXML2_HEADERS} )
+vulkan_hpp__setup_warning_level( NAME VideoHppGenerator )
+file( TO_NATIVE_PATH ${VulkanRegistry_DIR}/video.xml video_spec )
+string( REPLACE "\\" "\\\\" video_spec ${video_spec} )
+target_compile_definitions( VideoHppGenerator PUBLIC BASE_PATH="${CMAKE_SOURCE_DIR}" VIDEO_SPEC="${video_spec}" )
+target_include_directories( VideoHppGenerator PRIVATE  ${VULKAN_HPP_TINYXML2_SRC_DIR} )
+set_target_properties( VideoHppGenerator PROPERTIES CXX_STANDARD 20 CXX_STANDARD_REQUIRED ON )
 
-target_include_directories( ${PROJECT_NAME} PRIVATE ${VULKAN_HPP_TINYXML2_SRC_DIR} )
 
-set_target_properties( ${PROJECT_NAME} PROPERTIES CXX_STANDARD 20 CXX_STANDARD_REQUIRED ON )
-
-# if the generator is to be run, add a custom command and target
+# if the generators are to be run, add a custom commands and targets
 if( VULKAN_HPP_RUN_GENERATOR )
        if( NOT DEFINED VulkanHeaders_INCLUDE_DIR )
                if( DEFINED VULKAN_HPP_PATH )
@@ -374,14 +380,21 @@ if( VULKAN_HPP_RUN_GENERATOR )
        string( REPLACE "\\" "\\\\" vulkan_hpp ${vulkan_hpp} )
 
        add_custom_command(
-               COMMAND ${PROJECT_NAME}
-               COMMAND ${PROJECT_NAME} -api vulkansc
+               COMMAND VulkanHppGenerator
+               COMMAND VulkanHppGenerator -api vulkansc
                OUTPUT "${vulkan_hpp}"
                WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
-               COMMENT "run ${PROJECT_NAME}"
-               DEPENDS ${PROJECT_NAME} "${vk_spec}" )
-
+               COMMENT "run VulkanHppGenerator"
+               DEPENDS VulkanHppGenerator "${vk_spec}" )
        add_custom_target( build_vulkan_hpp ALL DEPENDS "${vulkan_hpp}" "${vk_spec}" )
+
+       add_custom_command(
+               COMMAND VideoHppGenerator
+               OUTPUT "${vulkan_video_hpp}"
+               WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
+               COMMENT "run VulkanVideoGenerator"
+               DEPENDS VulkanVideoGenerator "${video_spec}" )
+       add_custom_target( build_vulkan_video ALL DEPENDS "${vulkan_video_hpp}" "${video_spec}" )
 endif()
 
 if( VULKAN_HPP_SAMPLES_BUILD )
diff --git a/VideoHppGenerator.cpp b/VideoHppGenerator.cpp
new file mode 100644 (file)
index 0000000..f649dc8
--- /dev/null
@@ -0,0 +1,978 @@
+// Copyright(c) 2023, NVIDIA CORPORATION. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "VideoHppGenerator.hpp"
+
+#include "XMLHelper.hpp"
+
+#include <iostream>
+#include <vector>
+
+VideoHppGenerator::VideoHppGenerator( tinyxml2::XMLDocument const & document )
+{
+  // read the document and check its correctness
+  int                                       line     = document.GetLineNum();
+  std::vector<tinyxml2::XMLElement const *> elements = getChildElements( &document );
+  checkElements( line, elements, { { "registry", true } } );
+  checkForError( elements.size() == 1, line, "encountered " + std::to_string( elements.size() ) + " elements named <registry> but only one is allowed" );
+  readRegistry( elements[0] );
+  addImplicitlyRequiredTypes();
+  sortStructs();
+  checkCorrectness();
+}
+
+void VideoHppGenerator::generateHppFile() const
+{
+  std::string const video_hpp = std::string( BASE_PATH ) + "/vulkan/" + "vulkan_video.hpp";
+  std::cout << "VideoHppGenerator: Generating " << video_hpp << " ... " << std::endl;
+
+  std::string const videoHppTemplate = R"(${copyrightMessage}
+#include <vk_video/vulkan_video_codecs_common.h>
+#include <vk_video/vulkan_video_codec_h264std.h>
+#include <vk_video/vulkan_video_codec_h264std_decode.h>
+#include <vk_video/vulkan_video_codec_h264std_encode.h>
+#include <vk_video/vulkan_video_codec_h265std.h>
+#include <vk_video/vulkan_video_codec_h265std_decode.h>
+#include <vk_video/vulkan_video_codec_h265std_encode.h>
+#include <vulkan/vulkan.hpp>
+
+#if !defined( VULKAN_HPP_VIDEO_NAMESPACE )
+#  define VULKAN_HPP_VIDEO_NAMESPACE video
+#endif
+
+namespace VULKAN_HPP_NAMESPACE
+{
+namespace VULKAN_HPP_VIDEO_NAMESPACE
+{
+${enums}
+${structs}
+}   // namespace VULKAN_HPP_VIDEO_NAMESPACE
+}   // namespace VULKAN_HPP_NAMESPACE
+#endif
+)";
+
+  std::string str =
+    replaceWithMap( videoHppTemplate, { { "copyrightMessage", m_copyrightMessage }, { "enums", generateEnums() }, { "structs", generateStructs() } } );
+
+  writeToFile( str, video_hpp );
+}
+
+void VideoHppGenerator::addImplicitlyRequiredTypes()
+{
+  for ( auto & ext : m_extensions )
+  {
+    for ( auto reqIt = ext.requireData.types.begin(); reqIt != ext.requireData.types.end(); ++reqIt )
+    {
+      std::string name   = *reqIt;
+      auto        typeIt = m_types.find( *reqIt );
+      if ( ( typeIt != m_types.end() ) && ( typeIt->second.category == TypeCategory::Struct ) )
+      {
+        assert( typeIt->second.requiredBy.find( ext.name ) != typeIt->second.requiredBy.end() );
+        reqIt = addImplicitlyRequiredTypes( typeIt, ext, reqIt );
+      }
+    }
+  }
+}
+
+std::vector<std::string>::iterator VideoHppGenerator::addImplicitlyRequiredTypes( std::map<std::string, TypeData>::iterator typeIt,
+                                                                                  ExtensionData &                           extensionData,
+                                                                                  std::vector<std::string>::iterator        reqIt )
+{
+  auto structIt = m_structs.find( typeIt->first );
+  assert( structIt != m_structs.end() );
+  for ( auto const & member : structIt->second.members )
+  {
+    auto memberTypeIt = m_types.find( member.type.type );
+    if ( ( memberTypeIt != m_types.end() ) && ( memberTypeIt->second.category == TypeCategory::Struct ) )
+    {
+      reqIt = addImplicitlyRequiredTypes( memberTypeIt, extensionData, reqIt );
+    }
+  }
+  assert( typeIt->second.requiredBy.empty() || ( *typeIt->second.requiredBy.begin() == extensionData.name ) ||
+          ( *typeIt->second.requiredBy.begin() == extensionData.depends ) );
+  if ( typeIt->second.requiredBy.empty() && ( std::find( extensionData.requireData.types.begin(), reqIt, typeIt->first ) == reqIt ) )
+  {
+    assert( std::find( reqIt, extensionData.requireData.types.end(), typeIt->first ) == extensionData.requireData.types.end() );
+    typeIt->second.requiredBy.insert( extensionData.name );
+    reqIt = std::next( extensionData.requireData.types.insert( reqIt, typeIt->first ) );
+  }
+  return reqIt;
+}
+
+void VideoHppGenerator::checkCorrectness() const
+{
+  // only structs to check here!
+  for ( auto const & structure : m_structs )
+  {
+    // check that a struct is referenced somewhere
+    // I think, it's not forbidden to not reference a struct, but it would probably be not intended?
+    auto typeIt = m_types.find( structure.first );
+    assert( typeIt != m_types.end() );
+    checkForError( !typeIt->second.requiredBy.empty(), structure.second.xmlLine, "structure <" + structure.first + "> not required by any extension" );
+
+    assert( typeIt->second.requiredBy.size() == 1 );
+    auto extIt =
+      std::find_if( m_extensions.begin(), m_extensions.end(), [&typeIt]( ExtensionData const & ed ) { return ed.name == *typeIt->second.requiredBy.begin(); } );
+    assert( extIt != m_extensions.end() );
+
+    // checks on the members of a struct
+    for ( auto const & member : structure.second.members )
+    {
+      // check that each member type is known
+      checkForError( m_types.find( member.type.type ) != m_types.end(), member.xmlLine, "struct member uses unknown type <" + member.type.type + ">" );
+
+      // check that all member types are required in some extension (it's just a warning!!)
+      if ( member.type.type.starts_with( "StdVideo" ) )
+      {
+        auto memberTypeIt = m_types.find( member.type.type );
+        assert( memberTypeIt != m_types.end() );
+        checkForWarning( !memberTypeIt->second.requiredBy.empty(),
+                         member.xmlLine,
+                         "struct member type <" + member.type.type + "> used in struct <" + structure.first + "> is never required for any extension" );
+      }
+
+      // check that all array sizes are a known constant
+      for ( auto const & arraySize : member.arraySizes )
+      {
+        if ( arraySize.find_first_not_of( "0123456789" ) != std::string::npos )
+        {
+          bool found = ( extIt->requireData.constants.find( arraySize ) != extIt->requireData.constants.end() );
+          if ( !found )
+          {
+            checkForError(
+              !extIt->depends.empty(), extIt->xmlLine, "struct member <" + member.name + "> uses unknown constant <" + arraySize + "> as array size" );
+            auto depIt = std::find_if( m_extensions.begin(), m_extensions.end(), [&extIt]( ExtensionData const & ed ) { return ed.name == extIt->depends; } );
+            assert( depIt != m_extensions.end() );
+            checkForError( depIt->requireData.constants.find( arraySize ) != depIt->requireData.constants.end(),
+                           member.xmlLine,
+                           "struct member <" + member.name + "> uses unknown constant <" + arraySize + "> as array size" );
+          }
+        }
+      }
+    }
+  }
+}
+
+std::string VideoHppGenerator::generateEnum( std::pair<std::string, EnumData> const & enumData ) const
+{
+  std::string enumValues;
+#if !defined( NDEBUG )
+  std::map<std::string, std::string> valueToNameMap;
+#endif
+
+  // convert the enum name to upper case
+  std::string prefix = toUpperCase( enumData.first ) + "_";
+  for ( auto const & value : enumData.second.values )
+  {
+    std::string valueName = "e" + toCamelCase( stripPrefix( value.name, prefix ), true );
+    assert( valueToNameMap.insert( { valueName, value.name } ).second );
+    enumValues += "    " + valueName + " = " + value.name + ",\n";
+  }
+
+  if ( !enumValues.empty() )
+  {
+    size_t pos = enumValues.rfind( ',' );
+    assert( pos != std::string::npos );
+    enumValues.erase( pos, 1 );
+    enumValues = "\n" + enumValues + "  ";
+  }
+
+  const std::string enumTemplate = R"(  enum class ${enumName}
+  {${enumValues}};
+)";
+
+  return replaceWithMap( enumTemplate, { { "enumName", stripPrefix( enumData.first, "StdVideo" ) }, { "enumValues", enumValues } } );
+}
+
+std::string VideoHppGenerator::generateEnums() const
+{
+  {
+    const std::string enumsTemplate = R"(
+  //=============
+  //=== ENUMs ===
+  //=============
+
+${enums}
+)";
+
+    std::string enums;
+    for ( auto const & extension : m_extensions )
+    {
+      enums += generateEnums( extension.requireData, extension.name );
+    }
+
+    return replaceWithMap( enumsTemplate, { { "enums", enums } } );
+  }
+}
+
+std::string VideoHppGenerator::generateEnums( RequireData const & requireData, std::string const & title ) const
+{
+  std::string str;
+  for ( auto const & type : requireData.types )
+  {
+    auto enumIt = m_enums.find( type );
+    if ( enumIt != m_enums.end() )
+    {
+      str += "\n" + generateEnum( *enumIt );
+    }
+  }
+  if ( !str.empty() )
+  {
+    str = "\n    //=== " + title + " ===\n" + str;
+  }
+  return str;
+}
+
+std::string VideoHppGenerator::generateStruct( std::pair<std::string, StructureData> const & structData ) const
+{
+  static const std::string structureTemplate = R"(  struct ${structureType}
+  {
+    using NativeType = StdVideo${structureType};
+
+    operator StdVideo${structureType} const &() const VULKAN_HPP_NOEXCEPT
+    {
+      return *reinterpret_cast<const StdVideo${structureType}*>( this );
+    }
+
+    operator StdVideo${structureType} &() VULKAN_HPP_NOEXCEPT
+    {
+      return *reinterpret_cast<StdVideo${structureType}*>( this );
+    }
+${compareOperators}
+    public:
+${members}
+  };
+)";
+
+  return replaceWithMap( structureTemplate,
+                         { { "compareOperators", generateStructCompareOperators( structData ) },
+                           { "members", generateStructMembers( structData ) },
+                           { "structureType", stripPrefix( structData.first, "StdVideo" ) } } );
+}
+
+std::string VideoHppGenerator::generateStructCompareOperators( std::pair<std::string, StructureData> const & structData ) const
+{
+  static const std::set<std::string> simpleTypes = { "char",   "double",  "DWORD",    "float",    "HANDLE",  "HINSTANCE", "HMONITOR",
+                                                     "HWND",   "int",     "int8_t",   "int16_t",  "int32_t", "int64_t",   "LPCWSTR",
+                                                     "size_t", "uint8_t", "uint16_t", "uint32_t", "uint64_t" };
+
+  // two structs are compared by comparing each of the elements
+  std::string compareMembers;
+  std::string intro = "";
+  for ( size_t i = 0; i < structData.second.members.size(); i++ )
+  {
+    MemberData const & member = structData.second.members[i];
+    auto               typeIt = m_types.find( member.type.type );
+    assert( typeIt != m_types.end() );
+    if ( ( typeIt->second.category == TypeCategory::ExternalType ) && member.type.postfix.empty() &&
+         ( simpleTypes.find( member.type.type ) == simpleTypes.end() ) )
+    {
+      // this type might support operator==() or operator<=>()... that is, use memcmp
+      compareMembers += intro + "( memcmp( &" + member.name + ", &rhs." + member.name + ", sizeof( " + member.type.type + " ) ) == 0 )";
+    }
+    else
+    {
+      assert( member.type.type != "char" );
+      // for all others, we use the operator== of that type
+      compareMembers += intro + "( " + member.name + " == rhs." + member.name + " )";
+    }
+    intro = "\n          && ";
+  }
+
+  static const std::string compareTemplate = R"(
+    bool operator==( ${name} const & rhs ) const VULKAN_HPP_NOEXCEPT
+    {
+      return ${compareMembers};
+    }
+
+    bool operator!=( ${name} const & rhs ) const VULKAN_HPP_NOEXCEPT
+    {
+      return !operator==( rhs );
+    }
+)";
+
+  return replaceWithMap( compareTemplate, { { "name", stripPrefix( structData.first, "StdVideo" ) }, { "compareMembers", compareMembers } } );
+}
+
+std::string VideoHppGenerator::generateStructMembers( std::pair<std::string, StructureData> const & structData ) const
+{
+  std::string members;
+  for ( auto const & member : structData.second.members )
+  {
+    members += "    ";
+    std::string type;
+    if ( !member.bitCount.empty() && member.type.type.starts_with( "StdVideo" ) )
+    {
+      assert( member.type.prefix.empty() && member.type.postfix.empty() );  // never encounterd a different case
+      type = member.type.type;
+    }
+    else if ( member.arraySizes.empty() )
+    {
+      type = member.type.compose( "VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE", "StdVideo" );
+    }
+    else
+    {
+      assert( member.type.prefix.empty() && member.type.postfix.empty() );
+      type = generateStandardArrayWrapper( member.type.compose( "VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE" ), member.arraySizes );
+    }
+    members += type + " " + member.name;
+
+    // as we don't have any meaningful default initialization values, everything can be initialized by just '{}' !
+    assert( member.arraySizes.empty() || member.bitCount.empty() );
+    if ( !member.bitCount.empty() )
+    {
+      members += " : " + member.bitCount;  // except for bitfield members, where no default member initialization
+                                           // is supported (up to C++20)
+    }
+    else
+    {
+      members += " = ";
+      auto enumIt = m_enums.find( member.type.type );
+      if ( member.arraySizes.empty() && ( enumIt != m_enums.end() ) && member.type.postfix.empty() )
+      {
+        assert( member.type.prefix.empty() && member.arraySizes.empty() && !enumIt->second.values.empty() );
+
+        std::string prefix    = toUpperCase( member.type.type ) + "_";
+        std::string valueName = "e" + toCamelCase( stripPrefix( enumIt->second.values.front().name, prefix ), true );
+
+        members += type + "::" + valueName;
+      }
+      else
+      {
+        members += "{}";
+      }
+    }
+    members += ";\n";
+  }
+  return members;
+}
+
+std::string VideoHppGenerator::generateStructs() const
+{
+  const std::string structsTemplate = R"(
+  //===============
+  //=== STRUCTS ===
+  //===============
+
+${structs}
+)";
+
+  std::string           structs;
+  for ( auto const & extension : m_extensions )
+  {
+    structs += generateStructs( extension.requireData, extension.name );
+  }
+  return replaceWithMap( structsTemplate, { { "structs", structs } } );
+}
+
+std::string VideoHppGenerator::generateStructs( RequireData const & requireData, std::string const & title ) const
+{
+  std::string str;
+  for ( auto const & type : requireData.types )
+  {
+    auto structIt = m_structs.find( type );
+    if ( structIt != m_structs.end() )
+    {
+      str += "\n" + generateStruct( *structIt );
+    }
+  }
+  if ( !str.empty() )
+  {
+    str = "\n    //=== " + title + " ===\n" + str;
+  }
+  return str;
+}
+
+bool VideoHppGenerator::isExtension( std::string const & name ) const
+{
+  return std::find_if( m_extensions.begin(), m_extensions.end(), [&name]( ExtensionData const & ed ) { return ed.name == name; } ) != m_extensions.end();
+}
+
+void VideoHppGenerator::readEnums( tinyxml2::XMLElement const * element )
+{
+  int                                line       = element->GetLineNum();
+  std::map<std::string, std::string> attributes = getAttributes( element );
+  checkAttributes( line, attributes, { { "name", {} }, { "type", { "enum" } } }, {} );
+  std::vector<tinyxml2::XMLElement const *> children = getChildElements( element );
+  checkElements( line, children, { { "enum", {} } }, { "comment" } );
+
+  std::string name, type;
+  for ( auto const & attribute : attributes )
+  {
+    if ( attribute.first == "name" )
+    {
+      name = attribute.second;
+    }
+    else if ( attribute.first == "type" )
+    {
+      type = attribute.second;
+    }
+  }
+
+  // get the EnumData entry in enum map
+  auto enumIt = m_enums.find( name );
+  checkForError( enumIt != m_enums.end(), line, "enum <" + name + "> is not listed as enum in the types section" );
+  checkForError( enumIt->second.values.empty(), line, "enum <" + name + "> already holds values" );
+
+  // read the names of the enum values
+  for ( auto child : children )
+  {
+    std::string value = child->Value();
+    if ( value == "enum" )
+    {
+      readEnumsEnum( child, enumIt );
+    }
+  }
+}
+
+void VideoHppGenerator::readEnumsEnum( tinyxml2::XMLElement const * element, std::map<std::string, EnumData>::iterator enumIt )
+{
+  int                                line       = element->GetLineNum();
+  std::map<std::string, std::string> attributes = getAttributes( element );
+  checkAttributes( line, attributes, { { "name", {} }, { "value", {} } }, { { "comment", {} } } );
+  checkElements( line, getChildElements( element ), {} );
+
+  std::string name, value;
+  for ( auto const & attribute : attributes )
+  {
+    if ( attribute.first == "name" )
+    {
+      name = attribute.second;
+    }
+    else if ( attribute.first == "value" )
+    {
+      value = attribute.second;
+    }
+  }
+
+  std::string prefix = toUpperCase( enumIt->first ) + "_";
+  checkForError( name.starts_with( prefix ), line, "encountered enum value <" + name + "> that does not begin with expected prefix <" + prefix + ">" );
+
+  checkForError( std::find_if( enumIt->second.values.begin(),
+                               enumIt->second.values.end(),
+                               [&name]( EnumValueData const & evd ) { return evd.name == name; } ) == enumIt->second.values.end(),
+                 line,
+                 "enum value <" + name + "> already part of enum <" + enumIt->first + ">" );
+  enumIt->second.values.push_back( { name, value, line } );
+}
+
+void VideoHppGenerator::readExtension( tinyxml2::XMLElement const * element )
+{
+  int                                       line       = element->GetLineNum();
+  std::map<std::string, std::string>        attributes = getAttributes( element );
+  std::vector<tinyxml2::XMLElement const *> children   = getChildElements( element );
+
+  checkAttributes( line, attributes, { { "name", {} }, { "comment", {} }, { "supported", { "vulkan" } } }, {} );
+  checkElements( line, children, { { "require", false } } );
+
+  ExtensionData extensionData{ .xmlLine = line };
+  std::string   supported;
+  for ( auto const & attribute : attributes )
+  {
+    if ( attribute.first == "name" )
+    {
+      extensionData.name = attribute.second;
+      checkForError( !isExtension( extensionData.name ), line, "already encountered extension <" + extensionData.name + ">" );
+    }
+    else if ( attribute.first == "supported" )
+    {
+      supported = attribute.second;
+    }
+  }
+  checkForError( supported == "vulkan", line, "extension <" + extensionData.name + "> has unknown supported type <" + supported + ">" );
+
+  for ( auto child : children )
+  {
+    const std::string value = child->Value();
+    assert( value == "require" );
+    readExtensionRequire( child, extensionData );
+  }
+
+  m_extensions.push_back( extensionData );
+}
+
+void VideoHppGenerator::readExtensionRequire( tinyxml2::XMLElement const * element, ExtensionData & extensionData )
+{
+  int                                line       = element->GetLineNum();
+  std::map<std::string, std::string> attributes = getAttributes( element );
+  checkAttributes( line, attributes, {}, {} );
+  std::vector<tinyxml2::XMLElement const *> children = getChildElements( element );
+  checkElements( line, children, {}, { "enum", "type" } );
+
+  extensionData.requireData.xmlLine = line;
+
+  for ( auto child : children )
+  {
+    std::string value = child->Value();
+    if ( value == "enum" )
+    {
+      readRequireEnum( child, extensionData.requireData.constants );
+    }
+    else if ( value == "type" )
+    {
+      readRequireType( child, extensionData );
+    }
+  }
+  assert( !extensionData.requireData.types.empty() );
+}
+
+void VideoHppGenerator::readExtensions( tinyxml2::XMLElement const * element )
+{
+  int line = element->GetLineNum();
+  checkAttributes( line, getAttributes( element ), {}, {} );
+  std::vector<tinyxml2::XMLElement const *> children = getChildElements( element );
+  checkElements( line, children, { { "extension", false } } );
+
+  for ( auto child : children )
+  {
+    const std::string value = child->Value();
+    assert( value == "extension" );
+    readExtension( child );
+  }
+}
+
+void VideoHppGenerator::readRegistry( tinyxml2::XMLElement const * element )
+{
+  int line = element->GetLineNum();
+  checkAttributes( line, getAttributes( element ), {}, {} );
+
+  std::vector<tinyxml2::XMLElement const *> children = getChildElements( element );
+  checkElements( line, children, { { "comment", false }, { "enums", false }, { "extensions", true }, { "types", true } } );
+  for ( auto child : children )
+  {
+    const std::string value = child->Value();
+    if ( value == "comment" )
+    {
+      std::string comment = readComment( child );
+      if ( comment.find( "\nCopyright" ) == 0 )
+      {
+        m_copyrightMessage = generateCopyrightMessage( comment );
+      }
+    }
+    else if ( value == "enums" )
+    {
+      readEnums( child );
+    }
+    else if ( value == "extensions" )
+    {
+      readExtensions( child );
+    }
+    else
+    {
+      assert( value == "types" );
+      readTypes( child );
+    }
+  }
+  checkForError( !m_copyrightMessage.empty(), -1, "missing copyright message" );
+}
+
+void VideoHppGenerator::readRequireEnum( tinyxml2::XMLElement const * element, std::map<std::string, ConstantData> & constants )
+{
+  int                                line       = element->GetLineNum();
+  std::map<std::string, std::string> attributes = getAttributes( element );
+  checkElements( line, getChildElements( element ), {} );
+  checkAttributes( line, attributes, { { "name", {} }, { "value", {} } }, {} );
+
+  std::string name, value;
+  for ( auto const & attribute : attributes )
+  {
+    if ( attribute.first == "name" )
+    {
+      name = attribute.second;
+    }
+    else if ( attribute.first == "value" )
+    {
+      value = attribute.second;
+    }
+  }
+
+  if ( !name.ends_with( "_SPEC_VERSION" ) && !name.ends_with( "_EXTENSION_NAME" ) )
+  {
+    checkForError( value.find_first_not_of( "0123456789" ) == std::string::npos, line, "enum value uses unknown constant <" + value + ">" );
+    checkForError( constants.insert( { name, { value, line } } ).second, line, "required enum <" + name + "> already specified" );
+  }
+}
+
+void VideoHppGenerator::readRequireType( tinyxml2::XMLElement const * element, ExtensionData & extensionData )
+{
+  int                                line       = element->GetLineNum();
+  std::map<std::string, std::string> attributes = getAttributes( element );
+  checkAttributes( line, attributes, { { "name", {} } }, { { "comment", {} } } );
+  checkElements( line, getChildElements( element ), {} );
+
+  std::string name = attributes.find( "name" )->second;
+  if ( name.starts_with( "vk_video/vulkan_video_codec" ) && name.ends_with( ".h" ) )
+  {
+    checkForError( extensionData.depends.empty(), line, "extension <" + extensionData.name + "> already depends on <" + extensionData.name + ">" );
+    extensionData.depends = stripPrefix( stripPostfix( name, ".h" ), "vk_video/" );
+    checkForError( isExtension( extensionData.depends ), line, "extension <" + extensionData.name + "> uses unknown header <" + name + ">" );
+  }
+  else
+  {
+    auto typeIt = m_types.find( name );
+    checkForError( typeIt != m_types.end(), line, "unknown required type <" + name + ">" );
+    typeIt->second.requiredBy.insert( extensionData.name );
+    extensionData.requireData.types.push_back( name );
+  }
+}
+
+void VideoHppGenerator::readStructMember( tinyxml2::XMLElement const * element, std::vector<MemberData> & members )
+{
+  (void)members;
+  int                                line       = element->GetLineNum();
+  std::map<std::string, std::string> attributes = getAttributes( element );
+  checkAttributes( line, attributes, {}, {} );
+  std::vector<tinyxml2::XMLElement const *> children = getChildElements( element );
+  checkElements( line, children, { { "name", true }, { "type", true } }, { "comment", "enum" } );
+
+  MemberData memberData;
+  memberData.xmlLine = line;
+
+  std::string name;
+  for ( auto child : children )
+  {
+    int childLine = child->GetLineNum();
+    checkAttributes( childLine, getAttributes( child ), {}, {} );
+    checkElements( childLine, getChildElements( child ), {}, {} );
+
+    std::string value = child->Value();
+    if ( value == "enum" )
+    {
+      std::string enumString = child->GetText();
+
+      checkForError( child->PreviousSibling() && child->NextSibling(), line, "struct member array specification is ill-formatted: <" + enumString + ">" );
+      std::string previous = child->PreviousSibling()->Value();
+      std::string next     = child->NextSibling()->Value();
+      checkForError( previous.ends_with( "[" ) && next.starts_with( "]" ), line, "struct member array specification is ill-formatted: <" + enumString + ">" );
+
+      memberData.arraySizes.push_back( enumString );
+    }
+    else if ( value == "name" )
+    {
+      name                                                   = child->GetText();
+      std::tie( memberData.arraySizes, memberData.bitCount ) = readModifiers( child->NextSibling() );
+    }
+    else if ( value == "type" )
+    {
+      memberData.type = readTypeInfo( child );
+    }
+  }
+  assert( !name.empty() );
+
+  checkForError( std::find_if( members.begin(), members.end(), [&name]( MemberData const & md ) { return md.name == name; } ) == members.end(),
+                 line,
+                 "struct member name <" + name + "> already used" );
+  memberData.name = name;
+  members.push_back( memberData );
+}
+
+void VideoHppGenerator::readTypeDefine( tinyxml2::XMLElement const * element, std::map<std::string, std::string> const & attributes )
+{
+  int line = element->GetLineNum();
+  checkAttributes( line, attributes, { { "category", { "define" } } }, { { "requires", {} } } );
+  std::vector<tinyxml2::XMLElement const *> children = getChildElements( element );
+  checkElements( line, children, { { "name", false } }, { "type" } );
+
+  std::string require;
+  for ( auto const & attribute : attributes )
+  {
+    if ( attribute.first == "requires" )
+    {
+      require = attribute.second;
+    }
+  }
+
+  std::string name, type;
+  for ( auto child : children )
+  {
+    const std::string value = child->Value();
+    if ( value == "name" )
+    {
+      name = child->GetText();
+    }
+    else if ( value == "type" )
+    {
+      type = child->GetText();
+    }
+  }
+  checkForError( require.empty() || ( m_defines.find( require ) != m_defines.end() ), line, "define <" + name + "> requires unknown type <" + require + ">" );
+  checkForError( type.empty() || ( m_defines.find( type ) != m_defines.end() ), line, "define <" + name + "> of unknown type <" + type + ">" );
+
+  checkForError( m_types.insert( { name, TypeData{ TypeCategory::Define, {}, line } } ).second, line, "define <" + name + "> already specified" );
+  assert( m_defines.find( name ) == m_defines.end() );
+  m_defines[name] = { require, line };
+}
+
+void VideoHppGenerator::readTypeEnum( tinyxml2::XMLElement const * element, std::map<std::string, std::string> const & attributes )
+{
+  int line = element->GetLineNum();
+  checkAttributes( line, attributes, { { "category", { "enum" } }, { "name", {} } }, {} );
+  checkElements( line, getChildElements( element ), {} );
+
+  std::string name;
+  for ( auto const & attribute : attributes )
+  {
+    if ( attribute.first == "name" )
+    {
+      name = attribute.second;
+    }
+  }
+
+  checkForError( m_types.insert( { name, TypeData{ TypeCategory::Enum, {}, line } } ).second, line, "enum <" + name + "> already specified" );
+  assert( m_enums.find( name ) == m_enums.end() );
+  m_enums[name] = EnumData{ .xmlLine = line };
+}
+
+void VideoHppGenerator::readTypeInclude( tinyxml2::XMLElement const * element, std::map<std::string, std::string> const & attributes )
+{
+  int line = element->GetLineNum();
+  checkAttributes( line, attributes, { { "category", { "include" } }, { "name", {} } }, {} );
+  checkElements( line, getChildElements( element ), {} );
+
+  std::string name = attributes.find( "name" )->second;
+  checkForError( m_types.insert( { name, TypeData{ TypeCategory::Include, {}, line } } ).second, line, "type <" + name + "> already specified" );
+  assert( m_includes.find( name ) == m_includes.end() );
+  m_includes[name] = { line };
+}
+
+void VideoHppGenerator::readTypeRequires( tinyxml2::XMLElement const * element, std::map<std::string, std::string> const & attributes )
+{
+  int line = element->GetLineNum();
+  checkAttributes( line, attributes, { { "name", {} }, { "requires", {} } }, {} );
+  checkElements( line, getChildElements( element ), {} );
+
+  std::string name, require;
+  for ( auto attribute : attributes )
+  {
+    if ( attribute.first == "name" )
+    {
+      name = attribute.second;
+    }
+    else
+    {
+      assert( attribute.first == "requires" );
+      require = attribute.second;
+    }
+  }
+
+  checkForError( m_includes.find( require ) != m_includes.end(), line, "type <" + name + "> requires unknown <" + require + ">" );
+  checkForError( m_types.insert( { name, TypeData{ TypeCategory::ExternalType, {}, line } } ).second, line, "type <" + name + "> already specified" );
+  assert( m_externalTypes.find( name ) == m_externalTypes.end() );
+  m_externalTypes[name] = { require, line };
+}
+
+void VideoHppGenerator::readTypes( tinyxml2::XMLElement const * element )
+{
+  int line = element->GetLineNum();
+  checkAttributes( line, getAttributes( element ), { { "comment", {} } }, {} );
+  std::vector<tinyxml2::XMLElement const *> children = getChildElements( element );
+  checkElements( line, children, { { "type", false } } );
+
+  for ( auto child : children )
+  {
+    std::string value = child->Value();
+    if ( value == "type" )
+    {
+      readTypesType( child );
+    }
+  }
+}
+
+void VideoHppGenerator::readTypeStruct( tinyxml2::XMLElement const * element, std::map<std::string, std::string> const & attributes )
+{
+  int line = element->GetLineNum();
+  checkAttributes( line, attributes, { { "category", { "struct" } }, { "name", {} } }, { { "comment", {} }, { "requires", {} } } );
+  std::vector<tinyxml2::XMLElement const *> children = getChildElements( element );
+  checkElements( line, children, { { "member", false } }, { "comment" } );
+
+  StructureData structureData{ .xmlLine = line };
+
+  std::string name, require;
+  for ( auto const & attribute : attributes )
+  {
+    if ( attribute.first == "name" )
+    {
+      name = attribute.second;
+    }
+    else if ( attribute.first == "requires" )
+    {
+      require = attribute.second;
+    }
+  }
+  assert( !name.empty() );
+  checkForError( require.empty() || ( m_types.find( require ) != m_types.end() ), line, "struct <" + name + "> requires unknown type <" + require + ">" );
+
+  checkForError( m_types.insert( { name, TypeData{ TypeCategory::Struct, {}, line } } ).second, line, "struct <" + name + "> already specified" );
+  assert( m_structs.find( name ) == m_structs.end() );
+
+  std::map<std::string, StructureData>::iterator it = m_structs.insert( std::make_pair( name, structureData ) ).first;
+
+  for ( auto child : children )
+  {
+    std::string value = child->Value();
+    if ( value == "member" )
+    {
+      readStructMember( child, it->second.members );
+    }
+  }
+}
+
+void VideoHppGenerator::readTypesType( tinyxml2::XMLElement const * element )
+{
+  int                                line       = element->GetLineNum();
+  std::map<std::string, std::string> attributes = getAttributes( element );
+
+  auto categoryIt = attributes.find( "category" );
+  if ( categoryIt != attributes.end() )
+  {
+    if ( categoryIt->second == "define" )
+    {
+      readTypeDefine( element, attributes );
+    }
+    else if ( categoryIt->second == "enum" )
+    {
+      readTypeEnum( element, attributes );
+    }
+    else if ( categoryIt->second == "include" )
+    {
+      readTypeInclude( element, attributes );
+    }
+    else if ( categoryIt->second == "struct" )
+    {
+      readTypeStruct( element, attributes );
+    }
+    else
+    {
+      checkForError( false, line, "unknown category <" + categoryIt->second + "> encountered" );
+    }
+  }
+  else
+  {
+    auto requiresIt = attributes.find( "requires" );
+    if ( requiresIt != attributes.end() )
+    {
+      readTypeRequires( element, attributes );
+    }
+    else
+    {
+      checkForError( ( attributes.size() == 1 ) && ( attributes.begin()->first == "name" ) && ( attributes.begin()->second == "int" ), line, "unknown type" );
+      checkForError( m_types.insert( { "int", TypeData{ TypeCategory::Unknown, {}, line } } ).second, line, "type <int> already specified" );
+    }
+  }
+}
+
+void VideoHppGenerator::sortStructs()
+{
+  for ( auto & ext : m_extensions )
+  {
+    for ( auto reqIt = ext.requireData.types.begin(); reqIt != ext.requireData.types.end(); ++reqIt )
+    {
+      std::string name   = *reqIt;
+      auto        typeIt = m_types.find( *reqIt );
+      if ( ( typeIt != m_types.end() ) && ( typeIt->second.category == TypeCategory::Struct ) )
+      {
+        auto structIt = m_structs.find( typeIt->first );
+        assert( structIt != m_structs.end() );
+        for ( auto const & member : structIt->second.members )
+        {
+          auto memberTypeIt = m_types.find( member.type.type );
+          assert( memberTypeIt != m_types.end() );
+          if ( ( memberTypeIt->second.category == TypeCategory::Struct ) && ( std::find( ext.requireData.types.begin(), reqIt, member.type.type ) == reqIt ) )
+          {
+            auto it = std::find( std::next( reqIt ), ext.requireData.types.end(), member.type.type );
+            if ( it != ext.requireData.types.end() )
+            {
+              ext.requireData.types.erase( it );
+              reqIt = std::next( ext.requireData.types.insert( reqIt, member.type.type ) );
+            }
+#if !defined(NDEBUG)
+            else
+            {
+              auto depIt = std::find_if( m_extensions.begin(), m_extensions.end(), [&ext]( ExtensionData const & ed ) { return ed.name == ext.depends; } );
+              assert( ( depIt != m_extensions.end() ) &&
+                      ( std::find( depIt->requireData.types.begin(), depIt->requireData.types.end(), member.type.type ) != depIt->requireData.types.end() ) );
+            }
+#endif
+          }
+        }
+      }
+    }
+  }
+}
+
+int main( int argc, char ** argv )
+{
+  if ( ( argc % 2 ) == 0 )
+  {
+    std::cout << "VideoHppGenerator usage: VideoHppGenerator [-f filename]" << std::endl;
+    std::cout << "\tdefault for filename is <" << VIDEO_SPEC << ">" << std::endl;
+    return -1;
+  }
+
+  std::string filename = VIDEO_SPEC;
+  for ( int i = 1; i < argc; i += 2 )
+  {
+    if ( strcmp( argv[i], "-f" ) == 0 )
+    {
+      filename = argv[i + 1];
+    }
+    else
+    {
+      std::cout << "unsupported argument <" << argv[i] << ">" << std::endl;
+      return -1;
+    }
+  }
+
+#if defined( CLANG_FORMAT_EXECUTABLE )
+  std::cout << "VideoHppGenerator: Found ";
+  std::string commandString = "\"" CLANG_FORMAT_EXECUTABLE "\" --version ";
+  int         ret           = std::system( commandString.c_str() );
+  if ( ret != 0 )
+  {
+    std::cout << "VideoHppGenerator: failed to determine clang_format version with error <" << ret << ">\n";
+  }
+#endif
+
+  tinyxml2::XMLDocument doc;
+  std::cout << "VideoHppGenerator: Loading " << filename << std::endl;
+  tinyxml2::XMLError error = doc.LoadFile( filename.c_str() );
+  if ( error != tinyxml2::XML_SUCCESS )
+  {
+    std::cout << "VideoHppGenerator: failed to load file " << filename << " with error <" << toString( error ) << ">" << std::endl;
+    return -1;
+  }
+
+  try
+  {
+    std::cout << "VideoHppGenerator: Parsing " << filename << std::endl;
+    VideoHppGenerator generator( doc );
+
+    generator.generateHppFile();
+
+#  if !defined( CLANG_FORMAT_EXECUTABLE )
+    std::cout << "VideoHppGenerator: could not find clang-format. The generated files will not be formatted accordingly.\n";
+#  endif
+  }
+  catch ( std::exception const & e )
+  {
+    std::cout << "caught exception: " << e.what() << std::endl;
+    return -1;
+  }
+  catch ( ... )
+  {
+    std::cout << "caught unknown exception" << std::endl;
+    return -1;
+  }
+  return 0;
+}
diff --git a/VideoHppGenerator.hpp b/VideoHppGenerator.hpp
new file mode 100644 (file)
index 0000000..11fcbb3
--- /dev/null
@@ -0,0 +1,127 @@
+// Copyright(c) 2023, NVIDIA CORPORATION. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#pragma once
+
+#include "XMLHelper.hpp"
+
+#include <map>
+#include <string>
+#include <tinyxml2.h>
+
+class VideoHppGenerator
+{
+public:
+  VideoHppGenerator( tinyxml2::XMLDocument const & document );
+
+  void generateHppFile() const;
+
+private:
+  struct ConstantData
+  {
+    std::string value   = {};
+    int         xmlLine = {};
+  };
+
+  struct DefineData
+  {
+    std::string require = {};
+    int         xmlLine = {};
+  };
+
+  struct EnumValueData
+  {
+    std::string name    = {};
+    std::string value   = {};
+    int         xmlLine = {};
+  };
+
+  struct EnumData
+  {
+    std::vector<EnumValueData> values  = {};
+    int                        xmlLine = {};
+  };
+
+  struct RequireData
+  {
+    std::map<std::string, ConstantData> constants = {};
+    std::vector<std::string>            types     = {};
+    int                                 xmlLine   = {};
+  };
+
+  struct ExtensionData
+  {
+    std::string depends     = {};
+    std::string name        = {};
+    RequireData requireData = {};
+    int         xmlLine     = 0;
+  };
+
+  struct MemberData
+  {
+    TypeInfo                 type       = {};
+    std::string              name       = {};
+    std::vector<std::string> arraySizes = {};
+    std::string              bitCount   = {};
+    int                      xmlLine    = {};
+  };
+
+  struct StructureData
+  {
+    std::vector<MemberData> members = {};
+    int                     xmlLine = {};
+  };
+
+private:
+  void addImplicitlyRequiredTypes();
+  std::vector<std::string>::iterator
+       addImplicitlyRequiredTypes( std::map<std::string, TypeData>::iterator typeIt, ExtensionData & extensionData, std::vector<std::string>::iterator reqIt );
+  void checkCorrectness() const;
+  std::string generateEnum( std::pair<std::string, EnumData> const & enumData ) const;
+  std::string generateEnums() const;
+  std::string generateEnums( RequireData const & requireData, std::string const & title ) const;
+  std::string generateStruct( std::pair<std::string, StructureData> const & structData ) const;
+  std::string generateStructCompareOperators( std::pair<std::string, StructureData> const & structData ) const;
+  std::string generateStructMembers( std::pair<std::string, StructureData> const & structData ) const;
+  std::string generateStructs() const;
+  std::string generateStructs( RequireData const & requireData, std::string const & title ) const;
+  bool        isExtension( std::string const & name ) const;
+  void        readEnums( tinyxml2::XMLElement const * element );
+  void        readEnumsEnum( tinyxml2::XMLElement const * element, std::map<std::string, EnumData>::iterator enumIt );
+  void        readExtension( tinyxml2::XMLElement const * element );
+  void        readExtensionRequire( tinyxml2::XMLElement const * element, ExtensionData & extensionData );
+  void        readExtensions( tinyxml2::XMLElement const * element );
+  void        readRegistry( tinyxml2::XMLElement const * element );
+  void        readRequireEnum( tinyxml2::XMLElement const * element, std::map<std::string, ConstantData> & constants );
+  void        readRequireType( tinyxml2::XMLElement const * element, ExtensionData & extensionData );
+  void        readStructMember( tinyxml2::XMLElement const * element, std::vector<MemberData> & members );
+  void        readTypeDefine( tinyxml2::XMLElement const * element, std::map<std::string, std::string> const & attributes );
+  void        readTypeEnum( tinyxml2::XMLElement const * element, std::map<std::string, std::string> const & attributes );
+  void        readTypeInclude( tinyxml2::XMLElement const * element, std::map<std::string, std::string> const & attributes );
+  void        readTypeRequires( tinyxml2::XMLElement const * element, std::map<std::string, std::string> const & attributes );
+  void        readTypes( tinyxml2::XMLElement const * element );
+  void        readTypeStruct( tinyxml2::XMLElement const * element, std::map<std::string, std::string> const & attributes );
+  void        readTypesType( tinyxml2::XMLElement const * element );
+  void        sortStructs();
+
+private:
+  std::string                             m_copyrightMessage;
+  std::map<std::string, DefineData>       m_defines;
+  std::map<std::string, EnumData>         m_enums;
+  std::vector<ExtensionData>              m_extensions;
+  std::map<std::string, ExternalTypeData> m_externalTypes;
+  std::map<std::string, IncludeData>      m_includes;
+  std::map<std::string, StructureData>    m_structs;
+  std::map<std::string, TypeData>         m_types;
+};
\ No newline at end of file
index 678c1b2..3a996e5 100644 (file)
@@ -14,6 +14,8 @@
 
 #include "VulkanHppGenerator.hpp"
 
+#include "XMLHelper.hpp"
+
 #include <algorithm>
 #include <array>
 #include <cassert>
@@ -33,10 +35,6 @@ void                                        checkAttributes( int
                                                              std::map<std::string, std::string> const &           attributes,
                                                              std::map<std::string, std::set<std::string>> const & required,
                                                              std::map<std::string, std::set<std::string>> const & optional );
-void                                        checkElements( int                                               line,
-                                                           std::vector<tinyxml2::XMLElement const *> const & elements,
-                                                           std::map<std::string, bool> const &               required,
-                                                           std::set<std::string> const &                     optional = {} );
 void                                        checkForError( bool condition, int line, std::string const & message );
 void                                        checkForWarning( bool condition, int line, std::string const & message );
 std::vector<std::pair<std::string, size_t>> filterNumbers( std::vector<std::string> const & names );
@@ -56,7 +54,6 @@ std::string                                      startLowerCase( std::string con
 std::string                                      startUpperCase( std::string const & input );
 std::string                                      stripPostfix( std::string const & value, std::string const & postfix );
 std::string                                      stripPrefix( std::string const & value, std::string const & prefix );
-std::string                                      toCamelCase( std::string const & value );
 std::string                                      toUpperCase( std::string const & name );
 std::vector<std::string>                         tokenize( std::string const & tokenString, std::string const & separator );
 std::vector<std::string>                         tokenizeAny( std::string const & tokenString, std::string const & separators );
@@ -1488,11 +1485,11 @@ void VulkanHppGenerator::checkStructMemberCorrectness( std::string const &
     checkForError( m_types.find( member.type.type ) != m_types.end(), member.xmlLine, "struct member uses unknown type <" + member.type.type + ">" );
 
     // check that any used constant is a known constant
-    if ( !member.usedConstant.empty() )
+    for ( auto const & arraySize : member.arraySizes )
     {
-      checkForError( m_constants.find( member.usedConstant ) != m_constants.end(),
+      checkForError( ( arraySize.find_first_not_of( "0123456789" ) == std::string::npos ) || ( m_constants.find( arraySize ) != m_constants.end() ),
                      member.xmlLine,
-                     "struct member array size uses unknown constant <" + member.usedConstant + ">" );
+                     "struct member array size uses unknown constant <" + arraySize + ">" );
     }
 
     // checks if a value is specified
@@ -12614,15 +12611,6 @@ void VulkanHppGenerator::readEnumsEnum( tinyxml2::XMLElement const * element, st
   }
 }
 
-std::string VulkanHppGenerator::readComment( tinyxml2::XMLElement const * element )
-{
-  int line = element->GetLineNum();
-  checkAttributes( line, getAttributes( element ), {}, {} );
-  checkElements( line, getChildElements( element ), {} );
-
-  return element->GetText();
-}
-
 void VulkanHppGenerator::readExtensionRequire( tinyxml2::XMLElement const * element, ExtensionData & extensionData, bool extensionSupported )
 {
   int                                line       = element->GetLineNum();
@@ -13188,7 +13176,7 @@ std::string VulkanHppGenerator::readName( tinyxml2::XMLElement const * element )
   return attributes.find( "name" )->second;
 }
 
-std::pair<VulkanHppGenerator::NameData, VulkanHppGenerator::TypeInfo> VulkanHppGenerator::readNameAndType( tinyxml2::XMLElement const * element )
+std::pair<VulkanHppGenerator::NameData, TypeInfo> VulkanHppGenerator::readNameAndType( tinyxml2::XMLElement const * element )
 {
   int                                       line     = element->GetLineNum();
   std::vector<tinyxml2::XMLElement const *> children = getChildElements( element );
@@ -13301,7 +13289,7 @@ void VulkanHppGenerator::readRegistry( tinyxml2::XMLElement const * element )
       std::string comment = readComment( child );
       if ( comment.find( "\nCopyright" ) == 0 )
       {
-        setVulkanLicenseHeader( child->GetLineNum(), comment );
+        m_vulkanLicenseHeader = generateCopyrightMessage( comment );
       }
     }
     else if ( value == "enums" )
@@ -13834,8 +13822,6 @@ void VulkanHppGenerator::readStructMember( tinyxml2::XMLElement const * element,
                      std::string( "struct member array specifiation is ill-formatted: <" ) + enumString + ">" );
 
       memberData.arraySizes.push_back( enumString );
-      checkForError( memberData.usedConstant.empty(), line, "struct already holds a constant <" + memberData.usedConstant + ">" );
-      memberData.usedConstant = enumString;
     }
     else if ( value == "name" )
     {
@@ -14713,7 +14699,7 @@ void VulkanHppGenerator::readTypesType( tinyxml2::XMLElement const * element )
   }
 }
 
-VulkanHppGenerator::TypeInfo VulkanHppGenerator::readTypeInfo( tinyxml2::XMLElement const * element ) const
+TypeInfo VulkanHppGenerator::readTypeInfo( tinyxml2::XMLElement const * element ) const
 {
   TypeInfo                  typeInfo;
   tinyxml2::XMLNode const * previousSibling = element->PreviousSibling();
@@ -14807,24 +14793,6 @@ std::vector<std::string> VulkanHppGenerator::selectCommandsByHandle( std::vector
   return selectedCommands;
 }
 
-void VulkanHppGenerator::setVulkanLicenseHeader( int line, std::string const & comment )
-{
-  checkForError( m_vulkanLicenseHeader.empty(), line, "second encounter of a Copyright comment" );
-  m_vulkanLicenseHeader = comment;
-
-  // replace any '\n' with "\n// "
-  for ( size_t pos = m_vulkanLicenseHeader.find( '\n' ); pos != std::string::npos; pos = m_vulkanLicenseHeader.find( '\n', pos + 1 ) )
-  {
-    m_vulkanLicenseHeader.replace( pos, 1, "\n// " );
-  }
-  // remove any trailing spaces
-  m_vulkanLicenseHeader = trimEnd( m_vulkanLicenseHeader );
-
-  // and add a little message on our own
-  m_vulkanLicenseHeader += "\n\n// This header is generated from the Khronos Vulkan XML API Registry.";
-  m_vulkanLicenseHeader = trim( m_vulkanLicenseHeader ) + "\n";
-}
-
 bool VulkanHppGenerator::skipLeadingGrandParent( std::pair<std::string, HandleData> const & handle ) const
 {
   bool skip = false;
@@ -14926,107 +14894,10 @@ void VulkanHppGenerator::EnumData::addEnumValue(
   }
 }
 
-std::string VulkanHppGenerator::TypeInfo::compose( std::string const & nameSpace ) const
-{
-  return prefix + ( prefix.empty() ? "" : " " ) +
-         ( nameSpace.empty() ? type : ( ( ( type.substr( 0, 2 ) == "Vk" ) ? ( nameSpace + "::" ) : "" ) + stripPrefix( type, "Vk" ) ) ) +
-         ( postfix.empty() ? "" : " " ) + postfix;
-}
-
 //
 // VulkanHppGenerator local functions
 //
 
-// check the validity of an attributes map
-// line       : the line in the xml file where the attributes are listed
-// attributes : the map of name/value pairs of the encountered attributes
-// required   : the required attributes, with a set of allowed values per attribute
-// optional   : the optional attributes, with a set of allowed values per attribute
-void checkAttributes( int                                                  line,
-                      std::map<std::string, std::string> const &           attributes,
-                      std::map<std::string, std::set<std::string>> const & required,
-                      std::map<std::string, std::set<std::string>> const & optional )
-{
-  // check if all required attributes are included and if there is a set of allowed values, check if the actual
-  // value is part of that set
-  for ( auto const & r : required )
-  {
-    auto attributesIt = attributes.find( r.first );
-    checkForError( attributesIt != attributes.end(), line, "missing attribute <" + r.first + ">" );
-    if ( !r.second.empty() )
-    {
-      std::vector<std::string> values = tokenize( attributesIt->second, "," );
-      for ( auto const & v : values )
-      {
-        checkForError( r.second.find( v ) != r.second.end(), line, "unexpected attribute value <" + v + "> in attribute <" + attributesIt->first + ">" );
-      }
-    }
-  }
-  // check if all not required attributes or optional, and if there is a set of allowed values, check if the
-  // actual value is part of that set
-  for ( auto const & a : attributes )
-  {
-    if ( required.find( a.first ) == required.end() )
-    {
-      auto optionalIt = optional.find( a.first );
-      if ( optionalIt == optional.end() )
-      {
-        checkForWarning( false, line, "unknown attribute <" + a.first + ">" );
-        continue;
-      }
-      if ( !optionalIt->second.empty() )
-      {
-        std::vector<std::string> values = tokenize( a.second, "," );
-        for ( auto const & v : values )
-        {
-          checkForWarning(
-            optionalIt->second.find( v ) != optionalIt->second.end(), line, "unexpected attribute value <" + v + "> in attribute <" + a.first + ">" );
-        }
-      }
-    }
-  }
-}
-
-void checkElements( int                                               line,
-                    std::vector<tinyxml2::XMLElement const *> const & elements,
-                    std::map<std::string, bool> const &               required,
-                    std::set<std::string> const &                     optional )
-{
-  std::map<std::string, size_t> encountered;
-  for ( auto const & e : elements )
-  {
-    std::string value = e->Value();
-    encountered[value]++;
-    checkForWarning(
-      ( required.find( value ) != required.end() ) || ( optional.find( value ) != optional.end() ), e->GetLineNum(), "unknown element <" + value + ">" );
-  }
-  for ( auto const & r : required )
-  {
-    auto encounteredIt = encountered.find( r.first );
-    checkForError( encounteredIt != encountered.end(), line, "missing required element <" + r.first + ">" );
-    // check: r.second (means: required excactly once) => (encouteredIt->second == 1)
-    checkForError( !r.second || ( encounteredIt->second == 1 ),
-                   line,
-                   "required element <" + r.first + "> is supposed to be listed exactly once, but is listed " + std::to_string( encounteredIt->second ) );
-  }
-}
-
-void checkForError( bool condition, int line, std::string const & message )
-{
-  if ( !condition )
-  {
-    throw std::runtime_error( "VulkanHppGenerator: Spec error on line " + std::to_string( line ) + ": " + message );
-  }
-}
-
-void checkForWarning( bool condition, int line, std::string const & message )
-{
-  if ( !condition )
-  {
-    std::cerr << "VulkanHppGenerator: Spec warning on line " << std::to_string( line ) << ": " << message << "!" << std::endl;
-  }
-}
-
 std::vector<std::pair<std::string, size_t>> filterNumbers( std::vector<std::string> const & names )
 {
   std::vector<std::pair<std::string, size_t>> filteredNames;
@@ -15070,78 +14941,11 @@ std::string generateStandardArray( std::string const & type, std::vector<std::st
   return arrayString;
 }
 
-std::string generateStandardArrayWrapper( std::string const & type, std::vector<std::string> const & sizes )
-{
-  std::string arrayString = "VULKAN_HPP_NAMESPACE::ArrayWrapper" + std::to_string( sizes.size() ) + "D<" + type;
-  for ( auto const & size : sizes )
-  {
-    arrayString += ", " + size;
-  }
-  arrayString += ">";
-  return arrayString;
-}
-
-std::map<std::string, std::string> getAttributes( tinyxml2::XMLElement const * element )
-{
-  std::map<std::string, std::string> attributes;
-  for ( auto attribute = element->FirstAttribute(); attribute; attribute = attribute->Next() )
-  {
-    assert( attributes.find( attribute->Name() ) == attributes.end() );
-    attributes[attribute->Name()] = attribute->Value();
-  }
-  return attributes;
-}
-
-template <typename ElementContainer>
-std::vector<tinyxml2::XMLElement const *> getChildElements( ElementContainer const * element )
-{
-  std::vector<tinyxml2::XMLElement const *> childElements;
-  for ( tinyxml2::XMLElement const * childElement = element->FirstChildElement(); childElement; childElement = childElement->NextSiblingElement() )
-  {
-    childElements.push_back( childElement );
-  }
-  return childElements;
-}
-
 bool isNumber( std::string const & name )
 {
   return name.find_first_not_of( "0123456789" ) == std::string::npos;
 }
 
-std::pair<std::vector<std::string>, std::string> readModifiers( tinyxml2::XMLNode const * node )
-{
-  std::vector<std::string> arraySizes;
-  std::string              bitCount;
-  if ( node && node->ToText() )
-  {
-    // following the name there might be some array size
-    std::string value = node->Value();
-    assert( !value.empty() );
-    if ( value[0] == '[' )
-    {
-      std::string::size_type endPos = 0;
-      while ( endPos + 1 != value.length() )
-      {
-        std::string::size_type startPos = value.find( '[', endPos );
-        checkForError( startPos != std::string::npos, node->GetLineNum(), "could not find '[' in <" + value + ">" );
-        endPos = value.find( ']', startPos );
-        checkForError( endPos != std::string::npos, node->GetLineNum(), "could not find ']' in <" + value + ">" );
-        checkForError( startPos + 2 <= endPos, node->GetLineNum(), "missing content between '[' and ']' in <" + value + ">" );
-        arraySizes.push_back( value.substr( startPos + 1, endPos - startPos - 1 ) );
-      }
-    }
-    else if ( value[0] == ':' )
-    {
-      bitCount = value.substr( 1 );
-    }
-    else
-    {
-      checkForError( ( value[0] == ';' ) || ( value[0] == ')' ), node->GetLineNum(), "unknown modifier <" + value + ">" );
-    }
-  }
-  return std::make_pair( arraySizes, bitCount );
-}
-
 std::string readSnippet( std::string const & snippetFile )
 {
   std::ifstream ifs( std::string( BASE_PATH ) + "/snippets/" + snippetFile );
@@ -15151,57 +14955,6 @@ std::string readSnippet( std::string const & snippetFile )
   return oss.str();
 }
 
-std::string replaceWithMap( std::string const & input, std::map<std::string, std::string> replacements )
-{
-  // This will match ${someVariable} and contain someVariable in match group 1
-  std::regex re( R"(\$\{([^\}]+)\})" );
-  auto       it  = std::sregex_iterator( input.begin(), input.end(), re );
-  auto       end = std::sregex_iterator();
-
-  // No match, just return the original string
-  if ( it == end )
-  {
-    assert( replacements.empty() );
-    return input;
-  }
-
-#if !defined( NDEBUG )
-  std::set<std::string> matchedReplacements;
-#endif
-
-  std::string result = "";
-  while ( it != end )
-  {
-    std::smatch match         = *it;
-    auto        itReplacement = replacements.find( match[1].str() );
-    assert( itReplacement != replacements.end() );
-#if !defined( NDEBUG )
-    matchedReplacements.insert( match[1].str() );
-#endif
-
-    result += match.prefix().str() + ( ( itReplacement != replacements.end() ) ? itReplacement->second : match[0].str() );
-    ++it;
-
-    // we've passed the last match. Append the rest of the orignal string
-    if ( it == end )
-    {
-      result += match.suffix().str();
-    }
-  }
-#if !defined( NDEBUG )
-  std::set<std::string> missedReplacements;
-  for ( auto r : replacements )
-  {
-    if ( matchedReplacements.find( r.first ) == matchedReplacements.end() )
-    {
-      missedReplacements.insert( r.first );
-    }
-  }
-  assert( missedReplacements.empty() );
-#endif
-  return result;
-}
-
 std::string startLowerCase( std::string const & input )
 {
   assert( !input.empty() );
@@ -15214,93 +14967,6 @@ std::string startUpperCase( std::string const & input )
   return static_cast<char>( toupper( input[0] ) ) + input.substr( 1 );
 }
 
-std::string stripPostfix( std::string const & value, std::string const & postfix )
-{
-  std::string strippedValue = value;
-  if ( strippedValue.ends_with( postfix ) )
-  {
-    strippedValue.erase( strippedValue.length() - postfix.length() );
-  }
-  return strippedValue;
-}
-
-std::string stripPrefix( std::string const & value, std::string const & prefix )
-{
-  std::string strippedValue = value;
-  if ( strippedValue.starts_with( prefix ) )
-  {
-    strippedValue.erase( 0, prefix.length() );
-  }
-  return strippedValue;
-}
-
-std::string toCamelCase( std::string const & value )
-{
-  assert( !value.empty() && ( isupper( value[0] ) || isdigit( value[0] ) ) );
-  std::string result;
-  result.reserve( value.size() );
-  bool keepUpper = true;
-  for ( auto c : value )
-  {
-    if ( c == '_' )
-    {
-      keepUpper = true;
-    }
-    else if ( isdigit( c ) )
-    {
-      keepUpper = true;
-      result.push_back( c );
-    }
-    else if ( keepUpper )
-    {
-      result.push_back( c );
-      keepUpper = false;
-    }
-    else
-    {
-      result.push_back( static_cast<char>( tolower( c ) ) );
-    }
-  }
-  return result;
-}
-
-std::string toUpperCase( std::string const & name )
-{
-  std::string convertedName;
-  bool        previousIsLowerCase = false;
-  bool        previousIsDigit     = false;
-  for ( auto c : name )
-  {
-    if ( ( isupper( c ) && ( previousIsLowerCase || previousIsDigit ) ) || ( isdigit( c ) && previousIsLowerCase ) )
-    {
-      convertedName.push_back( '_' );
-    }
-    convertedName.push_back( static_cast<char>( toupper( c ) ) );
-    previousIsLowerCase = !!islower( c );
-    previousIsDigit     = !!isdigit( c );
-  }
-  return convertedName;
-}
-
-std::vector<std::string> tokenize( std::string const & tokenString, std::string const & separator )
-{
-  std::vector<std::string> tokens;
-  if ( !tokenString.empty() )
-  {
-    size_t start = 0, end;
-    do
-    {
-      end = tokenString.find( separator, start );
-      if ( start != end )
-      {
-        tokens.push_back( trim( tokenString.substr( start, end - start ) ) );
-      }
-      start = end + separator.length();
-    } while ( end != std::string::npos );
-  }
-  return tokens;
-}
-
 std::vector<std::string> tokenizeAny( std::string const & tokenString, std::string const & separators )
 {
   size_t                   len = tokenString.length();
@@ -15321,41 +14987,6 @@ std::vector<std::string> tokenizeAny( std::string const & tokenString, std::stri
   return tokens;
 }
 
-std::string trim( std::string const & input )
-{
-  std::string result = input;
-  result.erase( result.begin(), std::find_if( result.begin(), result.end(), []( char c ) { return !std::isspace( c ); } ) );
-  result.erase( std::find_if( result.rbegin(), result.rend(), []( char c ) { return !std::isspace( c ); } ).base(), result.end() );
-  return result;
-}
-
-std::string trimEnd( std::string const & input )
-{
-  std::string result = input;
-  result.erase( std::find_if( result.rbegin(), result.rend(), []( char c ) { return !std::isspace( c ); } ).base(), result.end() );
-  return result;
-}
-
-std::string trimStars( std::string const & input )
-{
-  std::string result = input;
-  size_t      pos    = result.find( '*' );
-  while ( pos != std::string::npos )
-  {
-    if ( ( 0 < pos ) && ( result[pos - 1] != ' ' ) && ( result[pos - 1] != '*' ) )
-    {
-      result.insert( pos, 1, ' ' );
-      ++pos;
-    }
-    else if ( ( pos < result.length() - 1 ) && ( result[pos + 1] != ' ' ) && ( result[pos + 1] != '*' ) )
-    {
-      result.insert( pos + 1, 1, ' ' );
-    }
-    pos = result.find( '*', pos + 1 );
-  }
-  return result;
-}
-
 // function to take three or four-vector of strings containing a macro definition, and return
 // a tuple with possibly the deprecation reason, possibly the called macro, the macro parameters, and possibly the definition
 MacroData parseMacro( std::vector<std::string> const & completeMacro )
@@ -15410,50 +15041,6 @@ MacroData parseMacro( std::vector<std::string> const & completeMacro )
   return {};
 }
 
-void writeToFile( std::string const & str, std::string const & fileName )
-{
-  std::ofstream ofs( fileName );
-  assert( !ofs.fail() );
-  ofs << str;
-  ofs.close();
-
-#if defined( CLANG_FORMAT_EXECUTABLE )
-  std::cout << "VulkanHppGenerator: Formatting " << fileName << " ..." << std::endl;
-  std::string commandString = "\"" CLANG_FORMAT_EXECUTABLE "\" -i --style=file " + fileName;
-  int         ret           = std::system( commandString.c_str() );
-  if ( ret != 0 )
-  {
-    std::cout << "VulkanHppGenerator: failed to format file " << fileName << " with error <" << ret << ">\n";
-  }
-#endif
-}
-
-std::string toString( tinyxml2::XMLError error )
-{
-  switch ( error )
-  {
-    case tinyxml2::XML_SUCCESS: return "XML_SUCCESS";
-    case tinyxml2::XML_NO_ATTRIBUTE: return "XML_NO_ATTRIBUTE";
-    case tinyxml2::XML_WRONG_ATTRIBUTE_TYPE: return "XML_WRONG_ATTRIBUTE_TYPE";
-    case tinyxml2::XML_ERROR_FILE_NOT_FOUND: return "XML_ERROR_FILE_NOT_FOUND";
-    case tinyxml2::XML_ERROR_FILE_COULD_NOT_BE_OPENED: return "XML_ERROR_FILE_COULD_NOT_BE_OPENED";
-    case tinyxml2::XML_ERROR_FILE_READ_ERROR: return "XML_ERROR_FILE_READ_ERROR";
-    case tinyxml2::XML_ERROR_PARSING_ELEMENT: return "XML_ERROR_PARSING_ELEMENT";
-    case tinyxml2::XML_ERROR_PARSING_ATTRIBUTE: return "XML_ERROR_PARSING_ATTRIBUTE";
-    case tinyxml2::XML_ERROR_PARSING_TEXT: return "XML_ERROR_PARSING_TEXT";
-    case tinyxml2::XML_ERROR_PARSING_CDATA: return "XML_ERROR_PARSING_CDATA";
-    case tinyxml2::XML_ERROR_PARSING_COMMENT: return "XML_ERROR_PARSING_COMMENT";
-    case tinyxml2::XML_ERROR_PARSING_DECLARATION: return "XML_ERROR_PARSING_DECLARATION";
-    case tinyxml2::XML_ERROR_PARSING_UNKNOWN: return "XML_ERROR_PARSING_UNKNOWN";
-    case tinyxml2::XML_ERROR_EMPTY_DOCUMENT: return "XML_ERROR_EMPTY_DOCUMENT";
-    case tinyxml2::XML_ERROR_MISMATCHED_ELEMENT: return "XML_ERROR_MISMATCHED_ELEMENT";
-    case tinyxml2::XML_ERROR_PARSING: return "XML_ERROR_PARSING";
-    case tinyxml2::XML_CAN_NOT_CONVERT_TEXT: return "XML_CAN_NOT_CONVERT_TEXT";
-    case tinyxml2::XML_NO_TEXT_NODE: return "XML_NO_TEXT_NODE";
-    default: return "unknown error code <" + std::to_string( error ) + ">";
-  }
-}
-
 int main( int argc, char ** argv )
 {
   if ( ( argc % 2 ) == 0 )
index 6263640..826fe53 100644 (file)
@@ -14,6 +14,8 @@
 
 #pragma once
 
+#include "XMLHelper.hpp"
+
 #include <iostream>
 #include <map>
 #include <set>
@@ -94,45 +96,6 @@ public:
   void prepareVulkanFuncs();
 
 private:
-  struct TypeInfo
-  {
-    std::string compose( std::string const & nameSpace ) const;
-
-    bool operator==( TypeInfo const & rhs ) const
-    {
-      return ( prefix == rhs.prefix ) && ( type == rhs.type ) && ( postfix == rhs.postfix );
-    }
-
-    bool operator!=( TypeInfo const & rhs ) const
-    {
-      return !operator==( rhs );
-    }
-
-    bool operator<( TypeInfo const & rhs ) const
-    {
-      return ( prefix < rhs.prefix ) || ( ( prefix == rhs.prefix ) && ( ( type < rhs.type ) || ( ( type == rhs.type ) && ( postfix < rhs.postfix ) ) ) );
-    }
-
-    bool isConstPointer() const
-    {
-      return ( prefix.find( "const" ) != std::string::npos ) && ( postfix.find( '*' ) != std::string::npos );
-    }
-
-    bool isNonConstPointer() const
-    {
-      return ( prefix.find( "const" ) == std::string::npos ) && ( postfix.find( '*' ) != std::string::npos );
-    }
-
-    bool isValue() const
-    {
-      return ( ( prefix.find( '*' ) == std::string::npos ) && ( postfix.find( '*' ) == std::string::npos ) );
-    }
-
-    std::string prefix  = {};
-    std::string type    = {};
-    std::string postfix = {};
-  };
-
   struct AliasData
   {
     std::string name    = {};
@@ -152,6 +115,29 @@ private:
     int         xmlLine = {};
   };
 
+  struct EnumValueData
+  {
+    std::string alias   = {};
+    std::string bitpos  = {};
+    std::string name    = {};
+    std::string protect = {};
+    std::string value   = {};
+    int         xmlLine = {};
+  };
+
+  struct EnumData
+  {
+    void addEnumAlias( int line, std::string const & name, std::string const & alias, std::string const & protect, bool supported );
+    void addEnumValue(
+      int line, std::string const & valueName, std::string const & protect, std::string const & bitpos, std::string const & value, bool supported );
+
+    std::string                bitwidth          = {};
+    bool                       isBitmask         = false;
+    std::vector<EnumValueData> unsupportedValues = {};
+    std::vector<EnumValueData> values            = {};
+    int                        xmlLine           = {};
+  };
+
   struct NameData
   {
     std::string              name       = {};
@@ -206,29 +192,6 @@ private:
     std::map<std::string, DefineData> values  = {};
   };
 
-  struct EnumValueData
-  {
-    std::string alias   = {};
-    std::string bitpos  = {};
-    std::string name    = {};
-    std::string protect = {};
-    std::string value   = {};
-    int         xmlLine = {};
-  };
-
-  struct EnumData
-  {
-    void addEnumAlias( int line, std::string const & name, std::string const & alias, std::string const & protect, bool supported );
-    void addEnumValue(
-      int line, std::string const & valueName, std::string const & protect, std::string const & bitpos, std::string const & value, bool supported );
-
-    std::string                bitwidth          = {};
-    bool                       isBitmask         = false;
-    std::vector<EnumValueData> unsupportedValues = {};
-    std::vector<EnumValueData> values            = {};
-    int                        xmlLine           = {};
-  };
-
   struct RemoveData
   {
     std::vector<std::string> commands = {};
@@ -245,15 +208,6 @@ private:
     int                      xmlLine  = {};
   };
 
-  struct FeatureData
-  {
-    std::string              name        = {};
-    std::string              number      = {};
-    std::vector<RemoveData>  removeData  = {};
-    std::vector<RequireData> requireData = {};
-    int                      xmlLine     = {};
-  };
-
   struct ExtensionData
   {
     std::string                                                  deprecatedBy = {};
@@ -269,6 +223,15 @@ private:
     int                                                          xmlLine      = 0;
   };
 
+  struct FeatureData
+  {
+    std::string              name        = {};
+    std::string              number      = {};
+    std::vector<RemoveData>  removeData  = {};
+    std::vector<RequireData> requireData = {};
+    int                      xmlLine     = {};
+  };
+
   struct ExternalTypeData
   {
     std::string require = {};
@@ -339,9 +302,10 @@ private:
     std::vector<std::map<std::string, CommandData>::const_iterator> constructorIts = {};
   };
 
-  struct IncludeData
+  struct PlatformData
   {
-    int xmlLine = {};
+    std::string protect = {};
+    int         xmlLine = {};
   };
 
   struct MemberData
@@ -357,16 +321,9 @@ private:
     std::vector<std::string>                    selection      = {};
     std::string                                 selector       = {};
     std::string                                 value          = {};
-    std::string                                 usedConstant   = {};
     int                                         xmlLine        = {};
   };
 
-  struct PlatformData
-  {
-    std::string protect = {};
-    int         xmlLine = {};
-  };
-
   struct StructureData
   {
     bool                     allowDuplicate      = {};
@@ -384,29 +341,6 @@ private:
     int xmlLine = {};
   };
 
-  enum class TypeCategory
-  {
-    Bitmask,
-    BaseType,
-    Constant,
-    Define,
-    Enum,
-    ExternalType,
-    FuncPointer,
-    Handle,
-    Include,
-    Struct,
-    Union,
-    Unknown
-  };
-
-  struct TypeData
-  {
-    TypeCategory          category   = TypeCategory::Unknown;
-    std::set<std::string> requiredBy = {};
-    int                   xmlLine    = {};
-  };
-
   struct VectorParamData
   {
     size_t lenParam    = INVALID_INDEX;
@@ -986,7 +920,6 @@ private:
   std::pair<bool, ParamData>                             readCommandParam( tinyxml2::XMLElement const * element, std::vector<ParamData> const & params );
   std::pair<std::string, std::string>                    readCommandProto( tinyxml2::XMLElement const * element );
   void                                                   readCommands( tinyxml2::XMLElement const * element );
-  std::string                                            readComment( tinyxml2::XMLElement const * element );
   void                                                   readEnums( tinyxml2::XMLElement const * element );
   void                                                   readEnumsConstants( tinyxml2::XMLElement const * element );
   void                          readEnumsEnum( tinyxml2::XMLElement const * element, std::map<std::string, EnumData>::iterator enumIt );
@@ -1052,7 +985,6 @@ private:
   std::vector<std::string> selectCommandsByHandle( std::vector<RequireData> const & requireData,
                                                    std::set<std::string> const &    handleCommands,
                                                    std::set<std::string> &          listedCommands ) const;
-  void                     setVulkanLicenseHeader( int line, std::string const & comment );
   bool                     skipLeadingGrandParent( std::pair<std::string, HandleData> const & handle ) const;
   std::string              stripPluralS( std::string const & name ) const;
   std::string              toString( TypeCategory category );
diff --git a/XMLHelper.hpp b/XMLHelper.hpp
new file mode 100644 (file)
index 0000000..3cb98c4
--- /dev/null
@@ -0,0 +1,567 @@
+// Copyright(c) 2023, NVIDIA CORPORATION. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#pragma once
+
+#include <assert.h>
+#include <fstream>
+#include <iostream>
+#include <map>
+#include <regex>
+#include <set>
+#include <string>
+#include <tinyxml2.h>
+#include <vector>
+
+struct TypeInfo;
+
+void                               checkAttributes( int                                                  line,
+                                                    std::map<std::string, std::string> const &           attributes,
+                                                    std::map<std::string, std::set<std::string>> const & required,
+                                                    std::map<std::string, std::set<std::string>> const & optional );
+void                               checkElements( int                                               line,
+                                                  std::vector<tinyxml2::XMLElement const *> const & elements,
+                                                  std::map<std::string, bool> const &               required,
+                                                  std::set<std::string> const &                     optional = {} );
+void                               checkForError( bool condition, int line, std::string const & message );
+void                               checkForWarning( bool condition, int line, std::string const & message );
+std::string                        generateCopyrightMessage( std::string const & comment );
+std::string                        generateStandardArrayWrapper( std::string const & type, std::vector<std::string> const & sizes );
+std::map<std::string, std::string> getAttributes( tinyxml2::XMLElement const * element );
+template <typename ElementContainer>
+std::vector<tinyxml2::XMLElement const *>        getChildElements( ElementContainer const * element );
+std::string                                      readComment( tinyxml2::XMLElement const * element );
+std::pair<std::vector<std::string>, std::string> readModifiers( tinyxml2::XMLNode const * node );
+TypeInfo                                         readTypeInfo( tinyxml2::XMLElement const * element );
+std::string                                      replaceWithMap( std::string const & input, std::map<std::string, std::string> replacements );
+std::string                                      stripPostfix( std::string const & value, std::string const & postfix );
+std::string                                      stripPrefix( std::string const & value, std::string const & prefix );
+std::string                                      toCamelCase( std::string const & value, bool keepSeparatedNumbersSeparated = false );
+std::vector<std::string>                         tokenize( std::string const & tokenString, std::string const & separator );
+std::string                                      toString( tinyxml2::XMLError error );
+std::string                                      toUpperCase( std::string const & name );
+std::string                                      trim( std::string const & input );
+std::string                                      trimEnd( std::string const & input );
+std::string                                      trimStars( std::string const & input );
+void                                             writeToFile( std::string const & str, std::string const & fileName );
+
+struct TypeInfo
+{
+  std::string compose( std::string const & nameSpace, std::string const & prefix_ = "Vk" ) const
+  {
+    return prefix + ( prefix.empty() ? "" : " " ) +
+           ( nameSpace.empty() ? type : ( ( ( type.starts_with( prefix_ ) ) ? ( nameSpace + "::" ) : "" ) + stripPrefix( type, prefix_ ) ) ) +
+           ( postfix.empty() ? "" : " " ) + postfix;
+  }
+
+  bool operator==( TypeInfo const & rhs ) const
+  {
+    return ( prefix == rhs.prefix ) && ( type == rhs.type ) && ( postfix == rhs.postfix );
+  }
+
+  bool operator!=( TypeInfo const & rhs ) const
+  {
+    return !operator==( rhs );
+  }
+
+  bool operator<( TypeInfo const & rhs ) const
+  {
+    return ( prefix < rhs.prefix ) || ( ( prefix == rhs.prefix ) && ( ( type < rhs.type ) || ( ( type == rhs.type ) && ( postfix < rhs.postfix ) ) ) );
+  }
+
+  bool isConstPointer() const
+  {
+    return ( prefix.find( "const" ) != std::string::npos ) && ( postfix.find( '*' ) != std::string::npos );
+  }
+
+  bool isNonConstPointer() const
+  {
+    return ( prefix.find( "const" ) == std::string::npos ) && ( postfix.find( '*' ) != std::string::npos );
+  }
+
+  bool isValue() const
+  {
+    return ( ( prefix.find( '*' ) == std::string::npos ) && ( postfix.find( '*' ) == std::string::npos ) );
+  }
+
+  std::string prefix  = {};
+  std::string type    = {};
+  std::string postfix = {};
+};
+
+struct ExternalTypeData
+{
+  std::string require = {};
+  int         xmlLine = 0;
+};
+
+struct IncludeData
+{
+  int xmlLine = {};
+};
+
+enum class TypeCategory
+{
+  Bitmask,
+  BaseType,
+  Constant,
+  Define,
+  Enum,
+  ExternalType,
+  FuncPointer,
+  Handle,
+  Include,
+  Struct,
+  Union,
+  Unknown
+};
+
+struct TypeData
+{
+  TypeCategory          category   = TypeCategory::Unknown;
+  std::set<std::string> requiredBy = {};
+  int                   xmlLine    = {};
+};
+
+// check the validity of an attributes map
+// line       : the line in the xml file where the attributes are listed
+// attributes : the map of name/value pairs of the encountered attributes
+// required   : the required attributes, with a set of allowed values per attribute
+// optional   : the optional attributes, with a set of allowed values per attribute
+inline void checkAttributes( int                                                  line,
+                             std::map<std::string, std::string> const &           attributes,
+                             std::map<std::string, std::set<std::string>> const & required,
+                             std::map<std::string, std::set<std::string>> const & optional )
+{
+  // check if all required attributes are included and if there is a set of allowed values, check if the actual
+  // value is part of that set
+  for ( auto const & r : required )
+  {
+    auto attributesIt = attributes.find( r.first );
+    checkForError( attributesIt != attributes.end(), line, "missing attribute <" + r.first + ">" );
+    if ( !r.second.empty() )
+    {
+      std::vector<std::string> values = tokenize( attributesIt->second, "," );
+      for ( auto const & v : values )
+      {
+        checkForError( r.second.find( v ) != r.second.end(), line, "unexpected attribute value <" + v + "> in attribute <" + attributesIt->first + ">" );
+      }
+    }
+  }
+  // check if all not required attributes or optional, and if there is a set of allowed values, check if the
+  // actual value is part of that set
+  for ( auto const & a : attributes )
+  {
+    if ( required.find( a.first ) == required.end() )
+    {
+      auto optionalIt = optional.find( a.first );
+      if ( optionalIt == optional.end() )
+      {
+        checkForWarning( false, line, "unknown attribute <" + a.first + ">" );
+        continue;
+      }
+      if ( !optionalIt->second.empty() )
+      {
+        std::vector<std::string> values = tokenize( a.second, "," );
+        for ( auto const & v : values )
+        {
+          checkForWarning(
+            optionalIt->second.find( v ) != optionalIt->second.end(), line, "unexpected attribute value <" + v + "> in attribute <" + a.first + ">" );
+        }
+      }
+    }
+  }
+}
+
+inline void checkElements( int                                               line,
+                           std::vector<tinyxml2::XMLElement const *> const & elements,
+                           std::map<std::string, bool> const &               required,
+                           std::set<std::string> const &                     optional )
+{
+  std::map<std::string, size_t> encountered;
+  for ( auto const & e : elements )
+  {
+    std::string value = e->Value();
+    encountered[value]++;
+    checkForWarning(
+      ( required.find( value ) != required.end() ) || ( optional.find( value ) != optional.end() ), e->GetLineNum(), "unknown element <" + value + ">" );
+  }
+  for ( auto const & r : required )
+  {
+    auto encounteredIt = encountered.find( r.first );
+    checkForError( encounteredIt != encountered.end(), line, "missing required element <" + r.first + ">" );
+    // check: r.second (means: required excactly once) => (encouteredIt->second == 1)
+    checkForError( !r.second || ( encounteredIt->second == 1 ),
+                   line,
+                   "required element <" + r.first + "> is supposed to be listed exactly once, but is listed " + std::to_string( encounteredIt->second ) );
+  }
+}
+
+inline void checkForError( bool condition, int line, std::string const & message )
+{
+  if ( !condition )
+  {
+    throw std::runtime_error( "VulkanHppGenerator: Spec error on line " + std::to_string( line ) + ": " + message );
+  }
+}
+
+inline void checkForWarning( bool condition, int line, std::string const & message )
+{
+  if ( !condition )
+  {
+    std::cerr << "VulkanHppGenerator: Spec warning on line " << std::to_string( line ) << ": " << message << "!" << std::endl;
+  }
+}
+
+inline std::string generateCopyrightMessage( std::string const & comment )
+{
+  std::string copyrightMessage = comment;
+
+  // replace any '\n' with "\n// "
+  for ( size_t pos = copyrightMessage.find( '\n' ); pos != std::string::npos; pos = copyrightMessage.find( '\n', pos + 1 ) )
+  {
+    copyrightMessage.replace( pos, 1, "\n// " );
+  }
+  // remove any trailing spaces
+  copyrightMessage = trimEnd( copyrightMessage );
+
+  // and add a little message on our own
+  copyrightMessage += "\n\n// This header is generated from the Khronos Vulkan XML API Registry.";
+  return trim( copyrightMessage ) + "\n";
+}
+
+inline std::string generateStandardArrayWrapper( std::string const & type, std::vector<std::string> const & sizes )
+{
+  std::string arrayString = "VULKAN_HPP_NAMESPACE::ArrayWrapper" + std::to_string( sizes.size() ) + "D<" + type;
+  for ( auto const & size : sizes )
+  {
+    arrayString += ", " + size;
+  }
+  arrayString += ">";
+  return arrayString;
+}
+
+inline std::map<std::string, std::string> getAttributes( tinyxml2::XMLElement const * element )
+{
+  std::map<std::string, std::string> attributes;
+  for ( auto attribute = element->FirstAttribute(); attribute; attribute = attribute->Next() )
+  {
+    assert( attributes.find( attribute->Name() ) == attributes.end() );
+    attributes[attribute->Name()] = attribute->Value();
+  }
+  return attributes;
+}
+
+template <typename ElementContainer>
+inline std::vector<tinyxml2::XMLElement const *> getChildElements( ElementContainer const * element )
+{
+  std::vector<tinyxml2::XMLElement const *> childElements;
+  for ( tinyxml2::XMLElement const * childElement = element->FirstChildElement(); childElement; childElement = childElement->NextSiblingElement() )
+  {
+    childElements.push_back( childElement );
+  }
+  return childElements;
+}
+
+inline std::string readComment( tinyxml2::XMLElement const * element )
+{
+  int line = element->GetLineNum();
+  checkAttributes( line, getAttributes( element ), {}, {} );
+  checkElements( line, getChildElements( element ), {} );
+  return element->GetText();
+}
+
+inline std::pair<std::vector<std::string>, std::string> readModifiers( tinyxml2::XMLNode const * node )
+{
+  std::vector<std::string> arraySizes;
+  std::string              bitCount;
+  if ( node && node->ToText() )
+  {
+    // following the name there might be some array size
+    std::string value = trim( node->Value() );
+    assert( !value.empty() );
+    if ( value[0] == '[' )
+    {
+      std::string::size_type endPos = 0;
+      while ( endPos + 1 != value.length() )
+      {
+        std::string::size_type startPos = value.find( '[', endPos );
+        checkForError( startPos != std::string::npos, node->GetLineNum(), "could not find '[' in <" + value + ">" );
+        endPos = value.find( ']', startPos );
+        checkForError( endPos != std::string::npos, node->GetLineNum(), "could not find ']' in <" + value + ">" );
+        checkForError( startPos + 2 <= endPos, node->GetLineNum(), "missing content between '[' and ']' in <" + value + ">" );
+        arraySizes.push_back( value.substr( startPos + 1, endPos - startPos - 1 ) );
+      }
+    }
+    else if ( value[0] == ':' )
+    {
+      bitCount = trim( value.substr( 1 ) );
+    }
+    else
+    {
+      checkForError( ( value[0] == ';' ) || ( value[0] == ')' ), node->GetLineNum(), "unknown modifier <" + value + ">" );
+    }
+  }
+  return std::make_pair( arraySizes, bitCount );
+}
+
+inline TypeInfo readTypeInfo( tinyxml2::XMLElement const * element )
+{
+  TypeInfo                  typeInfo;
+  tinyxml2::XMLNode const * previousSibling = element->PreviousSibling();
+  if ( previousSibling && previousSibling->ToText() )
+  {
+    typeInfo.prefix = trim( previousSibling->Value() );
+  }
+  typeInfo.type                         = element->GetText();
+  tinyxml2::XMLNode const * nextSibling = element->NextSibling();
+  if ( nextSibling && nextSibling->ToText() )
+  {
+    typeInfo.postfix = trimStars( trimEnd( nextSibling->Value() ) );
+  }
+  return typeInfo;
+}
+
+inline std::string replaceWithMap( std::string const & input, std::map<std::string, std::string> replacements )
+{
+  // This will match ${someVariable} and contain someVariable in match group 1
+  std::regex re( R"(\$\{([^\}]+)\})" );
+  auto       it  = std::sregex_iterator( input.begin(), input.end(), re );
+  auto       end = std::sregex_iterator();
+
+  // No match, just return the original string
+  if ( it == end )
+  {
+    assert( replacements.empty() );
+    return input;
+  }
+
+#if !defined( NDEBUG )
+  std::set<std::string> matchedReplacements;
+#endif
+
+  std::string result = "";
+  while ( it != end )
+  {
+    std::smatch match         = *it;
+    auto        itReplacement = replacements.find( match[1].str() );
+    assert( itReplacement != replacements.end() );
+#if !defined( NDEBUG )
+    matchedReplacements.insert( match[1].str() );
+#endif
+
+    result += match.prefix().str() + ( ( itReplacement != replacements.end() ) ? itReplacement->second : match[0].str() );
+    ++it;
+
+    // we've passed the last match. Append the rest of the orignal string
+    if ( it == end )
+    {
+      result += match.suffix().str();
+    }
+  }
+#if !defined( NDEBUG )
+  std::set<std::string> missedReplacements;
+  for ( auto r : replacements )
+  {
+    if ( matchedReplacements.find( r.first ) == matchedReplacements.end() )
+    {
+      missedReplacements.insert( r.first );
+    }
+  }
+  assert( missedReplacements.empty() );
+#endif
+  return result;
+}
+
+inline std::string stripPostfix( std::string const & value, std::string const & postfix )
+{
+  std::string strippedValue = value;
+  if ( strippedValue.ends_with( postfix ) )
+  {
+    strippedValue.erase( strippedValue.length() - postfix.length() );
+  }
+  return strippedValue;
+}
+
+inline std::string stripPrefix( std::string const & value, std::string const & prefix )
+{
+  std::string strippedValue = value;
+  if ( strippedValue.starts_with( prefix ) )
+  {
+    strippedValue.erase( 0, prefix.length() );
+  }
+  return strippedValue;
+}
+
+inline std::string toCamelCase( std::string const & value, bool keepSeparatedNumbersSeparated )
+{
+  assert( !value.empty() && ( isupper( value[0] ) || isdigit( value[0] ) ) );
+  std::string result;
+  result.reserve( value.size() );
+  for ( size_t i = 0; i < value.size(); ++i )
+  {
+    if ( value[i] == '_' )
+    {
+      if ( keepSeparatedNumbersSeparated && ( 0 < i ) && isdigit( value[i - 1] ) && ( i < value.size() - 1 ) && isdigit( value[i + 1] ) )
+      {
+        result.push_back( '_' );
+      }
+    }
+    else
+    {
+      result.push_back( ( ( 0 == i ) || ( value[i - 1] == '_' ) || isdigit( value[i - 1] ) ) ? value[i] : static_cast<char>( tolower( value[i] ) ) );
+    }
+  }
+#if 0
+  bool keepUpper = true;
+  for ( auto c : value )
+  {
+    if ( c == '_' )
+    {
+      keepUpper = true;
+    }
+    else if ( isdigit( c ) )
+    {
+      keepUpper = true;
+      result.push_back( c );
+    }
+    else if ( keepUpper )
+    {
+      result.push_back( c );
+      keepUpper = false;
+    }
+    else
+    {
+      result.push_back( static_cast<char>( tolower( c ) ) );
+    }
+  }
+#endif
+  return result;
+}
+
+inline std::vector<std::string> tokenize( std::string const & tokenString, std::string const & separator )
+{
+  std::vector<std::string> tokens;
+  if ( !tokenString.empty() )
+  {
+    size_t start = 0, end;
+    do
+    {
+      end = tokenString.find( separator, start );
+      if ( start != end )
+      {
+        tokens.push_back( trim( tokenString.substr( start, end - start ) ) );
+      }
+      start = end + separator.length();
+    } while ( end != std::string::npos );
+  }
+  return tokens;
+}
+
+inline std::string toString( tinyxml2::XMLError error )
+{
+  switch ( error )
+  {
+    case tinyxml2::XML_SUCCESS: return "XML_SUCCESS";
+    case tinyxml2::XML_NO_ATTRIBUTE: return "XML_NO_ATTRIBUTE";
+    case tinyxml2::XML_WRONG_ATTRIBUTE_TYPE: return "XML_WRONG_ATTRIBUTE_TYPE";
+    case tinyxml2::XML_ERROR_FILE_NOT_FOUND: return "XML_ERROR_FILE_NOT_FOUND";
+    case tinyxml2::XML_ERROR_FILE_COULD_NOT_BE_OPENED: return "XML_ERROR_FILE_COULD_NOT_BE_OPENED";
+    case tinyxml2::XML_ERROR_FILE_READ_ERROR: return "XML_ERROR_FILE_READ_ERROR";
+    case tinyxml2::XML_ERROR_PARSING_ELEMENT: return "XML_ERROR_PARSING_ELEMENT";
+    case tinyxml2::XML_ERROR_PARSING_ATTRIBUTE: return "XML_ERROR_PARSING_ATTRIBUTE";
+    case tinyxml2::XML_ERROR_PARSING_TEXT: return "XML_ERROR_PARSING_TEXT";
+    case tinyxml2::XML_ERROR_PARSING_CDATA: return "XML_ERROR_PARSING_CDATA";
+    case tinyxml2::XML_ERROR_PARSING_COMMENT: return "XML_ERROR_PARSING_COMMENT";
+    case tinyxml2::XML_ERROR_PARSING_DECLARATION: return "XML_ERROR_PARSING_DECLARATION";
+    case tinyxml2::XML_ERROR_PARSING_UNKNOWN: return "XML_ERROR_PARSING_UNKNOWN";
+    case tinyxml2::XML_ERROR_EMPTY_DOCUMENT: return "XML_ERROR_EMPTY_DOCUMENT";
+    case tinyxml2::XML_ERROR_MISMATCHED_ELEMENT: return "XML_ERROR_MISMATCHED_ELEMENT";
+    case tinyxml2::XML_ERROR_PARSING: return "XML_ERROR_PARSING";
+    case tinyxml2::XML_CAN_NOT_CONVERT_TEXT: return "XML_CAN_NOT_CONVERT_TEXT";
+    case tinyxml2::XML_NO_TEXT_NODE: return "XML_NO_TEXT_NODE";
+    default: return "unknown error code <" + std::to_string( error ) + ">";
+  }
+}
+
+std::string toUpperCase( std::string const & name )
+{
+  std::string convertedName;
+  bool        previousIsLowerCase = false;
+  bool        previousIsDigit     = false;
+  for ( auto c : name )
+  {
+    if ( ( isupper( c ) && ( previousIsLowerCase || previousIsDigit ) ) || ( isdigit( c ) && previousIsLowerCase ) )
+    {
+      convertedName.push_back( '_' );
+    }
+    convertedName.push_back( static_cast<char>( toupper( c ) ) );
+    previousIsLowerCase = !!islower( c );
+    previousIsDigit     = !!isdigit( c );
+  }
+  return convertedName;
+}
+
+inline std::string trim( std::string const & input )
+{
+  std::string result = input;
+  result.erase( result.begin(), std::find_if( result.begin(), result.end(), []( char c ) { return !std::isspace( c ); } ) );
+  result.erase( std::find_if( result.rbegin(), result.rend(), []( char c ) { return !std::isspace( c ); } ).base(), result.end() );
+  return result;
+}
+
+inline std::string trimEnd( std::string const & input )
+{
+  std::string result = input;
+  result.erase( std::find_if( result.rbegin(), result.rend(), []( char c ) { return !std::isspace( c ); } ).base(), result.end() );
+  return result;
+}
+
+inline std::string trimStars( std::string const & input )
+{
+  std::string result = input;
+  size_t      pos    = result.find( '*' );
+  while ( pos != std::string::npos )
+  {
+    if ( ( 0 < pos ) && ( result[pos - 1] != ' ' ) && ( result[pos - 1] != '*' ) )
+    {
+      result.insert( pos, 1, ' ' );
+      ++pos;
+    }
+    else if ( ( pos < result.length() - 1 ) && ( result[pos + 1] != ' ' ) && ( result[pos + 1] != '*' ) )
+    {
+      result.insert( pos + 1, 1, ' ' );
+    }
+    pos = result.find( '*', pos + 1 );
+  }
+  return result;
+}
+
+void writeToFile( std::string const & str, std::string const & fileName )
+{
+  std::ofstream ofs( fileName );
+  assert( !ofs.fail() );
+  ofs << str;
+  ofs.close();
+
+#if defined( CLANG_FORMAT_EXECUTABLE )
+  std::cout << "VulkanHppGenerator: Formatting " << fileName << " ..." << std::endl;
+  std::string commandString = "\"" CLANG_FORMAT_EXECUTABLE "\" -i --style=file " + fileName;
+  int         ret           = std::system( commandString.c_str() );
+  if ( ret != 0 )
+  {
+    std::cout << "VulkanHppGenerator: failed to format file " << fileName << " with error <" << ret << ">\n";
+  }
+#endif
+}
diff --git a/vulkan/vulkan_video.hpp b/vulkan/vulkan_video.hpp
new file mode 100644 (file)
index 0000000..7465938
--- /dev/null
@@ -0,0 +1,2696 @@
+// Copyright 2021-2023 The Khronos Group Inc.
+// SPDX-License-Identifier: Apache-2.0 OR MIT
+//
+
+// This header is generated from the Khronos Vulkan XML API Registry.
+
+#include <vk_video/vulkan_video_codec_h264std.h>
+#include <vk_video/vulkan_video_codec_h264std_decode.h>
+#include <vk_video/vulkan_video_codec_h264std_encode.h>
+#include <vk_video/vulkan_video_codec_h265std.h>
+#include <vk_video/vulkan_video_codec_h265std_decode.h>
+#include <vk_video/vulkan_video_codec_h265std_encode.h>
+#include <vk_video/vulkan_video_codecs_common.h>
+#include <vulkan/vulkan.hpp>
+
+#if !defined( VULKAN_HPP_VIDEO_NAMESPACE )
+#  define VULKAN_HPP_VIDEO_NAMESPACE video
+#endif
+
+namespace VULKAN_HPP_NAMESPACE
+{
+  namespace VULKAN_HPP_VIDEO_NAMESPACE
+  {
+
+    //=============
+    //=== ENUMs ===
+    //=============
+
+    //=== vulkan_video_codec_h264std ===
+
+    enum class H264ChromaFormatIdc
+    {
+      eMonochrome = STD_VIDEO_H264_CHROMA_FORMAT_IDC_MONOCHROME,
+      e420        = STD_VIDEO_H264_CHROMA_FORMAT_IDC_420,
+      e422        = STD_VIDEO_H264_CHROMA_FORMAT_IDC_422,
+      e444        = STD_VIDEO_H264_CHROMA_FORMAT_IDC_444,
+      eInvalid    = STD_VIDEO_H264_CHROMA_FORMAT_IDC_INVALID
+    };
+
+    enum class H264ProfileIdc
+    {
+      eBaseline          = STD_VIDEO_H264_PROFILE_IDC_BASELINE,
+      eMain              = STD_VIDEO_H264_PROFILE_IDC_MAIN,
+      eHigh              = STD_VIDEO_H264_PROFILE_IDC_HIGH,
+      eHigh444Predictive = STD_VIDEO_H264_PROFILE_IDC_HIGH_444_PREDICTIVE,
+      eInvalid           = STD_VIDEO_H264_PROFILE_IDC_INVALID
+    };
+
+    enum class H264LevelIdc
+    {
+      e1_0     = STD_VIDEO_H264_LEVEL_IDC_1_0,
+      e1_1     = STD_VIDEO_H264_LEVEL_IDC_1_1,
+      e1_2     = STD_VIDEO_H264_LEVEL_IDC_1_2,
+      e1_3     = STD_VIDEO_H264_LEVEL_IDC_1_3,
+      e2_0     = STD_VIDEO_H264_LEVEL_IDC_2_0,
+      e2_1     = STD_VIDEO_H264_LEVEL_IDC_2_1,
+      e2_2     = STD_VIDEO_H264_LEVEL_IDC_2_2,
+      e3_0     = STD_VIDEO_H264_LEVEL_IDC_3_0,
+      e3_1     = STD_VIDEO_H264_LEVEL_IDC_3_1,
+      e3_2     = STD_VIDEO_H264_LEVEL_IDC_3_2,
+      e4_0     = STD_VIDEO_H264_LEVEL_IDC_4_0,
+      e4_1     = STD_VIDEO_H264_LEVEL_IDC_4_1,
+      e4_2     = STD_VIDEO_H264_LEVEL_IDC_4_2,
+      e5_0     = STD_VIDEO_H264_LEVEL_IDC_5_0,
+      e5_1     = STD_VIDEO_H264_LEVEL_IDC_5_1,
+      e5_2     = STD_VIDEO_H264_LEVEL_IDC_5_2,
+      e6_0     = STD_VIDEO_H264_LEVEL_IDC_6_0,
+      e6_1     = STD_VIDEO_H264_LEVEL_IDC_6_1,
+      e6_2     = STD_VIDEO_H264_LEVEL_IDC_6_2,
+      eInvalid = STD_VIDEO_H264_LEVEL_IDC_INVALID
+    };
+
+    enum class H264PocType
+    {
+      e0       = STD_VIDEO_H264_POC_TYPE_0,
+      e1       = STD_VIDEO_H264_POC_TYPE_1,
+      e2       = STD_VIDEO_H264_POC_TYPE_2,
+      eInvalid = STD_VIDEO_H264_POC_TYPE_INVALID
+    };
+
+    enum class H264AspectRatioIdc
+    {
+      eUnspecified = STD_VIDEO_H264_ASPECT_RATIO_IDC_UNSPECIFIED,
+      eSquare      = STD_VIDEO_H264_ASPECT_RATIO_IDC_SQUARE,
+      e12_11       = STD_VIDEO_H264_ASPECT_RATIO_IDC_12_11,
+      e10_11       = STD_VIDEO_H264_ASPECT_RATIO_IDC_10_11,
+      e16_11       = STD_VIDEO_H264_ASPECT_RATIO_IDC_16_11,
+      e40_33       = STD_VIDEO_H264_ASPECT_RATIO_IDC_40_33,
+      e24_11       = STD_VIDEO_H264_ASPECT_RATIO_IDC_24_11,
+      e20_11       = STD_VIDEO_H264_ASPECT_RATIO_IDC_20_11,
+      e32_11       = STD_VIDEO_H264_ASPECT_RATIO_IDC_32_11,
+      e80_33       = STD_VIDEO_H264_ASPECT_RATIO_IDC_80_33,
+      e18_11       = STD_VIDEO_H264_ASPECT_RATIO_IDC_18_11,
+      e15_11       = STD_VIDEO_H264_ASPECT_RATIO_IDC_15_11,
+      e64_33       = STD_VIDEO_H264_ASPECT_RATIO_IDC_64_33,
+      e160_99      = STD_VIDEO_H264_ASPECT_RATIO_IDC_160_99,
+      e4_3         = STD_VIDEO_H264_ASPECT_RATIO_IDC_4_3,
+      e3_2         = STD_VIDEO_H264_ASPECT_RATIO_IDC_3_2,
+      e2_1         = STD_VIDEO_H264_ASPECT_RATIO_IDC_2_1,
+      eExtendedSar = STD_VIDEO_H264_ASPECT_RATIO_IDC_EXTENDED_SAR,
+      eInvalid     = STD_VIDEO_H264_ASPECT_RATIO_IDC_INVALID
+    };
+
+    enum class H264WeightedBipredIdc
+    {
+      eDefault  = STD_VIDEO_H264_WEIGHTED_BIPRED_IDC_DEFAULT,
+      eExplicit = STD_VIDEO_H264_WEIGHTED_BIPRED_IDC_EXPLICIT,
+      eImplicit = STD_VIDEO_H264_WEIGHTED_BIPRED_IDC_IMPLICIT,
+      eInvalid  = STD_VIDEO_H264_WEIGHTED_BIPRED_IDC_INVALID
+    };
+
+    enum class H264ModificationOfPicNumsIdc
+    {
+      eShortTermSubtract = STD_VIDEO_H264_MODIFICATION_OF_PIC_NUMS_IDC_SHORT_TERM_SUBTRACT,
+      eShortTermAdd      = STD_VIDEO_H264_MODIFICATION_OF_PIC_NUMS_IDC_SHORT_TERM_ADD,
+      eLongTerm          = STD_VIDEO_H264_MODIFICATION_OF_PIC_NUMS_IDC_LONG_TERM,
+      eEnd               = STD_VIDEO_H264_MODIFICATION_OF_PIC_NUMS_IDC_END,
+      eInvalid           = STD_VIDEO_H264_MODIFICATION_OF_PIC_NUMS_IDC_INVALID
+    };
+
+    enum class H264MemMgmtControlOp
+    {
+      eEnd                   = STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_END,
+      eUnmarkShortTerm       = STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_UNMARK_SHORT_TERM,
+      eUnmarkLongTerm        = STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_UNMARK_LONG_TERM,
+      eMarkLongTerm          = STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_MARK_LONG_TERM,
+      eSetMaxLongTermIndex   = STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_SET_MAX_LONG_TERM_INDEX,
+      eUnmarkAll             = STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_UNMARK_ALL,
+      eMarkCurrentAsLongTerm = STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_MARK_CURRENT_AS_LONG_TERM,
+      eInvalid               = STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_INVALID
+    };
+
+    enum class H264CabacInitIdc
+    {
+      e0       = STD_VIDEO_H264_CABAC_INIT_IDC_0,
+      e1       = STD_VIDEO_H264_CABAC_INIT_IDC_1,
+      e2       = STD_VIDEO_H264_CABAC_INIT_IDC_2,
+      eInvalid = STD_VIDEO_H264_CABAC_INIT_IDC_INVALID
+    };
+
+    enum class H264DisableDeblockingFilterIdc
+    {
+      eDisabled = STD_VIDEO_H264_DISABLE_DEBLOCKING_FILTER_IDC_DISABLED,
+      eEnabled  = STD_VIDEO_H264_DISABLE_DEBLOCKING_FILTER_IDC_ENABLED,
+      ePartial  = STD_VIDEO_H264_DISABLE_DEBLOCKING_FILTER_IDC_PARTIAL,
+      eInvalid  = STD_VIDEO_H264_DISABLE_DEBLOCKING_FILTER_IDC_INVALID
+    };
+
+    enum class H264SliceType
+    {
+      eP       = STD_VIDEO_H264_SLICE_TYPE_P,
+      eB       = STD_VIDEO_H264_SLICE_TYPE_B,
+      eI       = STD_VIDEO_H264_SLICE_TYPE_I,
+      eInvalid = STD_VIDEO_H264_SLICE_TYPE_INVALID
+    };
+
+    enum class H264PictureType
+    {
+      eP       = STD_VIDEO_H264_PICTURE_TYPE_P,
+      eB       = STD_VIDEO_H264_PICTURE_TYPE_B,
+      eI       = STD_VIDEO_H264_PICTURE_TYPE_I,
+      eIdr     = STD_VIDEO_H264_PICTURE_TYPE_IDR,
+      eInvalid = STD_VIDEO_H264_PICTURE_TYPE_INVALID
+    };
+
+    enum class H264NonVclNaluType
+    {
+      eSps           = STD_VIDEO_H264_NON_VCL_NALU_TYPE_SPS,
+      ePps           = STD_VIDEO_H264_NON_VCL_NALU_TYPE_PPS,
+      eAud           = STD_VIDEO_H264_NON_VCL_NALU_TYPE_AUD,
+      ePrefix        = STD_VIDEO_H264_NON_VCL_NALU_TYPE_PREFIX,
+      eEndOfSequence = STD_VIDEO_H264_NON_VCL_NALU_TYPE_END_OF_SEQUENCE,
+      eEndOfStream   = STD_VIDEO_H264_NON_VCL_NALU_TYPE_END_OF_STREAM,
+      ePrecoded      = STD_VIDEO_H264_NON_VCL_NALU_TYPE_PRECODED,
+      eInvalid       = STD_VIDEO_H264_NON_VCL_NALU_TYPE_INVALID
+    };
+
+    //=== vulkan_video_codec_h264std_decode ===
+
+    enum class DecodeH264FieldOrderCount
+    {
+      eTop     = STD_VIDEO_DECODE_H264_FIELD_ORDER_COUNT_TOP,
+      eBottom  = STD_VIDEO_DECODE_H264_FIELD_ORDER_COUNT_BOTTOM,
+      eInvalid = STD_VIDEO_DECODE_H264_FIELD_ORDER_COUNT_INVALID
+    };
+
+    //=== vulkan_video_codec_h265std ===
+
+    enum class H265ChromaFormatIdc
+    {
+      eMonochrome = STD_VIDEO_H265_CHROMA_FORMAT_IDC_MONOCHROME,
+      e420        = STD_VIDEO_H265_CHROMA_FORMAT_IDC_420,
+      e422        = STD_VIDEO_H265_CHROMA_FORMAT_IDC_422,
+      e444        = STD_VIDEO_H265_CHROMA_FORMAT_IDC_444,
+      eInvalid    = STD_VIDEO_H265_CHROMA_FORMAT_IDC_INVALID
+    };
+
+    enum class H265ProfileIdc
+    {
+      eMain                  = STD_VIDEO_H265_PROFILE_IDC_MAIN,
+      eMain10                = STD_VIDEO_H265_PROFILE_IDC_MAIN_10,
+      eMainStillPicture      = STD_VIDEO_H265_PROFILE_IDC_MAIN_STILL_PICTURE,
+      eFormatRangeExtensions = STD_VIDEO_H265_PROFILE_IDC_FORMAT_RANGE_EXTENSIONS,
+      eSccExtensions         = STD_VIDEO_H265_PROFILE_IDC_SCC_EXTENSIONS,
+      eInvalid               = STD_VIDEO_H265_PROFILE_IDC_INVALID
+    };
+
+    enum class H265LevelIdc
+    {
+      e1_0     = STD_VIDEO_H265_LEVEL_IDC_1_0,
+      e2_0     = STD_VIDEO_H265_LEVEL_IDC_2_0,
+      e2_1     = STD_VIDEO_H265_LEVEL_IDC_2_1,
+      e3_0     = STD_VIDEO_H265_LEVEL_IDC_3_0,
+      e3_1     = STD_VIDEO_H265_LEVEL_IDC_3_1,
+      e4_0     = STD_VIDEO_H265_LEVEL_IDC_4_0,
+      e4_1     = STD_VIDEO_H265_LEVEL_IDC_4_1,
+      e5_0     = STD_VIDEO_H265_LEVEL_IDC_5_0,
+      e5_1     = STD_VIDEO_H265_LEVEL_IDC_5_1,
+      e5_2     = STD_VIDEO_H265_LEVEL_IDC_5_2,
+      e6_0     = STD_VIDEO_H265_LEVEL_IDC_6_0,
+      e6_1     = STD_VIDEO_H265_LEVEL_IDC_6_1,
+      e6_2     = STD_VIDEO_H265_LEVEL_IDC_6_2,
+      eInvalid = STD_VIDEO_H265_LEVEL_IDC_INVALID
+    };
+
+    enum class H265SliceType
+    {
+      eB       = STD_VIDEO_H265_SLICE_TYPE_B,
+      eP       = STD_VIDEO_H265_SLICE_TYPE_P,
+      eI       = STD_VIDEO_H265_SLICE_TYPE_I,
+      eInvalid = STD_VIDEO_H265_SLICE_TYPE_INVALID
+    };
+
+    enum class H265PictureType
+    {
+      eP       = STD_VIDEO_H265_PICTURE_TYPE_P,
+      eB       = STD_VIDEO_H265_PICTURE_TYPE_B,
+      eI       = STD_VIDEO_H265_PICTURE_TYPE_I,
+      eIdr     = STD_VIDEO_H265_PICTURE_TYPE_IDR,
+      eInvalid = STD_VIDEO_H265_PICTURE_TYPE_INVALID
+    };
+
+    enum class H265AspectRatioIdc
+    {
+      eUnspecified = STD_VIDEO_H265_ASPECT_RATIO_IDC_UNSPECIFIED,
+      eSquare      = STD_VIDEO_H265_ASPECT_RATIO_IDC_SQUARE,
+      e12_11       = STD_VIDEO_H265_ASPECT_RATIO_IDC_12_11,
+      e10_11       = STD_VIDEO_H265_ASPECT_RATIO_IDC_10_11,
+      e16_11       = STD_VIDEO_H265_ASPECT_RATIO_IDC_16_11,
+      e40_33       = STD_VIDEO_H265_ASPECT_RATIO_IDC_40_33,
+      e24_11       = STD_VIDEO_H265_ASPECT_RATIO_IDC_24_11,
+      e20_11       = STD_VIDEO_H265_ASPECT_RATIO_IDC_20_11,
+      e32_11       = STD_VIDEO_H265_ASPECT_RATIO_IDC_32_11,
+      e80_33       = STD_VIDEO_H265_ASPECT_RATIO_IDC_80_33,
+      e18_11       = STD_VIDEO_H265_ASPECT_RATIO_IDC_18_11,
+      e15_11       = STD_VIDEO_H265_ASPECT_RATIO_IDC_15_11,
+      e64_33       = STD_VIDEO_H265_ASPECT_RATIO_IDC_64_33,
+      e160_99      = STD_VIDEO_H265_ASPECT_RATIO_IDC_160_99,
+      e4_3         = STD_VIDEO_H265_ASPECT_RATIO_IDC_4_3,
+      e3_2         = STD_VIDEO_H265_ASPECT_RATIO_IDC_3_2,
+      e2_1         = STD_VIDEO_H265_ASPECT_RATIO_IDC_2_1,
+      eExtendedSar = STD_VIDEO_H265_ASPECT_RATIO_IDC_EXTENDED_SAR,
+      eInvalid     = STD_VIDEO_H265_ASPECT_RATIO_IDC_INVALID
+    };
+
+    //===============
+    //=== STRUCTS ===
+    //===============
+
+    //=== vulkan_video_codec_h264std ===
+
+    struct H264SpsVuiFlags
+    {
+      using NativeType = StdVideoH264SpsVuiFlags;
+
+      operator StdVideoH264SpsVuiFlags const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoH264SpsVuiFlags *>( this );
+      }
+
+      operator StdVideoH264SpsVuiFlags &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoH264SpsVuiFlags *>( this );
+      }
+
+      bool operator==( H264SpsVuiFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( aspect_ratio_info_present_flag == rhs.aspect_ratio_info_present_flag ) && ( overscan_info_present_flag == rhs.overscan_info_present_flag ) &&
+               ( overscan_appropriate_flag == rhs.overscan_appropriate_flag ) && ( video_signal_type_present_flag == rhs.video_signal_type_present_flag ) &&
+               ( video_full_range_flag == rhs.video_full_range_flag ) && ( color_description_present_flag == rhs.color_description_present_flag ) &&
+               ( chroma_loc_info_present_flag == rhs.chroma_loc_info_present_flag ) && ( timing_info_present_flag == rhs.timing_info_present_flag ) &&
+               ( fixed_frame_rate_flag == rhs.fixed_frame_rate_flag ) && ( bitstream_restriction_flag == rhs.bitstream_restriction_flag ) &&
+               ( nal_hrd_parameters_present_flag == rhs.nal_hrd_parameters_present_flag ) &&
+               ( vcl_hrd_parameters_present_flag == rhs.vcl_hrd_parameters_present_flag );
+      }
+
+      bool operator!=( H264SpsVuiFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      uint32_t aspect_ratio_info_present_flag  : 1;
+      uint32_t overscan_info_present_flag      : 1;
+      uint32_t overscan_appropriate_flag       : 1;
+      uint32_t video_signal_type_present_flag  : 1;
+      uint32_t video_full_range_flag           : 1;
+      uint32_t color_description_present_flag  : 1;
+      uint32_t chroma_loc_info_present_flag    : 1;
+      uint32_t timing_info_present_flag        : 1;
+      uint32_t fixed_frame_rate_flag           : 1;
+      uint32_t bitstream_restriction_flag      : 1;
+      uint32_t nal_hrd_parameters_present_flag : 1;
+      uint32_t vcl_hrd_parameters_present_flag : 1;
+    };
+
+    struct H264HrdParameters
+    {
+      using NativeType = StdVideoH264HrdParameters;
+
+      operator StdVideoH264HrdParameters const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoH264HrdParameters *>( this );
+      }
+
+      operator StdVideoH264HrdParameters &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoH264HrdParameters *>( this );
+      }
+
+      bool operator==( H264HrdParameters const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( cpb_cnt_minus1 == rhs.cpb_cnt_minus1 ) && ( bit_rate_scale == rhs.bit_rate_scale ) && ( cpb_size_scale == rhs.cpb_size_scale ) &&
+               ( reserved1 == rhs.reserved1 ) && ( bit_rate_value_minus1 == rhs.bit_rate_value_minus1 ) &&
+               ( cpb_size_value_minus1 == rhs.cpb_size_value_minus1 ) && ( cbr_flag == rhs.cbr_flag ) &&
+               ( initial_cpb_removal_delay_length_minus1 == rhs.initial_cpb_removal_delay_length_minus1 ) &&
+               ( cpb_removal_delay_length_minus1 == rhs.cpb_removal_delay_length_minus1 ) &&
+               ( dpb_output_delay_length_minus1 == rhs.dpb_output_delay_length_minus1 ) && ( time_offset_length == rhs.time_offset_length );
+      }
+
+      bool operator!=( H264HrdParameters const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      uint8_t                                                                          cpb_cnt_minus1                          = {};
+      uint8_t                                                                          bit_rate_scale                          = {};
+      uint8_t                                                                          cpb_size_scale                          = {};
+      uint8_t                                                                          reserved1                               = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, STD_VIDEO_H264_CPB_CNT_LIST_SIZE> bit_rate_value_minus1                   = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, STD_VIDEO_H264_CPB_CNT_LIST_SIZE> cpb_size_value_minus1                   = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_H264_CPB_CNT_LIST_SIZE>  cbr_flag                                = {};
+      uint32_t                                                                         initial_cpb_removal_delay_length_minus1 = {};
+      uint32_t                                                                         cpb_removal_delay_length_minus1         = {};
+      uint32_t                                                                         dpb_output_delay_length_minus1          = {};
+      uint32_t                                                                         time_offset_length                      = {};
+    };
+
+    struct H264SequenceParameterSetVui
+    {
+      using NativeType = StdVideoH264SequenceParameterSetVui;
+
+      operator StdVideoH264SequenceParameterSetVui const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoH264SequenceParameterSetVui *>( this );
+      }
+
+      operator StdVideoH264SequenceParameterSetVui &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoH264SequenceParameterSetVui *>( this );
+      }
+
+      bool operator==( H264SequenceParameterSetVui const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( flags == rhs.flags ) && ( aspect_ratio_idc == rhs.aspect_ratio_idc ) && ( sar_width == rhs.sar_width ) && ( sar_height == rhs.sar_height ) &&
+               ( video_format == rhs.video_format ) && ( colour_primaries == rhs.colour_primaries ) &&
+               ( transfer_characteristics == rhs.transfer_characteristics ) && ( matrix_coefficients == rhs.matrix_coefficients ) &&
+               ( num_units_in_tick == rhs.num_units_in_tick ) && ( time_scale == rhs.time_scale ) && ( max_num_reorder_frames == rhs.max_num_reorder_frames ) &&
+               ( max_dec_frame_buffering == rhs.max_dec_frame_buffering ) && ( chroma_sample_loc_type_top_field == rhs.chroma_sample_loc_type_top_field ) &&
+               ( chroma_sample_loc_type_bottom_field == rhs.chroma_sample_loc_type_bottom_field ) && ( reserved1 == rhs.reserved1 ) &&
+               ( pHrdParameters == rhs.pHrdParameters );
+      }
+
+      bool operator!=( H264SequenceParameterSetVui const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264SpsVuiFlags    flags = {};
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264AspectRatioIdc aspect_ratio_idc =
+        VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264AspectRatioIdc::eUnspecified;
+      uint16_t                                                                    sar_width                           = {};
+      uint16_t                                                                    sar_height                          = {};
+      uint8_t                                                                     video_format                        = {};
+      uint8_t                                                                     colour_primaries                    = {};
+      uint8_t                                                                     transfer_characteristics            = {};
+      uint8_t                                                                     matrix_coefficients                 = {};
+      uint32_t                                                                    num_units_in_tick                   = {};
+      uint32_t                                                                    time_scale                          = {};
+      uint8_t                                                                     max_num_reorder_frames              = {};
+      uint8_t                                                                     max_dec_frame_buffering             = {};
+      uint8_t                                                                     chroma_sample_loc_type_top_field    = {};
+      uint8_t                                                                     chroma_sample_loc_type_bottom_field = {};
+      uint32_t                                                                    reserved1                           = {};
+      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264HrdParameters * pHrdParameters                      = {};
+    };
+
+    struct H264SpsFlags
+    {
+      using NativeType = StdVideoH264SpsFlags;
+
+      operator StdVideoH264SpsFlags const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoH264SpsFlags *>( this );
+      }
+
+      operator StdVideoH264SpsFlags &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoH264SpsFlags *>( this );
+      }
+
+      bool operator==( H264SpsFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( constraint_set0_flag == rhs.constraint_set0_flag ) && ( constraint_set1_flag == rhs.constraint_set1_flag ) &&
+               ( constraint_set2_flag == rhs.constraint_set2_flag ) && ( constraint_set3_flag == rhs.constraint_set3_flag ) &&
+               ( constraint_set4_flag == rhs.constraint_set4_flag ) && ( constraint_set5_flag == rhs.constraint_set5_flag ) &&
+               ( direct_8x8_inference_flag == rhs.direct_8x8_inference_flag ) && ( mb_adaptive_frame_field_flag == rhs.mb_adaptive_frame_field_flag ) &&
+               ( frame_mbs_only_flag == rhs.frame_mbs_only_flag ) && ( delta_pic_order_always_zero_flag == rhs.delta_pic_order_always_zero_flag ) &&
+               ( separate_colour_plane_flag == rhs.separate_colour_plane_flag ) &&
+               ( gaps_in_frame_num_value_allowed_flag == rhs.gaps_in_frame_num_value_allowed_flag ) &&
+               ( qpprime_y_zero_transform_bypass_flag == rhs.qpprime_y_zero_transform_bypass_flag ) && ( frame_cropping_flag == rhs.frame_cropping_flag ) &&
+               ( seq_scaling_matrix_present_flag == rhs.seq_scaling_matrix_present_flag ) && ( vui_parameters_present_flag == rhs.vui_parameters_present_flag );
+      }
+
+      bool operator!=( H264SpsFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      uint32_t constraint_set0_flag                 : 1;
+      uint32_t constraint_set1_flag                 : 1;
+      uint32_t constraint_set2_flag                 : 1;
+      uint32_t constraint_set3_flag                 : 1;
+      uint32_t constraint_set4_flag                 : 1;
+      uint32_t constraint_set5_flag                 : 1;
+      uint32_t direct_8x8_inference_flag            : 1;
+      uint32_t mb_adaptive_frame_field_flag         : 1;
+      uint32_t frame_mbs_only_flag                  : 1;
+      uint32_t delta_pic_order_always_zero_flag     : 1;
+      uint32_t separate_colour_plane_flag           : 1;
+      uint32_t gaps_in_frame_num_value_allowed_flag : 1;
+      uint32_t qpprime_y_zero_transform_bypass_flag : 1;
+      uint32_t frame_cropping_flag                  : 1;
+      uint32_t seq_scaling_matrix_present_flag      : 1;
+      uint32_t vui_parameters_present_flag          : 1;
+    };
+
+    struct H264ScalingLists
+    {
+      using NativeType = StdVideoH264ScalingLists;
+
+      operator StdVideoH264ScalingLists const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoH264ScalingLists *>( this );
+      }
+
+      operator StdVideoH264ScalingLists &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoH264ScalingLists *>( this );
+      }
+
+      bool operator==( H264ScalingLists const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( scaling_list_present_mask == rhs.scaling_list_present_mask ) && ( use_default_scaling_matrix_mask == rhs.use_default_scaling_matrix_mask ) &&
+               ( ScalingList4x4 == rhs.ScalingList4x4 ) && ( ScalingList8x8 == rhs.ScalingList8x8 );
+      }
+
+      bool operator!=( H264ScalingLists const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      uint16_t scaling_list_present_mask       = {};
+      uint16_t use_default_scaling_matrix_mask = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper2D<uint8_t, STD_VIDEO_H264_SCALING_LIST_4X4_NUM_LISTS, STD_VIDEO_H264_SCALING_LIST_4X4_NUM_ELEMENTS>
+        ScalingList4x4 = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper2D<uint8_t, STD_VIDEO_H264_SCALING_LIST_8X8_NUM_LISTS, STD_VIDEO_H264_SCALING_LIST_8X8_NUM_ELEMENTS>
+        ScalingList8x8 = {};
+    };
+
+    struct H264SequenceParameterSet
+    {
+      using NativeType = StdVideoH264SequenceParameterSet;
+
+      operator StdVideoH264SequenceParameterSet const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoH264SequenceParameterSet *>( this );
+      }
+
+      operator StdVideoH264SequenceParameterSet &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoH264SequenceParameterSet *>( this );
+      }
+
+      bool operator==( H264SequenceParameterSet const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( flags == rhs.flags ) && ( profile_idc == rhs.profile_idc ) && ( level_idc == rhs.level_idc ) &&
+               ( chroma_format_idc == rhs.chroma_format_idc ) && ( seq_parameter_set_id == rhs.seq_parameter_set_id ) &&
+               ( bit_depth_luma_minus8 == rhs.bit_depth_luma_minus8 ) && ( bit_depth_chroma_minus8 == rhs.bit_depth_chroma_minus8 ) &&
+               ( log2_max_frame_num_minus4 == rhs.log2_max_frame_num_minus4 ) && ( pic_order_cnt_type == rhs.pic_order_cnt_type ) &&
+               ( offset_for_non_ref_pic == rhs.offset_for_non_ref_pic ) && ( offset_for_top_to_bottom_field == rhs.offset_for_top_to_bottom_field ) &&
+               ( log2_max_pic_order_cnt_lsb_minus4 == rhs.log2_max_pic_order_cnt_lsb_minus4 ) &&
+               ( num_ref_frames_in_pic_order_cnt_cycle == rhs.num_ref_frames_in_pic_order_cnt_cycle ) && ( max_num_ref_frames == rhs.max_num_ref_frames ) &&
+               ( reserved1 == rhs.reserved1 ) && ( pic_width_in_mbs_minus1 == rhs.pic_width_in_mbs_minus1 ) &&
+               ( pic_height_in_map_units_minus1 == rhs.pic_height_in_map_units_minus1 ) && ( frame_crop_left_offset == rhs.frame_crop_left_offset ) &&
+               ( frame_crop_right_offset == rhs.frame_crop_right_offset ) && ( frame_crop_top_offset == rhs.frame_crop_top_offset ) &&
+               ( frame_crop_bottom_offset == rhs.frame_crop_bottom_offset ) && ( reserved2 == rhs.reserved2 ) &&
+               ( pOffsetForRefFrame == rhs.pOffsetForRefFrame ) && ( pScalingLists == rhs.pScalingLists ) &&
+               ( pSequenceParameterSetVui == rhs.pSequenceParameterSetVui );
+      }
+
+      bool operator!=( H264SequenceParameterSet const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264SpsFlags   flags = {};
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264ProfileIdc profile_idc =
+        VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264ProfileIdc::eBaseline;
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264LevelIdc        level_idc = VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264LevelIdc::e1_0;
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264ChromaFormatIdc chroma_format_idc =
+        VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264ChromaFormatIdc::eMonochrome;
+      uint8_t                                                       seq_parameter_set_id      = {};
+      uint8_t                                                       bit_depth_luma_minus8     = {};
+      uint8_t                                                       bit_depth_chroma_minus8   = {};
+      uint8_t                                                       log2_max_frame_num_minus4 = {};
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264PocType pic_order_cnt_type     = VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264PocType::e0;
+      int32_t                                                       offset_for_non_ref_pic = {};
+      int32_t                                                       offset_for_top_to_bottom_field                   = {};
+      uint8_t                                                       log2_max_pic_order_cnt_lsb_minus4                = {};
+      uint8_t                                                       num_ref_frames_in_pic_order_cnt_cycle            = {};
+      uint8_t                                                       max_num_ref_frames                               = {};
+      uint8_t                                                       reserved1                                        = {};
+      uint32_t                                                      pic_width_in_mbs_minus1                          = {};
+      uint32_t                                                      pic_height_in_map_units_minus1                   = {};
+      uint32_t                                                      frame_crop_left_offset                           = {};
+      uint32_t                                                      frame_crop_right_offset                          = {};
+      uint32_t                                                      frame_crop_top_offset                            = {};
+      uint32_t                                                      frame_crop_bottom_offset                         = {};
+      uint32_t                                                      reserved2                                        = {};
+      const int32_t *                                               pOffsetForRefFrame                               = {};
+      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264ScalingLists *            pScalingLists            = {};
+      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264SequenceParameterSetVui * pSequenceParameterSetVui = {};
+    };
+
+    struct H264PpsFlags
+    {
+      using NativeType = StdVideoH264PpsFlags;
+
+      operator StdVideoH264PpsFlags const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoH264PpsFlags *>( this );
+      }
+
+      operator StdVideoH264PpsFlags &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoH264PpsFlags *>( this );
+      }
+
+      bool operator==( H264PpsFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( transform_8x8_mode_flag == rhs.transform_8x8_mode_flag ) && ( redundant_pic_cnt_present_flag == rhs.redundant_pic_cnt_present_flag ) &&
+               ( constrained_intra_pred_flag == rhs.constrained_intra_pred_flag ) &&
+               ( deblocking_filter_control_present_flag == rhs.deblocking_filter_control_present_flag ) && ( weighted_pred_flag == rhs.weighted_pred_flag ) &&
+               ( bottom_field_pic_order_in_frame_present_flag == rhs.bottom_field_pic_order_in_frame_present_flag ) &&
+               ( entropy_coding_mode_flag == rhs.entropy_coding_mode_flag ) && ( pic_scaling_matrix_present_flag == rhs.pic_scaling_matrix_present_flag );
+      }
+
+      bool operator!=( H264PpsFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      uint32_t transform_8x8_mode_flag                      : 1;
+      uint32_t redundant_pic_cnt_present_flag               : 1;
+      uint32_t constrained_intra_pred_flag                  : 1;
+      uint32_t deblocking_filter_control_present_flag       : 1;
+      uint32_t weighted_pred_flag                           : 1;
+      uint32_t bottom_field_pic_order_in_frame_present_flag : 1;
+      uint32_t entropy_coding_mode_flag                     : 1;
+      uint32_t pic_scaling_matrix_present_flag              : 1;
+    };
+
+    struct H264PictureParameterSet
+    {
+      using NativeType = StdVideoH264PictureParameterSet;
+
+      operator StdVideoH264PictureParameterSet const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoH264PictureParameterSet *>( this );
+      }
+
+      operator StdVideoH264PictureParameterSet &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoH264PictureParameterSet *>( this );
+      }
+
+      bool operator==( H264PictureParameterSet const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( flags == rhs.flags ) && ( seq_parameter_set_id == rhs.seq_parameter_set_id ) && ( pic_parameter_set_id == rhs.pic_parameter_set_id ) &&
+               ( num_ref_idx_l0_default_active_minus1 == rhs.num_ref_idx_l0_default_active_minus1 ) &&
+               ( num_ref_idx_l1_default_active_minus1 == rhs.num_ref_idx_l1_default_active_minus1 ) && ( weighted_bipred_idc == rhs.weighted_bipred_idc ) &&
+               ( pic_init_qp_minus26 == rhs.pic_init_qp_minus26 ) && ( pic_init_qs_minus26 == rhs.pic_init_qs_minus26 ) &&
+               ( chroma_qp_index_offset == rhs.chroma_qp_index_offset ) && ( second_chroma_qp_index_offset == rhs.second_chroma_qp_index_offset ) &&
+               ( pScalingLists == rhs.pScalingLists );
+      }
+
+      bool operator!=( H264PictureParameterSet const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264PpsFlags          flags                                = {};
+      uint8_t                                                                 seq_parameter_set_id                 = {};
+      uint8_t                                                                 pic_parameter_set_id                 = {};
+      uint8_t                                                                 num_ref_idx_l0_default_active_minus1 = {};
+      uint8_t                                                                 num_ref_idx_l1_default_active_minus1 = {};
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264WeightedBipredIdc weighted_bipred_idc =
+        VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264WeightedBipredIdc::eDefault;
+      int8_t                                                                     pic_init_qp_minus26           = {};
+      int8_t                                                                     pic_init_qs_minus26           = {};
+      int8_t                                                                     chroma_qp_index_offset        = {};
+      int8_t                                                                     second_chroma_qp_index_offset = {};
+      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264ScalingLists * pScalingLists                 = {};
+    };
+
+    //=== vulkan_video_codec_h264std_decode ===
+
+    struct DecodeH264PictureInfoFlags
+    {
+      using NativeType = StdVideoDecodeH264PictureInfoFlags;
+
+      operator StdVideoDecodeH264PictureInfoFlags const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoDecodeH264PictureInfoFlags *>( this );
+      }
+
+      operator StdVideoDecodeH264PictureInfoFlags &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoDecodeH264PictureInfoFlags *>( this );
+      }
+
+      bool operator==( DecodeH264PictureInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( field_pic_flag == rhs.field_pic_flag ) && ( is_intra == rhs.is_intra ) && ( IdrPicFlag == rhs.IdrPicFlag ) &&
+               ( bottom_field_flag == rhs.bottom_field_flag ) && ( is_reference == rhs.is_reference ) &&
+               ( complementary_field_pair == rhs.complementary_field_pair );
+      }
+
+      bool operator!=( DecodeH264PictureInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      uint32_t field_pic_flag           : 1;
+      uint32_t is_intra                 : 1;
+      uint32_t IdrPicFlag               : 1;
+      uint32_t bottom_field_flag        : 1;
+      uint32_t is_reference             : 1;
+      uint32_t complementary_field_pair : 1;
+    };
+
+    struct DecodeH264PictureInfo
+    {
+      using NativeType = StdVideoDecodeH264PictureInfo;
+
+      operator StdVideoDecodeH264PictureInfo const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoDecodeH264PictureInfo *>( this );
+      }
+
+      operator StdVideoDecodeH264PictureInfo &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoDecodeH264PictureInfo *>( this );
+      }
+
+      bool operator==( DecodeH264PictureInfo const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( flags == rhs.flags ) && ( seq_parameter_set_id == rhs.seq_parameter_set_id ) && ( pic_parameter_set_id == rhs.pic_parameter_set_id ) &&
+               ( reserved1 == rhs.reserved1 ) && ( reserved2 == rhs.reserved2 ) && ( frame_num == rhs.frame_num ) && ( idr_pic_id == rhs.idr_pic_id ) &&
+               ( PicOrderCnt == rhs.PicOrderCnt );
+      }
+
+      bool operator!=( DecodeH264PictureInfo const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::DecodeH264PictureInfoFlags                     flags                = {};
+      uint8_t                                                                                          seq_parameter_set_id = {};
+      uint8_t                                                                                          pic_parameter_set_id = {};
+      uint8_t                                                                                          reserved1            = {};
+      uint8_t                                                                                          reserved2            = {};
+      uint16_t                                                                                         frame_num            = {};
+      uint16_t                                                                                         idr_pic_id           = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<int32_t, STD_VIDEO_DECODE_H264_FIELD_ORDER_COUNT_LIST_SIZE> PicOrderCnt          = {};
+    };
+
+    struct DecodeH264ReferenceInfoFlags
+    {
+      using NativeType = StdVideoDecodeH264ReferenceInfoFlags;
+
+      operator StdVideoDecodeH264ReferenceInfoFlags const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoDecodeH264ReferenceInfoFlags *>( this );
+      }
+
+      operator StdVideoDecodeH264ReferenceInfoFlags &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoDecodeH264ReferenceInfoFlags *>( this );
+      }
+
+      bool operator==( DecodeH264ReferenceInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( top_field_flag == rhs.top_field_flag ) && ( bottom_field_flag == rhs.bottom_field_flag ) &&
+               ( used_for_long_term_reference == rhs.used_for_long_term_reference ) && ( is_non_existing == rhs.is_non_existing );
+      }
+
+      bool operator!=( DecodeH264ReferenceInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      uint32_t top_field_flag               : 1;
+      uint32_t bottom_field_flag            : 1;
+      uint32_t used_for_long_term_reference : 1;
+      uint32_t is_non_existing              : 1;
+    };
+
+    struct DecodeH264ReferenceInfo
+    {
+      using NativeType = StdVideoDecodeH264ReferenceInfo;
+
+      operator StdVideoDecodeH264ReferenceInfo const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoDecodeH264ReferenceInfo *>( this );
+      }
+
+      operator StdVideoDecodeH264ReferenceInfo &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoDecodeH264ReferenceInfo *>( this );
+      }
+
+      bool operator==( DecodeH264ReferenceInfo const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( flags == rhs.flags ) && ( FrameNum == rhs.FrameNum ) && ( reserved == rhs.reserved ) && ( PicOrderCnt == rhs.PicOrderCnt );
+      }
+
+      bool operator!=( DecodeH264ReferenceInfo const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::DecodeH264ReferenceInfoFlags                   flags       = {};
+      uint16_t                                                                                         FrameNum    = {};
+      uint16_t                                                                                         reserved    = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<int32_t, STD_VIDEO_DECODE_H264_FIELD_ORDER_COUNT_LIST_SIZE> PicOrderCnt = {};
+    };
+
+    //=== vulkan_video_codec_h264std_encode ===
+
+    struct EncodeH264WeightTableFlags
+    {
+      using NativeType = StdVideoEncodeH264WeightTableFlags;
+
+      operator StdVideoEncodeH264WeightTableFlags const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoEncodeH264WeightTableFlags *>( this );
+      }
+
+      operator StdVideoEncodeH264WeightTableFlags &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoEncodeH264WeightTableFlags *>( this );
+      }
+
+      bool operator==( EncodeH264WeightTableFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( luma_weight_l0_flag == rhs.luma_weight_l0_flag ) && ( chroma_weight_l0_flag == rhs.chroma_weight_l0_flag ) &&
+               ( luma_weight_l1_flag == rhs.luma_weight_l1_flag ) && ( chroma_weight_l1_flag == rhs.chroma_weight_l1_flag );
+      }
+
+      bool operator!=( EncodeH264WeightTableFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      uint32_t luma_weight_l0_flag   = {};
+      uint32_t chroma_weight_l0_flag = {};
+      uint32_t luma_weight_l1_flag   = {};
+      uint32_t chroma_weight_l1_flag = {};
+    };
+
+    struct EncodeH264WeightTable
+    {
+      using NativeType = StdVideoEncodeH264WeightTable;
+
+      operator StdVideoEncodeH264WeightTable const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoEncodeH264WeightTable *>( this );
+      }
+
+      operator StdVideoEncodeH264WeightTable &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoEncodeH264WeightTable *>( this );
+      }
+
+      bool operator==( EncodeH264WeightTable const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( flags == rhs.flags ) && ( luma_log2_weight_denom == rhs.luma_log2_weight_denom ) &&
+               ( chroma_log2_weight_denom == rhs.chroma_log2_weight_denom ) && ( luma_weight_l0 == rhs.luma_weight_l0 ) &&
+               ( luma_offset_l0 == rhs.luma_offset_l0 ) && ( chroma_weight_l0 == rhs.chroma_weight_l0 ) && ( chroma_offset_l0 == rhs.chroma_offset_l0 ) &&
+               ( luma_weight_l1 == rhs.luma_weight_l1 ) && ( luma_offset_l1 == rhs.luma_offset_l1 ) && ( chroma_weight_l1 == rhs.chroma_weight_l1 ) &&
+               ( chroma_offset_l1 == rhs.chroma_offset_l1 );
+      }
+
+      bool operator!=( EncodeH264WeightTable const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH264WeightTableFlags                                    flags                    = {};
+      uint8_t                                                                                                         luma_log2_weight_denom   = {};
+      uint8_t                                                                                                         chroma_log2_weight_denom = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<int8_t, STD_VIDEO_H264_MAX_NUM_LIST_REF>                                   luma_weight_l0           = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<int8_t, STD_VIDEO_H264_MAX_NUM_LIST_REF>                                   luma_offset_l0           = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper2D<int8_t, STD_VIDEO_H264_MAX_NUM_LIST_REF, STD_VIDEO_H264_MAX_CHROMA_PLANES> chroma_weight_l0         = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper2D<int8_t, STD_VIDEO_H264_MAX_NUM_LIST_REF, STD_VIDEO_H264_MAX_CHROMA_PLANES> chroma_offset_l0         = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<int8_t, STD_VIDEO_H264_MAX_NUM_LIST_REF>                                   luma_weight_l1           = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<int8_t, STD_VIDEO_H264_MAX_NUM_LIST_REF>                                   luma_offset_l1           = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper2D<int8_t, STD_VIDEO_H264_MAX_NUM_LIST_REF, STD_VIDEO_H264_MAX_CHROMA_PLANES> chroma_weight_l1         = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper2D<int8_t, STD_VIDEO_H264_MAX_NUM_LIST_REF, STD_VIDEO_H264_MAX_CHROMA_PLANES> chroma_offset_l1         = {};
+    };
+
+    struct EncodeH264SliceHeaderFlags
+    {
+      using NativeType = StdVideoEncodeH264SliceHeaderFlags;
+
+      operator StdVideoEncodeH264SliceHeaderFlags const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoEncodeH264SliceHeaderFlags *>( this );
+      }
+
+      operator StdVideoEncodeH264SliceHeaderFlags &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoEncodeH264SliceHeaderFlags *>( this );
+      }
+
+      bool operator==( EncodeH264SliceHeaderFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( direct_spatial_mv_pred_flag == rhs.direct_spatial_mv_pred_flag ) &&
+               ( num_ref_idx_active_override_flag == rhs.num_ref_idx_active_override_flag ) && ( reserved == rhs.reserved );
+      }
+
+      bool operator!=( EncodeH264SliceHeaderFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      uint32_t direct_spatial_mv_pred_flag      : 1;
+      uint32_t num_ref_idx_active_override_flag : 1;
+      uint32_t reserved                         : 30;
+    };
+
+    struct EncodeH264PictureInfoFlags
+    {
+      using NativeType = StdVideoEncodeH264PictureInfoFlags;
+
+      operator StdVideoEncodeH264PictureInfoFlags const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoEncodeH264PictureInfoFlags *>( this );
+      }
+
+      operator StdVideoEncodeH264PictureInfoFlags &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoEncodeH264PictureInfoFlags *>( this );
+      }
+
+      bool operator==( EncodeH264PictureInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( IdrPicFlag == rhs.IdrPicFlag ) && ( is_reference == rhs.is_reference ) &&
+               ( no_output_of_prior_pics_flag == rhs.no_output_of_prior_pics_flag ) && ( long_term_reference_flag == rhs.long_term_reference_flag ) &&
+               ( adaptive_ref_pic_marking_mode_flag == rhs.adaptive_ref_pic_marking_mode_flag ) && ( reserved == rhs.reserved );
+      }
+
+      bool operator!=( EncodeH264PictureInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      uint32_t IdrPicFlag                         : 1;
+      uint32_t is_reference                       : 1;
+      uint32_t no_output_of_prior_pics_flag       : 1;
+      uint32_t long_term_reference_flag           : 1;
+      uint32_t adaptive_ref_pic_marking_mode_flag : 1;
+      uint32_t reserved                           : 27;
+    };
+
+    struct EncodeH264ReferenceInfoFlags
+    {
+      using NativeType = StdVideoEncodeH264ReferenceInfoFlags;
+
+      operator StdVideoEncodeH264ReferenceInfoFlags const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoEncodeH264ReferenceInfoFlags *>( this );
+      }
+
+      operator StdVideoEncodeH264ReferenceInfoFlags &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoEncodeH264ReferenceInfoFlags *>( this );
+      }
+
+      bool operator==( EncodeH264ReferenceInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( used_for_long_term_reference == rhs.used_for_long_term_reference ) && ( reserved == rhs.reserved );
+      }
+
+      bool operator!=( EncodeH264ReferenceInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      uint32_t used_for_long_term_reference : 1;
+      uint32_t reserved                     : 31;
+    };
+
+    struct EncodeH264ReferenceListsInfoFlags
+    {
+      using NativeType = StdVideoEncodeH264ReferenceListsInfoFlags;
+
+      operator StdVideoEncodeH264ReferenceListsInfoFlags const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoEncodeH264ReferenceListsInfoFlags *>( this );
+      }
+
+      operator StdVideoEncodeH264ReferenceListsInfoFlags &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoEncodeH264ReferenceListsInfoFlags *>( this );
+      }
+
+      bool operator==( EncodeH264ReferenceListsInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( ref_pic_list_modification_flag_l0 == rhs.ref_pic_list_modification_flag_l0 ) &&
+               ( ref_pic_list_modification_flag_l1 == rhs.ref_pic_list_modification_flag_l1 ) && ( reserved == rhs.reserved );
+      }
+
+      bool operator!=( EncodeH264ReferenceListsInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      uint32_t ref_pic_list_modification_flag_l0 : 1;
+      uint32_t ref_pic_list_modification_flag_l1 : 1;
+      uint32_t reserved                          : 30;
+    };
+
+    struct EncodeH264RefListModEntry
+    {
+      using NativeType = StdVideoEncodeH264RefListModEntry;
+
+      operator StdVideoEncodeH264RefListModEntry const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoEncodeH264RefListModEntry *>( this );
+      }
+
+      operator StdVideoEncodeH264RefListModEntry &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoEncodeH264RefListModEntry *>( this );
+      }
+
+      bool operator==( EncodeH264RefListModEntry const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( modification_of_pic_nums_idc == rhs.modification_of_pic_nums_idc ) && ( abs_diff_pic_num_minus1 == rhs.abs_diff_pic_num_minus1 ) &&
+               ( long_term_pic_num == rhs.long_term_pic_num );
+      }
+
+      bool operator!=( EncodeH264RefListModEntry const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264ModificationOfPicNumsIdc modification_of_pic_nums_idc =
+        VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264ModificationOfPicNumsIdc::eShortTermSubtract;
+      uint16_t abs_diff_pic_num_minus1 = {};
+      uint16_t long_term_pic_num       = {};
+    };
+
+    struct EncodeH264RefPicMarkingEntry
+    {
+      using NativeType = StdVideoEncodeH264RefPicMarkingEntry;
+
+      operator StdVideoEncodeH264RefPicMarkingEntry const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoEncodeH264RefPicMarkingEntry *>( this );
+      }
+
+      operator StdVideoEncodeH264RefPicMarkingEntry &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoEncodeH264RefPicMarkingEntry *>( this );
+      }
+
+      bool operator==( EncodeH264RefPicMarkingEntry const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( operation == rhs.operation ) && ( difference_of_pic_nums_minus1 == rhs.difference_of_pic_nums_minus1 ) &&
+               ( long_term_pic_num == rhs.long_term_pic_num ) && ( long_term_frame_idx == rhs.long_term_frame_idx ) &&
+               ( max_long_term_frame_idx_plus1 == rhs.max_long_term_frame_idx_plus1 );
+      }
+
+      bool operator!=( EncodeH264RefPicMarkingEntry const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264MemMgmtControlOp operation =
+        VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264MemMgmtControlOp::eEnd;
+      uint16_t difference_of_pic_nums_minus1 = {};
+      uint16_t long_term_pic_num             = {};
+      uint16_t long_term_frame_idx           = {};
+      uint16_t max_long_term_frame_idx_plus1 = {};
+    };
+
+    struct EncodeH264ReferenceListsInfo
+    {
+      using NativeType = StdVideoEncodeH264ReferenceListsInfo;
+
+      operator StdVideoEncodeH264ReferenceListsInfo const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoEncodeH264ReferenceListsInfo *>( this );
+      }
+
+      operator StdVideoEncodeH264ReferenceListsInfo &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoEncodeH264ReferenceListsInfo *>( this );
+      }
+
+      bool operator==( EncodeH264ReferenceListsInfo const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( flags == rhs.flags ) && ( num_ref_idx_l0_active_minus1 == rhs.num_ref_idx_l0_active_minus1 ) &&
+               ( num_ref_idx_l1_active_minus1 == rhs.num_ref_idx_l1_active_minus1 ) && ( RefPicList0 == rhs.RefPicList0 ) &&
+               ( RefPicList1 == rhs.RefPicList1 ) && ( refList0ModOpCount == rhs.refList0ModOpCount ) && ( refList1ModOpCount == rhs.refList1ModOpCount ) &&
+               ( refPicMarkingOpCount == rhs.refPicMarkingOpCount ) && ( reserved1 == rhs.reserved1 ) &&
+               ( pRefList0ModOperations == rhs.pRefList0ModOperations ) && ( pRefList1ModOperations == rhs.pRefList1ModOperations ) &&
+               ( pRefPicMarkingOperations == rhs.pRefPicMarkingOperations );
+      }
+
+      bool operator!=( EncodeH264ReferenceListsInfo const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH264ReferenceListsInfoFlags    flags                        = {};
+      uint8_t                                                                                num_ref_idx_l0_active_minus1 = {};
+      uint8_t                                                                                num_ref_idx_l1_active_minus1 = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_H264_MAX_NUM_LIST_REF>         RefPicList0                  = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_H264_MAX_NUM_LIST_REF>         RefPicList1                  = {};
+      uint8_t                                                                                refList0ModOpCount           = {};
+      uint8_t                                                                                refList1ModOpCount           = {};
+      uint8_t                                                                                refPicMarkingOpCount         = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, 7>                                       reserved1                    = {};
+      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH264RefListModEntry *    pRefList0ModOperations       = {};
+      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH264RefListModEntry *    pRefList1ModOperations       = {};
+      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH264RefPicMarkingEntry * pRefPicMarkingOperations     = {};
+    };
+
+    struct EncodeH264PictureInfo
+    {
+      using NativeType = StdVideoEncodeH264PictureInfo;
+
+      operator StdVideoEncodeH264PictureInfo const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoEncodeH264PictureInfo *>( this );
+      }
+
+      operator StdVideoEncodeH264PictureInfo &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoEncodeH264PictureInfo *>( this );
+      }
+
+      bool operator==( EncodeH264PictureInfo const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( flags == rhs.flags ) && ( seq_parameter_set_id == rhs.seq_parameter_set_id ) && ( pic_parameter_set_id == rhs.pic_parameter_set_id ) &&
+               ( idr_pic_id == rhs.idr_pic_id ) && ( primary_pic_type == rhs.primary_pic_type ) && ( frame_num == rhs.frame_num ) &&
+               ( PicOrderCnt == rhs.PicOrderCnt ) && ( temporal_id == rhs.temporal_id ) && ( reserved1 == rhs.reserved1 ) && ( pRefLists == rhs.pRefLists );
+      }
+
+      bool operator!=( EncodeH264PictureInfo const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH264PictureInfoFlags flags                = {};
+      uint8_t                                                                      seq_parameter_set_id = {};
+      uint8_t                                                                      pic_parameter_set_id = {};
+      uint16_t                                                                     idr_pic_id           = {};
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264PictureType            primary_pic_type =
+        VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264PictureType::eP;
+      uint32_t                                                                               frame_num   = {};
+      int32_t                                                                                PicOrderCnt = {};
+      uint8_t                                                                                temporal_id = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, 3>                                       reserved1   = {};
+      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH264ReferenceListsInfo * pRefLists   = {};
+    };
+
+    struct EncodeH264ReferenceInfo
+    {
+      using NativeType = StdVideoEncodeH264ReferenceInfo;
+
+      operator StdVideoEncodeH264ReferenceInfo const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoEncodeH264ReferenceInfo *>( this );
+      }
+
+      operator StdVideoEncodeH264ReferenceInfo &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoEncodeH264ReferenceInfo *>( this );
+      }
+
+      bool operator==( EncodeH264ReferenceInfo const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( flags == rhs.flags ) && ( primary_pic_type == rhs.primary_pic_type ) && ( FrameNum == rhs.FrameNum ) && ( PicOrderCnt == rhs.PicOrderCnt ) &&
+               ( long_term_pic_num == rhs.long_term_pic_num ) && ( long_term_frame_idx == rhs.long_term_frame_idx ) && ( temporal_id == rhs.temporal_id );
+      }
+
+      bool operator!=( EncodeH264ReferenceInfo const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH264ReferenceInfoFlags flags = {};
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264PictureType              primary_pic_type =
+        VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264PictureType::eP;
+      uint32_t FrameNum            = {};
+      int32_t  PicOrderCnt         = {};
+      uint16_t long_term_pic_num   = {};
+      uint16_t long_term_frame_idx = {};
+      uint8_t  temporal_id         = {};
+    };
+
+    struct EncodeH264SliceHeader
+    {
+      using NativeType = StdVideoEncodeH264SliceHeader;
+
+      operator StdVideoEncodeH264SliceHeader const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoEncodeH264SliceHeader *>( this );
+      }
+
+      operator StdVideoEncodeH264SliceHeader &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoEncodeH264SliceHeader *>( this );
+      }
+
+      bool operator==( EncodeH264SliceHeader const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( flags == rhs.flags ) && ( first_mb_in_slice == rhs.first_mb_in_slice ) && ( slice_type == rhs.slice_type ) &&
+               ( slice_alpha_c0_offset_div2 == rhs.slice_alpha_c0_offset_div2 ) && ( slice_beta_offset_div2 == rhs.slice_beta_offset_div2 ) &&
+               ( reserved1 == rhs.reserved1 ) && ( cabac_init_idc == rhs.cabac_init_idc ) &&
+               ( disable_deblocking_filter_idc == rhs.disable_deblocking_filter_idc ) && ( pWeightTable == rhs.pWeightTable );
+      }
+
+      bool operator!=( EncodeH264SliceHeader const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH264SliceHeaderFlags flags             = {};
+      uint32_t                                                                     first_mb_in_slice = {};
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264SliceType    slice_type = VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264SliceType::eP;
+      int8_t                                                             slice_alpha_c0_offset_div2 = {};
+      int8_t                                                             slice_beta_offset_div2     = {};
+      uint16_t                                                           reserved1                  = {};
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264CabacInitIdc cabac_init_idc =
+        VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264CabacInitIdc::e0;
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264DisableDeblockingFilterIdc disable_deblocking_filter_idc =
+        VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H264DisableDeblockingFilterIdc::eDisabled;
+      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH264WeightTable * pWeightTable = {};
+    };
+
+    //=== vulkan_video_codec_h265std ===
+
+    struct H265DecPicBufMgr
+    {
+      using NativeType = StdVideoH265DecPicBufMgr;
+
+      operator StdVideoH265DecPicBufMgr const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoH265DecPicBufMgr *>( this );
+      }
+
+      operator StdVideoH265DecPicBufMgr &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoH265DecPicBufMgr *>( this );
+      }
+
+      bool operator==( H265DecPicBufMgr const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( max_latency_increase_plus1 == rhs.max_latency_increase_plus1 ) && ( max_dec_pic_buffering_minus1 == rhs.max_dec_pic_buffering_minus1 ) &&
+               ( max_num_reorder_pics == rhs.max_num_reorder_pics );
+      }
+
+      bool operator!=( H265DecPicBufMgr const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, STD_VIDEO_H265_SUBLAYERS_LIST_SIZE> max_latency_increase_plus1   = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_H265_SUBLAYERS_LIST_SIZE>  max_dec_pic_buffering_minus1 = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_H265_SUBLAYERS_LIST_SIZE>  max_num_reorder_pics         = {};
+    };
+
+    struct H265SubLayerHrdParameters
+    {
+      using NativeType = StdVideoH265SubLayerHrdParameters;
+
+      operator StdVideoH265SubLayerHrdParameters const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoH265SubLayerHrdParameters *>( this );
+      }
+
+      operator StdVideoH265SubLayerHrdParameters &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoH265SubLayerHrdParameters *>( this );
+      }
+
+      bool operator==( H265SubLayerHrdParameters const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( bit_rate_value_minus1 == rhs.bit_rate_value_minus1 ) && ( cpb_size_value_minus1 == rhs.cpb_size_value_minus1 ) &&
+               ( cpb_size_du_value_minus1 == rhs.cpb_size_du_value_minus1 ) && ( bit_rate_du_value_minus1 == rhs.bit_rate_du_value_minus1 ) &&
+               ( cbr_flag == rhs.cbr_flag );
+      }
+
+      bool operator!=( H265SubLayerHrdParameters const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, STD_VIDEO_H265_CPB_CNT_LIST_SIZE> bit_rate_value_minus1    = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, STD_VIDEO_H265_CPB_CNT_LIST_SIZE> cpb_size_value_minus1    = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, STD_VIDEO_H265_CPB_CNT_LIST_SIZE> cpb_size_du_value_minus1 = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, STD_VIDEO_H265_CPB_CNT_LIST_SIZE> bit_rate_du_value_minus1 = {};
+      uint32_t                                                                         cbr_flag                 = {};
+    };
+
+    struct H265HrdFlags
+    {
+      using NativeType = StdVideoH265HrdFlags;
+
+      operator StdVideoH265HrdFlags const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoH265HrdFlags *>( this );
+      }
+
+      operator StdVideoH265HrdFlags &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoH265HrdFlags *>( this );
+      }
+
+      bool operator==( H265HrdFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( nal_hrd_parameters_present_flag == rhs.nal_hrd_parameters_present_flag ) &&
+               ( vcl_hrd_parameters_present_flag == rhs.vcl_hrd_parameters_present_flag ) &&
+               ( sub_pic_hrd_params_present_flag == rhs.sub_pic_hrd_params_present_flag ) &&
+               ( sub_pic_cpb_params_in_pic_timing_sei_flag == rhs.sub_pic_cpb_params_in_pic_timing_sei_flag ) &&
+               ( fixed_pic_rate_general_flag == rhs.fixed_pic_rate_general_flag ) && ( fixed_pic_rate_within_cvs_flag == rhs.fixed_pic_rate_within_cvs_flag ) &&
+               ( low_delay_hrd_flag == rhs.low_delay_hrd_flag );
+      }
+
+      bool operator!=( H265HrdFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      uint32_t nal_hrd_parameters_present_flag           : 1;
+      uint32_t vcl_hrd_parameters_present_flag           : 1;
+      uint32_t sub_pic_hrd_params_present_flag           : 1;
+      uint32_t sub_pic_cpb_params_in_pic_timing_sei_flag : 1;
+      uint32_t fixed_pic_rate_general_flag               : 8;
+      uint32_t fixed_pic_rate_within_cvs_flag            : 8;
+      uint32_t low_delay_hrd_flag                        : 8;
+    };
+
+    struct H265HrdParameters
+    {
+      using NativeType = StdVideoH265HrdParameters;
+
+      operator StdVideoH265HrdParameters const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoH265HrdParameters *>( this );
+      }
+
+      operator StdVideoH265HrdParameters &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoH265HrdParameters *>( this );
+      }
+
+      bool operator==( H265HrdParameters const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( flags == rhs.flags ) && ( tick_divisor_minus2 == rhs.tick_divisor_minus2 ) &&
+               ( du_cpb_removal_delay_increment_length_minus1 == rhs.du_cpb_removal_delay_increment_length_minus1 ) &&
+               ( dpb_output_delay_du_length_minus1 == rhs.dpb_output_delay_du_length_minus1 ) && ( bit_rate_scale == rhs.bit_rate_scale ) &&
+               ( cpb_size_scale == rhs.cpb_size_scale ) && ( cpb_size_du_scale == rhs.cpb_size_du_scale ) &&
+               ( initial_cpb_removal_delay_length_minus1 == rhs.initial_cpb_removal_delay_length_minus1 ) &&
+               ( au_cpb_removal_delay_length_minus1 == rhs.au_cpb_removal_delay_length_minus1 ) &&
+               ( dpb_output_delay_length_minus1 == rhs.dpb_output_delay_length_minus1 ) && ( cpb_cnt_minus1 == rhs.cpb_cnt_minus1 ) &&
+               ( elemental_duration_in_tc_minus1 == rhs.elemental_duration_in_tc_minus1 ) && ( reserved == rhs.reserved ) &&
+               ( pSubLayerHrdParametersNal == rhs.pSubLayerHrdParametersNal ) && ( pSubLayerHrdParametersVcl == rhs.pSubLayerHrdParametersVcl );
+      }
+
+      bool operator!=( H265HrdParameters const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265HrdFlags                      flags                                        = {};
+      uint8_t                                                                             tick_divisor_minus2                          = {};
+      uint8_t                                                                             du_cpb_removal_delay_increment_length_minus1 = {};
+      uint8_t                                                                             dpb_output_delay_du_length_minus1            = {};
+      uint8_t                                                                             bit_rate_scale                               = {};
+      uint8_t                                                                             cpb_size_scale                               = {};
+      uint8_t                                                                             cpb_size_du_scale                            = {};
+      uint8_t                                                                             initial_cpb_removal_delay_length_minus1      = {};
+      uint8_t                                                                             au_cpb_removal_delay_length_minus1           = {};
+      uint8_t                                                                             dpb_output_delay_length_minus1               = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_H265_SUBLAYERS_LIST_SIZE>   cpb_cnt_minus1                               = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint16_t, STD_VIDEO_H265_SUBLAYERS_LIST_SIZE>  elemental_duration_in_tc_minus1              = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint16_t, 3>                                   reserved                                     = {};
+      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265SubLayerHrdParameters * pSubLayerHrdParametersNal                    = {};
+      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265SubLayerHrdParameters * pSubLayerHrdParametersVcl                    = {};
+    };
+
+    struct H265VpsFlags
+    {
+      using NativeType = StdVideoH265VpsFlags;
+
+      operator StdVideoH265VpsFlags const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoH265VpsFlags *>( this );
+      }
+
+      operator StdVideoH265VpsFlags &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoH265VpsFlags *>( this );
+      }
+
+      bool operator==( H265VpsFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( vps_temporal_id_nesting_flag == rhs.vps_temporal_id_nesting_flag ) &&
+               ( vps_sub_layer_ordering_info_present_flag == rhs.vps_sub_layer_ordering_info_present_flag ) &&
+               ( vps_timing_info_present_flag == rhs.vps_timing_info_present_flag ) &&
+               ( vps_poc_proportional_to_timing_flag == rhs.vps_poc_proportional_to_timing_flag );
+      }
+
+      bool operator!=( H265VpsFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      uint32_t vps_temporal_id_nesting_flag             : 1;
+      uint32_t vps_sub_layer_ordering_info_present_flag : 1;
+      uint32_t vps_timing_info_present_flag             : 1;
+      uint32_t vps_poc_proportional_to_timing_flag      : 1;
+    };
+
+    struct H265ProfileTierLevelFlags
+    {
+      using NativeType = StdVideoH265ProfileTierLevelFlags;
+
+      operator StdVideoH265ProfileTierLevelFlags const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoH265ProfileTierLevelFlags *>( this );
+      }
+
+      operator StdVideoH265ProfileTierLevelFlags &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoH265ProfileTierLevelFlags *>( this );
+      }
+
+      bool operator==( H265ProfileTierLevelFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( general_tier_flag == rhs.general_tier_flag ) && ( general_progressive_source_flag == rhs.general_progressive_source_flag ) &&
+               ( general_interlaced_source_flag == rhs.general_interlaced_source_flag ) &&
+               ( general_non_packed_constraint_flag == rhs.general_non_packed_constraint_flag ) &&
+               ( general_frame_only_constraint_flag == rhs.general_frame_only_constraint_flag );
+      }
+
+      bool operator!=( H265ProfileTierLevelFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      uint32_t general_tier_flag                  : 1;
+      uint32_t general_progressive_source_flag    : 1;
+      uint32_t general_interlaced_source_flag     : 1;
+      uint32_t general_non_packed_constraint_flag : 1;
+      uint32_t general_frame_only_constraint_flag : 1;
+    };
+
+    struct H265ProfileTierLevel
+    {
+      using NativeType = StdVideoH265ProfileTierLevel;
+
+      operator StdVideoH265ProfileTierLevel const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoH265ProfileTierLevel *>( this );
+      }
+
+      operator StdVideoH265ProfileTierLevel &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoH265ProfileTierLevel *>( this );
+      }
+
+      bool operator==( H265ProfileTierLevel const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( flags == rhs.flags ) && ( general_profile_idc == rhs.general_profile_idc ) && ( general_level_idc == rhs.general_level_idc );
+      }
+
+      bool operator!=( H265ProfileTierLevel const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265ProfileTierLevelFlags flags = {};
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265ProfileIdc            general_profile_idc =
+        VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265ProfileIdc::eMain;
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265LevelIdc general_level_idc = VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265LevelIdc::e1_0;
+    };
+
+    struct H265VideoParameterSet
+    {
+      using NativeType = StdVideoH265VideoParameterSet;
+
+      operator StdVideoH265VideoParameterSet const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoH265VideoParameterSet *>( this );
+      }
+
+      operator StdVideoH265VideoParameterSet &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoH265VideoParameterSet *>( this );
+      }
+
+      bool operator==( H265VideoParameterSet const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( flags == rhs.flags ) && ( vps_video_parameter_set_id == rhs.vps_video_parameter_set_id ) &&
+               ( vps_max_sub_layers_minus1 == rhs.vps_max_sub_layers_minus1 ) && ( reserved1 == rhs.reserved1 ) && ( reserved2 == rhs.reserved2 ) &&
+               ( vps_num_units_in_tick == rhs.vps_num_units_in_tick ) && ( vps_time_scale == rhs.vps_time_scale ) &&
+               ( vps_num_ticks_poc_diff_one_minus1 == rhs.vps_num_ticks_poc_diff_one_minus1 ) && ( reserved3 == rhs.reserved3 ) &&
+               ( pDecPicBufMgr == rhs.pDecPicBufMgr ) && ( pHrdParameters == rhs.pHrdParameters ) && ( pProfileTierLevel == rhs.pProfileTierLevel );
+      }
+
+      bool operator!=( H265VideoParameterSet const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265VpsFlags                 flags                             = {};
+      uint8_t                                                                        vps_video_parameter_set_id        = {};
+      uint8_t                                                                        vps_max_sub_layers_minus1         = {};
+      uint8_t                                                                        reserved1                         = {};
+      uint8_t                                                                        reserved2                         = {};
+      uint32_t                                                                       vps_num_units_in_tick             = {};
+      uint32_t                                                                       vps_time_scale                    = {};
+      uint32_t                                                                       vps_num_ticks_poc_diff_one_minus1 = {};
+      uint32_t                                                                       reserved3                         = {};
+      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265DecPicBufMgr *     pDecPicBufMgr                     = {};
+      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265HrdParameters *    pHrdParameters                    = {};
+      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265ProfileTierLevel * pProfileTierLevel                 = {};
+    };
+
+    struct H265ScalingLists
+    {
+      using NativeType = StdVideoH265ScalingLists;
+
+      operator StdVideoH265ScalingLists const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoH265ScalingLists *>( this );
+      }
+
+      operator StdVideoH265ScalingLists &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoH265ScalingLists *>( this );
+      }
+
+      bool operator==( H265ScalingLists const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( ScalingList4x4 == rhs.ScalingList4x4 ) && ( ScalingList8x8 == rhs.ScalingList8x8 ) && ( ScalingList16x16 == rhs.ScalingList16x16 ) &&
+               ( ScalingList32x32 == rhs.ScalingList32x32 ) && ( ScalingListDCCoef16x16 == rhs.ScalingListDCCoef16x16 ) &&
+               ( ScalingListDCCoef32x32 == rhs.ScalingListDCCoef32x32 );
+      }
+
+      bool operator!=( H265ScalingLists const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      VULKAN_HPP_NAMESPACE::ArrayWrapper2D<uint8_t, STD_VIDEO_H265_SCALING_LIST_4X4_NUM_LISTS, STD_VIDEO_H265_SCALING_LIST_4X4_NUM_ELEMENTS>
+        ScalingList4x4 = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper2D<uint8_t, STD_VIDEO_H265_SCALING_LIST_8X8_NUM_LISTS, STD_VIDEO_H265_SCALING_LIST_8X8_NUM_ELEMENTS>
+        ScalingList8x8 = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper2D<uint8_t, STD_VIDEO_H265_SCALING_LIST_16X16_NUM_LISTS, STD_VIDEO_H265_SCALING_LIST_16X16_NUM_ELEMENTS>
+        ScalingList16x16 = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper2D<uint8_t, STD_VIDEO_H265_SCALING_LIST_32X32_NUM_LISTS, STD_VIDEO_H265_SCALING_LIST_32X32_NUM_ELEMENTS>
+                                                                                                 ScalingList32x32       = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_H265_SCALING_LIST_16X16_NUM_LISTS> ScalingListDCCoef16x16 = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_H265_SCALING_LIST_32X32_NUM_LISTS> ScalingListDCCoef32x32 = {};
+    };
+
+    struct H265SpsVuiFlags
+    {
+      using NativeType = StdVideoH265SpsVuiFlags;
+
+      operator StdVideoH265SpsVuiFlags const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoH265SpsVuiFlags *>( this );
+      }
+
+      operator StdVideoH265SpsVuiFlags &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoH265SpsVuiFlags *>( this );
+      }
+
+      bool operator==( H265SpsVuiFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( aspect_ratio_info_present_flag == rhs.aspect_ratio_info_present_flag ) && ( overscan_info_present_flag == rhs.overscan_info_present_flag ) &&
+               ( overscan_appropriate_flag == rhs.overscan_appropriate_flag ) && ( video_signal_type_present_flag == rhs.video_signal_type_present_flag ) &&
+               ( video_full_range_flag == rhs.video_full_range_flag ) && ( colour_description_present_flag == rhs.colour_description_present_flag ) &&
+               ( chroma_loc_info_present_flag == rhs.chroma_loc_info_present_flag ) &&
+               ( neutral_chroma_indication_flag == rhs.neutral_chroma_indication_flag ) && ( field_seq_flag == rhs.field_seq_flag ) &&
+               ( frame_field_info_present_flag == rhs.frame_field_info_present_flag ) && ( default_display_window_flag == rhs.default_display_window_flag ) &&
+               ( vui_timing_info_present_flag == rhs.vui_timing_info_present_flag ) &&
+               ( vui_poc_proportional_to_timing_flag == rhs.vui_poc_proportional_to_timing_flag ) &&
+               ( vui_hrd_parameters_present_flag == rhs.vui_hrd_parameters_present_flag ) && ( bitstream_restriction_flag == rhs.bitstream_restriction_flag ) &&
+               ( tiles_fixed_structure_flag == rhs.tiles_fixed_structure_flag ) &&
+               ( motion_vectors_over_pic_boundaries_flag == rhs.motion_vectors_over_pic_boundaries_flag ) &&
+               ( restricted_ref_pic_lists_flag == rhs.restricted_ref_pic_lists_flag );
+      }
+
+      bool operator!=( H265SpsVuiFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      uint32_t aspect_ratio_info_present_flag          : 1;
+      uint32_t overscan_info_present_flag              : 1;
+      uint32_t overscan_appropriate_flag               : 1;
+      uint32_t video_signal_type_present_flag          : 1;
+      uint32_t video_full_range_flag                   : 1;
+      uint32_t colour_description_present_flag         : 1;
+      uint32_t chroma_loc_info_present_flag            : 1;
+      uint32_t neutral_chroma_indication_flag          : 1;
+      uint32_t field_seq_flag                          : 1;
+      uint32_t frame_field_info_present_flag           : 1;
+      uint32_t default_display_window_flag             : 1;
+      uint32_t vui_timing_info_present_flag            : 1;
+      uint32_t vui_poc_proportional_to_timing_flag     : 1;
+      uint32_t vui_hrd_parameters_present_flag         : 1;
+      uint32_t bitstream_restriction_flag              : 1;
+      uint32_t tiles_fixed_structure_flag              : 1;
+      uint32_t motion_vectors_over_pic_boundaries_flag : 1;
+      uint32_t restricted_ref_pic_lists_flag           : 1;
+    };
+
+    struct H265SequenceParameterSetVui
+    {
+      using NativeType = StdVideoH265SequenceParameterSetVui;
+
+      operator StdVideoH265SequenceParameterSetVui const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoH265SequenceParameterSetVui *>( this );
+      }
+
+      operator StdVideoH265SequenceParameterSetVui &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoH265SequenceParameterSetVui *>( this );
+      }
+
+      bool operator==( H265SequenceParameterSetVui const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( flags == rhs.flags ) && ( aspect_ratio_idc == rhs.aspect_ratio_idc ) && ( sar_width == rhs.sar_width ) && ( sar_height == rhs.sar_height ) &&
+               ( video_format == rhs.video_format ) && ( colour_primaries == rhs.colour_primaries ) &&
+               ( transfer_characteristics == rhs.transfer_characteristics ) && ( matrix_coeffs == rhs.matrix_coeffs ) &&
+               ( chroma_sample_loc_type_top_field == rhs.chroma_sample_loc_type_top_field ) &&
+               ( chroma_sample_loc_type_bottom_field == rhs.chroma_sample_loc_type_bottom_field ) && ( reserved1 == rhs.reserved1 ) &&
+               ( reserved2 == rhs.reserved2 ) && ( def_disp_win_left_offset == rhs.def_disp_win_left_offset ) &&
+               ( def_disp_win_right_offset == rhs.def_disp_win_right_offset ) && ( def_disp_win_top_offset == rhs.def_disp_win_top_offset ) &&
+               ( def_disp_win_bottom_offset == rhs.def_disp_win_bottom_offset ) && ( vui_num_units_in_tick == rhs.vui_num_units_in_tick ) &&
+               ( vui_time_scale == rhs.vui_time_scale ) && ( vui_num_ticks_poc_diff_one_minus1 == rhs.vui_num_ticks_poc_diff_one_minus1 ) &&
+               ( min_spatial_segmentation_idc == rhs.min_spatial_segmentation_idc ) && ( reserved3 == rhs.reserved3 ) &&
+               ( max_bytes_per_pic_denom == rhs.max_bytes_per_pic_denom ) && ( max_bits_per_min_cu_denom == rhs.max_bits_per_min_cu_denom ) &&
+               ( log2_max_mv_length_horizontal == rhs.log2_max_mv_length_horizontal ) && ( log2_max_mv_length_vertical == rhs.log2_max_mv_length_vertical ) &&
+               ( pHrdParameters == rhs.pHrdParameters );
+      }
+
+      bool operator!=( H265SequenceParameterSetVui const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265SpsVuiFlags    flags = {};
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265AspectRatioIdc aspect_ratio_idc =
+        VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265AspectRatioIdc::eUnspecified;
+      uint16_t                                                                    sar_width                           = {};
+      uint16_t                                                                    sar_height                          = {};
+      uint8_t                                                                     video_format                        = {};
+      uint8_t                                                                     colour_primaries                    = {};
+      uint8_t                                                                     transfer_characteristics            = {};
+      uint8_t                                                                     matrix_coeffs                       = {};
+      uint8_t                                                                     chroma_sample_loc_type_top_field    = {};
+      uint8_t                                                                     chroma_sample_loc_type_bottom_field = {};
+      uint8_t                                                                     reserved1                           = {};
+      uint8_t                                                                     reserved2                           = {};
+      uint16_t                                                                    def_disp_win_left_offset            = {};
+      uint16_t                                                                    def_disp_win_right_offset           = {};
+      uint16_t                                                                    def_disp_win_top_offset             = {};
+      uint16_t                                                                    def_disp_win_bottom_offset          = {};
+      uint32_t                                                                    vui_num_units_in_tick               = {};
+      uint32_t                                                                    vui_time_scale                      = {};
+      uint32_t                                                                    vui_num_ticks_poc_diff_one_minus1   = {};
+      uint16_t                                                                    min_spatial_segmentation_idc        = {};
+      uint16_t                                                                    reserved3                           = {};
+      uint8_t                                                                     max_bytes_per_pic_denom             = {};
+      uint8_t                                                                     max_bits_per_min_cu_denom           = {};
+      uint8_t                                                                     log2_max_mv_length_horizontal       = {};
+      uint8_t                                                                     log2_max_mv_length_vertical         = {};
+      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265HrdParameters * pHrdParameters                      = {};
+    };
+
+    struct H265PredictorPaletteEntries
+    {
+      using NativeType = StdVideoH265PredictorPaletteEntries;
+
+      operator StdVideoH265PredictorPaletteEntries const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoH265PredictorPaletteEntries *>( this );
+      }
+
+      operator StdVideoH265PredictorPaletteEntries &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoH265PredictorPaletteEntries *>( this );
+      }
+
+      bool operator==( H265PredictorPaletteEntries const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( PredictorPaletteEntries == rhs.PredictorPaletteEntries );
+      }
+
+      bool operator!=( H265PredictorPaletteEntries const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      VULKAN_HPP_NAMESPACE::
+        ArrayWrapper2D<uint16_t, STD_VIDEO_H265_PREDICTOR_PALETTE_COMPONENTS_LIST_SIZE, STD_VIDEO_H265_PREDICTOR_PALETTE_COMP_ENTRIES_LIST_SIZE>
+          PredictorPaletteEntries = {};
+    };
+
+    struct H265SpsFlags
+    {
+      using NativeType = StdVideoH265SpsFlags;
+
+      operator StdVideoH265SpsFlags const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoH265SpsFlags *>( this );
+      }
+
+      operator StdVideoH265SpsFlags &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoH265SpsFlags *>( this );
+      }
+
+      bool operator==( H265SpsFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( sps_temporal_id_nesting_flag == rhs.sps_temporal_id_nesting_flag ) && ( separate_colour_plane_flag == rhs.separate_colour_plane_flag ) &&
+               ( conformance_window_flag == rhs.conformance_window_flag ) &&
+               ( sps_sub_layer_ordering_info_present_flag == rhs.sps_sub_layer_ordering_info_present_flag ) &&
+               ( scaling_list_enabled_flag == rhs.scaling_list_enabled_flag ) &&
+               ( sps_scaling_list_data_present_flag == rhs.sps_scaling_list_data_present_flag ) && ( amp_enabled_flag == rhs.amp_enabled_flag ) &&
+               ( sample_adaptive_offset_enabled_flag == rhs.sample_adaptive_offset_enabled_flag ) && ( pcm_enabled_flag == rhs.pcm_enabled_flag ) &&
+               ( pcm_loop_filter_disabled_flag == rhs.pcm_loop_filter_disabled_flag ) &&
+               ( long_term_ref_pics_present_flag == rhs.long_term_ref_pics_present_flag ) &&
+               ( sps_temporal_mvp_enabled_flag == rhs.sps_temporal_mvp_enabled_flag ) &&
+               ( strong_intra_smoothing_enabled_flag == rhs.strong_intra_smoothing_enabled_flag ) &&
+               ( vui_parameters_present_flag == rhs.vui_parameters_present_flag ) && ( sps_extension_present_flag == rhs.sps_extension_present_flag ) &&
+               ( sps_range_extension_flag == rhs.sps_range_extension_flag ) &&
+               ( transform_skip_rotation_enabled_flag == rhs.transform_skip_rotation_enabled_flag ) &&
+               ( transform_skip_context_enabled_flag == rhs.transform_skip_context_enabled_flag ) &&
+               ( implicit_rdpcm_enabled_flag == rhs.implicit_rdpcm_enabled_flag ) && ( explicit_rdpcm_enabled_flag == rhs.explicit_rdpcm_enabled_flag ) &&
+               ( extended_precision_processing_flag == rhs.extended_precision_processing_flag ) &&
+               ( intra_smoothing_disabled_flag == rhs.intra_smoothing_disabled_flag ) &&
+               ( high_precision_offsets_enabled_flag == rhs.high_precision_offsets_enabled_flag ) &&
+               ( persistent_rice_adaptation_enabled_flag == rhs.persistent_rice_adaptation_enabled_flag ) &&
+               ( cabac_bypass_alignment_enabled_flag == rhs.cabac_bypass_alignment_enabled_flag ) && ( sps_scc_extension_flag == rhs.sps_scc_extension_flag ) &&
+               ( sps_curr_pic_ref_enabled_flag == rhs.sps_curr_pic_ref_enabled_flag ) && ( palette_mode_enabled_flag == rhs.palette_mode_enabled_flag ) &&
+               ( sps_palette_predictor_initializers_present_flag == rhs.sps_palette_predictor_initializers_present_flag ) &&
+               ( intra_boundary_filtering_disabled_flag == rhs.intra_boundary_filtering_disabled_flag );
+      }
+
+      bool operator!=( H265SpsFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      uint32_t sps_temporal_id_nesting_flag                    : 1;
+      uint32_t separate_colour_plane_flag                      : 1;
+      uint32_t conformance_window_flag                         : 1;
+      uint32_t sps_sub_layer_ordering_info_present_flag        : 1;
+      uint32_t scaling_list_enabled_flag                       : 1;
+      uint32_t sps_scaling_list_data_present_flag              : 1;
+      uint32_t amp_enabled_flag                                : 1;
+      uint32_t sample_adaptive_offset_enabled_flag             : 1;
+      uint32_t pcm_enabled_flag                                : 1;
+      uint32_t pcm_loop_filter_disabled_flag                   : 1;
+      uint32_t long_term_ref_pics_present_flag                 : 1;
+      uint32_t sps_temporal_mvp_enabled_flag                   : 1;
+      uint32_t strong_intra_smoothing_enabled_flag             : 1;
+      uint32_t vui_parameters_present_flag                     : 1;
+      uint32_t sps_extension_present_flag                      : 1;
+      uint32_t sps_range_extension_flag                        : 1;
+      uint32_t transform_skip_rotation_enabled_flag            : 1;
+      uint32_t transform_skip_context_enabled_flag             : 1;
+      uint32_t implicit_rdpcm_enabled_flag                     : 1;
+      uint32_t explicit_rdpcm_enabled_flag                     : 1;
+      uint32_t extended_precision_processing_flag              : 1;
+      uint32_t intra_smoothing_disabled_flag                   : 1;
+      uint32_t high_precision_offsets_enabled_flag             : 1;
+      uint32_t persistent_rice_adaptation_enabled_flag         : 1;
+      uint32_t cabac_bypass_alignment_enabled_flag             : 1;
+      uint32_t sps_scc_extension_flag                          : 1;
+      uint32_t sps_curr_pic_ref_enabled_flag                   : 1;
+      uint32_t palette_mode_enabled_flag                       : 1;
+      uint32_t sps_palette_predictor_initializers_present_flag : 1;
+      uint32_t intra_boundary_filtering_disabled_flag          : 1;
+    };
+
+    struct H265ShortTermRefPicSetFlags
+    {
+      using NativeType = StdVideoH265ShortTermRefPicSetFlags;
+
+      operator StdVideoH265ShortTermRefPicSetFlags const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoH265ShortTermRefPicSetFlags *>( this );
+      }
+
+      operator StdVideoH265ShortTermRefPicSetFlags &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoH265ShortTermRefPicSetFlags *>( this );
+      }
+
+      bool operator==( H265ShortTermRefPicSetFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( inter_ref_pic_set_prediction_flag == rhs.inter_ref_pic_set_prediction_flag ) && ( delta_rps_sign == rhs.delta_rps_sign );
+      }
+
+      bool operator!=( H265ShortTermRefPicSetFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      uint32_t inter_ref_pic_set_prediction_flag : 1;
+      uint32_t delta_rps_sign                    : 1;
+    };
+
+    struct H265ShortTermRefPicSet
+    {
+      using NativeType = StdVideoH265ShortTermRefPicSet;
+
+      operator StdVideoH265ShortTermRefPicSet const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoH265ShortTermRefPicSet *>( this );
+      }
+
+      operator StdVideoH265ShortTermRefPicSet &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoH265ShortTermRefPicSet *>( this );
+      }
+
+      bool operator==( H265ShortTermRefPicSet const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( flags == rhs.flags ) && ( delta_idx_minus1 == rhs.delta_idx_minus1 ) && ( use_delta_flag == rhs.use_delta_flag ) &&
+               ( abs_delta_rps_minus1 == rhs.abs_delta_rps_minus1 ) && ( used_by_curr_pic_flag == rhs.used_by_curr_pic_flag ) &&
+               ( used_by_curr_pic_s0_flag == rhs.used_by_curr_pic_s0_flag ) && ( used_by_curr_pic_s1_flag == rhs.used_by_curr_pic_s1_flag ) &&
+               ( reserved1 == rhs.reserved1 ) && ( reserved2 == rhs.reserved2 ) && ( reserved3 == rhs.reserved3 ) &&
+               ( num_negative_pics == rhs.num_negative_pics ) && ( num_positive_pics == rhs.num_positive_pics ) &&
+               ( delta_poc_s0_minus1 == rhs.delta_poc_s0_minus1 ) && ( delta_poc_s1_minus1 == rhs.delta_poc_s1_minus1 );
+      }
+
+      bool operator!=( H265ShortTermRefPicSet const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265ShortTermRefPicSetFlags flags                    = {};
+      uint32_t                                                                      delta_idx_minus1         = {};
+      uint16_t                                                                      use_delta_flag           = {};
+      uint16_t                                                                      abs_delta_rps_minus1     = {};
+      uint16_t                                                                      used_by_curr_pic_flag    = {};
+      uint16_t                                                                      used_by_curr_pic_s0_flag = {};
+      uint16_t                                                                      used_by_curr_pic_s1_flag = {};
+      uint16_t                                                                      reserved1                = {};
+      uint8_t                                                                       reserved2                = {};
+      uint8_t                                                                       reserved3                = {};
+      uint8_t                                                                       num_negative_pics        = {};
+      uint8_t                                                                       num_positive_pics        = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint16_t, STD_VIDEO_H265_MAX_DPB_SIZE>   delta_poc_s0_minus1      = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint16_t, STD_VIDEO_H265_MAX_DPB_SIZE>   delta_poc_s1_minus1      = {};
+    };
+
+    struct H265LongTermRefPicsSps
+    {
+      using NativeType = StdVideoH265LongTermRefPicsSps;
+
+      operator StdVideoH265LongTermRefPicsSps const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoH265LongTermRefPicsSps *>( this );
+      }
+
+      operator StdVideoH265LongTermRefPicsSps &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoH265LongTermRefPicsSps *>( this );
+      }
+
+      bool operator==( H265LongTermRefPicsSps const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( used_by_curr_pic_lt_sps_flag == rhs.used_by_curr_pic_lt_sps_flag ) && ( lt_ref_pic_poc_lsb_sps == rhs.lt_ref_pic_poc_lsb_sps );
+      }
+
+      bool operator!=( H265LongTermRefPicsSps const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      uint32_t                                                                                  used_by_curr_pic_lt_sps_flag = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint32_t, STD_VIDEO_H265_MAX_LONG_TERM_REF_PICS_SPS> lt_ref_pic_poc_lsb_sps       = {};
+    };
+
+    struct H265SequenceParameterSet
+    {
+      using NativeType = StdVideoH265SequenceParameterSet;
+
+      operator StdVideoH265SequenceParameterSet const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoH265SequenceParameterSet *>( this );
+      }
+
+      operator StdVideoH265SequenceParameterSet &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoH265SequenceParameterSet *>( this );
+      }
+
+      bool operator==( H265SequenceParameterSet const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( flags == rhs.flags ) && ( chroma_format_idc == rhs.chroma_format_idc ) && ( pic_width_in_luma_samples == rhs.pic_width_in_luma_samples ) &&
+               ( pic_height_in_luma_samples == rhs.pic_height_in_luma_samples ) && ( sps_video_parameter_set_id == rhs.sps_video_parameter_set_id ) &&
+               ( sps_max_sub_layers_minus1 == rhs.sps_max_sub_layers_minus1 ) && ( sps_seq_parameter_set_id == rhs.sps_seq_parameter_set_id ) &&
+               ( bit_depth_luma_minus8 == rhs.bit_depth_luma_minus8 ) && ( bit_depth_chroma_minus8 == rhs.bit_depth_chroma_minus8 ) &&
+               ( log2_max_pic_order_cnt_lsb_minus4 == rhs.log2_max_pic_order_cnt_lsb_minus4 ) &&
+               ( log2_min_luma_coding_block_size_minus3 == rhs.log2_min_luma_coding_block_size_minus3 ) &&
+               ( log2_diff_max_min_luma_coding_block_size == rhs.log2_diff_max_min_luma_coding_block_size ) &&
+               ( log2_min_luma_transform_block_size_minus2 == rhs.log2_min_luma_transform_block_size_minus2 ) &&
+               ( log2_diff_max_min_luma_transform_block_size == rhs.log2_diff_max_min_luma_transform_block_size ) &&
+               ( max_transform_hierarchy_depth_inter == rhs.max_transform_hierarchy_depth_inter ) &&
+               ( max_transform_hierarchy_depth_intra == rhs.max_transform_hierarchy_depth_intra ) &&
+               ( num_short_term_ref_pic_sets == rhs.num_short_term_ref_pic_sets ) && ( num_long_term_ref_pics_sps == rhs.num_long_term_ref_pics_sps ) &&
+               ( pcm_sample_bit_depth_luma_minus1 == rhs.pcm_sample_bit_depth_luma_minus1 ) &&
+               ( pcm_sample_bit_depth_chroma_minus1 == rhs.pcm_sample_bit_depth_chroma_minus1 ) &&
+               ( log2_min_pcm_luma_coding_block_size_minus3 == rhs.log2_min_pcm_luma_coding_block_size_minus3 ) &&
+               ( log2_diff_max_min_pcm_luma_coding_block_size == rhs.log2_diff_max_min_pcm_luma_coding_block_size ) && ( reserved1 == rhs.reserved1 ) &&
+               ( reserved2 == rhs.reserved2 ) && ( palette_max_size == rhs.palette_max_size ) &&
+               ( delta_palette_max_predictor_size == rhs.delta_palette_max_predictor_size ) &&
+               ( motion_vector_resolution_control_idc == rhs.motion_vector_resolution_control_idc ) &&
+               ( sps_num_palette_predictor_initializers_minus1 == rhs.sps_num_palette_predictor_initializers_minus1 ) &&
+               ( conf_win_left_offset == rhs.conf_win_left_offset ) && ( conf_win_right_offset == rhs.conf_win_right_offset ) &&
+               ( conf_win_top_offset == rhs.conf_win_top_offset ) && ( conf_win_bottom_offset == rhs.conf_win_bottom_offset ) &&
+               ( pProfileTierLevel == rhs.pProfileTierLevel ) && ( pDecPicBufMgr == rhs.pDecPicBufMgr ) && ( pScalingLists == rhs.pScalingLists ) &&
+               ( pShortTermRefPicSet == rhs.pShortTermRefPicSet ) && ( pLongTermRefPicsSps == rhs.pLongTermRefPicsSps ) &&
+               ( pSequenceParameterSetVui == rhs.pSequenceParameterSetVui ) && ( pPredictorPaletteEntries == rhs.pPredictorPaletteEntries );
+      }
+
+      bool operator!=( H265SequenceParameterSet const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265SpsFlags        flags = {};
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265ChromaFormatIdc chroma_format_idc =
+        VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265ChromaFormatIdc::eMonochrome;
+      uint32_t                                                                              pic_width_in_luma_samples                     = {};
+      uint32_t                                                                              pic_height_in_luma_samples                    = {};
+      uint8_t                                                                               sps_video_parameter_set_id                    = {};
+      uint8_t                                                                               sps_max_sub_layers_minus1                     = {};
+      uint8_t                                                                               sps_seq_parameter_set_id                      = {};
+      uint8_t                                                                               bit_depth_luma_minus8                         = {};
+      uint8_t                                                                               bit_depth_chroma_minus8                       = {};
+      uint8_t                                                                               log2_max_pic_order_cnt_lsb_minus4             = {};
+      uint8_t                                                                               log2_min_luma_coding_block_size_minus3        = {};
+      uint8_t                                                                               log2_diff_max_min_luma_coding_block_size      = {};
+      uint8_t                                                                               log2_min_luma_transform_block_size_minus2     = {};
+      uint8_t                                                                               log2_diff_max_min_luma_transform_block_size   = {};
+      uint8_t                                                                               max_transform_hierarchy_depth_inter           = {};
+      uint8_t                                                                               max_transform_hierarchy_depth_intra           = {};
+      uint8_t                                                                               num_short_term_ref_pic_sets                   = {};
+      uint8_t                                                                               num_long_term_ref_pics_sps                    = {};
+      uint8_t                                                                               pcm_sample_bit_depth_luma_minus1              = {};
+      uint8_t                                                                               pcm_sample_bit_depth_chroma_minus1            = {};
+      uint8_t                                                                               log2_min_pcm_luma_coding_block_size_minus3    = {};
+      uint8_t                                                                               log2_diff_max_min_pcm_luma_coding_block_size  = {};
+      uint8_t                                                                               reserved1                                     = {};
+      uint8_t                                                                               reserved2                                     = {};
+      uint8_t                                                                               palette_max_size                              = {};
+      uint8_t                                                                               delta_palette_max_predictor_size              = {};
+      uint8_t                                                                               motion_vector_resolution_control_idc          = {};
+      uint8_t                                                                               sps_num_palette_predictor_initializers_minus1 = {};
+      uint32_t                                                                              conf_win_left_offset                          = {};
+      uint32_t                                                                              conf_win_right_offset                         = {};
+      uint32_t                                                                              conf_win_top_offset                           = {};
+      uint32_t                                                                              conf_win_bottom_offset                        = {};
+      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265ProfileTierLevel *        pProfileTierLevel                             = {};
+      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265DecPicBufMgr *            pDecPicBufMgr                                 = {};
+      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265ScalingLists *            pScalingLists                                 = {};
+      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265ShortTermRefPicSet *      pShortTermRefPicSet                           = {};
+      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265LongTermRefPicsSps *      pLongTermRefPicsSps                           = {};
+      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265SequenceParameterSetVui * pSequenceParameterSetVui                      = {};
+      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265PredictorPaletteEntries * pPredictorPaletteEntries                      = {};
+    };
+
+    struct H265PpsFlags
+    {
+      using NativeType = StdVideoH265PpsFlags;
+
+      operator StdVideoH265PpsFlags const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoH265PpsFlags *>( this );
+      }
+
+      operator StdVideoH265PpsFlags &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoH265PpsFlags *>( this );
+      }
+
+      bool operator==( H265PpsFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( dependent_slice_segments_enabled_flag == rhs.dependent_slice_segments_enabled_flag ) &&
+               ( output_flag_present_flag == rhs.output_flag_present_flag ) && ( sign_data_hiding_enabled_flag == rhs.sign_data_hiding_enabled_flag ) &&
+               ( cabac_init_present_flag == rhs.cabac_init_present_flag ) && ( constrained_intra_pred_flag == rhs.constrained_intra_pred_flag ) &&
+               ( transform_skip_enabled_flag == rhs.transform_skip_enabled_flag ) && ( cu_qp_delta_enabled_flag == rhs.cu_qp_delta_enabled_flag ) &&
+               ( pps_slice_chroma_qp_offsets_present_flag == rhs.pps_slice_chroma_qp_offsets_present_flag ) &&
+               ( weighted_pred_flag == rhs.weighted_pred_flag ) && ( weighted_bipred_flag == rhs.weighted_bipred_flag ) &&
+               ( transquant_bypass_enabled_flag == rhs.transquant_bypass_enabled_flag ) && ( tiles_enabled_flag == rhs.tiles_enabled_flag ) &&
+               ( entropy_coding_sync_enabled_flag == rhs.entropy_coding_sync_enabled_flag ) && ( uniform_spacing_flag == rhs.uniform_spacing_flag ) &&
+               ( loop_filter_across_tiles_enabled_flag == rhs.loop_filter_across_tiles_enabled_flag ) &&
+               ( pps_loop_filter_across_slices_enabled_flag == rhs.pps_loop_filter_across_slices_enabled_flag ) &&
+               ( deblocking_filter_control_present_flag == rhs.deblocking_filter_control_present_flag ) &&
+               ( deblocking_filter_override_enabled_flag == rhs.deblocking_filter_override_enabled_flag ) &&
+               ( pps_deblocking_filter_disabled_flag == rhs.pps_deblocking_filter_disabled_flag ) &&
+               ( pps_scaling_list_data_present_flag == rhs.pps_scaling_list_data_present_flag ) &&
+               ( lists_modification_present_flag == rhs.lists_modification_present_flag ) &&
+               ( slice_segment_header_extension_present_flag == rhs.slice_segment_header_extension_present_flag ) &&
+               ( pps_extension_present_flag == rhs.pps_extension_present_flag ) &&
+               ( cross_component_prediction_enabled_flag == rhs.cross_component_prediction_enabled_flag ) &&
+               ( chroma_qp_offset_list_enabled_flag == rhs.chroma_qp_offset_list_enabled_flag ) &&
+               ( pps_curr_pic_ref_enabled_flag == rhs.pps_curr_pic_ref_enabled_flag ) &&
+               ( residual_adaptive_colour_transform_enabled_flag == rhs.residual_adaptive_colour_transform_enabled_flag ) &&
+               ( pps_slice_act_qp_offsets_present_flag == rhs.pps_slice_act_qp_offsets_present_flag ) &&
+               ( pps_palette_predictor_initializers_present_flag == rhs.pps_palette_predictor_initializers_present_flag ) &&
+               ( monochrome_palette_flag == rhs.monochrome_palette_flag ) && ( pps_range_extension_flag == rhs.pps_range_extension_flag );
+      }
+
+      bool operator!=( H265PpsFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      uint32_t dependent_slice_segments_enabled_flag           : 1;
+      uint32_t output_flag_present_flag                        : 1;
+      uint32_t sign_data_hiding_enabled_flag                   : 1;
+      uint32_t cabac_init_present_flag                         : 1;
+      uint32_t constrained_intra_pred_flag                     : 1;
+      uint32_t transform_skip_enabled_flag                     : 1;
+      uint32_t cu_qp_delta_enabled_flag                        : 1;
+      uint32_t pps_slice_chroma_qp_offsets_present_flag        : 1;
+      uint32_t weighted_pred_flag                              : 1;
+      uint32_t weighted_bipred_flag                            : 1;
+      uint32_t transquant_bypass_enabled_flag                  : 1;
+      uint32_t tiles_enabled_flag                              : 1;
+      uint32_t entropy_coding_sync_enabled_flag                : 1;
+      uint32_t uniform_spacing_flag                            : 1;
+      uint32_t loop_filter_across_tiles_enabled_flag           : 1;
+      uint32_t pps_loop_filter_across_slices_enabled_flag      : 1;
+      uint32_t deblocking_filter_control_present_flag          : 1;
+      uint32_t deblocking_filter_override_enabled_flag         : 1;
+      uint32_t pps_deblocking_filter_disabled_flag             : 1;
+      uint32_t pps_scaling_list_data_present_flag              : 1;
+      uint32_t lists_modification_present_flag                 : 1;
+      uint32_t slice_segment_header_extension_present_flag     : 1;
+      uint32_t pps_extension_present_flag                      : 1;
+      uint32_t cross_component_prediction_enabled_flag         : 1;
+      uint32_t chroma_qp_offset_list_enabled_flag              : 1;
+      uint32_t pps_curr_pic_ref_enabled_flag                   : 1;
+      uint32_t residual_adaptive_colour_transform_enabled_flag : 1;
+      uint32_t pps_slice_act_qp_offsets_present_flag           : 1;
+      uint32_t pps_palette_predictor_initializers_present_flag : 1;
+      uint32_t monochrome_palette_flag                         : 1;
+      uint32_t pps_range_extension_flag                        : 1;
+    };
+
+    struct H265PictureParameterSet
+    {
+      using NativeType = StdVideoH265PictureParameterSet;
+
+      operator StdVideoH265PictureParameterSet const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoH265PictureParameterSet *>( this );
+      }
+
+      operator StdVideoH265PictureParameterSet &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoH265PictureParameterSet *>( this );
+      }
+
+      bool operator==( H265PictureParameterSet const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( flags == rhs.flags ) && ( pps_pic_parameter_set_id == rhs.pps_pic_parameter_set_id ) &&
+               ( pps_seq_parameter_set_id == rhs.pps_seq_parameter_set_id ) && ( sps_video_parameter_set_id == rhs.sps_video_parameter_set_id ) &&
+               ( num_extra_slice_header_bits == rhs.num_extra_slice_header_bits ) &&
+               ( num_ref_idx_l0_default_active_minus1 == rhs.num_ref_idx_l0_default_active_minus1 ) &&
+               ( num_ref_idx_l1_default_active_minus1 == rhs.num_ref_idx_l1_default_active_minus1 ) && ( init_qp_minus26 == rhs.init_qp_minus26 ) &&
+               ( diff_cu_qp_delta_depth == rhs.diff_cu_qp_delta_depth ) && ( pps_cb_qp_offset == rhs.pps_cb_qp_offset ) &&
+               ( pps_cr_qp_offset == rhs.pps_cr_qp_offset ) && ( pps_beta_offset_div2 == rhs.pps_beta_offset_div2 ) &&
+               ( pps_tc_offset_div2 == rhs.pps_tc_offset_div2 ) && ( log2_parallel_merge_level_minus2 == rhs.log2_parallel_merge_level_minus2 ) &&
+               ( log2_max_transform_skip_block_size_minus2 == rhs.log2_max_transform_skip_block_size_minus2 ) &&
+               ( diff_cu_chroma_qp_offset_depth == rhs.diff_cu_chroma_qp_offset_depth ) &&
+               ( chroma_qp_offset_list_len_minus1 == rhs.chroma_qp_offset_list_len_minus1 ) && ( cb_qp_offset_list == rhs.cb_qp_offset_list ) &&
+               ( cr_qp_offset_list == rhs.cr_qp_offset_list ) && ( log2_sao_offset_scale_luma == rhs.log2_sao_offset_scale_luma ) &&
+               ( log2_sao_offset_scale_chroma == rhs.log2_sao_offset_scale_chroma ) && ( pps_act_y_qp_offset_plus5 == rhs.pps_act_y_qp_offset_plus5 ) &&
+               ( pps_act_cb_qp_offset_plus5 == rhs.pps_act_cb_qp_offset_plus5 ) && ( pps_act_cr_qp_offset_plus3 == rhs.pps_act_cr_qp_offset_plus3 ) &&
+               ( pps_num_palette_predictor_initializers == rhs.pps_num_palette_predictor_initializers ) &&
+               ( luma_bit_depth_entry_minus8 == rhs.luma_bit_depth_entry_minus8 ) && ( chroma_bit_depth_entry_minus8 == rhs.chroma_bit_depth_entry_minus8 ) &&
+               ( num_tile_columns_minus1 == rhs.num_tile_columns_minus1 ) && ( num_tile_rows_minus1 == rhs.num_tile_rows_minus1 ) &&
+               ( reserved1 == rhs.reserved1 ) && ( reserved2 == rhs.reserved2 ) && ( column_width_minus1 == rhs.column_width_minus1 ) &&
+               ( row_height_minus1 == rhs.row_height_minus1 ) && ( reserved3 == rhs.reserved3 ) && ( pScalingLists == rhs.pScalingLists ) &&
+               ( pPredictorPaletteEntries == rhs.pPredictorPaletteEntries );
+      }
+
+      bool operator!=( H265PictureParameterSet const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265PpsFlags                                      flags                                     = {};
+      uint8_t                                                                                             pps_pic_parameter_set_id                  = {};
+      uint8_t                                                                                             pps_seq_parameter_set_id                  = {};
+      uint8_t                                                                                             sps_video_parameter_set_id                = {};
+      uint8_t                                                                                             num_extra_slice_header_bits               = {};
+      uint8_t                                                                                             num_ref_idx_l0_default_active_minus1      = {};
+      uint8_t                                                                                             num_ref_idx_l1_default_active_minus1      = {};
+      int8_t                                                                                              init_qp_minus26                           = {};
+      uint8_t                                                                                             diff_cu_qp_delta_depth                    = {};
+      int8_t                                                                                              pps_cb_qp_offset                          = {};
+      int8_t                                                                                              pps_cr_qp_offset                          = {};
+      int8_t                                                                                              pps_beta_offset_div2                      = {};
+      int8_t                                                                                              pps_tc_offset_div2                        = {};
+      uint8_t                                                                                             log2_parallel_merge_level_minus2          = {};
+      uint8_t                                                                                             log2_max_transform_skip_block_size_minus2 = {};
+      uint8_t                                                                                             diff_cu_chroma_qp_offset_depth            = {};
+      uint8_t                                                                                             chroma_qp_offset_list_len_minus1          = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<int8_t, STD_VIDEO_H265_CHROMA_QP_OFFSET_LIST_SIZE>             cb_qp_offset_list                         = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<int8_t, STD_VIDEO_H265_CHROMA_QP_OFFSET_LIST_SIZE>             cr_qp_offset_list                         = {};
+      uint8_t                                                                                             log2_sao_offset_scale_luma                = {};
+      uint8_t                                                                                             log2_sao_offset_scale_chroma              = {};
+      int8_t                                                                                              pps_act_y_qp_offset_plus5                 = {};
+      int8_t                                                                                              pps_act_cb_qp_offset_plus5                = {};
+      int8_t                                                                                              pps_act_cr_qp_offset_plus3                = {};
+      uint8_t                                                                                             pps_num_palette_predictor_initializers    = {};
+      uint8_t                                                                                             luma_bit_depth_entry_minus8               = {};
+      uint8_t                                                                                             chroma_bit_depth_entry_minus8             = {};
+      uint8_t                                                                                             num_tile_columns_minus1                   = {};
+      uint8_t                                                                                             num_tile_rows_minus1                      = {};
+      uint8_t                                                                                             reserved1                                 = {};
+      uint8_t                                                                                             reserved2                                 = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint16_t, STD_VIDEO_H265_CHROMA_QP_OFFSET_TILE_COLS_LIST_SIZE> column_width_minus1                       = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint16_t, STD_VIDEO_H265_CHROMA_QP_OFFSET_TILE_ROWS_LIST_SIZE> row_height_minus1                         = {};
+      uint32_t                                                                                            reserved3                                 = {};
+      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265ScalingLists *                          pScalingLists                             = {};
+      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265PredictorPaletteEntries *               pPredictorPaletteEntries                  = {};
+    };
+
+    //=== vulkan_video_codec_h265std_decode ===
+
+    struct DecodeH265PictureInfoFlags
+    {
+      using NativeType = StdVideoDecodeH265PictureInfoFlags;
+
+      operator StdVideoDecodeH265PictureInfoFlags const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoDecodeH265PictureInfoFlags *>( this );
+      }
+
+      operator StdVideoDecodeH265PictureInfoFlags &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoDecodeH265PictureInfoFlags *>( this );
+      }
+
+      bool operator==( DecodeH265PictureInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( IrapPicFlag == rhs.IrapPicFlag ) && ( IdrPicFlag == rhs.IdrPicFlag ) && ( IsReference == rhs.IsReference ) &&
+               ( short_term_ref_pic_set_sps_flag == rhs.short_term_ref_pic_set_sps_flag );
+      }
+
+      bool operator!=( DecodeH265PictureInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      uint32_t IrapPicFlag                     : 1;
+      uint32_t IdrPicFlag                      : 1;
+      uint32_t IsReference                     : 1;
+      uint32_t short_term_ref_pic_set_sps_flag : 1;
+    };
+
+    struct DecodeH265PictureInfo
+    {
+      using NativeType = StdVideoDecodeH265PictureInfo;
+
+      operator StdVideoDecodeH265PictureInfo const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoDecodeH265PictureInfo *>( this );
+      }
+
+      operator StdVideoDecodeH265PictureInfo &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoDecodeH265PictureInfo *>( this );
+      }
+
+      bool operator==( DecodeH265PictureInfo const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( flags == rhs.flags ) && ( sps_video_parameter_set_id == rhs.sps_video_parameter_set_id ) &&
+               ( pps_seq_parameter_set_id == rhs.pps_seq_parameter_set_id ) && ( pps_pic_parameter_set_id == rhs.pps_pic_parameter_set_id ) &&
+               ( NumDeltaPocsOfRefRpsIdx == rhs.NumDeltaPocsOfRefRpsIdx ) && ( PicOrderCntVal == rhs.PicOrderCntVal ) &&
+               ( NumBitsForSTRefPicSetInSlice == rhs.NumBitsForSTRefPicSetInSlice ) && ( reserved == rhs.reserved ) &&
+               ( RefPicSetStCurrBefore == rhs.RefPicSetStCurrBefore ) && ( RefPicSetStCurrAfter == rhs.RefPicSetStCurrAfter ) &&
+               ( RefPicSetLtCurr == rhs.RefPicSetLtCurr );
+      }
+
+      bool operator!=( DecodeH265PictureInfo const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::DecodeH265PictureInfoFlags               flags                        = {};
+      uint8_t                                                                                    sps_video_parameter_set_id   = {};
+      uint8_t                                                                                    pps_seq_parameter_set_id     = {};
+      uint8_t                                                                                    pps_pic_parameter_set_id     = {};
+      uint8_t                                                                                    NumDeltaPocsOfRefRpsIdx      = {};
+      int32_t                                                                                    PicOrderCntVal               = {};
+      uint16_t                                                                                   NumBitsForSTRefPicSetInSlice = {};
+      uint16_t                                                                                   reserved                     = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_DECODE_H265_REF_PIC_SET_LIST_SIZE> RefPicSetStCurrBefore        = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_DECODE_H265_REF_PIC_SET_LIST_SIZE> RefPicSetStCurrAfter         = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_DECODE_H265_REF_PIC_SET_LIST_SIZE> RefPicSetLtCurr              = {};
+    };
+
+    struct DecodeH265ReferenceInfoFlags
+    {
+      using NativeType = StdVideoDecodeH265ReferenceInfoFlags;
+
+      operator StdVideoDecodeH265ReferenceInfoFlags const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoDecodeH265ReferenceInfoFlags *>( this );
+      }
+
+      operator StdVideoDecodeH265ReferenceInfoFlags &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoDecodeH265ReferenceInfoFlags *>( this );
+      }
+
+      bool operator==( DecodeH265ReferenceInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( used_for_long_term_reference == rhs.used_for_long_term_reference ) && ( unused_for_reference == rhs.unused_for_reference );
+      }
+
+      bool operator!=( DecodeH265ReferenceInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      uint32_t used_for_long_term_reference : 1;
+      uint32_t unused_for_reference         : 1;
+    };
+
+    struct DecodeH265ReferenceInfo
+    {
+      using NativeType = StdVideoDecodeH265ReferenceInfo;
+
+      operator StdVideoDecodeH265ReferenceInfo const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoDecodeH265ReferenceInfo *>( this );
+      }
+
+      operator StdVideoDecodeH265ReferenceInfo &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoDecodeH265ReferenceInfo *>( this );
+      }
+
+      bool operator==( DecodeH265ReferenceInfo const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( flags == rhs.flags ) && ( PicOrderCntVal == rhs.PicOrderCntVal );
+      }
+
+      bool operator!=( DecodeH265ReferenceInfo const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::DecodeH265ReferenceInfoFlags flags          = {};
+      int32_t                                                                        PicOrderCntVal = {};
+    };
+
+    //=== vulkan_video_codec_h265std_encode ===
+
+    struct EncodeH265WeightTableFlags
+    {
+      using NativeType = StdVideoEncodeH265WeightTableFlags;
+
+      operator StdVideoEncodeH265WeightTableFlags const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoEncodeH265WeightTableFlags *>( this );
+      }
+
+      operator StdVideoEncodeH265WeightTableFlags &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoEncodeH265WeightTableFlags *>( this );
+      }
+
+      bool operator==( EncodeH265WeightTableFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( luma_weight_l0_flag == rhs.luma_weight_l0_flag ) && ( chroma_weight_l0_flag == rhs.chroma_weight_l0_flag ) &&
+               ( luma_weight_l1_flag == rhs.luma_weight_l1_flag ) && ( chroma_weight_l1_flag == rhs.chroma_weight_l1_flag );
+      }
+
+      bool operator!=( EncodeH265WeightTableFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      uint16_t luma_weight_l0_flag   = {};
+      uint16_t chroma_weight_l0_flag = {};
+      uint16_t luma_weight_l1_flag   = {};
+      uint16_t chroma_weight_l1_flag = {};
+    };
+
+    struct EncodeH265WeightTable
+    {
+      using NativeType = StdVideoEncodeH265WeightTable;
+
+      operator StdVideoEncodeH265WeightTable const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoEncodeH265WeightTable *>( this );
+      }
+
+      operator StdVideoEncodeH265WeightTable &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoEncodeH265WeightTable *>( this );
+      }
+
+      bool operator==( EncodeH265WeightTable const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( flags == rhs.flags ) && ( luma_log2_weight_denom == rhs.luma_log2_weight_denom ) &&
+               ( delta_chroma_log2_weight_denom == rhs.delta_chroma_log2_weight_denom ) && ( delta_luma_weight_l0 == rhs.delta_luma_weight_l0 ) &&
+               ( luma_offset_l0 == rhs.luma_offset_l0 ) && ( delta_chroma_weight_l0 == rhs.delta_chroma_weight_l0 ) &&
+               ( delta_chroma_offset_l0 == rhs.delta_chroma_offset_l0 ) && ( delta_luma_weight_l1 == rhs.delta_luma_weight_l1 ) &&
+               ( luma_offset_l1 == rhs.luma_offset_l1 ) && ( delta_chroma_weight_l1 == rhs.delta_chroma_weight_l1 ) &&
+               ( delta_chroma_offset_l1 == rhs.delta_chroma_offset_l1 );
+      }
+
+      bool operator!=( EncodeH265WeightTable const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH265WeightTableFlags                                    flags                          = {};
+      uint8_t                                                                                                         luma_log2_weight_denom         = {};
+      int8_t                                                                                                          delta_chroma_log2_weight_denom = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<int8_t, STD_VIDEO_H265_MAX_NUM_LIST_REF>                                   delta_luma_weight_l0           = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<int8_t, STD_VIDEO_H265_MAX_NUM_LIST_REF>                                   luma_offset_l0                 = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper2D<int8_t, STD_VIDEO_H265_MAX_NUM_LIST_REF, STD_VIDEO_H265_MAX_CHROMA_PLANES> delta_chroma_weight_l0         = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper2D<int8_t, STD_VIDEO_H265_MAX_NUM_LIST_REF, STD_VIDEO_H265_MAX_CHROMA_PLANES> delta_chroma_offset_l0         = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<int8_t, STD_VIDEO_H265_MAX_NUM_LIST_REF>                                   delta_luma_weight_l1           = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<int8_t, STD_VIDEO_H265_MAX_NUM_LIST_REF>                                   luma_offset_l1                 = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper2D<int8_t, STD_VIDEO_H265_MAX_NUM_LIST_REF, STD_VIDEO_H265_MAX_CHROMA_PLANES> delta_chroma_weight_l1         = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper2D<int8_t, STD_VIDEO_H265_MAX_NUM_LIST_REF, STD_VIDEO_H265_MAX_CHROMA_PLANES> delta_chroma_offset_l1         = {};
+    };
+
+    struct EncodeH265SliceSegmentHeaderFlags
+    {
+      using NativeType = StdVideoEncodeH265SliceSegmentHeaderFlags;
+
+      operator StdVideoEncodeH265SliceSegmentHeaderFlags const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoEncodeH265SliceSegmentHeaderFlags *>( this );
+      }
+
+      operator StdVideoEncodeH265SliceSegmentHeaderFlags &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoEncodeH265SliceSegmentHeaderFlags *>( this );
+      }
+
+      bool operator==( EncodeH265SliceSegmentHeaderFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( first_slice_segment_in_pic_flag == rhs.first_slice_segment_in_pic_flag ) &&
+               ( dependent_slice_segment_flag == rhs.dependent_slice_segment_flag ) && ( slice_sao_luma_flag == rhs.slice_sao_luma_flag ) &&
+               ( slice_sao_chroma_flag == rhs.slice_sao_chroma_flag ) && ( num_ref_idx_active_override_flag == rhs.num_ref_idx_active_override_flag ) &&
+               ( mvd_l1_zero_flag == rhs.mvd_l1_zero_flag ) && ( cabac_init_flag == rhs.cabac_init_flag ) &&
+               ( cu_chroma_qp_offset_enabled_flag == rhs.cu_chroma_qp_offset_enabled_flag ) &&
+               ( deblocking_filter_override_flag == rhs.deblocking_filter_override_flag ) &&
+               ( slice_deblocking_filter_disabled_flag == rhs.slice_deblocking_filter_disabled_flag ) &&
+               ( collocated_from_l0_flag == rhs.collocated_from_l0_flag ) &&
+               ( slice_loop_filter_across_slices_enabled_flag == rhs.slice_loop_filter_across_slices_enabled_flag ) && ( reserved == rhs.reserved );
+      }
+
+      bool operator!=( EncodeH265SliceSegmentHeaderFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      uint32_t first_slice_segment_in_pic_flag              : 1;
+      uint32_t dependent_slice_segment_flag                 : 1;
+      uint32_t slice_sao_luma_flag                          : 1;
+      uint32_t slice_sao_chroma_flag                        : 1;
+      uint32_t num_ref_idx_active_override_flag             : 1;
+      uint32_t mvd_l1_zero_flag                             : 1;
+      uint32_t cabac_init_flag                              : 1;
+      uint32_t cu_chroma_qp_offset_enabled_flag             : 1;
+      uint32_t deblocking_filter_override_flag              : 1;
+      uint32_t slice_deblocking_filter_disabled_flag        : 1;
+      uint32_t collocated_from_l0_flag                      : 1;
+      uint32_t slice_loop_filter_across_slices_enabled_flag : 1;
+      uint32_t reserved                                     : 20;
+    };
+
+    struct EncodeH265SliceSegmentHeader
+    {
+      using NativeType = StdVideoEncodeH265SliceSegmentHeader;
+
+      operator StdVideoEncodeH265SliceSegmentHeader const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoEncodeH265SliceSegmentHeader *>( this );
+      }
+
+      operator StdVideoEncodeH265SliceSegmentHeader &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoEncodeH265SliceSegmentHeader *>( this );
+      }
+
+      bool operator==( EncodeH265SliceSegmentHeader const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( flags == rhs.flags ) && ( slice_type == rhs.slice_type ) && ( slice_segment_address == rhs.slice_segment_address ) &&
+               ( collocated_ref_idx == rhs.collocated_ref_idx ) && ( MaxNumMergeCand == rhs.MaxNumMergeCand ) &&
+               ( slice_cb_qp_offset == rhs.slice_cb_qp_offset ) && ( slice_cr_qp_offset == rhs.slice_cr_qp_offset ) &&
+               ( slice_beta_offset_div2 == rhs.slice_beta_offset_div2 ) && ( slice_tc_offset_div2 == rhs.slice_tc_offset_div2 ) &&
+               ( slice_act_y_qp_offset == rhs.slice_act_y_qp_offset ) && ( slice_act_cb_qp_offset == rhs.slice_act_cb_qp_offset ) &&
+               ( slice_act_cr_qp_offset == rhs.slice_act_cr_qp_offset ) && ( reserved1 == rhs.reserved1 ) && ( pWeightTable == rhs.pWeightTable );
+      }
+
+      bool operator!=( EncodeH265SliceSegmentHeader const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH265SliceSegmentHeaderFlags flags = {};
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265SliceType slice_type = VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265SliceType::eB;
+      uint32_t                                                        slice_segment_address        = {};
+      uint8_t                                                         collocated_ref_idx           = {};
+      uint8_t                                                         MaxNumMergeCand              = {};
+      int8_t                                                          slice_cb_qp_offset           = {};
+      int8_t                                                          slice_cr_qp_offset           = {};
+      int8_t                                                          slice_beta_offset_div2       = {};
+      int8_t                                                          slice_tc_offset_div2         = {};
+      int8_t                                                          slice_act_y_qp_offset        = {};
+      int8_t                                                          slice_act_cb_qp_offset       = {};
+      int8_t                                                          slice_act_cr_qp_offset       = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, 3>                reserved1                    = {};
+      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH265WeightTable * pWeightTable = {};
+    };
+
+    struct EncodeH265ReferenceListsInfoFlags
+    {
+      using NativeType = StdVideoEncodeH265ReferenceListsInfoFlags;
+
+      operator StdVideoEncodeH265ReferenceListsInfoFlags const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoEncodeH265ReferenceListsInfoFlags *>( this );
+      }
+
+      operator StdVideoEncodeH265ReferenceListsInfoFlags &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoEncodeH265ReferenceListsInfoFlags *>( this );
+      }
+
+      bool operator==( EncodeH265ReferenceListsInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( ref_pic_list_modification_flag_l0 == rhs.ref_pic_list_modification_flag_l0 ) &&
+               ( ref_pic_list_modification_flag_l1 == rhs.ref_pic_list_modification_flag_l1 ) && ( reserved == rhs.reserved );
+      }
+
+      bool operator!=( EncodeH265ReferenceListsInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      uint32_t ref_pic_list_modification_flag_l0 : 1;
+      uint32_t ref_pic_list_modification_flag_l1 : 1;
+      uint32_t reserved                          : 30;
+    };
+
+    struct EncodeH265ReferenceListsInfo
+    {
+      using NativeType = StdVideoEncodeH265ReferenceListsInfo;
+
+      operator StdVideoEncodeH265ReferenceListsInfo const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoEncodeH265ReferenceListsInfo *>( this );
+      }
+
+      operator StdVideoEncodeH265ReferenceListsInfo &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoEncodeH265ReferenceListsInfo *>( this );
+      }
+
+      bool operator==( EncodeH265ReferenceListsInfo const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( flags == rhs.flags ) && ( num_ref_idx_l0_active_minus1 == rhs.num_ref_idx_l0_active_minus1 ) &&
+               ( num_ref_idx_l1_active_minus1 == rhs.num_ref_idx_l1_active_minus1 ) && ( RefPicList0 == rhs.RefPicList0 ) &&
+               ( RefPicList1 == rhs.RefPicList1 ) && ( list_entry_l0 == rhs.list_entry_l0 ) && ( list_entry_l1 == rhs.list_entry_l1 );
+      }
+
+      bool operator!=( EncodeH265ReferenceListsInfo const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH265ReferenceListsInfoFlags flags                        = {};
+      uint8_t                                                                             num_ref_idx_l0_active_minus1 = {};
+      uint8_t                                                                             num_ref_idx_l1_active_minus1 = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_H265_MAX_NUM_LIST_REF>      RefPicList0                  = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_H265_MAX_NUM_LIST_REF>      RefPicList1                  = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_H265_MAX_NUM_LIST_REF>      list_entry_l0                = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_H265_MAX_NUM_LIST_REF>      list_entry_l1                = {};
+    };
+
+    struct EncodeH265PictureInfoFlags
+    {
+      using NativeType = StdVideoEncodeH265PictureInfoFlags;
+
+      operator StdVideoEncodeH265PictureInfoFlags const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoEncodeH265PictureInfoFlags *>( this );
+      }
+
+      operator StdVideoEncodeH265PictureInfoFlags &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoEncodeH265PictureInfoFlags *>( this );
+      }
+
+      bool operator==( EncodeH265PictureInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( is_reference == rhs.is_reference ) && ( IrapPicFlag == rhs.IrapPicFlag ) &&
+               ( used_for_long_term_reference == rhs.used_for_long_term_reference ) && ( discardable_flag == rhs.discardable_flag ) &&
+               ( cross_layer_bla_flag == rhs.cross_layer_bla_flag ) && ( pic_output_flag == rhs.pic_output_flag ) &&
+               ( no_output_of_prior_pics_flag == rhs.no_output_of_prior_pics_flag ) &&
+               ( short_term_ref_pic_set_sps_flag == rhs.short_term_ref_pic_set_sps_flag ) &&
+               ( slice_temporal_mvp_enabled_flag == rhs.slice_temporal_mvp_enabled_flag ) && ( reserved == rhs.reserved );
+      }
+
+      bool operator!=( EncodeH265PictureInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      uint32_t is_reference                    : 1;
+      uint32_t IrapPicFlag                     : 1;
+      uint32_t used_for_long_term_reference    : 1;
+      uint32_t discardable_flag                : 1;
+      uint32_t cross_layer_bla_flag            : 1;
+      uint32_t pic_output_flag                 : 1;
+      uint32_t no_output_of_prior_pics_flag    : 1;
+      uint32_t short_term_ref_pic_set_sps_flag : 1;
+      uint32_t slice_temporal_mvp_enabled_flag : 1;
+      uint32_t reserved                        : 23;
+    };
+
+    struct EncodeH265SliceSegmentLongTermRefPics
+    {
+      using NativeType = StdVideoEncodeH265SliceSegmentLongTermRefPics;
+
+      operator StdVideoEncodeH265SliceSegmentLongTermRefPics const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoEncodeH265SliceSegmentLongTermRefPics *>( this );
+      }
+
+      operator StdVideoEncodeH265SliceSegmentLongTermRefPics &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoEncodeH265SliceSegmentLongTermRefPics *>( this );
+      }
+
+      bool operator==( EncodeH265SliceSegmentLongTermRefPics const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( num_long_term_sps == rhs.num_long_term_sps ) && ( num_long_term_pics == rhs.num_long_term_pics ) && ( lt_idx_sps == rhs.lt_idx_sps ) &&
+               ( poc_lsb_lt == rhs.poc_lsb_lt ) && ( used_by_curr_pic_lt_flag == rhs.used_by_curr_pic_lt_flag ) &&
+               ( delta_poc_msb_present_flag == rhs.delta_poc_msb_present_flag ) && ( delta_poc_msb_cycle_lt == rhs.delta_poc_msb_cycle_lt );
+      }
+
+      bool operator!=( EncodeH265SliceSegmentLongTermRefPics const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      uint8_t                                                                                  num_long_term_sps          = {};
+      uint8_t                                                                                  num_long_term_pics         = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_H265_MAX_LONG_TERM_REF_PICS_SPS> lt_idx_sps                 = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_H265_MAX_LONG_TERM_PICS>         poc_lsb_lt                 = {};
+      uint16_t                                                                                 used_by_curr_pic_lt_flag   = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_H265_MAX_DELTA_POC>              delta_poc_msb_present_flag = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, STD_VIDEO_H265_MAX_DELTA_POC>              delta_poc_msb_cycle_lt     = {};
+    };
+
+    struct EncodeH265PictureInfo
+    {
+      using NativeType = StdVideoEncodeH265PictureInfo;
+
+      operator StdVideoEncodeH265PictureInfo const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoEncodeH265PictureInfo *>( this );
+      }
+
+      operator StdVideoEncodeH265PictureInfo &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoEncodeH265PictureInfo *>( this );
+      }
+
+      bool operator==( EncodeH265PictureInfo const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( flags == rhs.flags ) && ( pic_type == rhs.pic_type ) && ( sps_video_parameter_set_id == rhs.sps_video_parameter_set_id ) &&
+               ( pps_seq_parameter_set_id == rhs.pps_seq_parameter_set_id ) && ( pps_pic_parameter_set_id == rhs.pps_pic_parameter_set_id ) &&
+               ( short_term_ref_pic_set_idx == rhs.short_term_ref_pic_set_idx ) && ( PicOrderCntVal == rhs.PicOrderCntVal ) &&
+               ( TemporalId == rhs.TemporalId ) && ( reserved1 == rhs.reserved1 ) && ( pRefLists == rhs.pRefLists ) &&
+               ( pShortTermRefPicSet == rhs.pShortTermRefPicSet ) && ( pLongTermRefPics == rhs.pLongTermRefPics );
+      }
+
+      bool operator!=( EncodeH265PictureInfo const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH265PictureInfoFlags flags = {};
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265PictureType pic_type = VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265PictureType::eP;
+      uint8_t                                                           sps_video_parameter_set_id                        = {};
+      uint8_t                                                           pps_seq_parameter_set_id                          = {};
+      uint8_t                                                           pps_pic_parameter_set_id                          = {};
+      uint8_t                                                           short_term_ref_pic_set_idx                        = {};
+      int32_t                                                           PicOrderCntVal                                    = {};
+      uint8_t                                                           TemporalId                                        = {};
+      VULKAN_HPP_NAMESPACE::ArrayWrapper1D<uint8_t, 7>                  reserved1                                         = {};
+      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH265ReferenceListsInfo *          pRefLists           = {};
+      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265ShortTermRefPicSet *                pShortTermRefPicSet = {};
+      const VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH265SliceSegmentLongTermRefPics * pLongTermRefPics    = {};
+    };
+
+    struct EncodeH265ReferenceInfoFlags
+    {
+      using NativeType = StdVideoEncodeH265ReferenceInfoFlags;
+
+      operator StdVideoEncodeH265ReferenceInfoFlags const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoEncodeH265ReferenceInfoFlags *>( this );
+      }
+
+      operator StdVideoEncodeH265ReferenceInfoFlags &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoEncodeH265ReferenceInfoFlags *>( this );
+      }
+
+      bool operator==( EncodeH265ReferenceInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( used_for_long_term_reference == rhs.used_for_long_term_reference ) && ( unused_for_reference == rhs.unused_for_reference ) &&
+               ( reserved == rhs.reserved );
+      }
+
+      bool operator!=( EncodeH265ReferenceInfoFlags const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      uint32_t used_for_long_term_reference : 1;
+      uint32_t unused_for_reference         : 1;
+      uint32_t reserved                     : 30;
+    };
+
+    struct EncodeH265ReferenceInfo
+    {
+      using NativeType = StdVideoEncodeH265ReferenceInfo;
+
+      operator StdVideoEncodeH265ReferenceInfo const &() const VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<const StdVideoEncodeH265ReferenceInfo *>( this );
+      }
+
+      operator StdVideoEncodeH265ReferenceInfo &() VULKAN_HPP_NOEXCEPT
+      {
+        return *reinterpret_cast<StdVideoEncodeH265ReferenceInfo *>( this );
+      }
+
+      bool operator==( EncodeH265ReferenceInfo const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return ( flags == rhs.flags ) && ( pic_type == rhs.pic_type ) && ( PicOrderCntVal == rhs.PicOrderCntVal ) && ( TemporalId == rhs.TemporalId );
+      }
+
+      bool operator!=( EncodeH265ReferenceInfo const & rhs ) const VULKAN_HPP_NOEXCEPT
+      {
+        return !operator==( rhs );
+      }
+
+    public:
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::EncodeH265ReferenceInfoFlags flags = {};
+      VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265PictureType pic_type       = VULKAN_HPP_NAMESPACE::VULKAN_HPP_VIDEO_NAMESPACE::H265PictureType::eP;
+      int32_t                                                           PicOrderCntVal = {};
+      uint8_t                                                           TemporalId     = {};
+    };
+
+  }  // namespace VULKAN_HPP_VIDEO_NAMESPACE
+}  // namespace VULKAN_HPP_NAMESPACE
+#endif