yum-mirror/slang

Making it easier to work with shaders

git clone https://git.yummers.dev/yum-mirror/slang

Ellie Hermaszewskaformatf65d756bf

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