Skip to content

Commit

Permalink
Start implementing Metal functionality
Browse files Browse the repository at this point in the history
  • Loading branch information
RobDangerous committed Feb 2, 2025
1 parent 8d73f8d commit 40ee48b
Show file tree
Hide file tree
Showing 7 changed files with 58 additions and 13 deletions.
14 changes: 10 additions & 4 deletions Backends/Graphics5/Metal/Sources/kope/metal/buffer.m
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,25 @@ void kope_metal_buffer_destroy(kope_g5_buffer *buffer) {
}

void *kope_metal_buffer_try_to_lock_all(kope_g5_buffer *buffer) {
return NULL;
id<MTLBuffer> metal_buffer = (__bridge id<MTLBuffer>)buffer->metal.buffer;
return (void *)[metal_buffer contents];
}

void *kope_metal_buffer_lock_all(kope_g5_buffer *buffer) {
return NULL;
id<MTLBuffer> metal_buffer = (__bridge id<MTLBuffer>)buffer->metal.buffer;
return (void *)[metal_buffer contents];
}

void *kope_metal_buffer_try_to_lock(kope_g5_buffer *buffer, uint64_t offset, uint64_t size) {
return NULL;
id<MTLBuffer> metal_buffer = (__bridge id<MTLBuffer>)buffer->metal.buffer;
uint8_t *data = (uint8_t *)[metal_buffer contents];
return &data[offset];
}

void *kope_metal_buffer_lock(kope_g5_buffer *buffer, uint64_t offset, uint64_t size) {
return NULL;
id<MTLBuffer> metal_buffer = (__bridge id<MTLBuffer>)buffer->metal.buffer;
uint8_t *data = (uint8_t *)[metal_buffer contents];
return &data[offset];
}

void kope_metal_buffer_unlock(kope_g5_buffer *buffer) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ extern "C" {
struct kope_g5_device;

typedef struct kope_metal_buffer {
int nothing;
void *buffer;
} kope_metal_buffer;

#ifdef __cplusplus
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ typedef struct kope_metal_buffer_access {
} kope_metal_buffer_access;

typedef struct kope_metal_command_list {
int nothing;
void *queue;
} kope_metal_command_list;

#ifdef __cplusplus
Expand Down
25 changes: 22 additions & 3 deletions Backends/Graphics5/Metal/Sources/kope/metal/device.m
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,13 @@

#include <assert.h>

void kope_metal_device_create(kope_g5_device *device, const kope_g5_device_wishlist *wishlist) {
CAMetalLayer *get_metal_layer(void);

void kope_metal_device_create(kope_g5_device *device, const kope_g5_device_wishlist *wishlist) {
id<MTLDevice> metal_device = MTLCreateSystemDefaultDevice();
get_metal_layer().device = metal_device;
device->metal.device = (__bridge_retained void *)metal_device;
device->metal.library = (__bridge_retained void *)[metal_device newDefaultLibrary];
}

void kope_metal_device_destroy(kope_g5_device *device) {
Expand All @@ -23,11 +28,25 @@ void kope_metal_device_set_name(kope_g5_device *device, const char *name) {
}

void kope_metal_device_create_buffer(kope_g5_device *device, const kope_g5_buffer_parameters *parameters, kope_g5_buffer *buffer) {

id<MTLDevice> metal_device = (__bridge id<MTLDevice>)device->metal.device;
MTLResourceOptions options = MTLResourceCPUCacheModeWriteCombined;
#ifdef KINC_APPLE_SOC
options |= MTLResourceStorageModeShared;
#else
if (gpuMemory) {
options |= MTLResourceStorageModeManaged;
}
else {
options |= MTLResourceStorageModeShared;
}
#endif
id<MTLBuffer> metal_buffer = [metal_device newBufferWithLength:parameters->size options:options];
buffer->metal.buffer = (__bridge_retained void *)metal_buffer;
}

void kope_metal_device_create_command_list(kope_g5_device *device, kope_g5_command_list_type type, kope_g5_command_list *list) {

id<MTLDevice> metal_device = (__bridge id<MTLDevice>)device->metal.device;
list->metal.queue = (__bridge_retained void *)[metal_device newCommandQueue];
}

void kope_metal_device_create_texture(kope_g5_device *device, const kope_g5_texture_parameters *parameters, kope_g5_texture *texture) {
Expand Down
3 changes: 2 additions & 1 deletion Backends/Graphics5/Metal/Sources/kope/metal/device_structs.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ extern "C" {
#define KOPE_METAL_FRAME_COUNT 2

typedef struct kope_metal_device {
int nothing;
void *device;
void *library;
} kope_metal_device;

typedef struct kope_metal_query_set {
Expand Down
2 changes: 1 addition & 1 deletion Backends/Graphics5/Metal/Sources/kope/metal/metalunit.m
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

#include <assert.h>


#import <MetalKit/MTKView.h>

#include "buffer.m"
#include "commandlist.m"
Expand Down
23 changes: 21 additions & 2 deletions Backends/System/macOS/Sources/kinc/backend/BasicOpenGLView.m.h
Original file line number Diff line number Diff line change
Expand Up @@ -419,14 +419,27 @@ static bool controlKeyMouseButton = false;
}
#else

static CAMetalLayer *metalLayer = NULL;

- (id)initWithFrame:(NSRect)frameRect {
self = [super initWithFrame:frameRect];

#ifdef KOPE
metalLayer = (CAMetalLayer *)self.layer;

//metalLayer.device = device;
metalLayer.pixelFormat = MTLPixelFormatBGRA8Unorm;
metalLayer.framebufferOnly = YES;
// metalLayer.presentsWithTransaction = YES;

metalLayer.opaque = YES;
metalLayer.backgroundColor = nil;
#else
device = MTLCreateSystemDefaultDevice();
commandQueue = [device newCommandQueue];
library = [device newDefaultLibrary];

CAMetalLayer *metalLayer = (CAMetalLayer *)self.layer;
metalLayer = (CAMetalLayer *)self.layer;

metalLayer.device = device;
metalLayer.pixelFormat = MTLPixelFormatBGRA8Unorm;
Expand All @@ -435,7 +448,8 @@ static bool controlKeyMouseButton = false;

metalLayer.opaque = YES;
metalLayer.backgroundColor = nil;

#endif

return self;
}
#endif
Expand Down Expand Up @@ -472,6 +486,11 @@ static bool controlKeyMouseButton = false;
- (id<MTLCommandQueue>)metalQueue {
return commandQueue;
}

CAMetalLayer *get_metal_layer(void) {
return metalLayer;
}

#endif

@end
Expand Down

0 comments on commit 40ee48b

Please sign in to comment.