diff --git a/src/xenia/app/premake5.lua b/src/xenia/app/premake5.lua index 192ee6fea..cd2a1cfb4 100644 --- a/src/xenia/app/premake5.lua +++ b/src/xenia/app/premake5.lua @@ -51,7 +51,7 @@ project("xenia-app") files({ "xenia_main.cc", "../base/main_"..platform_suffix..".cc", - "../base/main_entrypoint_"..platform_suffix..".cc", + "../base/main_init_"..platform_suffix..".cc", }) resincludedirs({ @@ -63,8 +63,8 @@ project("xenia-app") "main_resources.rc", }) - filter("files:../base/main_entrypoint_"..platform_suffix..".cc") - vectorextensions("IA32") -- Disable AVX so our AVX check/error can happen. + filter("files:../base/main_init_"..platform_suffix..".cc") + vectorextensions("IA32") -- Disable AVX for main_init_win.cc so our AVX check doesn't use AVX instructions. filter("platforms:Linux") links({ diff --git a/src/xenia/base/main_entrypoint_posix.cc b/src/xenia/base/main_entrypoint_posix.cc deleted file mode 100644 index b93b31502..000000000 --- a/src/xenia/base/main_entrypoint_posix.cc +++ /dev/null @@ -1,38 +0,0 @@ -/** - ****************************************************************************** - * Xenia : Xbox 360 Emulator Research Project * - ****************************************************************************** - * Copyright 2014 Ben Vanik. All rights reserved. * - * Released under the BSD license - see LICENSE in the root for more details. * - ****************************************************************************** - */ - -#include "xenia/base/main.h" - -#include - -#include "xenia/base/logging.h" -#include "xenia/base/string.h" - -extern "C" int main(int argc, char** argv) { - auto entry_info = xe::GetEntryInfo(); - - google::SetUsageMessage(std::string("usage: ") + - xe::to_string(entry_info.usage)); - google::SetVersionString("1.0"); - google::ParseCommandLineFlags(&argc, &argv, true); - - std::vector args; - for (int n = 0; n < argc; n++) { - args.push_back(xe::to_wstring(argv[n])); - } - - // Initialize logging. Needs parsed FLAGS. - xe::InitializeLogging(entry_info.name); - - // Call app-provided entry point. - int result = entry_info.entry_point(args); - - google::ShutDownCommandLineFlags(); - return result; -} diff --git a/src/xenia/base/main_entrypoint_win.cc b/src/xenia/base/main_entrypoint_win.cc deleted file mode 100644 index 9ec762d74..000000000 --- a/src/xenia/base/main_entrypoint_win.cc +++ /dev/null @@ -1,79 +0,0 @@ -/** - ****************************************************************************** - * Xenia : Xbox 360 Emulator Research Project * - ****************************************************************************** - * Copyright 2014 Ben Vanik. All rights reserved. * - * Released under the BSD license - see LICENSE in the root for more details. * - ****************************************************************************** - */ - -#include "xenia/base/main.h" - -#include -#include -#include - -#include - -// Autogenerated by `xb premake`. -#include "build/version.h" - -#include "xenia/base/platform_win.h" -#include "xenia/base/string.h" - -#include "third_party/xbyak/xbyak/xbyak_util.h" - -namespace xe { -void AttachConsole(); -int Main(); -}; // namespace xe - -// Used in console mode apps; automatically picked based on subsystem. -int main(int, char**) { - Xbyak::util::Cpu cpu; - if (!cpu.has(Xbyak::util::Cpu::tAVX)) { - printf( - "Your CPU does not support AVX, which is required by Xenia.\r\nSee the " - "FAQ for system requirements at https://xenia.jp\r\n"); - return -1; - } - return xe::Main(); -} - -// Used in windowed apps; automatically picked based on subsystem. -int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int) { - Xbyak::util::Cpu cpu; - if (!cpu.has(Xbyak::util::Cpu::tAVX)) { - MessageBoxA( - NULL, - "Your CPU does not support AVX, which is required by Xenia. See the " - "FAQ for system requirements at https://xenia.jp", - "Xenia Error", MB_OK | MB_ICONERROR | MB_APPLMODAL | MB_SETFOREGROUND); - return -1; - } - - // Attach a console so we can write output to stdout. If the user hasn't - // redirected output themselves it'll pop up a window. - xe::AttachConsole(); - - // Run normal entry point. - return xe::Main(); -} - -#if defined _M_IX86 -#pragma comment( \ - linker, \ - "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"") // NOLINT(whitespace/line_length) -#elif defined _M_IA64 -#pragma comment( \ - linker, \ - "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"") // NOLINT(whitespace/line_length) -#elif defined _M_X64 -#pragma comment( \ - linker, \ - "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"") // NOLINT(whitespace/line_length) -#else -#pragma comment( \ - linker, \ - "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") // NOLINT(whitespace/line_length) -#endif diff --git a/src/xenia/base/main_init_win.cc b/src/xenia/base/main_init_win.cc new file mode 100644 index 000000000..e6b0c9c59 --- /dev/null +++ b/src/xenia/base/main_init_win.cc @@ -0,0 +1,40 @@ +/** + ****************************************************************************** + * Xenia : Xbox 360 Emulator Research Project * + ****************************************************************************** + * Copyright 2014 Ben Vanik. All rights reserved. * + * Released under the BSD license - see LICENSE in the root for more details. * + ****************************************************************************** + */ + +#include "xenia/base/main.h" + +#include + +#include "third_party/xbyak/xbyak/xbyak_util.h" + +class StartupAvxCheck { + public: + StartupAvxCheck() { + Xbyak::util::Cpu cpu; + if (cpu.has(Xbyak::util::Cpu::tAVX)) { + return; + } + // TODO(gibbed): detect app type and printf instead, if needed? + MessageBoxA( + nullptr, + "Your CPU does not support AVX, which is required by Xenia. See the " + "FAQ for system requirements at https://xenia.jp", + "Xenia Error", MB_OK | MB_ICONERROR | MB_SETFOREGROUND); + ExitProcess(static_cast(-1)); + } +}; + +// This is a hack to get an instance of StartupAvxCheck +// constructed before any initialization code, +// where the AVX check then happens in the constructor. +// +// https://docs.microsoft.com/en-us/cpp/preprocessor/init-seg +#pragma warning(suppress : 4073) +#pragma init_seg(lib) +static StartupAvxCheck gStartupAvxCheck; diff --git a/src/xenia/base/main_posix.cc b/src/xenia/base/main_posix.cc index 0a7d75521..55dfae745 100644 --- a/src/xenia/base/main_posix.cc +++ b/src/xenia/base/main_posix.cc @@ -19,3 +19,26 @@ namespace xe { bool has_console_attached() { return true; } } // namespace xe + +extern "C" int main(int argc, char** argv) { + auto entry_info = xe::GetEntryInfo(); + + google::SetUsageMessage(std::string("usage: ") + + xe::to_string(entry_info.usage)); + google::SetVersionString("1.0"); + google::ParseCommandLineFlags(&argc, &argv, true); + + std::vector args; + for (int n = 0; n < argc; n++) { + args.push_back(xe::to_wstring(argv[n])); + } + + // Initialize logging. Needs parsed FLAGS. + xe::InitializeLogging(entry_info.name); + + // Call app-provided entry point. + int result = entry_info.entry_point(args); + + google::ShutDownCommandLineFlags(); + return result; +} diff --git a/src/xenia/base/main_win.cc b/src/xenia/base/main_win.cc index a3a004445..c52df8a91 100644 --- a/src/xenia/base/main_win.cc +++ b/src/xenia/base/main_win.cc @@ -130,6 +130,14 @@ int Main() { // Initialize logging. Needs parsed FLAGS. xe::InitializeLogging(entry_info.name); + Xbyak::util::Cpu cpu; + if (!cpu.has(Xbyak::util::Cpu::tAVX)) { + xe::FatalError( + "Your CPU does not support AVX, which is required by Xenia. See the " + "FAQ for system requirements at https://xenia.jp"); + return -1; + } + // Print version info. XELOGI("Build: %s / %s on %s", XE_BUILD_BRANCH, XE_BUILD_COMMIT, XE_BUILD_DATE); @@ -149,3 +157,34 @@ int Main() { } } // namespace xe + +// Used in console mode apps; automatically picked based on subsystem. +int main(int argc_ignored, char** argv_ignored) { return xe::Main(); } + +// Used in windowed apps; automatically picked based on subsystem. +int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR command_line, int) { + // Attach a console so we can write output to stdout. If the user hasn't + // redirected output themselves it'll pop up a window. + xe::AttachConsole(); + + // Run normal entry point. + return xe::Main(); +} + +#if defined _M_IX86 +#pragma comment( \ + linker, \ + "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"") // NOLINT(whitespace/line_length) +#elif defined _M_IA64 +#pragma comment( \ + linker, \ + "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"") // NOLINT(whitespace/line_length) +#elif defined _M_X64 +#pragma comment( \ + linker, \ + "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"") // NOLINT(whitespace/line_length) +#else +#pragma comment( \ + linker, \ + "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") // NOLINT(whitespace/line_length) +#endif diff --git a/src/xenia/cpu/ppc/testing/premake5.lua b/src/xenia/cpu/ppc/testing/premake5.lua index 11dcbe961..d2d5549cd 100644 --- a/src/xenia/cpu/ppc/testing/premake5.lua +++ b/src/xenia/cpu/ppc/testing/premake5.lua @@ -18,7 +18,6 @@ project("xenia-cpu-ppc-tests") files({ "ppc_testing_main.cc", "../../../base/main_"..platform_suffix..".cc", - "../../../base/main_entrypoint_"..platform_suffix..".cc", }) files({ "*.s", @@ -26,11 +25,8 @@ project("xenia-cpu-ppc-tests") includedirs({ project_root.."/third_party/gflags/src", }) - filter("files:*.s") flags({"ExcludeFromBuild"}) - filter("files:../../../base/main_entrypoint_"..platform_suffix..".cc") - vectorextensions("IA32") -- Disable AVX so our AVX check/error can happen. filter("platforms:Windows") debugdir(project_root) debugargs({ @@ -55,12 +51,14 @@ project("xenia-cpu-ppc-nativetests") files({ "ppc_testing_native_main.cc", "../../../base/main_"..platform_suffix..".cc", - "../../../base/main_entrypoint_"..platform_suffix..".cc", }) files({ "instr_*.s", "seq_*.s", }) + filter("files:instr_*.s", "files:seq_*.s") + flags({"ExcludeFromBuild"}) + filter({}) includedirs({ project_root.."/third_party/gflags/src", }) @@ -72,9 +70,4 @@ project("xenia-cpu-ppc-nativetests") "ppc_testing_native_thunks.s", }) - filter("files:instr_*.s", "files:seq_*.s") - flags({"ExcludeFromBuild"}) - filter("files:../../../base/main_entrypoint_"..platform_suffix..".cc") - vectorextensions("IA32") -- Disable AVX so our AVX check/error can happen. - end \ No newline at end of file diff --git a/src/xenia/gpu/premake5.lua b/src/xenia/gpu/premake5.lua index 127d5a5d1..36968d0f1 100644 --- a/src/xenia/gpu/premake5.lua +++ b/src/xenia/gpu/premake5.lua @@ -48,12 +48,8 @@ project("xenia-gpu-shader-compiler") files({ "shader_compiler_main.cc", "../base/main_"..platform_suffix..".cc", - "../base/main_entrypoint_"..platform_suffix..".cc", }) - filter("files:../base/main_entrypoint_"..platform_suffix..".cc") - vectorextensions("IA32") -- Disable AVX so our AVX check/error can happen. - filter("platforms:Windows") -- Only create the .user file if it doesn't already exist. local user_file = project_root.."/build/xenia-gpu-shader-compiler.vcxproj.user" diff --git a/src/xenia/gpu/vulkan/premake5.lua b/src/xenia/gpu/vulkan/premake5.lua index 4d2b70990..82b843b59 100644 --- a/src/xenia/gpu/vulkan/premake5.lua +++ b/src/xenia/gpu/vulkan/premake5.lua @@ -68,12 +68,8 @@ project("xenia-gpu-vulkan-trace-viewer") files({ "vulkan_trace_viewer_main.cc", "../../base/main_"..platform_suffix..".cc", - "../../base/main_entrypoint_"..platform_suffix..".cc", }) - filter("files:../../base/main_entrypoint_"..platform_suffix..".cc") - vectorextensions("IA32") -- Disable AVX so our AVX check/error can happen. - filter("platforms:Linux") links({ "X11", @@ -143,12 +139,8 @@ project("xenia-gpu-vulkan-trace-dump") files({ "vulkan_trace_dump_main.cc", "../../base/main_"..platform_suffix..".cc", - "../../base/main_entrypoint_"..platform_suffix..".cc", }) - filter("files:../../base/main_entrypoint_"..platform_suffix..".cc") - vectorextensions("IA32") -- Disable AVX so our AVX check/error can happen. - filter("platforms:Linux") links({ "X11", diff --git a/src/xenia/hid/premake5.lua b/src/xenia/hid/premake5.lua index 67580189f..ea7b6afbf 100644 --- a/src/xenia/hid/premake5.lua +++ b/src/xenia/hid/premake5.lua @@ -43,15 +43,11 @@ project("xenia-hid-demo") files({ "hid_demo.cc", "../base/main_"..platform_suffix..".cc", - "../base/main_entrypoint_"..platform_suffix..".cc", }) resincludedirs({ project_root, }) - filter("files:../base/main_entrypoint_"..platform_suffix..".cc") - vectorextensions("IA32") -- Disable AVX so our AVX check/error can happen. - filter("platforms:Linux") links({ "X11", diff --git a/src/xenia/ui/vulkan/premake5.lua b/src/xenia/ui/vulkan/premake5.lua index 74ea9e6db..8246ef249 100644 --- a/src/xenia/ui/vulkan/premake5.lua +++ b/src/xenia/ui/vulkan/premake5.lua @@ -47,15 +47,11 @@ project("xenia-ui-window-vulkan-demo") "../window_demo.cc", "vulkan_window_demo.cc", project_root.."/src/xenia/base/main_"..platform_suffix..".cc", - project_root.."/src/xenia/base/main_entrypoint_"..platform_suffix..".cc", }) resincludedirs({ project_root, }) - filter("files:"..project_root.."/src/xenia/base/main_entrypoint_"..platform_suffix..".cc") - vectorextensions("IA32") -- Disable AVX so our AVX check/error can happen. - filter("platforms:Linux") links({ "X11", diff --git a/src/xenia/vfs/premake5.lua b/src/xenia/vfs/premake5.lua index cdb0a66f1..ea174e3e0 100644 --- a/src/xenia/vfs/premake5.lua +++ b/src/xenia/vfs/premake5.lua @@ -34,11 +34,8 @@ project("xenia-vfs-dump") files({ "vfs_dump.cc", project_root.."/src/xenia/base/main_"..platform_suffix..".cc", - project_root.."/src/xenia/base/main_entrypoint_"..platform_suffix..".cc", }) resincludedirs({ project_root, }) - filter("files:"..project_root.."/src/xenia/base/main_entrypoint_"..platform_suffix..".cc") - vectorextensions("IA32") -- Disable AVX so our AVX check/error can happen.