43
43
static dispatch_semaphore_t vsyncSema = NULL ;
44
44
45
45
@interface OpenGLView : NSOpenGLView
46
+ #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 140000
46
47
@property (nonatomic , strong ) CADisplayLink *displayLink;
48
+ #endif
47
49
@end
48
50
51
+ #if __MAC_OS_X_VERSION_MIN_REQUIRED < 140000
52
+ static CVDisplayLinkRef cvDisplayLink = NULL ;
53
+ static CVReturn DisplayLinkCallback (CVDisplayLinkRef displayLink,
54
+ const CVTimeStamp *now,
55
+ const CVTimeStamp *outputTime,
56
+ CVOptionFlags flagsIn,
57
+ CVOptionFlags *flagsOut,
58
+ void *displayLinkContext);
59
+ #endif
49
60
@implementation OpenGLView
50
61
- (BOOL )acceptsFirstResponder
51
62
{
@@ -54,10 +65,14 @@ - (BOOL)acceptsFirstResponder
54
65
- (void )createDisplayLink
55
66
{
56
67
vsyncSema = dispatch_semaphore_create (0 );
57
- self.displayLink = [self displayLinkWithTarget: self
58
- selector: @selector (waitVSync )];
59
- [self .displayLink addToRunLoop: [NSRunLoop currentRunLoop ]
60
- forMode: NSDefaultRunLoopMode ];
68
+ #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 140000
69
+ self.displayLink = [self displayLinkWithTarget: self selector: @selector (waitVSync )];
70
+ [self .displayLink addToRunLoop: [NSRunLoop currentRunLoop ] forMode: NSDefaultRunLoopMode ];
71
+ #else
72
+ CVDisplayLinkCreateWithActiveCGDisplays (&cvDisplayLink);
73
+ CVDisplayLinkSetOutputCallback (cvDisplayLink, &DisplayLinkCallback, (__bridge void *)self);
74
+ CVDisplayLinkStart (cvDisplayLink);
75
+ #endif
61
76
}
62
77
63
78
- (void )waitVSync
@@ -67,14 +82,33 @@ - (void)waitVSync
67
82
68
83
- (void )dealloc
69
84
{
70
- [self .displayLink invalidate ];
71
- self.displayLink = nil ;
85
+ #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 140000
86
+ [self .displayLink invalidate ];
87
+ self.displayLink = nil ;
88
+ #else
89
+ CVDisplayLinkStop (cvDisplayLink);
90
+ CVDisplayLinkRelease (cvDisplayLink);
91
+ #endif
72
92
dispatch_release (vsyncSema);
73
93
[super dealloc ];
74
94
}
75
95
76
96
@end
77
97
98
+ #if __MAC_OS_X_VERSION_MIN_REQUIRED < 140000
99
+ static CVReturn DisplayLinkCallback (CVDisplayLinkRef displayLink,
100
+ const CVTimeStamp *now,
101
+ const CVTimeStamp *outputTime,
102
+ CVOptionFlags flagsIn,
103
+ CVOptionFlags *flagsOut,
104
+ void *displayLinkContext)
105
+ {
106
+ OpenGLView *self = (__bridge OpenGLView *)displayLinkContext;
107
+ [self waitVSync ];
108
+ return kCVReturnSuccess ;
109
+ }
110
+ #endif
111
+
78
112
extern char **_NSGetProgname (void );
79
113
80
114
static void create_menu_bar (void )
0 commit comments