@@ -643,14 +643,73 @@ fwRefContainer<GITexture> GtaNuiInterface::CreateTextureFromShareHandle(HANDLE s
643643
644644 if (texRef)
645645 {
646- rage::sga::Driver_Destroy_Texture (texRef);
646+ rage::sga::Driver_Destroy_Texture (texRef);
647647
648+ // Vulkan API magic time (copy/pasted from samples on GH)
648649 VkDevice device = (VkDevice)GetGraphicsDriverHandle ();
649- VkPhysicalDevice physicalDevice = GetVulkanPhysicalHandle ();
650-
650+
651+ VkExtent3D Extent = { width, height, 1 };
652+
653+ VkExternalMemoryImageCreateInfo ExternalMemoryImageCreateInfo = { VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO };
654+ ExternalMemoryImageCreateInfo.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT ;
655+ VkImageCreateInfo ImageCreateInfo = { VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO };
656+ ImageCreateInfo.pNext = &ExternalMemoryImageCreateInfo;
657+ ImageCreateInfo.imageType = VK_IMAGE_TYPE_2D ;
658+ ImageCreateInfo.format = VK_FORMAT_B8G8R8A8_UNORM ;
659+ ImageCreateInfo.extent = Extent;
660+ ImageCreateInfo.mipLevels = 1 ;
661+ ImageCreateInfo.arrayLayers = 1 ;
662+ ImageCreateInfo.samples = VK_SAMPLE_COUNT_1_BIT ;
663+ ImageCreateInfo.tiling = VK_IMAGE_TILING_OPTIMAL ;
664+ ImageCreateInfo.usage = VK_IMAGE_USAGE_SAMPLED_BIT ;
665+ ImageCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE ;
666+ ImageCreateInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED ;
667+
651668 VkImage Image;
652- VkDeviceMemory DeviceMemory;
653- CreateVKImageFromShareHandle (device, shareHandle, width, height, Image, DeviceMemory);
669+ VkResult result = vkCreateImage (device, &ImageCreateInfo, nullptr , &Image);
670+
671+ if (result != VK_SUCCESS )
672+ {
673+ FatalError (" Failed to create a Vulkan image. VkResult: %s" , ResultToString (result));
674+ }
675+
676+ VkMemoryRequirements MemoryRequirements;
677+ vkGetImageMemoryRequirements (device, Image, &MemoryRequirements);
678+
679+ VkMemoryDedicatedAllocateInfo MemoryDedicatedAllocateInfo = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO };
680+ MemoryDedicatedAllocateInfo.image = Image;
681+ VkImportMemoryWin32HandleInfoKHR ImportMemoryWin32HandleInfo = { VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR };
682+ ImportMemoryWin32HandleInfo.pNext = &MemoryDedicatedAllocateInfo;
683+ ImportMemoryWin32HandleInfo.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT ;
684+ ImportMemoryWin32HandleInfo.handle = shareHandle;
685+ VkMemoryAllocateInfo MemoryAllocateInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO };
686+ MemoryAllocateInfo.pNext = &ImportMemoryWin32HandleInfo;
687+ MemoryAllocateInfo.allocationSize = MemoryRequirements.size ;
688+
689+ unsigned long typeIndex;
690+ _BitScanForward (&typeIndex, MemoryRequirements.memoryTypeBits );
691+ MemoryAllocateInfo.memoryTypeIndex = typeIndex;
692+
693+ static auto _vkBindImageMemory2 = (PFN_vkBindImageMemory2)vkGetDeviceProcAddr (device, " vkBindImageMemory2" );
694+
695+ VkDeviceMemory ImageMemory;
696+ result = vkAllocateMemory (device, &MemoryAllocateInfo, nullptr , &ImageMemory);
697+
698+ if (result != VK_SUCCESS )
699+ {
700+ FatalError (" Failed to allocate memory for Vulkan. VkResult: %s" , ResultToString (result));
701+ }
702+
703+ VkBindImageMemoryInfo BindImageMemoryInfo = { VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO };
704+ BindImageMemoryInfo.image = Image;
705+ BindImageMemoryInfo.memory = ImageMemory;
706+
707+ result = _vkBindImageMemory2 (device, 1 , &BindImageMemoryInfo);
708+
709+ if (result != VK_SUCCESS )
710+ {
711+ FatalError (" Failed to bind Vulkan image memory. VkResult: %s" , ResultToString (result));
712+ }
654713
655714 auto newImage = new rage::sga::TextureVK::ImageData;
656715 // memcpy(newImage, texRef->image, sizeof(*newImage));
@@ -660,9 +719,7 @@ fwRefContainer<GITexture> GtaNuiInterface::CreateTextureFromShareHandle(HANDLE s
660719 texRef->image = newImage;
661720
662721 texRef->image ->image = Image;
663- texRef->image ->memory = DeviceMemory;
664- texRef->width = width;
665- texRef->height = height;
722+ texRef->image ->memory = ImageMemory;
666723
667724 rage::sga::TextureViewDesc srvDesc;
668725 srvDesc.mipLevels = 1 ;
0 commit comments