首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vulkan图像输出句柄到Win32或fd。如何反转win32句柄来获取图像信息?

Vulkan图像输出句柄到Win32或fd。如何反转win32句柄来获取图像信息?
EN

Stack Overflow用户
提问于 2022-06-16 06:11:57
回答 1查看 140关注 1票数 1

当我从Vulkan图像导出一个Win32句柄时。另一个过程。此时,如何根据win32处理反求Vulkan图像的信息?

我在一个过程中用Vulkan创建了一个句柄,并根据句柄创建了OpenGL的纹理。然后,它将与另一个进程共享。因此,存在上述问题之一。

我不知道图像的信息是什么。如何创建映像,然后将其导入共享内存?我不知道图像信息是什么,所以我如何创建一个OpenGL纹理对象?因此,我想获取包含在句柄中的图像信息。

代码语言:javascript
复制
// Get the Vulkan texture and create the OpenGL equivalent using the memory allocated in Vulkan
inline void createTextureGL(nvvk::ResourceAllocator& alloc, Texture2DVkGL& texGl, int format, int minFilter, int magFilter, int wraps, int wrapt)
{
    vk::Device                  device = alloc.getDevice();
    nvvk::MemAllocator::MemInfo info = alloc.getMemoryAllocator()->getMemoryInfo(texGl.texVk.memHandle);

    texGl.handle = device.getMemoryWin32HandleKHR({ info.memory, vk::ExternalMemoryHandleTypeFlagBits::eOpaqueWin32 });

    auto req = device.getImageMemoryRequirements(texGl.texVk.image);

    glCreateMemoryObjectsEXT(1, &texGl.memoryObject);

    glImportMemoryWin32HandleEXT(texGl.memoryObject, req.size, GL_HANDLE_TYPE_OPAQUE_WIN32_EXT, texGl.handle);

    glCreateTextures(GL_TEXTURE_2D, 1, &texGl.oglId);
    glTextureStorageMem2DEXT(texGl.oglId, texGl.mipLevels, format, texGl.imgSize.width, texGl.imgSize.height, texGl.memoryObject, info.offset);

goolge-图像-导入项目:

代码语言:javascript
复制
    ::VkImage image = *images_[0];

    VkMemoryRequirements requirements;
    device_->vkGetImageMemoryRequirements(device_, image, &requirements);

    aligned_data_size_ =
        vulkan::RoundUp(requirements.size, requirements.alignment);

    uint32_t memory_index =
        vulkan::GetMemoryIndex(&device, log, requirements.memoryTypeBits,
                               VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);

#ifdef _WIN32
    VkImportMemoryWin32HandleInfoKHR import_allocate_info{
        VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR, nullptr,
        VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT, handle, nullptr};
#elif __linux__
    VkImportMemoryFdInfoKHR import_allocate_info{
        VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR, nullptr,
        VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT, fd};
#endif

    VkMemoryAllocateInfo allocate_info{
        VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,  // sType
        &import_allocate_info,                   // pNext
        aligned_data_size_ * num_images,         // allocationSize
        memory_index};

    VkDeviceMemory device_memory;

    LOG_ASSERT(==, log, VK_SUCCESS,
               device->vkAllocateMemory(device, &allocate_info, nullptr,
                                        &device_memory));
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-16 13:38:21

我不知道图像的信息是什么。

不,你需要。是你在Vulkan创造的。你知道它的大小。你知道它的格式。你对图像了如指掌。

如果您可以传递这个函数的句柄来创建OpenGL纹理,那么您也可以传递其他信息。

没有API来检索有关窗口的任何信息。驱动程序甚至可能不会保存这样的信息,因为它是您已经拥有的信息,因此是多余的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72641269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档