yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
f65d756bf
master
1// vk-texture.cpp 2#include "vk-texture.h" 3 4namespace gfx 5{ 6 7using namespace Slang ; 8 9namespace vk 10{ 11 12TextureResourceImpl ::TextureResourceImpl (const Desc & desc ,DeviceImpl * device ) 13 :Parent (desc ),m_device (device ) 14{ 15} 16 17TextureResourceImpl ::~TextureResourceImpl () 18{ 19auto & vkAPI = m_device -> m_api ; 20if (!m_isWeakImageReference ) 21 { 22vkAPI .vkFreeMemory (vkAPI .m_device ,m_imageMemory ,nullptr ); 23vkAPI .vkDestroyImage (vkAPI .m_device ,m_image ,nullptr ); 24 } 25if (sharedHandle .handleValue != 0 ) 26 { 27#if SLANG_WINDOWS_FAMILY 28CloseHandle ((HANDLE )sharedHandle .handleValue ); 29#endif 30 } 31} 32 33Result TextureResourceImpl ::getNativeResourceHandle (InteropHandle * outHandle ) 34{ 35outHandle -> handleValue = (uint64_t )m_image ; 36outHandle -> api = InteropHandleAPI ::Vulkan ; 37return SLANG_OK ; 38} 39 40Result TextureResourceImpl ::getSharedHandle (InteropHandle * outHandle ) 41{ 42// Check if a shared handle already exists for this resource. 43if (sharedHandle .handleValue != 0 ) 44 { 45* outHandle = sharedHandle ; 46return SLANG_OK ; 47 } 48 49// If a shared handle doesn't exist, create one and store it. 50#if SLANG_WINDOWS_FAMILY 51VkMemoryGetWin32HandleInfoKHR info = {}; 52info .sType = VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR ; 53info .pNext = nullptr ; 54info .memory = m_imageMemory ; 55info .handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT ; 56 57auto & api = m_device -> m_api ; 58PFN_vkGetMemoryWin32HandleKHR vkCreateSharedHandle ; 59vkCreateSharedHandle = api .vkGetMemoryWin32HandleKHR ; 60if (!vkCreateSharedHandle ) 61 { 62return SLANG_FAIL ; 63 } 64SLANG_RETURN_ON_FAIL ( 65vkCreateSharedHandle (m_device -> m_device ,& info , (HANDLE * )& outHandle -> handleValue )!= 66VK_SUCCESS ); 67#else 68VkMemoryGetFdInfoKHR info = {}; 69info .sType = VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR ; 70info .pNext = nullptr ; 71info .memory = m_imageMemory ; 72info .handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT ; 73 74auto & api = m_device -> m_api ; 75PFN_vkGetMemoryFdKHR vkCreateSharedHandle ; 76vkCreateSharedHandle = api .vkGetMemoryFdKHR ; 77if (!vkCreateSharedHandle ) 78 { 79return SLANG_FAIL ; 80 } 81SLANG_RETURN_ON_FAIL ( 82vkCreateSharedHandle (m_device -> m_device ,& info , (int * )& outHandle -> handleValue )!= 83VK_SUCCESS ); 84#endif 85outHandle -> api = InteropHandleAPI ::Vulkan ; 86return SLANG_OK ; 87} 88Result TextureResourceImpl ::setDebugName (const char * name ) 89{ 90Parent ::setDebugName (name ); 91auto & api = m_device -> m_api ; 92if (api .vkDebugMarkerSetObjectNameEXT ) 93 { 94VkDebugMarkerObjectNameInfoEXT nameDesc = {}; 95nameDesc .sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT ; 96nameDesc .object = (uint64_t )m_image ; 97nameDesc .objectType = VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT ; 98nameDesc .pObjectName = name ; 99api .vkDebugMarkerSetObjectNameEXT (api .m_device ,& nameDesc ); 100 } 101return SLANG_OK ; 102} 103 104}// namespace vk 105}// namespace gfx