yuzu: Check Vulkan on startup with a child
This commit is contained in:
		| @@ -3853,6 +3853,21 @@ void GMainWindow::SetDiscordEnabled([[maybe_unused]] bool state) { | ||||
| #endif | ||||
|  | ||||
| int main(int argc, char* argv[]) { | ||||
| #ifdef _WIN32 | ||||
|     char variable_contents[32]; | ||||
|     const DWORD startup_check_var = | ||||
|         GetEnvironmentVariable(STARTUP_CHECK_ENV_VAR, variable_contents, 32); | ||||
|     if (startup_check_var != 0) { | ||||
|         std::fprintf(stderr, "perform statup checks\n"); | ||||
|         CheckVulkan(); | ||||
|         return 0; | ||||
|     } else { | ||||
|         std::fprintf(stderr, "%d\n", StartupChecks()); | ||||
|     } | ||||
| #elif YUZU_UNIX | ||||
| #error "Unimplemented" | ||||
| #endif | ||||
|  | ||||
|     Common::DetachedTasks detached_tasks; | ||||
|     MicroProfileOnThreadCreate("Frontend"); | ||||
|     SCOPE_EXIT({ MicroProfileShutdown(); }); | ||||
|   | ||||
| @@ -3,6 +3,15 @@ | ||||
|  | ||||
| #include "video_core/vulkan_common/vulkan_wrapper.h" | ||||
|  | ||||
| #ifdef _WIN32 | ||||
| #include <cstring> // for memset, strncpy | ||||
| #include <processthreadsapi.h> | ||||
| #include <windows.h> | ||||
| #elif defined(YUZU_UNIX) | ||||
| #include <unistd.h> | ||||
| #endif | ||||
|  | ||||
| #include <cstdio> | ||||
| #include <filesystem> | ||||
| #include <fstream> | ||||
| #include "common/fs/fs.h" | ||||
| @@ -10,7 +19,7 @@ | ||||
| #include "common/logging/log.h" | ||||
| #include "video_core/vulkan_common/vulkan_instance.h" | ||||
| #include "video_core/vulkan_common/vulkan_library.h" | ||||
| #include "yuzu/check_vulkan.h" | ||||
| #include "yuzu/startup_checks.h" | ||||
| #include "yuzu/uisettings.h" | ||||
|  | ||||
| constexpr char TEMP_FILE_NAME[] = "vulkan_check"; | ||||
| @@ -51,3 +60,53 @@ bool CheckVulkan() { | ||||
|     std::filesystem::remove(temp_file_loc); | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| bool StartupChecks() { | ||||
| #ifdef _WIN32 | ||||
|     const bool env_var_set = SetEnvironmentVariableA(STARTUP_CHECK_ENV_VAR, "ON"); | ||||
|     if (!env_var_set) { | ||||
|         LOG_ERROR(Frontend, "SetEnvironmentVariableA failed to set {}, {}", STARTUP_CHECK_ENV_VAR, | ||||
|                   GetLastError()); | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     STARTUPINFOA startup_info; | ||||
|     PROCESS_INFORMATION process_info; | ||||
|  | ||||
|     std::memset(&startup_info, '\0', sizeof(startup_info)); | ||||
|     std::memset(&process_info, '\0', sizeof(process_info)); | ||||
|     startup_info.cb = sizeof(startup_info); | ||||
|  | ||||
|     char p_name[255]; | ||||
|     std::strncpy(p_name, "yuzu.exe", 255); | ||||
|  | ||||
|     // TODO: use argv[0] instead of yuzu.exe | ||||
|     const bool process_created = CreateProcessA(nullptr,       // lpApplicationName | ||||
|                                                 p_name,        // lpCommandLine | ||||
|                                                 nullptr,       // lpProcessAttributes | ||||
|                                                 nullptr,       // lpThreadAttributes | ||||
|                                                 false,         // bInheritHandles | ||||
|                                                 0,             // dwCreationFlags | ||||
|                                                 nullptr,       // lpEnvironment | ||||
|                                                 nullptr,       // lpCurrentDirectory | ||||
|                                                 &startup_info, // lpStartupInfo | ||||
|                                                 &process_info  // lpProcessInformation | ||||
|     ); | ||||
|     if (!process_created) { | ||||
|         LOG_ERROR(Frontend, "CreateProcessA failed, {}", GetLastError()); | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     // wait until the processs exits | ||||
|     DWORD exit_code = STILL_ACTIVE; | ||||
|     while (exit_code == STILL_ACTIVE) { | ||||
|         GetExitCodeProcess(process_info.hProcess, &exit_code); | ||||
|     } | ||||
|  | ||||
|     std::fprintf(stderr, "exit code: %d\n", exit_code); | ||||
|  | ||||
|     CloseHandle(process_info.hProcess); | ||||
|     CloseHandle(process_info.hThread); | ||||
| #endif | ||||
|     return true; | ||||
| } | ||||
|   | ||||
| @@ -3,4 +3,7 @@ | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| constexpr char STARTUP_CHECK_ENV_VAR[] = "YUZU_DO_STARTUP_CHECKS"; | ||||
|  | ||||
| bool CheckVulkan(); | ||||
| bool StartupChecks(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user