yum-mirror/slang

Making it easier to work with shaders

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

kaizhangNVFix metal issue (#6361)a70113c42

master
2.0 KiB89 linesraw
1// metal-fence.cpp
2#include "metal-fence.h"
3
4#include "metal-device.h"
5
6namespace gfx
7{
8
9using namespace Slang;
10
11namespace metal
12{
13
14FenceImpl::~FenceImpl() {}
15
16Result FenceImpl::init(DeviceImpl* device, const IFence::Desc& desc)
17{
18    m_device = device;
19    m_event = NS::TransferPtr(m_device->m_device->newSharedEvent());
20    if (!m_event)
21    {
22        return SLANG_FAIL;
23    }
24    m_event->setSignaledValue(desc.initialValue);
25
26    m_eventListener = NS::TransferPtr(MTL::SharedEventListener::alloc()->init());
27    if (!m_eventListener)
28    {
29        return SLANG_FAIL;
30    }
31
32    return SLANG_OK;
33}
34
35Result FenceImpl::getCurrentValue(uint64_t* outValue)
36{
37    *outValue = m_event->signaledValue();
38    return SLANG_OK;
39}
40
41Result FenceImpl::setCurrentValue(uint64_t value)
42{
43    m_event->setSignaledValue(value);
44    return SLANG_OK;
45}
46
47Result FenceImpl::getSharedHandle(InteropHandle* outHandle)
48{
49    return SLANG_E_NOT_AVAILABLE;
50}
51
52Result FenceImpl::getNativeHandle(InteropHandle* outNativeHandle)
53{
54    outNativeHandle->api = InteropHandleAPI::Metal;
55    outNativeHandle->handleValue = reinterpret_cast<intptr_t>(m_event.get());
56    return SLANG_OK;
57}
58
59bool FenceImpl::waitForFence(uint64_t value, uint64_t timeout)
60{
61    // Create a semaphore to synchronize the notification
62    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
63
64    // Create and store the notification block
65    MTL::SharedEventNotificationBlock block = ^(MTL::SharedEvent* event, uint64_t eventValue) {
66      dispatch_semaphore_signal(semaphore);
67    };
68
69    // Set up notification handler
70    m_event->notifyListener(m_eventListener.get(), value, block);
71
72    // Wait for the notification or timeout
73    if (timeout & (1LLU << 63))
74    {
75        timeout = DISPATCH_TIME_FOREVER;
76    }
77    else
78    {
79        timeout = dispatch_time(DISPATCH_TIME_NOW, timeout);
80    }
81
82    long result = dispatch_semaphore_wait(semaphore, timeout);
83    dispatch_release(semaphore);
84
85    return result == 0;
86}
87
88} // namespace metal
89} // namespace gfx