aboutsummaryrefslogtreecommitdiff
path: root/sokol_app.h
diff options
context:
space:
mode:
authorAndre Weissflog <floooh@gmail.com>2021-05-03 18:49:01 +0200
committerAndre Weissflog <floooh@gmail.com>2021-05-03 18:49:01 +0200
commit99d7d888799d436d0c088d249622f72b0a71c86c (patch)
tree380e06ce300ec2060cc47ecd38ce6c23b8ad5863 /sokol_app.h
parent16cf91a1e4ecadf524341f157a30060a8bd95231 (diff)
Revert "sokol_app.h: start ditching MTKView, use CAMetalLayer directly"
This reverts commit 16cf91a1e4ecadf524341f157a30060a8bd95231.
Diffstat (limited to 'sokol_app.h')
-rw-r--r--sokol_app.h110
1 files changed, 21 insertions, 89 deletions
diff --git a/sokol_app.h b/sokol_app.h
index 9c54b740..796353ff 100644
--- a/sokol_app.h
+++ b/sokol_app.h
@@ -1870,10 +1870,7 @@ inline void sapp_run(const sapp_desc& desc) { return sapp_run(&desc); }
@property uint32_t win_id;
@end
#if defined(SOKOL_METAL)
- @interface _sapp_macos_metal_view : NSView<CALayerDelegate>
- @property (nonatomic, readonly) CAMetalLayer *metal_layer;
- @end
- @interface _sapp_macos_view : _sapp_macos_metal_view
+ @interface _sapp_macos_view : MTKView
@property uint32_t win_id;
@end
#elif defined(SOKOL_GLCORE33)
@@ -1890,10 +1887,6 @@ typedef struct {
NSTrackingArea* tracking_area;
uint32_t flags_changed_store;
uint8_t mouse_buttons;
- #if defined(SOKOL_METAL)
- MTLRenderPassDescriptor* renderpass_desc;
- id<CAMetalDrawable> current_drawable;
- #endif
} _sapp_macos_window_t;
typedef struct {
@@ -1901,7 +1894,7 @@ typedef struct {
#if defined(SOKOL_METAL)
id<MTLDevice> mtl_device;
#endif
- dispatch_source_t dispatch_source;
+ dispatch_source_t display_source;
CVDisplayLinkRef display_link;
} _sapp_macos_t;
@@ -3318,7 +3311,6 @@ _SOKOL_PRIVATE void _sapp_macos_init_state(void) {
_SOKOL_PRIVATE void _sapp_macos_discard_state(void) {
CVDisplayLinkStop(_sapp.macos.display_link);
CVDisplayLinkRelease(_sapp.macos.display_link);
- dispatch_source_cancel(_sapp.macos.dispatch_source);
_sapp.macos.display_link = nil;
// NOTE: it's safe to call [release] on a nil object
_SAPP_OBJC_RELEASE(_sapp.macos.app_delegate);
@@ -3412,13 +3404,9 @@ _SOKOL_PRIVATE bool _sapp_macos_create_window(_sapp_window_t* win) {
win->macos.delegate.win_id = win->slot.id;
win->macos.window.delegate = win->macos.delegate;
#if defined(SOKOL_METAL)
- win->macos.view = [[_sapp_macos_view alloc] initWithFrame:window_rect];
+ win->macos.view = [[_sapp_macos_view alloc] init];
win->macos.view.win_id = win->slot.id;
- win->macos.view.metal_layer.device = _sapp.macos.mtl_device;
- win->macos.view.metal_layer.pixelFormat = MTLPixelFormatBGRA8Unorm;
- win->macos.view.metal_layer.maximumDrawableCount = 2;
[win->macos.view updateTrackingAreas];
- /*
win->macos.view.preferredFramesPerSecond = 60 / win->desc.swap_interval;
win->macos.view.paused = YES;
win->macos.view.enableSetNeedsDisplay = NO;
@@ -3427,13 +3415,9 @@ _SOKOL_PRIVATE bool _sapp_macos_create_window(_sapp_window_t* win) {
win->macos.view.depthStencilPixelFormat = MTLPixelFormatDepth32Float_Stencil8;
win->macos.view.sampleCount = (NSUInteger) win->desc.sample_count;
win->macos.view.autoResizeDrawable = false;
- */
win->macos.window.contentView = win->macos.view;
[win->macos.window makeFirstResponder:win->macos.view];
- //win->macos.view.layer.magnificationFilter = kCAFilterNearest;
-
- win->macos.renderpass_desc = [MTLRenderPassDescriptor new];
- win->macos.renderpass_desc.colorAttachments[0].storeAction = MTLStoreActionStore;
+ win->macos.view.layer.magnificationFilter = kCAFilterNearest;
#elif defined(SOKOL_GLCORE33)
NSOpenGLPixelFormatAttribute attrs[32];
int i = 0;
@@ -3493,7 +3477,6 @@ _SOKOL_PRIVATE bool _sapp_macos_create_window(_sapp_window_t* win) {
_SOKOL_PRIVATE void _sapp_macos_destroy_window(_sapp_window_t* win) {
SOKOL_ASSERT(win);
// NOTE: it's safe to call [release] on a nil object
- _SAPP_OBJC_RELEASE(win->macos.renderpass_desc);
_SAPP_OBJC_RELEASE(win->macos.tracking_area);
_SAPP_OBJC_RELEASE(win->macos.delegate);
_SAPP_OBJC_RELEASE(win->macos.view);
@@ -3604,7 +3587,7 @@ _SOKOL_PRIVATE void _sapp_macos_update_dimensions(_sapp_window_t* win) {
*/
#if defined(SOKOL_METAL)
CGSize drawable_size = { (CGFloat) win->framebuffer_width, (CGFloat) win->framebuffer_height };
-// win->macos.view.drawableSize = drawable_size;
+ win->macos.view.drawableSize = drawable_size;
#endif
}
@@ -3757,26 +3740,6 @@ _SOKOL_PRIVATE CVReturn _sapp_macos_displaylink_callback(
return kCVReturnSuccess;
}
-_SOKOL_PRIVATE const void* _sapp_macos_metal_renderpass_descriptor(_sapp_window_t* win) {
- SOKOL_ASSERT(win);
- SOKOL_ASSERT(nil == win->macos.current_drawable);
-static uint32_t frame_count = 0;
-__builtin_printf("%d: before nextDrawable %p\n", frame_count, win);
- win->macos.current_drawable = [win->macos.view.metal_layer nextDrawable];
-__builtin_printf("%d: after nextDrawable %p\n", frame_count++, win);
- win->macos.renderpass_desc.colorAttachments[0].texture = win->macos.current_drawable.texture;
- return (__bridge const void*) win->macos.renderpass_desc;
-}
-
-_SOKOL_PRIVATE const void* _sapp_macos_metal_drawable(_sapp_window_t* win) {
- SOKOL_ASSERT(win);
- SOKOL_ASSERT(nil != win->macos.current_drawable);
- const void* drawable = (__bridge const void*) win->macos.current_drawable;
- // current_drawable is autoreleased at end of frame
- win->macos.current_drawable = nil;
- return drawable;
-}
-
@implementation _sapp_macos_app_delegate
- (void)drawFrame {
@@ -3786,7 +3749,7 @@ _SOKOL_PRIVATE const void* _sapp_macos_metal_drawable(_sapp_window_t* win) {
_sapp_window_t* win = _sapp_lookup_window(win_id);
if (win) {
#if defined(SOKOL_METAL)
- //[win->macos.view draw];
+ [win->macos.view draw];
#else
#error "FIXME: GL"
#endif
@@ -3818,16 +3781,16 @@ _SOKOL_PRIVATE const void* _sapp_macos_metal_drawable(_sapp_window_t* win) {
// setup display link
// see: https://developer.apple.com/documentation/metal/drawable_objects/creating_a_custom_metal_view?language=objc
- _sapp.macos.dispatch_source = dispatch_source_create(DISPATCH_SOURCE_TYPE_DATA_ADD, 0, 0, dispatch_get_main_queue());
- dispatch_source_set_event_handler(_sapp.macos.dispatch_source, ^(){
+ _sapp.macos.display_source = dispatch_source_create(DISPATCH_SOURCE_TYPE_DATA_ADD, 0, 0, dispatch_get_main_queue());
+ dispatch_source_set_event_handler(_sapp.macos.display_source, ^(){
@autoreleasepool {
[_sapp.macos.app_delegate drawFrame];
}
});
- dispatch_resume(_sapp.macos.dispatch_source);
+ dispatch_resume(_sapp.macos.display_source);
CVDisplayLinkCreateWithActiveCGDisplays(&_sapp.macos.display_link);
- CVDisplayLinkSetOutputCallback(_sapp.macos.display_link, &_sapp_macos_displaylink_callback, (__bridge void*)_sapp.macos.dispatch_source);
+ CVDisplayLinkSetOutputCallback(_sapp.macos.display_link, &_sapp_macos_displaylink_callback, (__bridge void*)_sapp.macos.display_source);
CGDirectDisplayID disp_id = (CGDirectDisplayID) [NSScreen.mainScreen.deviceDescription[@"NSScreenNumber"] unsignedIntegerValue];
CVDisplayLinkSetCurrentCGDisplay(_sapp.macos.display_link, disp_id);
CVDisplayLinkStart(_sapp.macos.display_link);
@@ -3847,7 +3810,7 @@ _SOKOL_PRIVATE const void* _sapp_macos_metal_drawable(_sapp_window_t* win) {
@end
@implementation _sapp_macos_window_delegate
-//@synthesize win_id;
+@synthesize win_id;
- (BOOL)windowShouldClose:(id)sender {
_SOKOL_UNUSED(sender);
@@ -3918,6 +3881,7 @@ _SOKOL_PRIVATE const void* _sapp_macos_metal_drawable(_sapp_window_t* win) {
@end
@implementation _sapp_macos_window
+@synthesize win_id;
- (instancetype)initWithContentRect:(NSRect)contentRect
styleMask:(NSWindowStyleMask)style
@@ -3974,44 +3938,8 @@ _SOKOL_PRIVATE const void* _sapp_macos_metal_drawable(_sapp_window_t* win) {
}
@end
-@implementation _sapp_macos_metal_view
-
-- (instancetype) initWithFrame:(CGRect)frame {
- self = [super initWithFrame:frame];
- if (self) {
- self.wantsLayer = YES;
- self.layerContentsRedrawPolicy = NSViewLayerContentsRedrawDuringViewResize;
- _metal_layer = (CAMetalLayer*) self.layer;
- self.layer.delegate = self;
- }
- return self;
-}
-
-- (CALayer*)makeBackingLayer {
- return [CAMetalLayer layer];
-}
-
-- (void)viewDidMoveToWindow {
- // fixme: resize drawable
-}
-
-- (void)viewDidChangeBackingProperties {
- [super viewDidChangeBackingProperties];
-// [self resizeDrawable:self.window.screen.backingScaleFactor];
-}
-
-- (void)setFrameSize:(NSSize)size {
- [super setFrameSize:size];
-// [self resizeDrawable:self.window.screen.backingScaleFactor];
-}
-
-- (void)setBoundsSize:(NSSize)size {
- [super setBoundsSize:size];
-// [self resizeDrawable:self.window.screen.backingScaleFactor];
-}
-@end
-
@implementation _sapp_macos_view
+@synthesize win_id;
#if defined(SOKOL_GLCORE33)
/* NOTE: this is a hack/fix when the initial window size has been clipped by
@@ -11776,13 +11704,15 @@ SOKOL_API_IMPL const void* sapp_metal_get_device(void) {
SOKOL_API_IMPL const void* sapp_metal_get_window_renderpass_descriptor(sapp_window window) {
SOKOL_ASSERT(_sapp.valid);
#if defined(SOKOL_METAL)
- _sapp_window_t* win = _sapp_lookup_window(window.id);
+ const _sapp_window_t* win = _sapp_lookup_window(window.id);
if (win) {
#if defined(_SAPP_MACOS)
- return _sapp_macos_metal_renderpass_descriptor(win);
+ const void* obj = (__bridge const void*) [win->macos.view currentRenderPassDescriptor];
#else
const void* obj = (__bridge const void*) [_sapp.window.ios.view currentRenderPassDescriptor];
#endif
+ SOKOL_ASSERT(obj);
+ return obj;
}
else {
return 0;
@@ -11799,13 +11729,15 @@ SOKOL_API_IMPL const void* sapp_metal_get_renderpass_descriptor(void) {
SOKOL_API_IMPL const void* sapp_metal_get_window_drawable(sapp_window window) {
SOKOL_ASSERT(_sapp.valid);
#if defined(SOKOL_METAL)
- _sapp_window_t* win = _sapp_lookup_window(window.id);
+ const _sapp_window_t* win = _sapp_lookup_window(window.id);
if (win) {
#if defined(_SAPP_MACOS)
- return _sapp_macos_metal_drawable(win);
+ const void* obj = (__bridge const void*) [win->macos.view currentDrawable];
#else
const void* obj = (__bridge const void*) [_sapp.window.ios.view currentDrawable];
#endif
+ SOKOL_ASSERT(obj);
+ return obj;
}
else {
return 0;