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