2023-01-05 13:25:55 +01:00
/**************************************************************************/
/* godot_main_macos.mm */
/**************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/**************************************************************************/
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
/* "Software"), to deal in the Software without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of the Software, and to */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions: */
/* */
/* The above copyright notice and this permission notice shall be */
/* included in all copies or substantial portions of the Software. */
/* */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/**************************************************************************/
2018-01-05 00:50:27 +01:00
2022-07-20 08:28:22 +02:00
#include "os_macos.h"
2017-04-09 14:18:49 +02:00
2023-06-08 14:51:32 +02:00
#include "main/main.h"
2014-02-10 02:10:30 +01:00
#include <string.h>
#include <unistd.h>
2022-04-01 12:15:35 +02:00
#if defined(SANITIZERS_ENABLED)
#include <sys/resource.h>
#endif
2017-04-09 14:18:49 +02:00
int main(int argc, char **argv) {
2019-06-22 18:34:26 +02:00
#if defined(VULKAN_ENABLED)
2024-07-04 20:03:15 +02:00
setenv("MVK_CONFIG_FULL_IMAGE_VIEW_SWIZZLE", "1", 1); // MoltenVK - enable full component swizzling support.
setenv("MVK_CONFIG_SWAPCHAIN_MIN_MAG_FILTER_USE_NEAREST", "0", 1); // MoltenVK - use linear surface scaling. TODO: remove when full DPI scaling is implemented.
2019-06-22 18:34:26 +02:00
#endif
2022-04-01 12:15:35 +02:00
#if defined(SANITIZERS_ENABLED)
// Note: Set stack size to be at least 30 MB (vs 8 MB default) to avoid overflow, address sanitizer can increase stack usage up to 3 times.
struct rlimit stack_lim = { 0x1E00000, 0x1E00000 };
setrlimit(RLIMIT_STACK, &stack_lim);
#endif
2016-04-29 15:45:31 +02:00
int first_arg = 1;
2017-04-09 14:18:49 +02:00
const char *dbg_arg = "-NSDocumentRevisionsDebugMode";
for (int i = 0; i < argc; i++) {
2022-01-26 10:01:27 +01:00
if (strcmp(dbg_arg, argv[i]) == 0) {
2017-04-09 14:18:49 +02:00
first_arg = i + 2;
2022-01-26 10:01:27 +01:00
}
2022-02-16 13:56:32 +01:00
}
2014-02-10 02:10:30 +01:00
2022-07-20 08:28:22 +02:00
OS_MacOS os;
2018-01-12 15:38:19 +01:00
Error err;
2022-01-26 10:01:27 +01:00
// We must override main when testing is enabled.
2020-07-20 18:35:34 +02:00
TEST_MAIN_OVERRIDE
2024-02-01 21:06:53 +01:00
@autoreleasepool {
err = Main::setup(argv[0], argc - first_arg, &argv[first_arg]);
}
2014-02-10 02:10:30 +01:00
2024-03-06 18:50:35 +01:00
if (err != OK) {
if (err == ERR_HELP) { // Returned by --help and --version, so success.
return EXIT_SUCCESS;
}
return EXIT_FAILURE;
2022-01-26 10:01:27 +01:00
}
2014-02-10 02:10:30 +01:00
2024-03-06 18:50:35 +01:00
int ret;
2024-02-01 21:06:53 +01:00
@autoreleasepool {
2024-03-06 18:50:35 +01:00
ret = Main::start();
2024-02-01 21:06:53 +01:00
}
2024-03-24 17:08:25 +01:00
if (ret == EXIT_SUCCESS) {
2024-03-06 18:50:35 +01:00
os.run();
} else {
os.set_exit_code(EXIT_FAILURE);
2022-01-26 10:01:27 +01:00
}
2017-04-09 14:18:49 +02:00
2024-02-01 21:06:53 +01:00
@autoreleasepool {
Main::cleanup();
}
2014-02-10 02:10:30 +01:00
2018-03-26 15:55:57 +02:00
return os.get_exit_code();
2022-02-16 13:56:32 +01:00
}