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