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