I think its a fence class

This commit is contained in:
Greg Wells
2025-05-30 11:14:18 -04:00
parent 014b315faa
commit b00bd732a3
2 changed files with 42 additions and 0 deletions

View File

@@ -0,0 +1,10 @@
#pragma once
#include "core/sync/fence/gryphn_fence.h"
#import <Metal/Metal.h>
#import <Metal/MTLEvent.h>
typedef struct gnPlatformFence_t {
id<MTLSharedEvent> fence;
MTLSharedEventListener* listener;
dispatch_semaphore_t semaphore;
} gnPlatformFence;

View File

@@ -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<MTLSharedEvent> 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);
}