24#include <score/gfx/Vulkan.hpp>
26#include <score_plugin_gfx_export.h>
32#include <vulkan/vulkan.h>
39namespace score::gfx::vkinterop
52 void* handle{
nullptr};
56 VkExternalMemoryHandleTypeFlagBits type{};
58 bool isValid() const noexcept
61 return handle !=
nullptr;
70 void* osHandle() const noexcept
75 return reinterpret_cast<void*
>(
static_cast<intptr_t
>(fd));
83inline constexpr VkExternalMemoryHandleTypeFlagBits kOpaqueHandleType =
85 VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT;
87 VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT;
91struct ExternalImageDesc
94 VkExtent3D extent{1, 1, 1};
95 VkImageUsageFlags usage{};
96 VkImageTiling tiling{VK_IMAGE_TILING_OPTIMAL};
97 VkExternalMemoryHandleTypeFlagBits handleType{};
100 bool preferDeviceLocal{
true};
116 const uint64_t* drmModifiers{};
117 uint32_t drmModifierCount{};
121struct ExternalBufferDesc
124 VkBufferUsageFlags usage{};
125 VkExternalMemoryHandleTypeFlagBits handleType{};
126 bool dedicated{
true};
132 VkInstance instance{VK_NULL_HANDLE};
133 VkPhysicalDevice physDev{VK_NULL_HANDLE};
134 VkDevice dev{VK_NULL_HANDLE};
135 QVulkanInstance* qInst{};
143SCORE_PLUGIN_GFX_EXPORT
void setDeviceTimelineSemaphoresEnabled(
bool enabled);
144SCORE_PLUGIN_GFX_EXPORT
bool deviceTimelineSemaphoresEnabled();
148 VkImage image{VK_NULL_HANDLE};
149 VkDeviceMemory memory{VK_NULL_HANDLE};
150 VkDeviceSize size{0};
153 uint64_t drmModifier{(1ull << 56) - 1};
158 VkBuffer buffer{VK_NULL_HANDLE};
159 VkDeviceMemory memory{VK_NULL_HANDLE};
160 VkDeviceSize size{0};
172 VkBuffer buffer{VK_NULL_HANDLE};
173 VkDeviceMemory memory{VK_NULL_HANDLE};
174 VkDeviceSize size{0};
175 std::uint64_t remoteAddress{0};
181SCORE_PLUGIN_GFX_EXPORT std::optional<RdmaBuffer>
182createRdmaBuffer(
const VulkanCtx&, VkDeviceSize size);
186SCORE_PLUGIN_GFX_EXPORT std::optional<std::uint64_t>
187getMemoryRemoteAddress(
const VulkanCtx&, VkDeviceMemory);
189SCORE_PLUGIN_GFX_EXPORT
void destroyRdma(
const VulkanCtx&, RdmaBuffer&);
202SCORE_PLUGIN_GFX_EXPORT std::optional<ExternalImage>
203createExportableImage(
const VulkanCtx&,
const ExternalImageDesc&);
210SCORE_PLUGIN_GFX_EXPORT std::optional<ExternalBuffer>
211createExportableBuffer(
const VulkanCtx&,
const ExternalBufferDesc&);
222SCORE_PLUGIN_GFX_EXPORT std::optional<ExternalHandle> exportMemoryHandle(
223 const VulkanCtx&, VkDeviceMemory, VkExternalMemoryHandleTypeFlagBits);
241SCORE_PLUGIN_GFX_EXPORT std::optional<ExternalImage> importExternalImage(
242 const VulkanCtx&,
const ExternalImageDesc&,
const ExternalHandle&);
247SCORE_PLUGIN_GFX_EXPORT std::optional<ExternalBuffer> importExternalBuffer(
248 const VulkanCtx&,
const ExternalBufferDesc&,
const ExternalHandle&);
256SCORE_PLUGIN_GFX_EXPORT
void destroyExternal(
const VulkanCtx& v, ExternalImage& img);
257SCORE_PLUGIN_GFX_EXPORT
void destroyExternal(
const VulkanCtx& v, ExternalBuffer& buf);
272SCORE_PLUGIN_GFX_EXPORT
bool transitionImageLayout(
273 const VulkanCtx& v, VkQueue queue, std::uint32_t queueFamily, VkImage image,
274 VkImageLayout oldLayout, VkImageLayout newLayout);
291bool can_import_dmabuf_modifier(
292 const VulkanCtx& v, VkFormat format, std::uint64_t drm_modifier,
293 std::uint32_t width, std::uint32_t height)
noexcept;
302std::vector<std::uint64_t> supported_dmabuf_modifiers(
303 const VulkanCtx& v, VkFormat format)
noexcept;