diff --git a/rendering_api/metal/src/core/sync/fence/metal_fence.h b/rendering_api/metal/src/core/sync/fence/metal_fence.h new file mode 100644 index 0000000..ac34cff --- /dev/null +++ b/rendering_api/metal/src/core/sync/fence/metal_fence.h @@ -0,0 +1,10 @@ +#pragma once +#include "core/sync/fence/gryphn_fence.h" +#import +#import + +typedef struct gnPlatformFence_t { + id fence; + MTLSharedEventListener* listener; + dispatch_semaphore_t semaphore; +} gnPlatformFence; diff --git a/rendering_api/metal/src/core/sync/fence/metal_fence.m b/rendering_api/metal/src/core/sync/fence/metal_fence.m new file mode 100644 index 0000000..678248c --- /dev/null +++ b/rendering_api/metal/src/core/sync/fence/metal_fence.m @@ -0,0 +1,32 @@ +#include "metal_fence.h" +#include "core/devices/metal_output_devices.h" + +gnReturnCode gnCreateFenceFn(struct gnFence_t* fence, struct gnOutputDevice_t* device) { + fence->fence = malloc(sizeof(gnPlatformFence)); + + fence->fence->fence = [device->outputDevice->device newSharedEvent]; + fence->fence->listener = [[MTLSharedEventListener alloc] init]; + fence->fence->semaphore = dispatch_semaphore_create(1); + + return GN_SUCCESS; +} +void gnSignalFenceFn(struct gnFence_t* fence) { + dispatch_semaphore_signal(fence->fence->semaphore); +} +void gnWaitForFenceFn(struct gnFence_t* fence, uint64_t timeout) { + dispatch_semaphore_wait(fence->fence->semaphore, timeout); +} +void gnResetFenceFn(struct gnFence_t* fence) { + dispatch_semaphore_signal(fence->fence->semaphore); + [fence->fence->fence setSignaledValue:0]; + [fence->fence->fence notifyListener:fence->fence->listener + atValue:1 + block:^(id ev, uint64_t val) { + dispatch_semaphore_signal(fence->fence->semaphore); + }]; +} +void gnDestroyFenceFn(struct gnFence_t* fence) { + [fence->fence->fence release]; + [fence->fence->listener release]; + free(fence->fence); +}