mirror of
https://github.com/RPCS3/rpcs3.git
synced 2024-11-25 04:02:42 +01:00
macOS moltenVK support and SIGBUS handling (#11252)
This commit is contained in:
parent
2f93df480b
commit
08333e0876
@ -1826,6 +1826,14 @@ const bool s_exception_handler_set = []() -> bool
|
|||||||
std::abort();
|
std::abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
if (::sigaction(SIGBUS, &sa, NULL) == -1)
|
||||||
|
{
|
||||||
|
std::fprintf(stderr, "sigaction(SIGBUS) failed (%d).\n", errno);
|
||||||
|
std::abort();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
sa.sa_handler = sigpipe_signaling_handler;
|
sa.sa_handler = sigpipe_signaling_handler;
|
||||||
if (::sigaction(SIGPIPE, &sa, NULL) == -1)
|
if (::sigaction(SIGPIPE, &sa, NULL) == -1)
|
||||||
{
|
{
|
||||||
|
@ -81,7 +81,9 @@ else()
|
|||||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -no-pie")
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -no-pie")
|
||||||
endif()
|
endif()
|
||||||
elseif(APPLE)
|
elseif(APPLE)
|
||||||
|
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
||||||
add_compile_options(-stdlib=libc++)
|
add_compile_options(-stdlib=libc++)
|
||||||
|
endif()
|
||||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-image_base,0x10000 -Wl,-pagezero_size,0x10000")
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-image_base,0x10000 -Wl,-pagezero_size,0x10000")
|
||||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-no_pie")
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-no_pie")
|
||||||
elseif(WIN32)
|
elseif(WIN32)
|
||||||
|
@ -681,8 +681,8 @@ namespace glsl
|
|||||||
"{\n"
|
"{\n"
|
||||||
" vec4 low = cl * 12.92;\n"
|
" vec4 low = cl * 12.92;\n"
|
||||||
" vec4 high = 1.055 * pow(cl, vec4(1. / 2.4)) - 0.055;\n"
|
" vec4 high = 1.055 * pow(cl, vec4(1. / 2.4)) - 0.055;\n"
|
||||||
" bvec4 select = lessThan(cl, vec4(0.0031308));\n"
|
" bvec4 selection = lessThan(cl, vec4(0.0031308));\n"
|
||||||
" return clamp(mix(high, low, select), 0., 1.);\n"
|
" return clamp(mix(high, low, selection), 0., 1.);\n"
|
||||||
"}\n\n";
|
"}\n\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,7 +29,9 @@ namespace vk
|
|||||||
case rsx::primitive_type::quad_strip:
|
case rsx::primitive_type::quad_strip:
|
||||||
return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
|
return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
|
||||||
case rsx::primitive_type::triangle_fan:
|
case rsx::primitive_type::triangle_fan:
|
||||||
|
#ifndef __APPLE__
|
||||||
return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN;
|
return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN;
|
||||||
|
#endif
|
||||||
case rsx::primitive_type::quads:
|
case rsx::primitive_type::quads:
|
||||||
case rsx::primitive_type::polygon:
|
case rsx::primitive_type::polygon:
|
||||||
requires_modification = true;
|
requires_modification = true;
|
||||||
|
@ -495,6 +495,14 @@ namespace vk
|
|||||||
enabled_features.occlusionQueryPrecise = VK_FALSE;
|
enabled_features.occlusionQueryPrecise = VK_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
if (!pgpu->features.logicOp)
|
||||||
|
{
|
||||||
|
rsx_log.error("Your GPU does not support framebuffer logical operations. Graphics may not render correctly.");
|
||||||
|
enabled_features.logicOp = VK_FALSE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
VkDeviceCreateInfo device = {};
|
VkDeviceCreateInfo device = {};
|
||||||
device.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
|
device.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
|
||||||
device.pNext = nullptr;
|
device.pNext = nullptr;
|
||||||
|
@ -49,7 +49,7 @@ DYNAMIC_IMPORT("ntdll.dll", NtSetTimerResolution, NTSTATUS(ULONG DesiredResoluti
|
|||||||
#include <sys/resource.h>
|
#include <sys/resource.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#if defined(__APPLE__) && defined(BLOCKS) // BLOCKS is required for dispatch_sync, but GCC-11 does not support it
|
||||||
#include <dispatch/dispatch.h>
|
#include <dispatch/dispatch.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -130,8 +130,9 @@ LOG_CHANNEL(q_debug, "QDEBUG");
|
|||||||
dlg.exec();
|
dlg.exec();
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#if defined(__APPLE__) && defined(BLOCKS) // BLOCKS is required for dispatch_sync, but GCC-11 does not support it
|
||||||
// Cocoa access is not allowed outside of the main thread
|
// Cocoa access is not allowed outside of the main thread
|
||||||
|
// Prevents crash dialogs from freezing the program
|
||||||
if (!pthread_main_np())
|
if (!pthread_main_np())
|
||||||
{
|
{
|
||||||
dispatch_sync(dispatch_get_main_queue(), ^ { show_report(text); });
|
dispatch_sync(dispatch_get_main_queue(), ^ { show_report(text); });
|
||||||
|
Loading…
Reference in New Issue
Block a user