mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-29 07:12:36 +00:00
- set default magnification filter for Metal layer to nearest
Magnification filter is applied to swapchain image when it's copied to a physical display surface This is needed for gfx-portability because MoltenVK uses nearest sampling by default
This commit is contained in:
parent
3c0ff178fd
commit
d9dcc26dc6
2 changed files with 18 additions and 3 deletions
|
@ -1482,8 +1482,14 @@ if( ZD_CMAKE_COMPILER_IS_GNUCXX_COMPATIBLE )
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if( APPLE )
|
if( APPLE )
|
||||||
|
set( LINK_FRAMEWORKS "-framework Cocoa -framework IOKit -framework OpenGL")
|
||||||
|
|
||||||
|
if( HAVE_VULKAN )
|
||||||
|
set( LINK_FRAMEWORKS "${LINK_FRAMEWORKS} -framework QuartzCore" )
|
||||||
|
endif()
|
||||||
|
|
||||||
set_target_properties(zdoom PROPERTIES
|
set_target_properties(zdoom PROPERTIES
|
||||||
LINK_FLAGS "-framework Cocoa -framework IOKit -framework OpenGL"
|
LINK_FLAGS "${LINK_FRAMEWORKS}"
|
||||||
MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/posix/osx/zdoom-info.plist" )
|
MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/posix/osx/zdoom-info.plist" )
|
||||||
|
|
||||||
# Dymanic libraries like libvulkan.dylib or libMoltenVK.dylib will be loaded by dlopen()
|
# Dymanic libraries like libvulkan.dylib or libMoltenVK.dylib will be loaded by dlopen()
|
||||||
|
|
|
@ -925,6 +925,15 @@ bool I_GetVulkanPlatformExtensions(unsigned int *count, const char **names)
|
||||||
|
|
||||||
bool I_CreateVulkanSurface(VkInstance instance, VkSurfaceKHR *surface)
|
bool I_CreateVulkanSurface(VkInstance instance, VkSurfaceKHR *surface)
|
||||||
{
|
{
|
||||||
|
NSView *const view = CocoaVideo::GetWindow().contentView;
|
||||||
|
CALayer *const layer = view.layer;
|
||||||
|
|
||||||
|
// Set magnification filter for swapchain image when it's copied to a physical display surface
|
||||||
|
// This is needed for gfx-portability because MoltenVK uses preferred nearest sampling by default
|
||||||
|
const char *const magFilterEnv = getenv("MVK_CONFIG_SWAPCHAIN_MAG_FILTER_USE_NEAREST");
|
||||||
|
const bool useNearestFilter = magFilterEnv == nullptr || strtol(magFilterEnv, nullptr, 0) != 0;
|
||||||
|
layer.magnificationFilter = useNearestFilter ? kCAFilterNearest : kCAFilterLinear;
|
||||||
|
|
||||||
if (vkCreateMetalSurfaceEXT)
|
if (vkCreateMetalSurfaceEXT)
|
||||||
{
|
{
|
||||||
// Preferred surface creation path
|
// Preferred surface creation path
|
||||||
|
@ -932,7 +941,7 @@ bool I_CreateVulkanSurface(VkInstance instance, VkSurfaceKHR *surface)
|
||||||
surfaceCreateInfo.sType = VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT;
|
surfaceCreateInfo.sType = VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT;
|
||||||
surfaceCreateInfo.pNext = nullptr;
|
surfaceCreateInfo.pNext = nullptr;
|
||||||
surfaceCreateInfo.flags = 0;
|
surfaceCreateInfo.flags = 0;
|
||||||
surfaceCreateInfo.pLayer = static_cast<CAMetalLayer*>(CocoaVideo::GetWindow().contentView.layer);
|
surfaceCreateInfo.pLayer = static_cast<CAMetalLayer*>(layer);
|
||||||
|
|
||||||
const VkResult result = vkCreateMetalSurfaceEXT(instance, &surfaceCreateInfo, nullptr, surface);
|
const VkResult result = vkCreateMetalSurfaceEXT(instance, &surfaceCreateInfo, nullptr, surface);
|
||||||
return result == VK_SUCCESS;
|
return result == VK_SUCCESS;
|
||||||
|
@ -943,7 +952,7 @@ bool I_CreateVulkanSurface(VkInstance instance, VkSurfaceKHR *surface)
|
||||||
windowCreateInfo.sType = VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK;
|
windowCreateInfo.sType = VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK;
|
||||||
windowCreateInfo.pNext = nullptr;
|
windowCreateInfo.pNext = nullptr;
|
||||||
windowCreateInfo.flags = 0;
|
windowCreateInfo.flags = 0;
|
||||||
windowCreateInfo.pView = [CocoaVideo::GetWindow() contentView];
|
windowCreateInfo.pView = view;
|
||||||
|
|
||||||
const VkResult result = vkCreateMacOSSurfaceMVK(instance, &windowCreateInfo, nullptr, surface);
|
const VkResult result = vkCreateMacOSSurfaceMVK(instance, &windowCreateInfo, nullptr, surface);
|
||||||
return result == VK_SUCCESS;
|
return result == VK_SUCCESS;
|
||||||
|
|
Loading…
Reference in a new issue