mirror of
https://github.com/KhronosGroup/Vulkan-Hpp
synced 2024-11-24 21:10:12 +00:00
5d0d3b7bd9
* stage 1: added shared handles and all traits * moved deleter to the shared part, now Shared handle weights 2 pointers * Fixed Destroy Function * generated headers * At least no errors. TODO: get image overload of shared handle back make an example * fixed all SFINAE issues, moved image specialization * Added a sample * made better example, added specialization for swapchain, added shared handles to readme * Major update: Fixed all wishes Made std::shared_ptr do heavy lifting Reduced code complexity Added ParentType to basic handles Added put and put_native for cross-abi usage * more readme * safer release() removed put() for now * better synchronization inspired by STL shared_ptr implementation * removed test shared pointer * added forward type for better interop with VMA added parent checking * fixed getParent() * added non-deleting overloads for Queue, DisplayKHR and PhysicalDevice * Shared non-destoyed type now have handles * using constructors are made to comply standard * fixed leak * shared handles migrated to own header, made module entries * header is independent now * rebased repo, updated the example * fixed most of the stuff * renamed parent of, added guide to make shared handles * vulkansc * moved destructor to shared handle traits * resolved issues with CI * more relaxed memory ordering for release operation * trying to remove submodule * renamed to destructorType * suppressed function cast warning * only GCC should be affected
108 lines
4.5 KiB
C++
108 lines
4.5 KiB
C++
|
|
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 {}
|
|
}; |