Skip to content

Commit 2de3e02

Browse files
committed
Fixed issue with MTLLibrary being created twice
Technically a memory leak.
1 parent 04a771d commit 2de3e02

5 files changed

Lines changed: 31 additions & 1 deletion

File tree

backends/gpu/metal/sources/device.m

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,13 +124,20 @@ static void set_next_fence(kore_gpu_device *device, void *fence) {
124124

125125
void kore_metal_device_create(kore_gpu_device *device, const kore_gpu_device_wishlist *wishlist) {
126126
id<MTLDevice> metal_device = getMetalLayer().device;
127+
id<MTLLibrary> metal_library = nil;
127128

128129
if (metal_device == nil) {
129130
metal_device = MTLCreateSystemDefaultDevice();
131+
metal_library = [metal_device newDefaultLibrary];
132+
} else {
133+
metal_library = getMetalLibrary();
134+
if (metal_library == nil) {
135+
metal_library = [metal_device newDefaultLibrary];
136+
}
130137
}
131138

132139
device->metal.device = (__bridge_retained void *)metal_device;
133-
device->metal.library = (__bridge_retained void *)[metal_device newDefaultLibrary];
140+
device->metal.library = (__bridge_retained void *)metal_library;
134141

135142
create_execution_fence(device);
136143
}

backends/gpu/metal/sources/metalunit.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@
1111
static id<CAMetalDrawable> drawable = nil;
1212

1313
CAMetalLayer *getMetalLayer(void);
14+
id getMetalDevice(void);
15+
id getMetalLibrary(void);
16+
17+
id kore_metal_create_library(id<MTLDevice> device);
1418

1519
static MTLPixelFormat convert_format(kore_gpu_texture_format format) {
1620
switch (format) {

backends/system/macos/includes/kore3/backend/BasicOpenGLView.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ struct kore_g5_render_target;
3737

3838
#ifdef KORE_METAL
3939
- (CAMetalLayer *)metalLayer;
40+
- (id<MTLDevice>)metalDevice;
41+
- (id<MTLLibrary>)metalLibrary;
4042

4143
- (void)updateDrawableSize;
4244
#else

backends/system/macos/sources/BasicOpenGLView.m

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,7 @@ - (id)initWithFrame:(NSRect)frameRect {
440440

441441
if (self->device == nil) {
442442
self->device = MTLCreateSystemDefaultDevice();
443+
self->library = [self->device newDefaultLibrary];
443444
}
444445

445446
self.wantsLayer = YES;
@@ -488,6 +489,14 @@ - (void)setFrame:(NSRect)frame {
488489
- (CAMetalLayer *)metalLayer {
489490
return (CAMetalLayer *)self.layer;
490491
}
492+
493+
- (id<MTLDevice>)metalDevice {
494+
return device;
495+
}
496+
497+
- (id<MTLLibrary>)metalLibrary {
498+
return library;
499+
}
491500
#endif
492501

493502
- (BOOL)acceptsFirstResponder {

backends/system/macos/sources/system.m

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,14 @@ - (void)windowDidBecomeMain:(NSNotification *)notification;
6666
return [view metalLayer];
6767
}
6868

69+
id getMetalDevice(void) {
70+
return [view metalDevice];
71+
}
72+
73+
id getMetalLibrary(void) {
74+
return [view metalLibrary];
75+
}
76+
6977
static CVReturn displayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeStamp *now, const CVTimeStamp *outputTime, CVOptionFlags flagsIn,
7078
CVOptionFlags *flagsOut, void *displayLinkContext) {
7179

0 commit comments

Comments
 (0)