mirror of
https://github.com/glfw/glfw.git
synced 2024-11-26 06:14:35 +00:00
NSGL: Update current display for display link
This solution of one display link per window is far from ideal but is still better than no solution. As a side-effect this fixes swap interval breaking being ignored for occluded windows on earlier versions of macOS. Fixes #680. Fixes #1337. Related to #1417. Fixes #1435.
This commit is contained in:
parent
f8bcc7e65c
commit
8d7e5cdb49
@ -32,8 +32,6 @@
|
|||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#include <IOKit/graphics/IOGraphicsLib.h>
|
#include <IOKit/graphics/IOGraphicsLib.h>
|
||||||
#include <CoreVideo/CVBase.h>
|
|
||||||
#include <CoreVideo/CVDisplayLink.h>
|
|
||||||
#include <ApplicationServices/ApplicationServices.h>
|
#include <ApplicationServices/ApplicationServices.h>
|
||||||
|
|
||||||
|
|
||||||
|
@ -28,6 +28,9 @@
|
|||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
|
|
||||||
#include <Carbon/Carbon.h>
|
#include <Carbon/Carbon.h>
|
||||||
|
#include <CoreVideo/CVBase.h>
|
||||||
|
#include <CoreVideo/CVDisplayLink.h>
|
||||||
|
|
||||||
#if defined(__OBJC__)
|
#if defined(__OBJC__)
|
||||||
#import <Cocoa/Cocoa.h>
|
#import <Cocoa/Cocoa.h>
|
||||||
#else
|
#else
|
||||||
|
@ -338,6 +338,12 @@ static const NSRange kEmptyRange = { NSNotFound, 0 };
|
|||||||
_glfwInputWindowFocus(window, GLFW_FALSE);
|
_glfwInputWindowFocus(window, GLFW_FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)windowDidChangeScreen:(NSNotification *)notification
|
||||||
|
{
|
||||||
|
if (window->context.source == GLFW_NATIVE_CONTEXT_API)
|
||||||
|
_glfwUpdateDisplayLinkDisplayNSGL(window);
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
@ -27,8 +27,6 @@
|
|||||||
#define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextNSGL nsgl
|
#define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextNSGL nsgl
|
||||||
#define _GLFW_PLATFORM_LIBRARY_CONTEXT_STATE _GLFWlibraryNSGL nsgl
|
#define _GLFW_PLATFORM_LIBRARY_CONTEXT_STATE _GLFWlibraryNSGL nsgl
|
||||||
|
|
||||||
#import <CoreVideo/CoreVideo.h>
|
|
||||||
|
|
||||||
#include <stdatomic.h>
|
#include <stdatomic.h>
|
||||||
|
|
||||||
|
|
||||||
@ -61,4 +59,5 @@ GLFWbool _glfwCreateContextNSGL(_GLFWwindow* window,
|
|||||||
const _GLFWctxconfig* ctxconfig,
|
const _GLFWctxconfig* ctxconfig,
|
||||||
const _GLFWfbconfig* fbconfig);
|
const _GLFWfbconfig* fbconfig);
|
||||||
void _glfwDestroyContextNSGL(_GLFWwindow* window);
|
void _glfwDestroyContextNSGL(_GLFWwindow* window);
|
||||||
|
void _glfwUpdateDisplayLinkDisplayNSGL(_GLFWwindow* window);
|
||||||
|
|
||||||
|
@ -367,6 +367,8 @@ GLFWbool _glfwCreateContextNSGL(_GLFWwindow* window,
|
|||||||
|
|
||||||
[window->context.nsgl.object setView:window->ns.view];
|
[window->context.nsgl.object setView:window->ns.view];
|
||||||
|
|
||||||
|
window->context.nsgl.swapIntervalCond = [NSCondition new];
|
||||||
|
|
||||||
window->context.makeCurrent = makeContextCurrentNSGL;
|
window->context.makeCurrent = makeContextCurrentNSGL;
|
||||||
window->context.swapBuffers = swapBuffersNSGL;
|
window->context.swapBuffers = swapBuffersNSGL;
|
||||||
window->context.swapInterval = swapIntervalNSGL;
|
window->context.swapInterval = swapIntervalNSGL;
|
||||||
@ -378,16 +380,22 @@ GLFWbool _glfwCreateContextNSGL(_GLFWwindow* window,
|
|||||||
CVDisplayLinkSetOutputCallback(window->context.nsgl.displayLink,
|
CVDisplayLinkSetOutputCallback(window->context.nsgl.displayLink,
|
||||||
&displayLinkCallback,
|
&displayLinkCallback,
|
||||||
window);
|
window);
|
||||||
CVDisplayLinkSetCurrentCGDisplayFromOpenGLContext(window->context.nsgl.displayLink,
|
|
||||||
(CGLContextObj) window->context.nsgl.object,
|
|
||||||
(CGLPixelFormatObj) window->context.nsgl.pixelFormat);
|
|
||||||
CVDisplayLinkStart(window->context.nsgl.displayLink);
|
CVDisplayLinkStart(window->context.nsgl.displayLink);
|
||||||
|
|
||||||
window->context.nsgl.swapIntervalCond = [NSCondition new];
|
_glfwUpdateDisplayLinkDisplayNSGL(window);
|
||||||
|
|
||||||
return GLFW_TRUE;
|
return GLFW_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _glfwUpdateDisplayLinkDisplayNSGL(_GLFWwindow* window)
|
||||||
|
{
|
||||||
|
CGDirectDisplayID displayID =
|
||||||
|
[[[window->ns.object screen] deviceDescription][@"NSScreenNumber"] unsignedIntValue];
|
||||||
|
if (!displayID)
|
||||||
|
return;
|
||||||
|
|
||||||
|
CVDisplayLinkSetCurrentCGDisplay(window->context.nsgl.displayLink, displayID);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
////// GLFW native API //////
|
////// GLFW native API //////
|
||||||
|
Loading…
Reference in New Issue
Block a user