1e8556ba3Sopenharmony_ci// Copyright 2015-2024 The Khronos Group Inc. 2e8556ba3Sopenharmony_ci// 3e8556ba3Sopenharmony_ci// SPDX-License-Identifier: Apache-2.0 OR MIT 4e8556ba3Sopenharmony_ci// 5e8556ba3Sopenharmony_ci 6e8556ba3Sopenharmony_ci// This header is generated from the Khronos Vulkan XML API Registry. 7e8556ba3Sopenharmony_ci 8e8556ba3Sopenharmony_ci#ifndef VULKAN_SHARED_HPP 9e8556ba3Sopenharmony_ci#define VULKAN_SHARED_HPP 10e8556ba3Sopenharmony_ci 11e8556ba3Sopenharmony_ci#include <atomic> // std::atomic_size_t 12e8556ba3Sopenharmony_ci#include <vulkan/vulkan.hpp> 13e8556ba3Sopenharmony_ci 14e8556ba3Sopenharmony_cinamespace VULKAN_HPP_NAMESPACE 15e8556ba3Sopenharmony_ci{ 16e8556ba3Sopenharmony_ci#if !defined( VULKAN_HPP_NO_SMART_HANDLE ) 17e8556ba3Sopenharmony_ci 18e8556ba3Sopenharmony_ci template <typename HandleType> 19e8556ba3Sopenharmony_ci class SharedHandleTraits; 20e8556ba3Sopenharmony_ci 21e8556ba3Sopenharmony_ci class NoDestructor 22e8556ba3Sopenharmony_ci { 23e8556ba3Sopenharmony_ci }; 24e8556ba3Sopenharmony_ci 25e8556ba3Sopenharmony_ci template <typename HandleType, typename = void> 26e8556ba3Sopenharmony_ci struct HasDestructorType : std::false_type 27e8556ba3Sopenharmony_ci { 28e8556ba3Sopenharmony_ci }; 29e8556ba3Sopenharmony_ci 30e8556ba3Sopenharmony_ci template <typename HandleType> 31e8556ba3Sopenharmony_ci struct HasDestructorType<HandleType, decltype( (void)typename SharedHandleTraits<HandleType>::DestructorType() )> : std::true_type 32e8556ba3Sopenharmony_ci { 33e8556ba3Sopenharmony_ci }; 34e8556ba3Sopenharmony_ci 35e8556ba3Sopenharmony_ci template <typename HandleType, typename Enable = void> 36e8556ba3Sopenharmony_ci struct GetDestructorType 37e8556ba3Sopenharmony_ci { 38e8556ba3Sopenharmony_ci using type = NoDestructor; 39e8556ba3Sopenharmony_ci }; 40e8556ba3Sopenharmony_ci 41e8556ba3Sopenharmony_ci template <typename HandleType> 42e8556ba3Sopenharmony_ci struct GetDestructorType<HandleType, typename std::enable_if<HasDestructorType<HandleType>::value>::type> 43e8556ba3Sopenharmony_ci { 44e8556ba3Sopenharmony_ci using type = typename SharedHandleTraits<HandleType>::DestructorType; 45e8556ba3Sopenharmony_ci }; 46e8556ba3Sopenharmony_ci 47e8556ba3Sopenharmony_ci template <class HandleType> 48e8556ba3Sopenharmony_ci using DestructorTypeOf = typename GetDestructorType<HandleType>::type; 49e8556ba3Sopenharmony_ci 50e8556ba3Sopenharmony_ci template <class HandleType> 51e8556ba3Sopenharmony_ci struct HasDestructor : std::integral_constant<bool, !std::is_same<DestructorTypeOf<HandleType>, NoDestructor>::value> 52e8556ba3Sopenharmony_ci { 53e8556ba3Sopenharmony_ci }; 54e8556ba3Sopenharmony_ci 55e8556ba3Sopenharmony_ci //===================================================================================================================== 56e8556ba3Sopenharmony_ci 57e8556ba3Sopenharmony_ci template <typename HandleType> 58e8556ba3Sopenharmony_ci class SharedHandle; 59e8556ba3Sopenharmony_ci 60e8556ba3Sopenharmony_ci template <typename DestructorType, typename Deleter> 61e8556ba3Sopenharmony_ci struct SharedHeader 62e8556ba3Sopenharmony_ci { 63e8556ba3Sopenharmony_ci SharedHeader( SharedHandle<DestructorType> parent, Deleter deleter = Deleter() ) VULKAN_HPP_NOEXCEPT 64e8556ba3Sopenharmony_ci : parent( std::move( parent ) ) 65e8556ba3Sopenharmony_ci , deleter( std::move( deleter ) ) 66e8556ba3Sopenharmony_ci { 67e8556ba3Sopenharmony_ci } 68e8556ba3Sopenharmony_ci 69e8556ba3Sopenharmony_ci SharedHandle<DestructorType> parent; 70e8556ba3Sopenharmony_ci Deleter deleter; 71e8556ba3Sopenharmony_ci }; 72e8556ba3Sopenharmony_ci 73e8556ba3Sopenharmony_ci template <typename Deleter> 74e8556ba3Sopenharmony_ci struct SharedHeader<NoDestructor, Deleter> 75e8556ba3Sopenharmony_ci { 76e8556ba3Sopenharmony_ci SharedHeader( Deleter deleter = Deleter() ) VULKAN_HPP_NOEXCEPT : deleter( std::move( deleter ) ) {} 77e8556ba3Sopenharmony_ci 78e8556ba3Sopenharmony_ci Deleter deleter; 79e8556ba3Sopenharmony_ci }; 80e8556ba3Sopenharmony_ci 81e8556ba3Sopenharmony_ci //===================================================================================================================== 82e8556ba3Sopenharmony_ci 83e8556ba3Sopenharmony_ci template <typename HeaderType> 84e8556ba3Sopenharmony_ci class ReferenceCounter 85e8556ba3Sopenharmony_ci { 86e8556ba3Sopenharmony_ci public: 87e8556ba3Sopenharmony_ci template <typename... Args> 88e8556ba3Sopenharmony_ci ReferenceCounter( Args &&... control_args ) : m_header( std::forward<Args>( control_args )... ) 89e8556ba3Sopenharmony_ci { 90e8556ba3Sopenharmony_ci } 91e8556ba3Sopenharmony_ci 92e8556ba3Sopenharmony_ci ReferenceCounter( const ReferenceCounter & ) = delete; 93e8556ba3Sopenharmony_ci ReferenceCounter & operator=( const ReferenceCounter & ) = delete; 94e8556ba3Sopenharmony_ci 95e8556ba3Sopenharmony_ci public: 96e8556ba3Sopenharmony_ci size_t addRef() VULKAN_HPP_NOEXCEPT 97e8556ba3Sopenharmony_ci { 98e8556ba3Sopenharmony_ci // Relaxed memory order is sufficient since this does not impose any ordering on other operations 99e8556ba3Sopenharmony_ci return m_ref_cnt.fetch_add( 1, std::memory_order_relaxed ); 100e8556ba3Sopenharmony_ci } 101e8556ba3Sopenharmony_ci 102e8556ba3Sopenharmony_ci size_t release() VULKAN_HPP_NOEXCEPT 103e8556ba3Sopenharmony_ci { 104e8556ba3Sopenharmony_ci // A release memory order to ensure that all releases are ordered 105e8556ba3Sopenharmony_ci return m_ref_cnt.fetch_sub( 1, std::memory_order_release ); 106e8556ba3Sopenharmony_ci } 107e8556ba3Sopenharmony_ci 108e8556ba3Sopenharmony_ci public: 109e8556ba3Sopenharmony_ci std::atomic_size_t m_ref_cnt{ 1 }; 110e8556ba3Sopenharmony_ci HeaderType m_header{}; 111e8556ba3Sopenharmony_ci }; 112e8556ba3Sopenharmony_ci 113e8556ba3Sopenharmony_ci //===================================================================================================================== 114e8556ba3Sopenharmony_ci 115e8556ba3Sopenharmony_ci template <typename HandleType, typename HeaderType, typename ForwardType = SharedHandle<HandleType>> 116e8556ba3Sopenharmony_ci class SharedHandleBase 117e8556ba3Sopenharmony_ci { 118e8556ba3Sopenharmony_ci public: 119e8556ba3Sopenharmony_ci SharedHandleBase() = default; 120e8556ba3Sopenharmony_ci 121e8556ba3Sopenharmony_ci template <typename... Args> 122e8556ba3Sopenharmony_ci SharedHandleBase( HandleType handle, Args &&... control_args ) 123e8556ba3Sopenharmony_ci : m_control( new ReferenceCounter<HeaderType>( std::forward<Args>( control_args )... ) ), m_handle( handle ) 124e8556ba3Sopenharmony_ci { 125e8556ba3Sopenharmony_ci } 126e8556ba3Sopenharmony_ci 127e8556ba3Sopenharmony_ci SharedHandleBase( const SharedHandleBase & o ) VULKAN_HPP_NOEXCEPT 128e8556ba3Sopenharmony_ci { 129e8556ba3Sopenharmony_ci o.addRef(); 130e8556ba3Sopenharmony_ci m_handle = o.m_handle; 131e8556ba3Sopenharmony_ci m_control = o.m_control; 132e8556ba3Sopenharmony_ci } 133e8556ba3Sopenharmony_ci 134e8556ba3Sopenharmony_ci SharedHandleBase( SharedHandleBase && o ) VULKAN_HPP_NOEXCEPT 135e8556ba3Sopenharmony_ci : m_control( o.m_control ) 136e8556ba3Sopenharmony_ci , m_handle( o.m_handle ) 137e8556ba3Sopenharmony_ci { 138e8556ba3Sopenharmony_ci o.m_handle = nullptr; 139e8556ba3Sopenharmony_ci o.m_control = nullptr; 140e8556ba3Sopenharmony_ci } 141e8556ba3Sopenharmony_ci 142e8556ba3Sopenharmony_ci SharedHandleBase & operator=( const SharedHandleBase & o ) VULKAN_HPP_NOEXCEPT 143e8556ba3Sopenharmony_ci { 144e8556ba3Sopenharmony_ci SharedHandleBase( o ).swap( *this ); 145e8556ba3Sopenharmony_ci return *this; 146e8556ba3Sopenharmony_ci } 147e8556ba3Sopenharmony_ci 148e8556ba3Sopenharmony_ci SharedHandleBase & operator=( SharedHandleBase && o ) VULKAN_HPP_NOEXCEPT 149e8556ba3Sopenharmony_ci { 150e8556ba3Sopenharmony_ci SharedHandleBase( std::move( o ) ).swap( *this ); 151e8556ba3Sopenharmony_ci return *this; 152e8556ba3Sopenharmony_ci } 153e8556ba3Sopenharmony_ci 154e8556ba3Sopenharmony_ci ~SharedHandleBase() 155e8556ba3Sopenharmony_ci { 156e8556ba3Sopenharmony_ci // only this function owns the last reference to the control block 157e8556ba3Sopenharmony_ci // the same principle is used in the default deleter of std::shared_ptr 158e8556ba3Sopenharmony_ci if ( m_control && ( m_control->release() == 1 ) ) 159e8556ba3Sopenharmony_ci { 160e8556ba3Sopenharmony_ci // noop in x86, but does thread synchronization in ARM 161e8556ba3Sopenharmony_ci // it is required to ensure that last thread is getting to destroy the control block 162e8556ba3Sopenharmony_ci // by ordering all atomic operations before this fence 163e8556ba3Sopenharmony_ci std::atomic_thread_fence( std::memory_order_acquire ); 164e8556ba3Sopenharmony_ci ForwardType::internalDestroy( getHeader(), m_handle ); 165e8556ba3Sopenharmony_ci delete m_control; 166e8556ba3Sopenharmony_ci } 167e8556ba3Sopenharmony_ci } 168e8556ba3Sopenharmony_ci 169e8556ba3Sopenharmony_ci public: 170e8556ba3Sopenharmony_ci HandleType get() const VULKAN_HPP_NOEXCEPT 171e8556ba3Sopenharmony_ci { 172e8556ba3Sopenharmony_ci return m_handle; 173e8556ba3Sopenharmony_ci } 174e8556ba3Sopenharmony_ci 175e8556ba3Sopenharmony_ci HandleType operator*() const VULKAN_HPP_NOEXCEPT 176e8556ba3Sopenharmony_ci { 177e8556ba3Sopenharmony_ci return m_handle; 178e8556ba3Sopenharmony_ci } 179e8556ba3Sopenharmony_ci 180e8556ba3Sopenharmony_ci explicit operator bool() const VULKAN_HPP_NOEXCEPT 181e8556ba3Sopenharmony_ci { 182e8556ba3Sopenharmony_ci return bool( m_handle ); 183e8556ba3Sopenharmony_ci } 184e8556ba3Sopenharmony_ci 185e8556ba3Sopenharmony_ci const HandleType * operator->() const VULKAN_HPP_NOEXCEPT 186e8556ba3Sopenharmony_ci { 187e8556ba3Sopenharmony_ci return &m_handle; 188e8556ba3Sopenharmony_ci } 189e8556ba3Sopenharmony_ci 190e8556ba3Sopenharmony_ci HandleType * operator->() VULKAN_HPP_NOEXCEPT 191e8556ba3Sopenharmony_ci { 192e8556ba3Sopenharmony_ci return &m_handle; 193e8556ba3Sopenharmony_ci } 194e8556ba3Sopenharmony_ci 195e8556ba3Sopenharmony_ci void reset() VULKAN_HPP_NOEXCEPT 196e8556ba3Sopenharmony_ci { 197e8556ba3Sopenharmony_ci SharedHandleBase().swap( *this ); 198e8556ba3Sopenharmony_ci } 199e8556ba3Sopenharmony_ci 200e8556ba3Sopenharmony_ci void swap( SharedHandleBase & o ) VULKAN_HPP_NOEXCEPT 201e8556ba3Sopenharmony_ci { 202e8556ba3Sopenharmony_ci std::swap( m_handle, o.m_handle ); 203e8556ba3Sopenharmony_ci std::swap( m_control, o.m_control ); 204e8556ba3Sopenharmony_ci } 205e8556ba3Sopenharmony_ci 206e8556ba3Sopenharmony_ci template <typename T = HandleType> 207e8556ba3Sopenharmony_ci typename std::enable_if<HasDestructor<T>::value, const SharedHandle<DestructorTypeOf<HandleType>> &>::type getDestructorType() const VULKAN_HPP_NOEXCEPT 208e8556ba3Sopenharmony_ci { 209e8556ba3Sopenharmony_ci return getHeader().parent; 210e8556ba3Sopenharmony_ci } 211e8556ba3Sopenharmony_ci 212e8556ba3Sopenharmony_ci protected: 213e8556ba3Sopenharmony_ci template <typename T = HandleType> 214e8556ba3Sopenharmony_ci static typename std::enable_if<!HasDestructor<T>::value, void>::type internalDestroy( const HeaderType & control, HandleType handle ) VULKAN_HPP_NOEXCEPT 215e8556ba3Sopenharmony_ci { 216e8556ba3Sopenharmony_ci control.deleter.destroy( handle ); 217e8556ba3Sopenharmony_ci } 218e8556ba3Sopenharmony_ci 219e8556ba3Sopenharmony_ci template <typename T = HandleType> 220e8556ba3Sopenharmony_ci static typename std::enable_if<HasDestructor<T>::value, void>::type internalDestroy( const HeaderType & control, HandleType handle ) VULKAN_HPP_NOEXCEPT 221e8556ba3Sopenharmony_ci { 222e8556ba3Sopenharmony_ci control.deleter.destroy( control.parent.get(), handle ); 223e8556ba3Sopenharmony_ci } 224e8556ba3Sopenharmony_ci 225e8556ba3Sopenharmony_ci const HeaderType & getHeader() const VULKAN_HPP_NOEXCEPT 226e8556ba3Sopenharmony_ci { 227e8556ba3Sopenharmony_ci return m_control->m_header; 228e8556ba3Sopenharmony_ci } 229e8556ba3Sopenharmony_ci 230e8556ba3Sopenharmony_ci private: 231e8556ba3Sopenharmony_ci void addRef() const VULKAN_HPP_NOEXCEPT 232e8556ba3Sopenharmony_ci { 233e8556ba3Sopenharmony_ci if ( m_control ) 234e8556ba3Sopenharmony_ci m_control->addRef(); 235e8556ba3Sopenharmony_ci } 236e8556ba3Sopenharmony_ci 237e8556ba3Sopenharmony_ci protected: 238e8556ba3Sopenharmony_ci ReferenceCounter<HeaderType> * m_control = nullptr; 239e8556ba3Sopenharmony_ci HandleType m_handle{}; 240e8556ba3Sopenharmony_ci }; 241e8556ba3Sopenharmony_ci 242e8556ba3Sopenharmony_ci template <typename HandleType> 243e8556ba3Sopenharmony_ci class SharedHandle : public SharedHandleBase<HandleType, SharedHeader<DestructorTypeOf<HandleType>, typename SharedHandleTraits<HandleType>::deleter>> 244e8556ba3Sopenharmony_ci { 245e8556ba3Sopenharmony_ci private: 246e8556ba3Sopenharmony_ci using BaseType = SharedHandleBase<HandleType, SharedHeader<DestructorTypeOf<HandleType>, typename SharedHandleTraits<HandleType>::deleter>>; 247e8556ba3Sopenharmony_ci using DeleterType = typename SharedHandleTraits<HandleType>::deleter; 248e8556ba3Sopenharmony_ci friend BaseType; 249e8556ba3Sopenharmony_ci 250e8556ba3Sopenharmony_ci public: 251e8556ba3Sopenharmony_ci SharedHandle() = default; 252e8556ba3Sopenharmony_ci 253e8556ba3Sopenharmony_ci template <typename T = HandleType, typename = typename std::enable_if<HasDestructor<T>::value>::type> 254e8556ba3Sopenharmony_ci explicit SharedHandle( HandleType handle, SharedHandle<DestructorTypeOf<HandleType>> parent, DeleterType deleter = DeleterType() ) VULKAN_HPP_NOEXCEPT 255e8556ba3Sopenharmony_ci : BaseType( handle, std::move( parent ), std::move( deleter ) ) 256e8556ba3Sopenharmony_ci { 257e8556ba3Sopenharmony_ci } 258e8556ba3Sopenharmony_ci 259e8556ba3Sopenharmony_ci template <typename T = HandleType, typename = typename std::enable_if<!HasDestructor<T>::value>::type> 260e8556ba3Sopenharmony_ci explicit SharedHandle( HandleType handle, DeleterType deleter = DeleterType() ) VULKAN_HPP_NOEXCEPT : BaseType( handle, std::move( deleter ) ) 261e8556ba3Sopenharmony_ci { 262e8556ba3Sopenharmony_ci } 263e8556ba3Sopenharmony_ci 264e8556ba3Sopenharmony_ci protected: 265e8556ba3Sopenharmony_ci using BaseType::internalDestroy; 266e8556ba3Sopenharmony_ci }; 267e8556ba3Sopenharmony_ci 268e8556ba3Sopenharmony_ci template <typename HandleType> 269e8556ba3Sopenharmony_ci class SharedHandleTraits; 270e8556ba3Sopenharmony_ci 271e8556ba3Sopenharmony_ci// Silence the function cast warnings. 272e8556ba3Sopenharmony_ci# if defined( __GNUC__ ) && !defined( __clang__ ) && !defined( __INTEL_COMPILER ) 273e8556ba3Sopenharmony_ci# pragma GCC diagnostic push 274e8556ba3Sopenharmony_ci# pragma GCC diagnostic ignored "-Wcast-function-type" 275e8556ba3Sopenharmony_ci# endif 276e8556ba3Sopenharmony_ci 277e8556ba3Sopenharmony_ci template <typename HandleType> 278e8556ba3Sopenharmony_ci class ObjectDestroyShared 279e8556ba3Sopenharmony_ci { 280e8556ba3Sopenharmony_ci public: 281e8556ba3Sopenharmony_ci using DestructorType = typename SharedHandleTraits<HandleType>::DestructorType; 282e8556ba3Sopenharmony_ci 283e8556ba3Sopenharmony_ci template <class Dispatcher> 284e8556ba3Sopenharmony_ci using DestroyFunctionPointerType = 285e8556ba3Sopenharmony_ci typename std::conditional<HasDestructor<HandleType>::value, 286e8556ba3Sopenharmony_ci void ( DestructorType::* )( HandleType, const AllocationCallbacks *, const Dispatcher & ) const, 287e8556ba3Sopenharmony_ci void ( HandleType::* )( const AllocationCallbacks *, const Dispatcher & ) const>::type; 288e8556ba3Sopenharmony_ci 289e8556ba3Sopenharmony_ci using SelectorType = typename std::conditional<HasDestructor<HandleType>::value, DestructorType, HandleType>::type; 290e8556ba3Sopenharmony_ci 291e8556ba3Sopenharmony_ci template <typename Dispatcher = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE> 292e8556ba3Sopenharmony_ci ObjectDestroyShared( Optional<const AllocationCallbacks> allocationCallbacks VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT, 293e8556ba3Sopenharmony_ci const Dispatcher & dispatch VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) 294e8556ba3Sopenharmony_ci : m_destroy( reinterpret_cast<decltype( m_destroy )>( static_cast<DestroyFunctionPointerType<Dispatcher>>( &SelectorType::destroy ) ) ) 295e8556ba3Sopenharmony_ci , m_dispatch( &dispatch ) 296e8556ba3Sopenharmony_ci , m_allocationCallbacks( allocationCallbacks ) 297e8556ba3Sopenharmony_ci { 298e8556ba3Sopenharmony_ci } 299e8556ba3Sopenharmony_ci 300e8556ba3Sopenharmony_ci public: 301e8556ba3Sopenharmony_ci template <typename T = HandleType> 302e8556ba3Sopenharmony_ci typename std::enable_if<HasDestructor<T>::value, void>::type destroy( DestructorType parent, HandleType handle ) const VULKAN_HPP_NOEXCEPT 303e8556ba3Sopenharmony_ci { 304e8556ba3Sopenharmony_ci VULKAN_HPP_ASSERT( m_destroy && m_dispatch ); 305e8556ba3Sopenharmony_ci ( parent.*m_destroy )( handle, m_allocationCallbacks, *m_dispatch ); 306e8556ba3Sopenharmony_ci } 307e8556ba3Sopenharmony_ci 308e8556ba3Sopenharmony_ci template <typename T = HandleType> 309e8556ba3Sopenharmony_ci typename std::enable_if<!HasDestructor<T>::value, void>::type destroy( HandleType handle ) const VULKAN_HPP_NOEXCEPT 310e8556ba3Sopenharmony_ci { 311e8556ba3Sopenharmony_ci VULKAN_HPP_ASSERT( m_destroy && m_dispatch ); 312e8556ba3Sopenharmony_ci ( handle.*m_destroy )( m_allocationCallbacks, *m_dispatch ); 313e8556ba3Sopenharmony_ci } 314e8556ba3Sopenharmony_ci 315e8556ba3Sopenharmony_ci private: 316e8556ba3Sopenharmony_ci DestroyFunctionPointerType<DispatchLoaderBase> m_destroy = nullptr; 317e8556ba3Sopenharmony_ci const DispatchLoaderBase * m_dispatch = nullptr; 318e8556ba3Sopenharmony_ci Optional<const AllocationCallbacks> m_allocationCallbacks = nullptr; 319e8556ba3Sopenharmony_ci }; 320e8556ba3Sopenharmony_ci 321e8556ba3Sopenharmony_ci template <typename HandleType> 322e8556ba3Sopenharmony_ci class ObjectFreeShared 323e8556ba3Sopenharmony_ci { 324e8556ba3Sopenharmony_ci public: 325e8556ba3Sopenharmony_ci using DestructorType = typename SharedHandleTraits<HandleType>::DestructorType; 326e8556ba3Sopenharmony_ci 327e8556ba3Sopenharmony_ci template <class Dispatcher> 328e8556ba3Sopenharmony_ci using DestroyFunctionPointerType = void ( DestructorType::* )( HandleType, const AllocationCallbacks *, const Dispatcher & ) const; 329e8556ba3Sopenharmony_ci 330e8556ba3Sopenharmony_ci template <class Dispatcher = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE> 331e8556ba3Sopenharmony_ci ObjectFreeShared( Optional<const AllocationCallbacks> allocationCallbacks VULKAN_HPP_DEFAULT_ARGUMENT_NULLPTR_ASSIGNMENT, 332e8556ba3Sopenharmony_ci const Dispatcher & dispatch VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) 333e8556ba3Sopenharmony_ci : m_destroy( reinterpret_cast<decltype( m_destroy )>( static_cast<DestroyFunctionPointerType<Dispatcher>>( &DestructorType::free ) ) ) 334e8556ba3Sopenharmony_ci , m_dispatch( &dispatch ) 335e8556ba3Sopenharmony_ci , m_allocationCallbacks( allocationCallbacks ) 336e8556ba3Sopenharmony_ci { 337e8556ba3Sopenharmony_ci } 338e8556ba3Sopenharmony_ci 339e8556ba3Sopenharmony_ci public: 340e8556ba3Sopenharmony_ci void destroy( DestructorType parent, HandleType handle ) const VULKAN_HPP_NOEXCEPT 341e8556ba3Sopenharmony_ci { 342e8556ba3Sopenharmony_ci VULKAN_HPP_ASSERT( m_destroy && m_dispatch ); 343e8556ba3Sopenharmony_ci ( parent.*m_destroy )( handle, m_allocationCallbacks, *m_dispatch ); 344e8556ba3Sopenharmony_ci } 345e8556ba3Sopenharmony_ci 346e8556ba3Sopenharmony_ci private: 347e8556ba3Sopenharmony_ci DestroyFunctionPointerType<DispatchLoaderBase> m_destroy = nullptr; 348e8556ba3Sopenharmony_ci const DispatchLoaderBase * m_dispatch = nullptr; 349e8556ba3Sopenharmony_ci Optional<const AllocationCallbacks> m_allocationCallbacks = nullptr; 350e8556ba3Sopenharmony_ci }; 351e8556ba3Sopenharmony_ci 352e8556ba3Sopenharmony_ci template <typename HandleType> 353e8556ba3Sopenharmony_ci class ObjectReleaseShared 354e8556ba3Sopenharmony_ci { 355e8556ba3Sopenharmony_ci public: 356e8556ba3Sopenharmony_ci using DestructorType = typename SharedHandleTraits<HandleType>::DestructorType; 357e8556ba3Sopenharmony_ci 358e8556ba3Sopenharmony_ci template <class Dispatcher> 359e8556ba3Sopenharmony_ci using DestroyFunctionPointerType = void ( DestructorType::* )( HandleType, const Dispatcher & ) const; 360e8556ba3Sopenharmony_ci 361e8556ba3Sopenharmony_ci template <class Dispatcher = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE> 362e8556ba3Sopenharmony_ci ObjectReleaseShared( const Dispatcher & dispatch VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) 363e8556ba3Sopenharmony_ci : m_destroy( reinterpret_cast<decltype( m_destroy )>( static_cast<DestroyFunctionPointerType<Dispatcher>>( &DestructorType::release ) ) ) 364e8556ba3Sopenharmony_ci , m_dispatch( &dispatch ) 365e8556ba3Sopenharmony_ci { 366e8556ba3Sopenharmony_ci } 367e8556ba3Sopenharmony_ci 368e8556ba3Sopenharmony_ci public: 369e8556ba3Sopenharmony_ci void destroy( DestructorType parent, HandleType handle ) const VULKAN_HPP_NOEXCEPT 370e8556ba3Sopenharmony_ci { 371e8556ba3Sopenharmony_ci VULKAN_HPP_ASSERT( m_destroy && m_dispatch ); 372e8556ba3Sopenharmony_ci ( parent.*m_destroy )( handle, *m_dispatch ); 373e8556ba3Sopenharmony_ci } 374e8556ba3Sopenharmony_ci 375e8556ba3Sopenharmony_ci private: 376e8556ba3Sopenharmony_ci DestroyFunctionPointerType<DispatchLoaderBase> m_destroy = nullptr; 377e8556ba3Sopenharmony_ci const DispatchLoaderBase * m_dispatch = nullptr; 378e8556ba3Sopenharmony_ci }; 379e8556ba3Sopenharmony_ci 380e8556ba3Sopenharmony_ci template <typename HandleType, typename PoolType> 381e8556ba3Sopenharmony_ci class PoolFreeShared 382e8556ba3Sopenharmony_ci { 383e8556ba3Sopenharmony_ci public: 384e8556ba3Sopenharmony_ci using DestructorType = typename SharedHandleTraits<HandleType>::DestructorType; 385e8556ba3Sopenharmony_ci 386e8556ba3Sopenharmony_ci template <class Dispatcher> 387e8556ba3Sopenharmony_ci using ReturnType = decltype( std::declval<DestructorType>().free( PoolType(), 0u, nullptr, Dispatcher() ) ); 388e8556ba3Sopenharmony_ci 389e8556ba3Sopenharmony_ci template <class Dispatcher> 390e8556ba3Sopenharmony_ci using DestroyFunctionPointerType = ReturnType<Dispatcher> ( DestructorType::* )( PoolType, uint32_t, const HandleType *, const Dispatcher & ) const; 391e8556ba3Sopenharmony_ci 392e8556ba3Sopenharmony_ci PoolFreeShared() = default; 393e8556ba3Sopenharmony_ci 394e8556ba3Sopenharmony_ci template <class Dispatcher = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE> 395e8556ba3Sopenharmony_ci PoolFreeShared( SharedHandle<PoolType> pool, const Dispatcher & dispatch VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT ) 396e8556ba3Sopenharmony_ci : m_destroy( reinterpret_cast<decltype( m_destroy )>( static_cast<DestroyFunctionPointerType<Dispatcher>>( &DestructorType::free ) ) ) 397e8556ba3Sopenharmony_ci , m_dispatch( &dispatch ) 398e8556ba3Sopenharmony_ci , m_pool( std::move( pool ) ) 399e8556ba3Sopenharmony_ci { 400e8556ba3Sopenharmony_ci } 401e8556ba3Sopenharmony_ci 402e8556ba3Sopenharmony_ci public: 403e8556ba3Sopenharmony_ci void destroy( DestructorType parent, HandleType handle ) const VULKAN_HPP_NOEXCEPT 404e8556ba3Sopenharmony_ci { 405e8556ba3Sopenharmony_ci VULKAN_HPP_ASSERT( m_destroy && m_dispatch ); 406e8556ba3Sopenharmony_ci ( parent.*m_destroy )( m_pool.get(), 1u, &handle, *m_dispatch ); 407e8556ba3Sopenharmony_ci } 408e8556ba3Sopenharmony_ci 409e8556ba3Sopenharmony_ci private: 410e8556ba3Sopenharmony_ci DestroyFunctionPointerType<DispatchLoaderBase> m_destroy = nullptr; 411e8556ba3Sopenharmony_ci const DispatchLoaderBase * m_dispatch = nullptr; 412e8556ba3Sopenharmony_ci SharedHandle<PoolType> m_pool{}; 413e8556ba3Sopenharmony_ci }; 414e8556ba3Sopenharmony_ci 415e8556ba3Sopenharmony_ci# if defined( __GNUC__ ) && !defined( __clang__ ) && !defined( __INTEL_COMPILER ) 416e8556ba3Sopenharmony_ci# pragma GCC diagnostic pop 417e8556ba3Sopenharmony_ci# endif 418e8556ba3Sopenharmony_ci 419e8556ba3Sopenharmony_ci //====================== 420e8556ba3Sopenharmony_ci //=== SHARED HANDLEs === 421e8556ba3Sopenharmony_ci //====================== 422e8556ba3Sopenharmony_ci 423e8556ba3Sopenharmony_ci //=== VK_VERSION_1_0 === 424e8556ba3Sopenharmony_ci template <> 425e8556ba3Sopenharmony_ci class SharedHandleTraits<Instance> 426e8556ba3Sopenharmony_ci { 427e8556ba3Sopenharmony_ci public: 428e8556ba3Sopenharmony_ci using DestructorType = NoDestructor; 429e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<Instance>; 430e8556ba3Sopenharmony_ci }; 431e8556ba3Sopenharmony_ci 432e8556ba3Sopenharmony_ci using SharedInstance = SharedHandle<Instance>; 433e8556ba3Sopenharmony_ci 434e8556ba3Sopenharmony_ci template <> 435e8556ba3Sopenharmony_ci class SharedHandleTraits<Device> 436e8556ba3Sopenharmony_ci { 437e8556ba3Sopenharmony_ci public: 438e8556ba3Sopenharmony_ci using DestructorType = NoDestructor; 439e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<Device>; 440e8556ba3Sopenharmony_ci }; 441e8556ba3Sopenharmony_ci 442e8556ba3Sopenharmony_ci using SharedDevice = SharedHandle<Device>; 443e8556ba3Sopenharmony_ci 444e8556ba3Sopenharmony_ci template <> 445e8556ba3Sopenharmony_ci class SharedHandleTraits<DeviceMemory> 446e8556ba3Sopenharmony_ci { 447e8556ba3Sopenharmony_ci public: 448e8556ba3Sopenharmony_ci using DestructorType = Device; 449e8556ba3Sopenharmony_ci using deleter = ObjectFreeShared<DeviceMemory>; 450e8556ba3Sopenharmony_ci }; 451e8556ba3Sopenharmony_ci 452e8556ba3Sopenharmony_ci using SharedDeviceMemory = SharedHandle<DeviceMemory>; 453e8556ba3Sopenharmony_ci 454e8556ba3Sopenharmony_ci template <> 455e8556ba3Sopenharmony_ci class SharedHandleTraits<Fence> 456e8556ba3Sopenharmony_ci { 457e8556ba3Sopenharmony_ci public: 458e8556ba3Sopenharmony_ci using DestructorType = Device; 459e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<Fence>; 460e8556ba3Sopenharmony_ci }; 461e8556ba3Sopenharmony_ci 462e8556ba3Sopenharmony_ci using SharedFence = SharedHandle<Fence>; 463e8556ba3Sopenharmony_ci 464e8556ba3Sopenharmony_ci template <> 465e8556ba3Sopenharmony_ci class SharedHandleTraits<Semaphore> 466e8556ba3Sopenharmony_ci { 467e8556ba3Sopenharmony_ci public: 468e8556ba3Sopenharmony_ci using DestructorType = Device; 469e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<Semaphore>; 470e8556ba3Sopenharmony_ci }; 471e8556ba3Sopenharmony_ci 472e8556ba3Sopenharmony_ci using SharedSemaphore = SharedHandle<Semaphore>; 473e8556ba3Sopenharmony_ci 474e8556ba3Sopenharmony_ci template <> 475e8556ba3Sopenharmony_ci class SharedHandleTraits<Event> 476e8556ba3Sopenharmony_ci { 477e8556ba3Sopenharmony_ci public: 478e8556ba3Sopenharmony_ci using DestructorType = Device; 479e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<Event>; 480e8556ba3Sopenharmony_ci }; 481e8556ba3Sopenharmony_ci 482e8556ba3Sopenharmony_ci using SharedEvent = SharedHandle<Event>; 483e8556ba3Sopenharmony_ci 484e8556ba3Sopenharmony_ci template <> 485e8556ba3Sopenharmony_ci class SharedHandleTraits<QueryPool> 486e8556ba3Sopenharmony_ci { 487e8556ba3Sopenharmony_ci public: 488e8556ba3Sopenharmony_ci using DestructorType = Device; 489e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<QueryPool>; 490e8556ba3Sopenharmony_ci }; 491e8556ba3Sopenharmony_ci 492e8556ba3Sopenharmony_ci using SharedQueryPool = SharedHandle<QueryPool>; 493e8556ba3Sopenharmony_ci 494e8556ba3Sopenharmony_ci template <> 495e8556ba3Sopenharmony_ci class SharedHandleTraits<Buffer> 496e8556ba3Sopenharmony_ci { 497e8556ba3Sopenharmony_ci public: 498e8556ba3Sopenharmony_ci using DestructorType = Device; 499e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<Buffer>; 500e8556ba3Sopenharmony_ci }; 501e8556ba3Sopenharmony_ci 502e8556ba3Sopenharmony_ci using SharedBuffer = SharedHandle<Buffer>; 503e8556ba3Sopenharmony_ci 504e8556ba3Sopenharmony_ci template <> 505e8556ba3Sopenharmony_ci class SharedHandleTraits<BufferView> 506e8556ba3Sopenharmony_ci { 507e8556ba3Sopenharmony_ci public: 508e8556ba3Sopenharmony_ci using DestructorType = Device; 509e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<BufferView>; 510e8556ba3Sopenharmony_ci }; 511e8556ba3Sopenharmony_ci 512e8556ba3Sopenharmony_ci using SharedBufferView = SharedHandle<BufferView>; 513e8556ba3Sopenharmony_ci 514e8556ba3Sopenharmony_ci template <> 515e8556ba3Sopenharmony_ci class SharedHandleTraits<Image> 516e8556ba3Sopenharmony_ci { 517e8556ba3Sopenharmony_ci public: 518e8556ba3Sopenharmony_ci using DestructorType = Device; 519e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<Image>; 520e8556ba3Sopenharmony_ci }; 521e8556ba3Sopenharmony_ci 522e8556ba3Sopenharmony_ci using SharedImage = SharedHandle<Image>; 523e8556ba3Sopenharmony_ci 524e8556ba3Sopenharmony_ci template <> 525e8556ba3Sopenharmony_ci class SharedHandleTraits<ImageView> 526e8556ba3Sopenharmony_ci { 527e8556ba3Sopenharmony_ci public: 528e8556ba3Sopenharmony_ci using DestructorType = Device; 529e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<ImageView>; 530e8556ba3Sopenharmony_ci }; 531e8556ba3Sopenharmony_ci 532e8556ba3Sopenharmony_ci using SharedImageView = SharedHandle<ImageView>; 533e8556ba3Sopenharmony_ci 534e8556ba3Sopenharmony_ci template <> 535e8556ba3Sopenharmony_ci class SharedHandleTraits<ShaderModule> 536e8556ba3Sopenharmony_ci { 537e8556ba3Sopenharmony_ci public: 538e8556ba3Sopenharmony_ci using DestructorType = Device; 539e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<ShaderModule>; 540e8556ba3Sopenharmony_ci }; 541e8556ba3Sopenharmony_ci 542e8556ba3Sopenharmony_ci using SharedShaderModule = SharedHandle<ShaderModule>; 543e8556ba3Sopenharmony_ci 544e8556ba3Sopenharmony_ci template <> 545e8556ba3Sopenharmony_ci class SharedHandleTraits<PipelineCache> 546e8556ba3Sopenharmony_ci { 547e8556ba3Sopenharmony_ci public: 548e8556ba3Sopenharmony_ci using DestructorType = Device; 549e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<PipelineCache>; 550e8556ba3Sopenharmony_ci }; 551e8556ba3Sopenharmony_ci 552e8556ba3Sopenharmony_ci using SharedPipelineCache = SharedHandle<PipelineCache>; 553e8556ba3Sopenharmony_ci 554e8556ba3Sopenharmony_ci template <> 555e8556ba3Sopenharmony_ci class SharedHandleTraits<Pipeline> 556e8556ba3Sopenharmony_ci { 557e8556ba3Sopenharmony_ci public: 558e8556ba3Sopenharmony_ci using DestructorType = Device; 559e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<Pipeline>; 560e8556ba3Sopenharmony_ci }; 561e8556ba3Sopenharmony_ci 562e8556ba3Sopenharmony_ci using SharedPipeline = SharedHandle<Pipeline>; 563e8556ba3Sopenharmony_ci 564e8556ba3Sopenharmony_ci template <> 565e8556ba3Sopenharmony_ci class SharedHandleTraits<PipelineLayout> 566e8556ba3Sopenharmony_ci { 567e8556ba3Sopenharmony_ci public: 568e8556ba3Sopenharmony_ci using DestructorType = Device; 569e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<PipelineLayout>; 570e8556ba3Sopenharmony_ci }; 571e8556ba3Sopenharmony_ci 572e8556ba3Sopenharmony_ci using SharedPipelineLayout = SharedHandle<PipelineLayout>; 573e8556ba3Sopenharmony_ci 574e8556ba3Sopenharmony_ci template <> 575e8556ba3Sopenharmony_ci class SharedHandleTraits<Sampler> 576e8556ba3Sopenharmony_ci { 577e8556ba3Sopenharmony_ci public: 578e8556ba3Sopenharmony_ci using DestructorType = Device; 579e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<Sampler>; 580e8556ba3Sopenharmony_ci }; 581e8556ba3Sopenharmony_ci 582e8556ba3Sopenharmony_ci using SharedSampler = SharedHandle<Sampler>; 583e8556ba3Sopenharmony_ci 584e8556ba3Sopenharmony_ci template <> 585e8556ba3Sopenharmony_ci class SharedHandleTraits<DescriptorPool> 586e8556ba3Sopenharmony_ci { 587e8556ba3Sopenharmony_ci public: 588e8556ba3Sopenharmony_ci using DestructorType = Device; 589e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<DescriptorPool>; 590e8556ba3Sopenharmony_ci }; 591e8556ba3Sopenharmony_ci 592e8556ba3Sopenharmony_ci using SharedDescriptorPool = SharedHandle<DescriptorPool>; 593e8556ba3Sopenharmony_ci 594e8556ba3Sopenharmony_ci template <> 595e8556ba3Sopenharmony_ci class SharedHandleTraits<DescriptorSet> 596e8556ba3Sopenharmony_ci { 597e8556ba3Sopenharmony_ci public: 598e8556ba3Sopenharmony_ci using DestructorType = Device; 599e8556ba3Sopenharmony_ci using deleter = PoolFreeShared<DescriptorSet, DescriptorPool>; 600e8556ba3Sopenharmony_ci }; 601e8556ba3Sopenharmony_ci 602e8556ba3Sopenharmony_ci using SharedDescriptorSet = SharedHandle<DescriptorSet>; 603e8556ba3Sopenharmony_ci 604e8556ba3Sopenharmony_ci template <> 605e8556ba3Sopenharmony_ci class SharedHandleTraits<DescriptorSetLayout> 606e8556ba3Sopenharmony_ci { 607e8556ba3Sopenharmony_ci public: 608e8556ba3Sopenharmony_ci using DestructorType = Device; 609e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<DescriptorSetLayout>; 610e8556ba3Sopenharmony_ci }; 611e8556ba3Sopenharmony_ci 612e8556ba3Sopenharmony_ci using SharedDescriptorSetLayout = SharedHandle<DescriptorSetLayout>; 613e8556ba3Sopenharmony_ci 614e8556ba3Sopenharmony_ci template <> 615e8556ba3Sopenharmony_ci class SharedHandleTraits<Framebuffer> 616e8556ba3Sopenharmony_ci { 617e8556ba3Sopenharmony_ci public: 618e8556ba3Sopenharmony_ci using DestructorType = Device; 619e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<Framebuffer>; 620e8556ba3Sopenharmony_ci }; 621e8556ba3Sopenharmony_ci 622e8556ba3Sopenharmony_ci using SharedFramebuffer = SharedHandle<Framebuffer>; 623e8556ba3Sopenharmony_ci 624e8556ba3Sopenharmony_ci template <> 625e8556ba3Sopenharmony_ci class SharedHandleTraits<RenderPass> 626e8556ba3Sopenharmony_ci { 627e8556ba3Sopenharmony_ci public: 628e8556ba3Sopenharmony_ci using DestructorType = Device; 629e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<RenderPass>; 630e8556ba3Sopenharmony_ci }; 631e8556ba3Sopenharmony_ci 632e8556ba3Sopenharmony_ci using SharedRenderPass = SharedHandle<RenderPass>; 633e8556ba3Sopenharmony_ci 634e8556ba3Sopenharmony_ci template <> 635e8556ba3Sopenharmony_ci class SharedHandleTraits<CommandPool> 636e8556ba3Sopenharmony_ci { 637e8556ba3Sopenharmony_ci public: 638e8556ba3Sopenharmony_ci using DestructorType = Device; 639e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<CommandPool>; 640e8556ba3Sopenharmony_ci }; 641e8556ba3Sopenharmony_ci 642e8556ba3Sopenharmony_ci using SharedCommandPool = SharedHandle<CommandPool>; 643e8556ba3Sopenharmony_ci 644e8556ba3Sopenharmony_ci template <> 645e8556ba3Sopenharmony_ci class SharedHandleTraits<CommandBuffer> 646e8556ba3Sopenharmony_ci { 647e8556ba3Sopenharmony_ci public: 648e8556ba3Sopenharmony_ci using DestructorType = Device; 649e8556ba3Sopenharmony_ci using deleter = PoolFreeShared<CommandBuffer, CommandPool>; 650e8556ba3Sopenharmony_ci }; 651e8556ba3Sopenharmony_ci 652e8556ba3Sopenharmony_ci using SharedCommandBuffer = SharedHandle<CommandBuffer>; 653e8556ba3Sopenharmony_ci 654e8556ba3Sopenharmony_ci //=== VK_VERSION_1_1 === 655e8556ba3Sopenharmony_ci template <> 656e8556ba3Sopenharmony_ci class SharedHandleTraits<SamplerYcbcrConversion> 657e8556ba3Sopenharmony_ci { 658e8556ba3Sopenharmony_ci public: 659e8556ba3Sopenharmony_ci using DestructorType = Device; 660e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<SamplerYcbcrConversion>; 661e8556ba3Sopenharmony_ci }; 662e8556ba3Sopenharmony_ci 663e8556ba3Sopenharmony_ci using SharedSamplerYcbcrConversion = SharedHandle<SamplerYcbcrConversion>; 664e8556ba3Sopenharmony_ci using SharedSamplerYcbcrConversionKHR = SharedHandle<SamplerYcbcrConversion>; 665e8556ba3Sopenharmony_ci 666e8556ba3Sopenharmony_ci template <> 667e8556ba3Sopenharmony_ci class SharedHandleTraits<DescriptorUpdateTemplate> 668e8556ba3Sopenharmony_ci { 669e8556ba3Sopenharmony_ci public: 670e8556ba3Sopenharmony_ci using DestructorType = Device; 671e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<DescriptorUpdateTemplate>; 672e8556ba3Sopenharmony_ci }; 673e8556ba3Sopenharmony_ci 674e8556ba3Sopenharmony_ci using SharedDescriptorUpdateTemplate = SharedHandle<DescriptorUpdateTemplate>; 675e8556ba3Sopenharmony_ci using SharedDescriptorUpdateTemplateKHR = SharedHandle<DescriptorUpdateTemplate>; 676e8556ba3Sopenharmony_ci 677e8556ba3Sopenharmony_ci //=== VK_VERSION_1_3 === 678e8556ba3Sopenharmony_ci template <> 679e8556ba3Sopenharmony_ci class SharedHandleTraits<PrivateDataSlot> 680e8556ba3Sopenharmony_ci { 681e8556ba3Sopenharmony_ci public: 682e8556ba3Sopenharmony_ci using DestructorType = Device; 683e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<PrivateDataSlot>; 684e8556ba3Sopenharmony_ci }; 685e8556ba3Sopenharmony_ci 686e8556ba3Sopenharmony_ci using SharedPrivateDataSlot = SharedHandle<PrivateDataSlot>; 687e8556ba3Sopenharmony_ci using SharedPrivateDataSlotEXT = SharedHandle<PrivateDataSlot>; 688e8556ba3Sopenharmony_ci 689e8556ba3Sopenharmony_ci //=== VK_KHR_surface === 690e8556ba3Sopenharmony_ci template <> 691e8556ba3Sopenharmony_ci class SharedHandleTraits<SurfaceKHR> 692e8556ba3Sopenharmony_ci { 693e8556ba3Sopenharmony_ci public: 694e8556ba3Sopenharmony_ci using DestructorType = Instance; 695e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<SurfaceKHR>; 696e8556ba3Sopenharmony_ci }; 697e8556ba3Sopenharmony_ci 698e8556ba3Sopenharmony_ci using SharedSurfaceKHR = SharedHandle<SurfaceKHR>; 699e8556ba3Sopenharmony_ci 700e8556ba3Sopenharmony_ci //=== VK_KHR_swapchain === 701e8556ba3Sopenharmony_ci template <> 702e8556ba3Sopenharmony_ci class SharedHandleTraits<SwapchainKHR> 703e8556ba3Sopenharmony_ci { 704e8556ba3Sopenharmony_ci public: 705e8556ba3Sopenharmony_ci using DestructorType = Device; 706e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<SwapchainKHR>; 707e8556ba3Sopenharmony_ci }; 708e8556ba3Sopenharmony_ci 709e8556ba3Sopenharmony_ci using SharedSwapchainKHR = SharedHandle<SwapchainKHR>; 710e8556ba3Sopenharmony_ci 711e8556ba3Sopenharmony_ci //=== VK_KHR_display === 712e8556ba3Sopenharmony_ci template <> 713e8556ba3Sopenharmony_ci class SharedHandleTraits<DisplayKHR> 714e8556ba3Sopenharmony_ci { 715e8556ba3Sopenharmony_ci public: 716e8556ba3Sopenharmony_ci using DestructorType = PhysicalDevice; 717e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<DisplayKHR>; 718e8556ba3Sopenharmony_ci }; 719e8556ba3Sopenharmony_ci 720e8556ba3Sopenharmony_ci using SharedDisplayKHR = SharedHandle<DisplayKHR>; 721e8556ba3Sopenharmony_ci 722e8556ba3Sopenharmony_ci //=== VK_EXT_debug_report === 723e8556ba3Sopenharmony_ci template <> 724e8556ba3Sopenharmony_ci class SharedHandleTraits<DebugReportCallbackEXT> 725e8556ba3Sopenharmony_ci { 726e8556ba3Sopenharmony_ci public: 727e8556ba3Sopenharmony_ci using DestructorType = Instance; 728e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<DebugReportCallbackEXT>; 729e8556ba3Sopenharmony_ci }; 730e8556ba3Sopenharmony_ci 731e8556ba3Sopenharmony_ci using SharedDebugReportCallbackEXT = SharedHandle<DebugReportCallbackEXT>; 732e8556ba3Sopenharmony_ci 733e8556ba3Sopenharmony_ci //=== VK_KHR_video_queue === 734e8556ba3Sopenharmony_ci template <> 735e8556ba3Sopenharmony_ci class SharedHandleTraits<VideoSessionKHR> 736e8556ba3Sopenharmony_ci { 737e8556ba3Sopenharmony_ci public: 738e8556ba3Sopenharmony_ci using DestructorType = Device; 739e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<VideoSessionKHR>; 740e8556ba3Sopenharmony_ci }; 741e8556ba3Sopenharmony_ci 742e8556ba3Sopenharmony_ci using SharedVideoSessionKHR = SharedHandle<VideoSessionKHR>; 743e8556ba3Sopenharmony_ci 744e8556ba3Sopenharmony_ci template <> 745e8556ba3Sopenharmony_ci class SharedHandleTraits<VideoSessionParametersKHR> 746e8556ba3Sopenharmony_ci { 747e8556ba3Sopenharmony_ci public: 748e8556ba3Sopenharmony_ci using DestructorType = Device; 749e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<VideoSessionParametersKHR>; 750e8556ba3Sopenharmony_ci }; 751e8556ba3Sopenharmony_ci 752e8556ba3Sopenharmony_ci using SharedVideoSessionParametersKHR = SharedHandle<VideoSessionParametersKHR>; 753e8556ba3Sopenharmony_ci 754e8556ba3Sopenharmony_ci //=== VK_NVX_binary_import === 755e8556ba3Sopenharmony_ci template <> 756e8556ba3Sopenharmony_ci class SharedHandleTraits<CuModuleNVX> 757e8556ba3Sopenharmony_ci { 758e8556ba3Sopenharmony_ci public: 759e8556ba3Sopenharmony_ci using DestructorType = Device; 760e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<CuModuleNVX>; 761e8556ba3Sopenharmony_ci }; 762e8556ba3Sopenharmony_ci 763e8556ba3Sopenharmony_ci using SharedCuModuleNVX = SharedHandle<CuModuleNVX>; 764e8556ba3Sopenharmony_ci 765e8556ba3Sopenharmony_ci template <> 766e8556ba3Sopenharmony_ci class SharedHandleTraits<CuFunctionNVX> 767e8556ba3Sopenharmony_ci { 768e8556ba3Sopenharmony_ci public: 769e8556ba3Sopenharmony_ci using DestructorType = Device; 770e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<CuFunctionNVX>; 771e8556ba3Sopenharmony_ci }; 772e8556ba3Sopenharmony_ci 773e8556ba3Sopenharmony_ci using SharedCuFunctionNVX = SharedHandle<CuFunctionNVX>; 774e8556ba3Sopenharmony_ci 775e8556ba3Sopenharmony_ci //=== VK_EXT_debug_utils === 776e8556ba3Sopenharmony_ci template <> 777e8556ba3Sopenharmony_ci class SharedHandleTraits<DebugUtilsMessengerEXT> 778e8556ba3Sopenharmony_ci { 779e8556ba3Sopenharmony_ci public: 780e8556ba3Sopenharmony_ci using DestructorType = Instance; 781e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<DebugUtilsMessengerEXT>; 782e8556ba3Sopenharmony_ci }; 783e8556ba3Sopenharmony_ci 784e8556ba3Sopenharmony_ci using SharedDebugUtilsMessengerEXT = SharedHandle<DebugUtilsMessengerEXT>; 785e8556ba3Sopenharmony_ci 786e8556ba3Sopenharmony_ci //=== VK_KHR_acceleration_structure === 787e8556ba3Sopenharmony_ci template <> 788e8556ba3Sopenharmony_ci class SharedHandleTraits<AccelerationStructureKHR> 789e8556ba3Sopenharmony_ci { 790e8556ba3Sopenharmony_ci public: 791e8556ba3Sopenharmony_ci using DestructorType = Device; 792e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<AccelerationStructureKHR>; 793e8556ba3Sopenharmony_ci }; 794e8556ba3Sopenharmony_ci 795e8556ba3Sopenharmony_ci using SharedAccelerationStructureKHR = SharedHandle<AccelerationStructureKHR>; 796e8556ba3Sopenharmony_ci 797e8556ba3Sopenharmony_ci //=== VK_EXT_validation_cache === 798e8556ba3Sopenharmony_ci template <> 799e8556ba3Sopenharmony_ci class SharedHandleTraits<ValidationCacheEXT> 800e8556ba3Sopenharmony_ci { 801e8556ba3Sopenharmony_ci public: 802e8556ba3Sopenharmony_ci using DestructorType = Device; 803e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<ValidationCacheEXT>; 804e8556ba3Sopenharmony_ci }; 805e8556ba3Sopenharmony_ci 806e8556ba3Sopenharmony_ci using SharedValidationCacheEXT = SharedHandle<ValidationCacheEXT>; 807e8556ba3Sopenharmony_ci 808e8556ba3Sopenharmony_ci //=== VK_NV_ray_tracing === 809e8556ba3Sopenharmony_ci template <> 810e8556ba3Sopenharmony_ci class SharedHandleTraits<AccelerationStructureNV> 811e8556ba3Sopenharmony_ci { 812e8556ba3Sopenharmony_ci public: 813e8556ba3Sopenharmony_ci using DestructorType = Device; 814e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<AccelerationStructureNV>; 815e8556ba3Sopenharmony_ci }; 816e8556ba3Sopenharmony_ci 817e8556ba3Sopenharmony_ci using SharedAccelerationStructureNV = SharedHandle<AccelerationStructureNV>; 818e8556ba3Sopenharmony_ci 819e8556ba3Sopenharmony_ci //=== VK_INTEL_performance_query === 820e8556ba3Sopenharmony_ci template <> 821e8556ba3Sopenharmony_ci class SharedHandleTraits<PerformanceConfigurationINTEL> 822e8556ba3Sopenharmony_ci { 823e8556ba3Sopenharmony_ci public: 824e8556ba3Sopenharmony_ci using DestructorType = Device; 825e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<PerformanceConfigurationINTEL>; 826e8556ba3Sopenharmony_ci }; 827e8556ba3Sopenharmony_ci 828e8556ba3Sopenharmony_ci using SharedPerformanceConfigurationINTEL = SharedHandle<PerformanceConfigurationINTEL>; 829e8556ba3Sopenharmony_ci 830e8556ba3Sopenharmony_ci //=== VK_KHR_deferred_host_operations === 831e8556ba3Sopenharmony_ci template <> 832e8556ba3Sopenharmony_ci class SharedHandleTraits<DeferredOperationKHR> 833e8556ba3Sopenharmony_ci { 834e8556ba3Sopenharmony_ci public: 835e8556ba3Sopenharmony_ci using DestructorType = Device; 836e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<DeferredOperationKHR>; 837e8556ba3Sopenharmony_ci }; 838e8556ba3Sopenharmony_ci 839e8556ba3Sopenharmony_ci using SharedDeferredOperationKHR = SharedHandle<DeferredOperationKHR>; 840e8556ba3Sopenharmony_ci 841e8556ba3Sopenharmony_ci //=== VK_NV_device_generated_commands === 842e8556ba3Sopenharmony_ci template <> 843e8556ba3Sopenharmony_ci class SharedHandleTraits<IndirectCommandsLayoutNV> 844e8556ba3Sopenharmony_ci { 845e8556ba3Sopenharmony_ci public: 846e8556ba3Sopenharmony_ci using DestructorType = Device; 847e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<IndirectCommandsLayoutNV>; 848e8556ba3Sopenharmony_ci }; 849e8556ba3Sopenharmony_ci 850e8556ba3Sopenharmony_ci using SharedIndirectCommandsLayoutNV = SharedHandle<IndirectCommandsLayoutNV>; 851e8556ba3Sopenharmony_ci 852e8556ba3Sopenharmony_ci# if defined( VK_ENABLE_BETA_EXTENSIONS ) 853e8556ba3Sopenharmony_ci //=== VK_NV_cuda_kernel_launch === 854e8556ba3Sopenharmony_ci template <> 855e8556ba3Sopenharmony_ci class SharedHandleTraits<CudaModuleNV> 856e8556ba3Sopenharmony_ci { 857e8556ba3Sopenharmony_ci public: 858e8556ba3Sopenharmony_ci using DestructorType = Device; 859e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<CudaModuleNV>; 860e8556ba3Sopenharmony_ci }; 861e8556ba3Sopenharmony_ci 862e8556ba3Sopenharmony_ci using SharedCudaModuleNV = SharedHandle<CudaModuleNV>; 863e8556ba3Sopenharmony_ci 864e8556ba3Sopenharmony_ci template <> 865e8556ba3Sopenharmony_ci class SharedHandleTraits<CudaFunctionNV> 866e8556ba3Sopenharmony_ci { 867e8556ba3Sopenharmony_ci public: 868e8556ba3Sopenharmony_ci using DestructorType = Device; 869e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<CudaFunctionNV>; 870e8556ba3Sopenharmony_ci }; 871e8556ba3Sopenharmony_ci 872e8556ba3Sopenharmony_ci using SharedCudaFunctionNV = SharedHandle<CudaFunctionNV>; 873e8556ba3Sopenharmony_ci# endif /*VK_ENABLE_BETA_EXTENSIONS*/ 874e8556ba3Sopenharmony_ci 875e8556ba3Sopenharmony_ci# if defined( VK_USE_PLATFORM_FUCHSIA ) 876e8556ba3Sopenharmony_ci //=== VK_FUCHSIA_buffer_collection === 877e8556ba3Sopenharmony_ci template <> 878e8556ba3Sopenharmony_ci class SharedHandleTraits<BufferCollectionFUCHSIA> 879e8556ba3Sopenharmony_ci { 880e8556ba3Sopenharmony_ci public: 881e8556ba3Sopenharmony_ci using DestructorType = Device; 882e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<BufferCollectionFUCHSIA>; 883e8556ba3Sopenharmony_ci }; 884e8556ba3Sopenharmony_ci 885e8556ba3Sopenharmony_ci using SharedBufferCollectionFUCHSIA = SharedHandle<BufferCollectionFUCHSIA>; 886e8556ba3Sopenharmony_ci# endif /*VK_USE_PLATFORM_FUCHSIA*/ 887e8556ba3Sopenharmony_ci 888e8556ba3Sopenharmony_ci //=== VK_EXT_opacity_micromap === 889e8556ba3Sopenharmony_ci template <> 890e8556ba3Sopenharmony_ci class SharedHandleTraits<MicromapEXT> 891e8556ba3Sopenharmony_ci { 892e8556ba3Sopenharmony_ci public: 893e8556ba3Sopenharmony_ci using DestructorType = Device; 894e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<MicromapEXT>; 895e8556ba3Sopenharmony_ci }; 896e8556ba3Sopenharmony_ci 897e8556ba3Sopenharmony_ci using SharedMicromapEXT = SharedHandle<MicromapEXT>; 898e8556ba3Sopenharmony_ci 899e8556ba3Sopenharmony_ci //=== VK_NV_optical_flow === 900e8556ba3Sopenharmony_ci template <> 901e8556ba3Sopenharmony_ci class SharedHandleTraits<OpticalFlowSessionNV> 902e8556ba3Sopenharmony_ci { 903e8556ba3Sopenharmony_ci public: 904e8556ba3Sopenharmony_ci using DestructorType = Device; 905e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<OpticalFlowSessionNV>; 906e8556ba3Sopenharmony_ci }; 907e8556ba3Sopenharmony_ci 908e8556ba3Sopenharmony_ci using SharedOpticalFlowSessionNV = SharedHandle<OpticalFlowSessionNV>; 909e8556ba3Sopenharmony_ci 910e8556ba3Sopenharmony_ci //=== VK_EXT_shader_object === 911e8556ba3Sopenharmony_ci template <> 912e8556ba3Sopenharmony_ci class SharedHandleTraits<ShaderEXT> 913e8556ba3Sopenharmony_ci { 914e8556ba3Sopenharmony_ci public: 915e8556ba3Sopenharmony_ci using DestructorType = Device; 916e8556ba3Sopenharmony_ci using deleter = ObjectDestroyShared<ShaderEXT>; 917e8556ba3Sopenharmony_ci }; 918e8556ba3Sopenharmony_ci 919e8556ba3Sopenharmony_ci using SharedShaderEXT = SharedHandle<ShaderEXT>; 920e8556ba3Sopenharmony_ci 921e8556ba3Sopenharmony_ci enum class SwapchainOwns 922e8556ba3Sopenharmony_ci { 923e8556ba3Sopenharmony_ci no, 924e8556ba3Sopenharmony_ci yes, 925e8556ba3Sopenharmony_ci }; 926e8556ba3Sopenharmony_ci 927e8556ba3Sopenharmony_ci struct ImageHeader : SharedHeader<DestructorTypeOf<VULKAN_HPP_NAMESPACE::Image>, typename SharedHandleTraits<VULKAN_HPP_NAMESPACE::Image>::deleter> 928e8556ba3Sopenharmony_ci { 929e8556ba3Sopenharmony_ci ImageHeader( 930e8556ba3Sopenharmony_ci SharedHandle<DestructorTypeOf<VULKAN_HPP_NAMESPACE::Image>> parent, 931e8556ba3Sopenharmony_ci typename SharedHandleTraits<VULKAN_HPP_NAMESPACE::Image>::deleter deleter = typename SharedHandleTraits<VULKAN_HPP_NAMESPACE::Image>::deleter(), 932e8556ba3Sopenharmony_ci SwapchainOwns swapchainOwned = SwapchainOwns::no ) VULKAN_HPP_NOEXCEPT 933e8556ba3Sopenharmony_ci : SharedHeader<DestructorTypeOf<VULKAN_HPP_NAMESPACE::Image>, typename SharedHandleTraits<VULKAN_HPP_NAMESPACE::Image>::deleter>( std::move( parent ), 934e8556ba3Sopenharmony_ci std::move( deleter ) ) 935e8556ba3Sopenharmony_ci , swapchainOwned( swapchainOwned ) 936e8556ba3Sopenharmony_ci { 937e8556ba3Sopenharmony_ci } 938e8556ba3Sopenharmony_ci 939e8556ba3Sopenharmony_ci SwapchainOwns swapchainOwned = SwapchainOwns::no; 940e8556ba3Sopenharmony_ci }; 941e8556ba3Sopenharmony_ci 942e8556ba3Sopenharmony_ci template <> 943e8556ba3Sopenharmony_ci class SharedHandle<VULKAN_HPP_NAMESPACE::Image> : public SharedHandleBase<VULKAN_HPP_NAMESPACE::Image, ImageHeader> 944e8556ba3Sopenharmony_ci { 945e8556ba3Sopenharmony_ci using BaseType = SharedHandleBase<VULKAN_HPP_NAMESPACE::Image, ImageHeader>; 946e8556ba3Sopenharmony_ci using DeleterType = typename SharedHandleTraits<VULKAN_HPP_NAMESPACE::Image>::deleter; 947e8556ba3Sopenharmony_ci friend BaseType; 948e8556ba3Sopenharmony_ci 949e8556ba3Sopenharmony_ci public: 950e8556ba3Sopenharmony_ci SharedHandle() = default; 951e8556ba3Sopenharmony_ci 952e8556ba3Sopenharmony_ci explicit SharedHandle( VULKAN_HPP_NAMESPACE::Image handle, 953e8556ba3Sopenharmony_ci SharedHandle<DestructorTypeOf<VULKAN_HPP_NAMESPACE::Image>> parent, 954e8556ba3Sopenharmony_ci SwapchainOwns swapchain_owned = SwapchainOwns::no, 955e8556ba3Sopenharmony_ci DeleterType deleter = DeleterType() ) VULKAN_HPP_NOEXCEPT 956e8556ba3Sopenharmony_ci : BaseType( handle, std::move( parent ), std::move( deleter ), swapchain_owned ) 957e8556ba3Sopenharmony_ci { 958e8556ba3Sopenharmony_ci } 959e8556ba3Sopenharmony_ci 960e8556ba3Sopenharmony_ci protected: 961e8556ba3Sopenharmony_ci static void internalDestroy( const ImageHeader & control, VULKAN_HPP_NAMESPACE::Image handle ) VULKAN_HPP_NOEXCEPT 962e8556ba3Sopenharmony_ci { 963e8556ba3Sopenharmony_ci if ( control.swapchainOwned == SwapchainOwns::no ) 964e8556ba3Sopenharmony_ci { 965e8556ba3Sopenharmony_ci control.deleter.destroy( control.parent.get(), handle ); 966e8556ba3Sopenharmony_ci } 967e8556ba3Sopenharmony_ci } 968e8556ba3Sopenharmony_ci }; 969e8556ba3Sopenharmony_ci 970e8556ba3Sopenharmony_ci struct SwapchainHeader 971e8556ba3Sopenharmony_ci { 972e8556ba3Sopenharmony_ci SwapchainHeader( SharedHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR> surface, 973e8556ba3Sopenharmony_ci SharedHandle<DestructorTypeOf<VULKAN_HPP_NAMESPACE::SwapchainKHR>> parent, 974e8556ba3Sopenharmony_ci typename SharedHandleTraits<VULKAN_HPP_NAMESPACE::SwapchainKHR>::deleter deleter = 975e8556ba3Sopenharmony_ci typename SharedHandleTraits<VULKAN_HPP_NAMESPACE::SwapchainKHR>::deleter() ) VULKAN_HPP_NOEXCEPT 976e8556ba3Sopenharmony_ci : surface( std::move( surface ) ) 977e8556ba3Sopenharmony_ci , parent( std::move( parent ) ) 978e8556ba3Sopenharmony_ci , deleter( std::move( deleter ) ) 979e8556ba3Sopenharmony_ci { 980e8556ba3Sopenharmony_ci } 981e8556ba3Sopenharmony_ci 982e8556ba3Sopenharmony_ci SharedHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR> surface{}; 983e8556ba3Sopenharmony_ci SharedHandle<DestructorTypeOf<VULKAN_HPP_NAMESPACE::SwapchainKHR>> parent{}; 984e8556ba3Sopenharmony_ci typename SharedHandleTraits<VULKAN_HPP_NAMESPACE::SwapchainKHR>::deleter deleter{}; 985e8556ba3Sopenharmony_ci }; 986e8556ba3Sopenharmony_ci 987e8556ba3Sopenharmony_ci template <> 988e8556ba3Sopenharmony_ci class SharedHandle<VULKAN_HPP_NAMESPACE::SwapchainKHR> : public SharedHandleBase<VULKAN_HPP_NAMESPACE::SwapchainKHR, SwapchainHeader> 989e8556ba3Sopenharmony_ci { 990e8556ba3Sopenharmony_ci using BaseType = SharedHandleBase<VULKAN_HPP_NAMESPACE::SwapchainKHR, SwapchainHeader>; 991e8556ba3Sopenharmony_ci using DeleterType = typename SharedHandleTraits<VULKAN_HPP_NAMESPACE::SwapchainKHR>::deleter; 992e8556ba3Sopenharmony_ci friend BaseType; 993e8556ba3Sopenharmony_ci 994e8556ba3Sopenharmony_ci public: 995e8556ba3Sopenharmony_ci SharedHandle() = default; 996e8556ba3Sopenharmony_ci 997e8556ba3Sopenharmony_ci explicit SharedHandle( VULKAN_HPP_NAMESPACE::SwapchainKHR handle, 998e8556ba3Sopenharmony_ci SharedHandle<DestructorTypeOf<VULKAN_HPP_NAMESPACE::SwapchainKHR>> parent, 999e8556ba3Sopenharmony_ci SharedHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR> surface, 1000e8556ba3Sopenharmony_ci DeleterType deleter = DeleterType() ) VULKAN_HPP_NOEXCEPT 1001e8556ba3Sopenharmony_ci : BaseType( handle, std::move( surface ), std::move( parent ), std::move( deleter ) ) 1002e8556ba3Sopenharmony_ci { 1003e8556ba3Sopenharmony_ci } 1004e8556ba3Sopenharmony_ci 1005e8556ba3Sopenharmony_ci public: 1006e8556ba3Sopenharmony_ci const SharedHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR> & getSurface() const VULKAN_HPP_NOEXCEPT 1007e8556ba3Sopenharmony_ci { 1008e8556ba3Sopenharmony_ci return getHeader().surface; 1009e8556ba3Sopenharmony_ci } 1010e8556ba3Sopenharmony_ci 1011e8556ba3Sopenharmony_ci protected: 1012e8556ba3Sopenharmony_ci using BaseType::internalDestroy; 1013e8556ba3Sopenharmony_ci }; 1014e8556ba3Sopenharmony_ci 1015e8556ba3Sopenharmony_ci template <typename HandleType, typename DestructorType> 1016e8556ba3Sopenharmony_ci class SharedHandleBaseNoDestroy : public SharedHandleBase<HandleType, DestructorType> 1017e8556ba3Sopenharmony_ci { 1018e8556ba3Sopenharmony_ci public: 1019e8556ba3Sopenharmony_ci using SharedHandleBase<HandleType, DestructorType>::SharedHandleBase; 1020e8556ba3Sopenharmony_ci 1021e8556ba3Sopenharmony_ci const DestructorType & getDestructorType() const VULKAN_HPP_NOEXCEPT 1022e8556ba3Sopenharmony_ci { 1023e8556ba3Sopenharmony_ci return SharedHandleBase<HandleType, DestructorType>::getHeader(); 1024e8556ba3Sopenharmony_ci } 1025e8556ba3Sopenharmony_ci 1026e8556ba3Sopenharmony_ci protected: 1027e8556ba3Sopenharmony_ci static void internalDestroy( const DestructorType &, HandleType ) VULKAN_HPP_NOEXCEPT {} 1028e8556ba3Sopenharmony_ci }; 1029e8556ba3Sopenharmony_ci 1030e8556ba3Sopenharmony_ci //=== VK_VERSION_1_0 === 1031e8556ba3Sopenharmony_ci 1032e8556ba3Sopenharmony_ci template <> 1033e8556ba3Sopenharmony_ci class SharedHandle<PhysicalDevice> : public SharedHandleBaseNoDestroy<PhysicalDevice, SharedInstance> 1034e8556ba3Sopenharmony_ci { 1035e8556ba3Sopenharmony_ci friend SharedHandleBase<PhysicalDevice, SharedInstance>; 1036e8556ba3Sopenharmony_ci 1037e8556ba3Sopenharmony_ci public: 1038e8556ba3Sopenharmony_ci SharedHandle() = default; 1039e8556ba3Sopenharmony_ci 1040e8556ba3Sopenharmony_ci explicit SharedHandle( PhysicalDevice handle, SharedInstance parent ) noexcept 1041e8556ba3Sopenharmony_ci : SharedHandleBaseNoDestroy<PhysicalDevice, SharedInstance>( handle, std::move( parent ) ) 1042e8556ba3Sopenharmony_ci { 1043e8556ba3Sopenharmony_ci } 1044e8556ba3Sopenharmony_ci }; 1045e8556ba3Sopenharmony_ci 1046e8556ba3Sopenharmony_ci using SharedPhysicalDevice = SharedHandle<PhysicalDevice>; 1047e8556ba3Sopenharmony_ci 1048e8556ba3Sopenharmony_ci template <> 1049e8556ba3Sopenharmony_ci class SharedHandle<Queue> : public SharedHandleBaseNoDestroy<Queue, SharedDevice> 1050e8556ba3Sopenharmony_ci { 1051e8556ba3Sopenharmony_ci friend SharedHandleBase<Queue, SharedDevice>; 1052e8556ba3Sopenharmony_ci 1053e8556ba3Sopenharmony_ci public: 1054e8556ba3Sopenharmony_ci SharedHandle() = default; 1055e8556ba3Sopenharmony_ci 1056e8556ba3Sopenharmony_ci explicit SharedHandle( Queue handle, SharedDevice parent ) noexcept : SharedHandleBaseNoDestroy<Queue, SharedDevice>( handle, std::move( parent ) ) {} 1057e8556ba3Sopenharmony_ci }; 1058e8556ba3Sopenharmony_ci 1059e8556ba3Sopenharmony_ci using SharedQueue = SharedHandle<Queue>; 1060e8556ba3Sopenharmony_ci 1061e8556ba3Sopenharmony_ci //=== VK_KHR_display === 1062e8556ba3Sopenharmony_ci 1063e8556ba3Sopenharmony_ci template <> 1064e8556ba3Sopenharmony_ci class SharedHandle<DisplayModeKHR> : public SharedHandleBaseNoDestroy<DisplayModeKHR, SharedDisplayKHR> 1065e8556ba3Sopenharmony_ci { 1066e8556ba3Sopenharmony_ci friend SharedHandleBase<DisplayModeKHR, SharedDisplayKHR>; 1067e8556ba3Sopenharmony_ci 1068e8556ba3Sopenharmony_ci public: 1069e8556ba3Sopenharmony_ci SharedHandle() = default; 1070e8556ba3Sopenharmony_ci 1071e8556ba3Sopenharmony_ci explicit SharedHandle( DisplayModeKHR handle, SharedDisplayKHR parent ) noexcept 1072e8556ba3Sopenharmony_ci : SharedHandleBaseNoDestroy<DisplayModeKHR, SharedDisplayKHR>( handle, std::move( parent ) ) 1073e8556ba3Sopenharmony_ci { 1074e8556ba3Sopenharmony_ci } 1075e8556ba3Sopenharmony_ci }; 1076e8556ba3Sopenharmony_ci 1077e8556ba3Sopenharmony_ci using SharedDisplayModeKHR = SharedHandle<DisplayModeKHR>; 1078e8556ba3Sopenharmony_ci#endif // !VULKAN_HPP_NO_SMART_HANDLE 1079e8556ba3Sopenharmony_ci} // namespace VULKAN_HPP_NAMESPACE 1080e8556ba3Sopenharmony_ci#endif // VULKAN_SHARED_HPP 1081