yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
f65d756bf
master
1// vk-fence.cpp 2#include "vk-fence.h" 3 4#include "vk-device.h" 5#include "vk-util.h" 6 7#if SLANG_WINDOWS_FAMILY 8#include <dxgi1_2.h> 9#endif 10 11namespace gfx 12{ 13 14using namespace Slang ; 15 16namespace vk 17{ 18 19FenceImpl ::FenceImpl (DeviceImpl * device ) 20 :m_device (device ) 21{ 22} 23 24FenceImpl ::~FenceImpl () 25{ 26if (m_semaphore ) 27 { 28m_device -> m_api .vkDestroySemaphore (m_device -> m_api .m_device ,m_semaphore ,nullptr ); 29 } 30} 31 32Result FenceImpl ::init (const IFence ::Desc & desc ) 33{ 34if (!m_device -> m_api .m_extendedFeatures .vulkan12Features .timelineSemaphore ) 35return SLANG_E_NOT_AVAILABLE ; 36 37VkSemaphoreTypeCreateInfo timelineCreateInfo ; 38timelineCreateInfo .sType = VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO ; 39timelineCreateInfo .pNext = nullptr ; 40timelineCreateInfo .semaphoreType = VK_SEMAPHORE_TYPE_TIMELINE ; 41timelineCreateInfo .initialValue = desc .initialValue ; 42 43VkSemaphoreCreateInfo createInfo ; 44createInfo .sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO ; 45createInfo .pNext = & timelineCreateInfo ; 46createInfo .flags = 0 ; 47 48#if SLANG_WINDOWS_FAMILY 49VkExportSemaphoreWin32HandleInfoKHR exportSemaphoreWin32HandleInfoKHR ; 50#endif 51VkExportSemaphoreCreateInfoKHR exportSemaphoreCreateInfo ; 52if (desc .isShared ) 53 { 54#if SLANG_WINDOWS_FAMILY 55exportSemaphoreWin32HandleInfoKHR .sType = 56VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR ; 57exportSemaphoreWin32HandleInfoKHR .pNext = timelineCreateInfo .pNext ; 58exportSemaphoreWin32HandleInfoKHR .pAttributes = nullptr ; 59exportSemaphoreWin32HandleInfoKHR .dwAccess = GENERIC_ALL ; 60exportSemaphoreWin32HandleInfoKHR .name = (LPCWSTR )nullptr ; 61#endif 62exportSemaphoreCreateInfo .sType = VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO_KHR ; 63#if SLANG_WINDOWS_FAMILY 64exportSemaphoreCreateInfo .pNext = & exportSemaphoreWin32HandleInfoKHR ; 65exportSemaphoreCreateInfo .handleTypes = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT ; 66#else 67exportSemaphoreCreateInfo .pNext = timelineCreateInfo .pNext ; 68exportSemaphoreCreateInfo .handleTypes = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT ; 69#endif 70timelineCreateInfo .pNext = & exportSemaphoreCreateInfo ; 71 } 72 73SLANG_VK_RETURN_ON_FAIL (m_device -> m_api .vkCreateSemaphore ( 74m_device -> m_api .m_device , 75& createInfo , 76nullptr , 77& m_semaphore )); 78 79return SLANG_OK ; 80} 81 82Result FenceImpl ::getCurrentValue (uint64_t * outValue ) 83{ 84SLANG_VK_RETURN_ON_FAIL (m_device -> m_api .vkGetSemaphoreCounterValue ( 85m_device -> m_api .m_device , 86m_semaphore , 87outValue )); 88return SLANG_OK ; 89} 90 91Result FenceImpl ::setCurrentValue (uint64_t value ) 92{ 93uint64_t currentValue = 0 ; 94SLANG_VK_RETURN_ON_FAIL (m_device -> m_api .vkGetSemaphoreCounterValue ( 95m_device -> m_api .m_device , 96m_semaphore , 97& currentValue )); 98if (currentValue < value ) 99 { 100VkSemaphoreSignalInfo signalInfo ; 101signalInfo .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO ; 102signalInfo .pNext = nullptr ; 103signalInfo .semaphore = m_semaphore ; 104signalInfo .value = value ; 105 106SLANG_VK_RETURN_ON_FAIL ( 107m_device -> m_api .vkSignalSemaphore (m_device -> m_api .m_device ,& signalInfo )); 108 } 109return SLANG_OK ; 110} 111 112Result FenceImpl ::getSharedHandle (InteropHandle * outHandle ) 113{ 114// Check if a shared handle already exists. 115if (sharedHandle .handleValue != 0 ) 116 { 117* outHandle = sharedHandle ; 118return SLANG_OK ; 119 } 120 121#if SLANG_WINDOWS_FAMILY 122VkSemaphoreGetWin32HandleInfoKHR handleInfo = { 123VK_STRUCTURE_TYPE_SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR }; 124handleInfo .pNext = nullptr ; 125handleInfo .semaphore = m_semaphore ; 126handleInfo .handleType = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT ; 127 128SLANG_VK_RETURN_ON_FAIL (m_device -> m_api .vkGetSemaphoreWin32HandleKHR ( 129m_device -> m_api .m_device , 130& handleInfo , 131 (HANDLE * )& sharedHandle .handleValue )); 132#else 133VkSemaphoreGetFdInfoKHR fdInfo = {VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR }; 134fdInfo .pNext = nullptr ; 135fdInfo .semaphore = m_semaphore ; 136fdInfo .handleType = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT ; 137 138SLANG_VK_RETURN_ON_FAIL (m_device -> m_api .vkGetSemaphoreFdKHR ( 139m_device -> m_api .m_device , 140& fdInfo , 141 (int * )& sharedHandle .handleValue )); 142#endif 143 144sharedHandle .api = InteropHandleAPI ::Vulkan ; 145* outHandle = sharedHandle ; 146return SLANG_OK ; 147} 148 149Result FenceImpl ::getNativeHandle (InteropHandle * outNativeHandle ) 150{ 151outNativeHandle -> handleValue = 0 ; 152return SLANG_FAIL ; 153} 154 155}// namespace vk 156}// namespace gfx