flycast/core/ui/settings_about.cpp

167 lines
4.4 KiB
C++

/*
Copyright 2025 flyinghead
This file is part of Flycast.
Flycast is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
Flycast is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Flycast. If not, see <https://www.gnu.org/licenses/>.
*/
#include "settings.h"
#include "gui.h"
#include "version.h"
#include "wsi/context.h"
#include "oslib/storage.h"
#include "mainui.h"
#ifdef __ANDROID__
#if HOST_CPU == CPU_ARM64 && USE_VULKAN
#include "rend/vulkan/adreno.h"
#endif
#endif
#if defined(__ANDROID__) && HOST_CPU == CPU_ARM64 && USE_VULKAN
static bool driverDirty;
static void customDriverCallback(bool cancelled, std::string selection)
{
if (!cancelled) {
try {
uploadCustomGpuDriver(selection);
config::CustomGpuDriver = true;
driverDirty = true;
} catch (const FlycastException& e) {
gui_error(e.what());
config::CustomGpuDriver = false;
}
}
}
#endif
void gui_settings_about()
{
header("Flycast");
{
ImGui::Text("Version: %s", GIT_VERSION);
ImGui::Text("Git Hash: %s", GIT_HASH);
ImGui::Text("Build Date: %s", BUILD_DATE);
}
ImGui::Spacing();
header("Platform");
{
ImGui::Text("CPU: %s",
#if HOST_CPU == CPU_X86
"x86"
#elif HOST_CPU == CPU_ARM
"ARM"
#elif HOST_CPU == CPU_X64
"x86/64"
#elif HOST_CPU == CPU_ARM64
"ARM64"
#else
"Unknown"
#endif
);
ImGui::Text("Operating System: %s",
#ifdef __ANDROID__
"Android"
#elif defined(__unix__)
"Linux"
#elif defined(__APPLE__)
#ifdef TARGET_IPHONE
"iOS"
#else
"macOS"
#endif
#elif defined(TARGET_UWP)
"Windows Universal Platform"
#elif defined(_WIN32)
"Windows"
#elif defined(__SWITCH__)
"Switch"
#else
"Unknown"
#endif
);
#ifdef TARGET_IPHONE
const char *getIosJitStatus();
ImGui::Text("JIT Status: %s", getIosJitStatus());
#endif
}
ImGui::Spacing();
if (isOpenGL(config::RendererType))
header("OpenGL");
else if (isVulkan(config::RendererType))
header("Vulkan");
else if (isDirectX(config::RendererType))
header("DirectX");
ImGui::Text("Driver Name: %s", GraphicsContext::Instance()->getDriverName().c_str());
ImGui::Text("Version: %s", GraphicsContext::Instance()->getDriverVersion().c_str());
#if defined(__ANDROID__) && HOST_CPU == CPU_ARM64 && USE_VULKAN
if (isVulkan(config::RendererType))
{
const char *fileSelectTitle = "Select a custom GPU driver";
{
ImguiStyleVar _(ImGuiStyleVar_FramePadding, ScaledVec2(20, 10));
if (config::CustomGpuDriver)
{
std::string name, description, vendor, version;
if (getCustomGpuDriverInfo(name, description, vendor, version))
{
ImGui::Text("Custom Driver:");
ImGui::Indent();
ImGui::Text("%s - %s", name.c_str(), description.c_str());
ImGui::Text("%s - %s", vendor.c_str(), version.c_str());
ImGui::Unindent();
}
if (ImGui::Button("Use Default Driver")) {
config::CustomGpuDriver = false;
ImGui::OpenPopup("Reset Vulkan");
}
}
else if (ImGui::Button("Upload Custom Driver")) {
if (!hostfs::addStorage(false, false, fileSelectTitle, customDriverCallback))
ImGui::OpenPopup(fileSelectTitle);
}
if (driverDirty) {
ImGui::OpenPopup("Reset Vulkan");
driverDirty = false;
}
ImguiStyleVar _1(ImGuiStyleVar_WindowPadding, ScaledVec2(20, 20));
if (ImGui::BeginPopupModal("Reset Vulkan", NULL, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoScrollbar))
{
ImGui::Text("Do you want to reset Vulkan to use new driver?");
ImGui::NewLine();
ImguiStyleVar _(ImGuiStyleVar_ItemSpacing, ImVec2(uiScaled(20), ImGui::GetStyle().ItemSpacing.y));
ImguiStyleVar _1(ImGuiStyleVar_FramePadding, ScaledVec2(10, 10));
if (ImGui::Button("Yes"))
{
mainui_reinit();
ImGui::CloseCurrentPopup();
}
ImGui::SameLine();
if (ImGui::Button("No"))
ImGui::CloseCurrentPopup();
ImGui::EndPopup();
}
}
select_file_popup(fileSelectTitle, [](bool cancelled, std::string selection) {
customDriverCallback(cancelled, selection);
return true;
}, true, "zip");
}
#endif
}