| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988 |
- // Copyright 2015-2023 The Khronos Group Inc.
- //
- // SPDX-License-Identifier: Apache-2.0 OR MIT
- //
- // This header is generated from the Khronos Vulkan XML API Registry.
- #ifndef VULKAN_SHARED_HPP
- #define VULKAN_SHARED_HPP
- #include <atomic> // std::atomic_size_t
- #include <vulkan/vulkan.hpp>
- namespace VULKAN_HPP_NAMESPACE
- {
- #if !defined( VULKAN_HPP_NO_SMART_HANDLE )
- template <typename HandleType>
- class SharedHandleTraits;
- class NoDestructor
- {
- };
- template <typename HandleType, typename = void>
- struct HasDestructorType : std::false_type
- {
- };
- template <typename HandleType>
- struct HasDestructorType<HandleType, decltype( (void)typename SharedHandleTraits<HandleType>::DestructorType() )> : std::true_type
- {
- };
- template <typename HandleType, typename Enable = void>
- struct GetDestructorType
- {
- using type = NoDestructor;
- };
- template <typename HandleType>
- struct GetDestructorType<HandleType, typename std::enable_if<HasDestructorType<HandleType>::value>::type>
- {
- using type = typename SharedHandleTraits<HandleType>::DestructorType;
- };
- template <class HandleType>
- using DestructorTypeOf = typename GetDestructorType<HandleType>::type;
- template <class HandleType>
- struct HasDestructor : std::integral_constant<bool, !std::is_same<DestructorTypeOf<HandleType>, NoDestructor>::value>
- {
- };
- //=====================================================================================================================
- template <typename HandleType>
- class SharedHandle;
- template <typename DestructorType, typename Deleter>
- struct SharedHeader
- {
- SharedHeader( SharedHandle<DestructorType> parent, Deleter deleter = Deleter() ) VULKAN_HPP_NOEXCEPT
- : parent( std::move( parent ) )
- , deleter( std::move( deleter ) )
- {
- }
- SharedHandle<DestructorType> parent;
- Deleter deleter;
- };
- template <typename Deleter>
- struct SharedHeader<NoDestructor, Deleter>
- {
- SharedHeader( Deleter deleter = Deleter() ) VULKAN_HPP_NOEXCEPT : deleter( std::move( deleter ) ) {}
- Deleter deleter;
- };
- //=====================================================================================================================
- template <typename HeaderType>
- class ReferenceCounter
- {
- public:
- template <typename... Args>
- ReferenceCounter( Args &&... control_args ) : m_header( std::forward<Args>( control_args )... )
- {
- }
- ReferenceCounter( const ReferenceCounter & ) = delete;
- ReferenceCounter & operator=( const ReferenceCounter & ) = delete;
- public:
- size_t addRef() VULKAN_HPP_NOEXCEPT
- {
- // Relaxed memory order is sufficient since this does not impose any ordering on other operations
- return m_ref_cnt.fetch_add( 1, std::memory_order_relaxed );
- }
- size_t release() VULKAN_HPP_NOEXCEPT
- {
- // A release memory order to ensure that all releases are ordered
- return m_ref_cnt.fetch_sub( 1, std::memory_order_release );
- }
- public:
- std::atomic_size_t m_ref_cnt{ 1 };
- HeaderType m_header{};
- };
- //=====================================================================================================================
- template <typename HandleType, typename HeaderType, typename ForwardType = SharedHandle<HandleType>>
- class SharedHandleBase
- {
- public:
- SharedHandleBase() = default;
- template <typename... Args>
- SharedHandleBase( HandleType handle, Args &&... control_args )
- : m_control( new ReferenceCounter<HeaderType>( std::forward<Args>( control_args )... ) ), m_handle( handle )
- {
- }
- SharedHandleBase( const SharedHandleBase & o ) VULKAN_HPP_NOEXCEPT
- {
- o.addRef();
- m_handle = o.m_handle;
- m_control = o.m_control;
- }
- SharedHandleBase( SharedHandleBase && o ) VULKAN_HPP_NOEXCEPT
- : m_control( o.m_control )
- , m_handle( o.m_handle )
- {
- o.m_handle = nullptr;
- o.m_control = nullptr;
- }
- SharedHandleBase & operator=( const SharedHandleBase & o ) VULKAN_HPP_NOEXCEPT
- {
- SharedHandleBase( o ).swap( *this );
- return *this;
- }
- SharedHandleBase & operator=( SharedHandleBase && o ) VULKAN_HPP_NOEXCEPT
- {
- SharedHandleBase( std::move( o ) ).swap( *this );
- return *this;
- }
- ~SharedHandleBase()
- {
- // only this function owns the last reference to the control block
- // the same principle is used in the default deleter of std::shared_ptr
- if ( m_control && ( m_control->release() == 1 ) )
- {
- // noop in x86, but does thread synchronization in ARM
- // it is required to ensure that last thread is getting to destroy the control block
- // by ordering all atomic operations before this fence
- std::atomic_thread_fence( std::memory_order_acquire );
- ForwardType::internalDestroy( getHeader(), m_handle );
- delete m_control;
- }
- }
- public:
- HandleType get() const VULKAN_HPP_NOEXCEPT
- {
- return m_handle;
- }
- HandleType operator*() const VULKAN_HPP_NOEXCEPT
- {
- return m_handle;
- }
- explicit operator bool() const VULKAN_HPP_NOEXCEPT
- {
- return bool( m_handle );
- }
- const HandleType * operator->() const VULKAN_HPP_NOEXCEPT
- {
- return &m_handle;
- }
- HandleType * operator->() VULKAN_HPP_NOEXCEPT
- {
- return &m_handle;
- }
- void reset() VULKAN_HPP_NOEXCEPT
- {
- SharedHandleBase().swap( *this );
- }
- void swap( SharedHandleBase & o ) VULKAN_HPP_NOEXCEPT
- {
- std::swap( m_handle, o.m_handle );
- std::swap( m_control, o.m_control );
- }
- template <typename T = HandleType>
- typename std::enable_if<HasDestructor<T>::value, const SharedHandle<DestructorTypeOf<HandleType>> &>::type getDestructorType() const VULKAN_HPP_NOEXCEPT
- {
- return getHeader().parent;
- }
- protected:
- template <typename T = HandleType>
- static typename std::enable_if<!HasDestructor<T>::value, void>::type internalDestroy( const HeaderType & control, HandleType handle ) VULKAN_HPP_NOEXCEPT
- {
- control.deleter.destroy( handle );
- }
- template <typename T = HandleType>
- static typename std::enable_if<HasDestructor<T>::value, void>::type internalDestroy( const HeaderType & control, HandleType handle ) VULKAN_HPP_NOEXCEPT
- {
- control.deleter.destroy( control.parent.get(), handle );
- }
- const HeaderType & getHeader() const VULKAN_HPP_NOEXCEPT
- {
- return m_control->m_header;
- }
- private:
- void addRef() const VULKAN_HPP_NOEXCEPT
- {
- if ( m_control )
- m_control->addRef();
- }
- protected:
- ReferenceCounter<HeaderType> * m_control = nullptr;
- HandleType m_handle{};
- };
- template <typename HandleType>
- class SharedHandle : public SharedHandleBase<HandleType, SharedHeader<DestructorTypeOf<HandleType>, typename SharedHandleTraits<HandleType>::deleter>>
- {
- private:
- using BaseType = SharedHandleBase<HandleType, SharedHeader<DestructorTypeOf<HandleType>, typename SharedHandleTraits<HandleType>::deleter>>;
- using DeleterType = typename SharedHandleTraits<HandleType>::deleter;
- friend BaseType;
- public:
- SharedHandle() = default;
- template <typename T = HandleType, typename = typename std::enable_if<HasDestructor<T>::value>::type>
- explicit SharedHandle( HandleType handle, SharedHandle<DestructorTypeOf<HandleType>> parent, DeleterType deleter = DeleterType() ) VULKAN_HPP_NOEXCEPT
- : BaseType( handle, std::move( parent ), std::move( deleter ) )
- {
- }
- template <typename T = HandleType, typename = typename std::enable_if<!HasDestructor<T>::value>::type>
- explicit SharedHandle( HandleType handle, DeleterType deleter = DeleterType() ) VULKAN_HPP_NOEXCEPT : BaseType( handle, std::move( deleter ) )
- {
- }
- protected:
- using BaseType::internalDestroy;
- };
- template <typename HandleType>
- class SharedHandleTraits;
- // Silence the function cast warnings.
- # if defined( __GNUC__ ) && !defined( __clang__ ) && !defined( __INTEL_COMPILER )
- # pragma GCC diagnostic push
- # pragma GCC diagnostic ignored "-Wcast-function-type"
- # endif
- template <typename HandleType>
- class ObjectDestroyShared
- {
- public:
- using DestructorType = typename SharedHandleTraits<HandleType>::DestructorType;
- template <class Dispatcher>
- using DestroyFunctionPointerType =
- typename std::conditional<HasDestructor<HandleType>::value,
- void ( DestructorType::* )( HandleType, const AllocationCallbacks *, const Dispatcher & ) const,
- void ( HandleType::* )( const AllocationCallbacks *, const Dispatcher & ) const>::type;
- using SelectorType = typename std::conditional<HasDestructor<HandleType>::value, DestructorType, HandleType>::type;
- 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 )
- : m_destroy( reinterpret_cast<decltype( m_destroy )>( static_cast<DestroyFunctionPointerType<Dispatcher>>( &SelectorType::destroy ) ) )
- , m_dispatch( &dispatch )
- , m_allocationCallbacks( allocationCallbacks )
- {
- }
- public:
- template <typename T = HandleType>
- typename std::enable_if<HasDestructor<T>::value, void>::type destroy( DestructorType parent, HandleType handle ) const VULKAN_HPP_NOEXCEPT
- {
- VULKAN_HPP_ASSERT( m_destroy && m_dispatch );
- ( parent.*m_destroy )( handle, m_allocationCallbacks, *m_dispatch );
- }
- template <typename T = HandleType>
- typename std::enable_if<!HasDestructor<T>::value, void>::type destroy( HandleType handle ) const VULKAN_HPP_NOEXCEPT
- {
- VULKAN_HPP_ASSERT( m_destroy && m_dispatch );
- ( handle.*m_destroy )( m_allocationCallbacks, *m_dispatch );
- }
- private:
- DestroyFunctionPointerType<DispatchLoaderBase> m_destroy = nullptr;
- const DispatchLoaderBase * m_dispatch = nullptr;
- Optional<const AllocationCallbacks> m_allocationCallbacks = nullptr;
- };
- template <typename HandleType>
- class ObjectFreeShared
- {
- public:
- using DestructorType = typename SharedHandleTraits<HandleType>::DestructorType;
- template <class Dispatcher>
- using DestroyFunctionPointerType = void ( DestructorType::* )( HandleType, const AllocationCallbacks *, const Dispatcher & ) const;
- 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 )
- : m_destroy( reinterpret_cast<decltype( m_destroy )>( static_cast<DestroyFunctionPointerType<Dispatcher>>( &DestructorType::free ) ) )
- , m_dispatch( &dispatch )
- , m_allocationCallbacks( allocationCallbacks )
- {
- }
- public:
- void destroy( DestructorType parent, HandleType handle ) const VULKAN_HPP_NOEXCEPT
- {
- VULKAN_HPP_ASSERT( m_destroy && m_dispatch );
- ( parent.*m_destroy )( handle, m_allocationCallbacks, *m_dispatch );
- }
- private:
- DestroyFunctionPointerType<DispatchLoaderBase> m_destroy = nullptr;
- const DispatchLoaderBase * m_dispatch = nullptr;
- Optional<const AllocationCallbacks> m_allocationCallbacks = nullptr;
- };
- template <typename HandleType>
- class ObjectReleaseShared
- {
- public:
- using DestructorType = typename SharedHandleTraits<HandleType>::DestructorType;
- template <class Dispatcher>
- using DestroyFunctionPointerType = void ( DestructorType::* )( HandleType, const Dispatcher & ) const;
- template <class Dispatcher = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>
- ObjectReleaseShared( const Dispatcher & dispatch VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT )
- : m_destroy( reinterpret_cast<decltype( m_destroy )>( static_cast<DestroyFunctionPointerType<Dispatcher>>( &DestructorType::release ) ) )
- , m_dispatch( &dispatch )
- {
- }
- public:
- void destroy( DestructorType parent, HandleType handle ) const VULKAN_HPP_NOEXCEPT
- {
- VULKAN_HPP_ASSERT( m_destroy && m_dispatch );
- ( parent.*m_destroy )( handle, *m_dispatch );
- }
- private:
- DestroyFunctionPointerType<DispatchLoaderBase> m_destroy = nullptr;
- const DispatchLoaderBase * m_dispatch = nullptr;
- };
- template <typename HandleType, typename PoolType>
- class PoolFreeShared
- {
- public:
- using DestructorType = typename SharedHandleTraits<HandleType>::DestructorType;
- template <class Dispatcher>
- using ReturnType = decltype( std::declval<DestructorType>().free( PoolType(), 0u, nullptr, Dispatcher() ) );
- template <class Dispatcher>
- using DestroyFunctionPointerType = ReturnType<Dispatcher> ( DestructorType::* )( PoolType, uint32_t, const HandleType *, const Dispatcher & ) const;
- PoolFreeShared() = default;
- template <class Dispatcher = VULKAN_HPP_DEFAULT_DISPATCHER_TYPE>
- PoolFreeShared( SharedHandle<PoolType> pool, const Dispatcher & dispatch VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT )
- : m_destroy( reinterpret_cast<decltype( m_destroy )>( static_cast<DestroyFunctionPointerType<Dispatcher>>( &DestructorType::free ) ) )
- , m_dispatch( &dispatch )
- , m_pool( std::move( pool ) )
- {
- }
- public:
- void destroy( DestructorType parent, HandleType handle ) const VULKAN_HPP_NOEXCEPT
- {
- VULKAN_HPP_ASSERT( m_destroy && m_dispatch );
- ( parent.*m_destroy )( m_pool.get(), 1u, &handle, *m_dispatch );
- }
- private:
- DestroyFunctionPointerType<DispatchLoaderBase> m_destroy = nullptr;
- const DispatchLoaderBase * m_dispatch = nullptr;
- SharedHandle<PoolType> m_pool{};
- };
- # if defined( __GNUC__ ) && !defined( __clang__ ) && !defined( __INTEL_COMPILER )
- # pragma GCC diagnostic pop
- # endif
- //======================
- //=== SHARED HANDLEs ===
- //======================
- //=== VK_VERSION_1_0 ===
- template <>
- class SharedHandleTraits<Instance>
- {
- public:
- using DestructorType = NoDestructor;
- using deleter = ObjectDestroyShared<Instance>;
- };
- using SharedInstance = SharedHandle<Instance>;
- template <>
- class SharedHandleTraits<Device>
- {
- public:
- using DestructorType = NoDestructor;
- using deleter = ObjectDestroyShared<Device>;
- };
- using SharedDevice = SharedHandle<Device>;
- template <>
- class SharedHandleTraits<DeviceMemory>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectFreeShared<DeviceMemory>;
- };
- using SharedDeviceMemory = SharedHandle<DeviceMemory>;
- template <>
- class SharedHandleTraits<Fence>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectDestroyShared<Fence>;
- };
- using SharedFence = SharedHandle<Fence>;
- template <>
- class SharedHandleTraits<Semaphore>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectDestroyShared<Semaphore>;
- };
- using SharedSemaphore = SharedHandle<Semaphore>;
- template <>
- class SharedHandleTraits<Event>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectDestroyShared<Event>;
- };
- using SharedEvent = SharedHandle<Event>;
- template <>
- class SharedHandleTraits<QueryPool>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectDestroyShared<QueryPool>;
- };
- using SharedQueryPool = SharedHandle<QueryPool>;
- template <>
- class SharedHandleTraits<Buffer>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectDestroyShared<Buffer>;
- };
- using SharedBuffer = SharedHandle<Buffer>;
- template <>
- class SharedHandleTraits<BufferView>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectDestroyShared<BufferView>;
- };
- using SharedBufferView = SharedHandle<BufferView>;
- template <>
- class SharedHandleTraits<Image>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectDestroyShared<Image>;
- };
- using SharedImage = SharedHandle<Image>;
- template <>
- class SharedHandleTraits<ImageView>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectDestroyShared<ImageView>;
- };
- using SharedImageView = SharedHandle<ImageView>;
- template <>
- class SharedHandleTraits<ShaderModule>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectDestroyShared<ShaderModule>;
- };
- using SharedShaderModule = SharedHandle<ShaderModule>;
- template <>
- class SharedHandleTraits<PipelineCache>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectDestroyShared<PipelineCache>;
- };
- using SharedPipelineCache = SharedHandle<PipelineCache>;
- template <>
- class SharedHandleTraits<Pipeline>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectDestroyShared<Pipeline>;
- };
- using SharedPipeline = SharedHandle<Pipeline>;
- template <>
- class SharedHandleTraits<PipelineLayout>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectDestroyShared<PipelineLayout>;
- };
- using SharedPipelineLayout = SharedHandle<PipelineLayout>;
- template <>
- class SharedHandleTraits<Sampler>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectDestroyShared<Sampler>;
- };
- using SharedSampler = SharedHandle<Sampler>;
- template <>
- class SharedHandleTraits<DescriptorPool>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectDestroyShared<DescriptorPool>;
- };
- using SharedDescriptorPool = SharedHandle<DescriptorPool>;
- template <>
- class SharedHandleTraits<DescriptorSet>
- {
- public:
- using DestructorType = Device;
- using deleter = PoolFreeShared<DescriptorSet, DescriptorPool>;
- };
- using SharedDescriptorSet = SharedHandle<DescriptorSet>;
- template <>
- class SharedHandleTraits<DescriptorSetLayout>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectDestroyShared<DescriptorSetLayout>;
- };
- using SharedDescriptorSetLayout = SharedHandle<DescriptorSetLayout>;
- template <>
- class SharedHandleTraits<Framebuffer>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectDestroyShared<Framebuffer>;
- };
- using SharedFramebuffer = SharedHandle<Framebuffer>;
- template <>
- class SharedHandleTraits<RenderPass>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectDestroyShared<RenderPass>;
- };
- using SharedRenderPass = SharedHandle<RenderPass>;
- template <>
- class SharedHandleTraits<CommandPool>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectDestroyShared<CommandPool>;
- };
- using SharedCommandPool = SharedHandle<CommandPool>;
- template <>
- class SharedHandleTraits<CommandBuffer>
- {
- public:
- using DestructorType = Device;
- using deleter = PoolFreeShared<CommandBuffer, CommandPool>;
- };
- using SharedCommandBuffer = SharedHandle<CommandBuffer>;
- //=== VK_VERSION_1_1 ===
- template <>
- class SharedHandleTraits<SamplerYcbcrConversion>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectDestroyShared<SamplerYcbcrConversion>;
- };
- using SharedSamplerYcbcrConversion = SharedHandle<SamplerYcbcrConversion>;
- using SharedSamplerYcbcrConversionKHR = SharedHandle<SamplerYcbcrConversion>;
- template <>
- class SharedHandleTraits<DescriptorUpdateTemplate>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectDestroyShared<DescriptorUpdateTemplate>;
- };
- using SharedDescriptorUpdateTemplate = SharedHandle<DescriptorUpdateTemplate>;
- using SharedDescriptorUpdateTemplateKHR = SharedHandle<DescriptorUpdateTemplate>;
- //=== VK_VERSION_1_3 ===
- template <>
- class SharedHandleTraits<PrivateDataSlot>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectDestroyShared<PrivateDataSlot>;
- };
- using SharedPrivateDataSlot = SharedHandle<PrivateDataSlot>;
- using SharedPrivateDataSlotEXT = SharedHandle<PrivateDataSlot>;
- //=== VK_KHR_surface ===
- template <>
- class SharedHandleTraits<SurfaceKHR>
- {
- public:
- using DestructorType = Instance;
- using deleter = ObjectDestroyShared<SurfaceKHR>;
- };
- using SharedSurfaceKHR = SharedHandle<SurfaceKHR>;
- //=== VK_KHR_swapchain ===
- template <>
- class SharedHandleTraits<SwapchainKHR>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectDestroyShared<SwapchainKHR>;
- };
- using SharedSwapchainKHR = SharedHandle<SwapchainKHR>;
- //=== VK_EXT_debug_report ===
- template <>
- class SharedHandleTraits<DebugReportCallbackEXT>
- {
- public:
- using DestructorType = Instance;
- using deleter = ObjectDestroyShared<DebugReportCallbackEXT>;
- };
- using SharedDebugReportCallbackEXT = SharedHandle<DebugReportCallbackEXT>;
- //=== VK_KHR_video_queue ===
- template <>
- class SharedHandleTraits<VideoSessionKHR>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectDestroyShared<VideoSessionKHR>;
- };
- using SharedVideoSessionKHR = SharedHandle<VideoSessionKHR>;
- template <>
- class SharedHandleTraits<VideoSessionParametersKHR>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectDestroyShared<VideoSessionParametersKHR>;
- };
- using SharedVideoSessionParametersKHR = SharedHandle<VideoSessionParametersKHR>;
- //=== VK_NVX_binary_import ===
- template <>
- class SharedHandleTraits<CuModuleNVX>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectDestroyShared<CuModuleNVX>;
- };
- using SharedCuModuleNVX = SharedHandle<CuModuleNVX>;
- template <>
- class SharedHandleTraits<CuFunctionNVX>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectDestroyShared<CuFunctionNVX>;
- };
- using SharedCuFunctionNVX = SharedHandle<CuFunctionNVX>;
- //=== VK_EXT_debug_utils ===
- template <>
- class SharedHandleTraits<DebugUtilsMessengerEXT>
- {
- public:
- using DestructorType = Instance;
- using deleter = ObjectDestroyShared<DebugUtilsMessengerEXT>;
- };
- using SharedDebugUtilsMessengerEXT = SharedHandle<DebugUtilsMessengerEXT>;
- //=== VK_KHR_acceleration_structure ===
- template <>
- class SharedHandleTraits<AccelerationStructureKHR>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectDestroyShared<AccelerationStructureKHR>;
- };
- using SharedAccelerationStructureKHR = SharedHandle<AccelerationStructureKHR>;
- //=== VK_EXT_validation_cache ===
- template <>
- class SharedHandleTraits<ValidationCacheEXT>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectDestroyShared<ValidationCacheEXT>;
- };
- using SharedValidationCacheEXT = SharedHandle<ValidationCacheEXT>;
- //=== VK_NV_ray_tracing ===
- template <>
- class SharedHandleTraits<AccelerationStructureNV>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectDestroyShared<AccelerationStructureNV>;
- };
- using SharedAccelerationStructureNV = SharedHandle<AccelerationStructureNV>;
- //=== VK_KHR_deferred_host_operations ===
- template <>
- class SharedHandleTraits<DeferredOperationKHR>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectDestroyShared<DeferredOperationKHR>;
- };
- using SharedDeferredOperationKHR = SharedHandle<DeferredOperationKHR>;
- //=== VK_NV_device_generated_commands ===
- template <>
- class SharedHandleTraits<IndirectCommandsLayoutNV>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectDestroyShared<IndirectCommandsLayoutNV>;
- };
- using SharedIndirectCommandsLayoutNV = SharedHandle<IndirectCommandsLayoutNV>;
- # if defined( VK_USE_PLATFORM_FUCHSIA )
- //=== VK_FUCHSIA_buffer_collection ===
- template <>
- class SharedHandleTraits<BufferCollectionFUCHSIA>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectDestroyShared<BufferCollectionFUCHSIA>;
- };
- using SharedBufferCollectionFUCHSIA = SharedHandle<BufferCollectionFUCHSIA>;
- # endif /*VK_USE_PLATFORM_FUCHSIA*/
- //=== VK_EXT_opacity_micromap ===
- template <>
- class SharedHandleTraits<MicromapEXT>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectDestroyShared<MicromapEXT>;
- };
- using SharedMicromapEXT = SharedHandle<MicromapEXT>;
- //=== VK_NV_optical_flow ===
- template <>
- class SharedHandleTraits<OpticalFlowSessionNV>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectDestroyShared<OpticalFlowSessionNV>;
- };
- using SharedOpticalFlowSessionNV = SharedHandle<OpticalFlowSessionNV>;
- //=== VK_EXT_shader_object ===
- template <>
- class SharedHandleTraits<ShaderEXT>
- {
- public:
- using DestructorType = Device;
- using deleter = ObjectDestroyShared<ShaderEXT>;
- };
- using SharedShaderEXT = SharedHandle<ShaderEXT>;
- enum class SwapchainOwns
- {
- no,
- yes,
- };
- struct ImageHeader : SharedHeader<DestructorTypeOf<VULKAN_HPP_NAMESPACE::Image>, typename SharedHandleTraits<VULKAN_HPP_NAMESPACE::Image>::deleter>
- {
- ImageHeader(
- SharedHandle<DestructorTypeOf<VULKAN_HPP_NAMESPACE::Image>> parent,
- typename SharedHandleTraits<VULKAN_HPP_NAMESPACE::Image>::deleter deleter = typename SharedHandleTraits<VULKAN_HPP_NAMESPACE::Image>::deleter(),
- SwapchainOwns swapchainOwned = SwapchainOwns::no ) VULKAN_HPP_NOEXCEPT
- : SharedHeader<DestructorTypeOf<VULKAN_HPP_NAMESPACE::Image>, typename SharedHandleTraits<VULKAN_HPP_NAMESPACE::Image>::deleter>( std::move( parent ),
- std::move( deleter ) )
- , swapchainOwned( swapchainOwned )
- {
- }
- SwapchainOwns swapchainOwned = SwapchainOwns::no;
- };
- template <>
- class SharedHandle<VULKAN_HPP_NAMESPACE::Image> : public SharedHandleBase<VULKAN_HPP_NAMESPACE::Image, ImageHeader>
- {
- using BaseType = SharedHandleBase<VULKAN_HPP_NAMESPACE::Image, ImageHeader>;
- using DeleterType = typename SharedHandleTraits<VULKAN_HPP_NAMESPACE::Image>::deleter;
- friend BaseType;
- public:
- SharedHandle() = default;
- explicit SharedHandle( VULKAN_HPP_NAMESPACE::Image handle,
- SharedHandle<DestructorTypeOf<VULKAN_HPP_NAMESPACE::Image>> parent,
- SwapchainOwns swapchain_owned = SwapchainOwns::no,
- DeleterType deleter = DeleterType() ) VULKAN_HPP_NOEXCEPT
- : BaseType( handle, std::move( parent ), std::move( deleter ), swapchain_owned )
- {
- }
- protected:
- static void internalDestroy( const ImageHeader & control, VULKAN_HPP_NAMESPACE::Image handle ) VULKAN_HPP_NOEXCEPT
- {
- if ( control.swapchainOwned == SwapchainOwns::no )
- {
- control.deleter.destroy( control.parent.get(), handle );
- }
- }
- };
- struct SwapchainHeader
- {
- SwapchainHeader( SharedHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR> surface,
- SharedHandle<DestructorTypeOf<VULKAN_HPP_NAMESPACE::SwapchainKHR>> parent,
- typename SharedHandleTraits<VULKAN_HPP_NAMESPACE::SwapchainKHR>::deleter deleter =
- typename SharedHandleTraits<VULKAN_HPP_NAMESPACE::SwapchainKHR>::deleter() ) VULKAN_HPP_NOEXCEPT
- : surface( std::move( surface ) )
- , parent( std::move( parent ) )
- , deleter( std::move( deleter ) )
- {
- }
- SharedHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR> surface{};
- SharedHandle<DestructorTypeOf<VULKAN_HPP_NAMESPACE::SwapchainKHR>> parent{};
- typename SharedHandleTraits<VULKAN_HPP_NAMESPACE::SwapchainKHR>::deleter deleter{};
- };
- template <>
- class SharedHandle<VULKAN_HPP_NAMESPACE::SwapchainKHR> : public SharedHandleBase<VULKAN_HPP_NAMESPACE::SwapchainKHR, SwapchainHeader>
- {
- using BaseType = SharedHandleBase<VULKAN_HPP_NAMESPACE::SwapchainKHR, SwapchainHeader>;
- using DeleterType = typename SharedHandleTraits<VULKAN_HPP_NAMESPACE::SwapchainKHR>::deleter;
- friend BaseType;
- public:
- SharedHandle() = default;
- explicit SharedHandle( VULKAN_HPP_NAMESPACE::SwapchainKHR handle,
- SharedHandle<DestructorTypeOf<VULKAN_HPP_NAMESPACE::SwapchainKHR>> parent,
- SharedHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR> surface,
- DeleterType deleter = DeleterType() ) VULKAN_HPP_NOEXCEPT
- : BaseType( handle, std::move( surface ), std::move( parent ), std::move( deleter ) )
- {
- }
- public:
- const SharedHandle<VULKAN_HPP_NAMESPACE::SurfaceKHR> & getSurface() const VULKAN_HPP_NOEXCEPT
- {
- return getHeader().surface;
- }
- protected:
- using BaseType::internalDestroy;
- };
- template <typename HandleType, typename DestructorType>
- class SharedHandleBaseNoDestroy : public SharedHandleBase<HandleType, DestructorType>
- {
- public:
- using SharedHandleBase<HandleType, DestructorType>::SharedHandleBase;
- const DestructorType & getDestructorType() const VULKAN_HPP_NOEXCEPT
- {
- return SharedHandleBase<HandleType, DestructorType>::getHeader();
- }
- protected:
- static void internalDestroy( const DestructorType &, HandleType ) VULKAN_HPP_NOEXCEPT {}
- };
- //=== VK_VERSION_1_0 ===
- template <>
- class SharedHandle<PhysicalDevice> : public SharedHandleBaseNoDestroy<PhysicalDevice, SharedInstance>
- {
- friend SharedHandleBase<PhysicalDevice, SharedInstance>;
- public:
- SharedHandle() = default;
- explicit SharedHandle( PhysicalDevice handle, SharedInstance parent ) noexcept
- : SharedHandleBaseNoDestroy<PhysicalDevice, SharedInstance>( handle, std::move( parent ) )
- {
- }
- };
- using SharedPhysicalDevice = SharedHandle<PhysicalDevice>;
- template <>
- class SharedHandle<Queue> : public SharedHandleBaseNoDestroy<Queue, SharedDevice>
- {
- friend SharedHandleBase<Queue, SharedDevice>;
- public:
- SharedHandle() = default;
- explicit SharedHandle( Queue handle, SharedDevice parent ) noexcept : SharedHandleBaseNoDestroy<Queue, SharedDevice>( handle, std::move( parent ) ) {}
- };
- using SharedQueue = SharedHandle<Queue>;
- //=== VK_KHR_display ===
- template <>
- class SharedHandle<DisplayKHR> : public SharedHandleBaseNoDestroy<DisplayKHR, SharedPhysicalDevice>
- {
- friend SharedHandleBase<DisplayKHR, SharedPhysicalDevice>;
- public:
- SharedHandle() = default;
- explicit SharedHandle( DisplayKHR handle, SharedPhysicalDevice parent ) noexcept
- : SharedHandleBaseNoDestroy<DisplayKHR, SharedPhysicalDevice>( handle, std::move( parent ) )
- {
- }
- };
- using SharedDisplayKHR = SharedHandle<DisplayKHR>;
- template <>
- class SharedHandle<DisplayModeKHR> : public SharedHandleBaseNoDestroy<DisplayModeKHR, SharedDisplayKHR>
- {
- friend SharedHandleBase<DisplayModeKHR, SharedDisplayKHR>;
- public:
- SharedHandle() = default;
- explicit SharedHandle( DisplayModeKHR handle, SharedDisplayKHR parent ) noexcept
- : SharedHandleBaseNoDestroy<DisplayModeKHR, SharedDisplayKHR>( handle, std::move( parent ) )
- {
- }
- };
- using SharedDisplayModeKHR = SharedHandle<DisplayModeKHR>;
- //=== VK_INTEL_performance_query ===
- template <>
- class SharedHandle<PerformanceConfigurationINTEL> : public SharedHandleBaseNoDestroy<PerformanceConfigurationINTEL, SharedDevice>
- {
- friend SharedHandleBase<PerformanceConfigurationINTEL, SharedDevice>;
- public:
- SharedHandle() = default;
- explicit SharedHandle( PerformanceConfigurationINTEL handle, SharedDevice parent ) noexcept
- : SharedHandleBaseNoDestroy<PerformanceConfigurationINTEL, SharedDevice>( handle, std::move( parent ) )
- {
- }
- };
- using SharedPerformanceConfigurationINTEL = SharedHandle<PerformanceConfigurationINTEL>;
- #endif // !VULKAN_HPP_NO_SMART_HANDLE
- } // namespace VULKAN_HPP_NAMESPACE
- #endif // VULKAN_SHARED_HPP
|