diff options
| author | SulfurNitride <SulfurNitride@users.noreply.github.com> | 2026-04-06 13:29:05 -0500 |
|---|---|---|
| committer | SulfurNitride <SulfurNitride@users.noreply.github.com> | 2026-04-06 13:29:05 -0500 |
| commit | da10828d0d63718cba1532ae819a3cc16ebe30db (patch) | |
| tree | b809bc1eb4cdaf21a3718893cee40569bad72726 /src | |
| parent | 391b9f13cff5937426353bb0bba8c39ca67c1d64 (diff) | |
Consolidate prefix setup steps and update .NET versions
- Merge all DirectX June 2010 extractions into single "DirectX Runtimes"
step (d3dcompiler_42/43/47, d3dx9, d3dx10, d3dx11_42/43, xinput, xact)
- Merge .NET 6/7/8/9 runtimes into single "NET Runtimes (6-9)" step
- Replace .NET 9 SDK with .NET 9 Runtime (9.0.14)
- Add .NET 10 SDK (10.0.201)
- Remove .NET Desktop Runtime 10
- Add xinput, d3dcompiler_42, d3dx10, d3dx11_42 extractions
- Move .NET Desktop Runtime 6 before runtime installs
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/src/prefixsetuprunner.cpp | 276 | ||||
| -rw-r--r-- | src/src/prefixsetuprunner.h | 7 |
2 files changed, 127 insertions, 156 deletions
diff --git a/src/src/prefixsetuprunner.cpp b/src/src/prefixsetuprunner.cpp index 2a89313..ed836e4 100644 --- a/src/src/prefixsetuprunner.cpp +++ b/src/src/prefixsetuprunner.cpp @@ -37,13 +37,13 @@ static const char* CABEXTRACT_URL = static const char* SEVENZIP_URL = "https://github.com/ip7z/7zip/releases/download/26.00/7z2600-linux-x86.tar.xz"; -static const char* DOTNET9_SDK_URL = - "https://builds.dotnet.microsoft.com/dotnet/Sdk/9.0.310/" - "dotnet-sdk-9.0.310-win-x64.exe"; +static const char* DOTNET9_RUNTIME_URL = + "https://builds.dotnet.microsoft.com/dotnet/Runtime/9.0.14/" + "dotnet-runtime-9.0.14-win-x64.exe"; -static const char* DOTNET_DESKTOP10_URL = - "https://builds.dotnet.microsoft.com/dotnet/WindowsDesktop/10.0.2/" - "windowsdesktop-runtime-10.0.2-win-x64.exe"; +static const char* DOTNET10_SDK_URL = + "https://builds.dotnet.microsoft.com/dotnet/Sdk/10.0.201/" + "dotnet-sdk-10.0.201-win-x64.exe"; // d3dcompiler_47: prebuilt DLLs from Mozilla's fxc2 repo (Windows 8.1 SDK redist). static const char* D3DCOMPILER_47_32_URL = @@ -175,6 +175,7 @@ static const char* WINE_SETTINGS_REG = R"(Windows Registry Editor Version 5.00 "dinput.dll"="native,builtin" "dinput8"="native,builtin" "dinput8.dll"="native,builtin" +"d3dcompiler_42"="native" "d3dcompiler_43"="native" "d3dcompiler_47"="native" "d3dx9_24"="native" @@ -197,7 +198,23 @@ static const char* WINE_SETTINGS_REG = R"(Windows Registry Editor Version 5.00 "d3dx9_41"="native" "d3dx9_42"="native" "d3dx9_43"="native" +"d3dx10_33"="native" +"d3dx10_34"="native" +"d3dx10_35"="native" +"d3dx10_36"="native" +"d3dx10_37"="native" +"d3dx10_38"="native" +"d3dx10_39"="native" +"d3dx10_40"="native" +"d3dx10_41"="native" +"d3dx10_42"="native" +"d3dx10_43"="native" +"d3dx11_42"="native" "d3dx11_43"="native" +"xinput1_1"="native" +"xinput1_2"="native" +"xinput1_3"="native" +"xinput9_1_0"="native" "xaudio2_0"="native,builtin" "xaudio2_1"="native,builtin" "xaudio2_2"="native,builtin" @@ -408,35 +425,19 @@ void PrefixSetupRunner::buildStepList() addStep("drive_cleanup", "Clean Up Drive Letters", [this] { return stepDriveCleanup(); }); - // DirectX DLL extraction (cab-based, no Wine needed). - addStep("d3dcompiler_47", "d3dcompiler_47", - [this] { return stepD3DCompiler47(); }); - addStep("d3dcompiler_43", "d3dcompiler_43", - [this] { return stepD3DCompiler43(); }); - addStep("d3dx9", "d3dx9", - [this] { return stepD3dx9(); }); - addStep("d3dx11_43", "d3dx11_43", - [this] { return stepD3dx11_43(); }); - addStep("xact", "XACT (32-bit)", - [this] { return stepXact(); }); - addStep("xact_x64", "XACT (64-bit)", - [this] { return stepXact64(); }); + // DirectX DLL extraction (cab-based, no Wine needed for most). + addStep("directx_runtime", "DirectX Runtimes", + [this] { return stepDirectXRuntime(); }); // Runtime installers (run via Wine). addStep("vcrun2022", "Visual C++ 2022", [this] { return stepVcrun2022(); }); - addStep("dotnet6", ".NET Runtime 6", - [this] { return stepDotNetInstallPair(DOTNET6_X86_URL, DOTNET6_X64_URL, ".NET 6"); }); - addStep("dotnet7", ".NET Runtime 7", - [this] { return stepDotNetInstallPair(DOTNET7_X86_URL, DOTNET7_X64_URL, ".NET 7"); }); - addStep("dotnet8", ".NET Runtime 8", - [this] { return stepDotNetInstallPair(DOTNET8_X86_URL, DOTNET8_X64_URL, ".NET 8"); }); addStep("dotnetdesktop6", ".NET Desktop Runtime 6", [this] { return stepDotNetInstallPair(DOTNET_DESKTOP6_X86_URL, DOTNET_DESKTOP6_X64_URL, ".NET Desktop 6"); }); - addStep("dotnet9_sdk", ".NET 9 SDK", - [this] { return stepDotNetInstall(DOTNET9_SDK_URL, "dotnet-sdk-9"); }); - addStep("dotnet_desktop10", ".NET Desktop Runtime 10", - [this] { return stepDotNetInstall(DOTNET_DESKTOP10_URL, "dotnet-desktop-10"); }); + addStep("dotnet_runtimes", ".NET Runtimes (6-9)", + [this] { return stepDotNetRuntimes(); }); + addStep("dotnet10_sdk", ".NET 10 SDK", + [this] { return stepDotNetInstall(DOTNET10_SDK_URL, ".NET 10 SDK"); }); addStep("game_detection", "Auto-Detect Games", [this] { return stepGameDetection(); }); @@ -982,157 +983,104 @@ bool PrefixSetupRunner::stepD3DCompiler47() return true; } -bool PrefixSetupRunner::stepD3DCompiler43() +bool PrefixSetupRunner::stepDirectXRuntime() { - emit logMessage("Installing d3dcompiler_43..."); - - QString redistPath; - if (!ensureDirectXRedist(redistPath)) - return false; - - const QString dllDir64 = m_prefixPath + "/drive_c/windows/system32"; - const QString dllDir32 = m_prefixPath + "/drive_c/windows/syswow64"; - - emit logMessage("Extracting d3dcompiler_43 (32-bit)..."); - if (!extractFromRedist(redistPath, "*d3dcompiler_43*x86*", "d3dcompiler_43.dll", dllDir32)) - return false; - - emit logMessage("Extracting d3dcompiler_43 (64-bit)..."); - if (!extractFromRedist(redistPath, "*d3dcompiler_43*x64*", "d3dcompiler_43.dll", dllDir64)) - return false; - - emit logMessage("d3dcompiler_43 installed"); - return true; -} - -bool PrefixSetupRunner::stepD3dx9() -{ - emit logMessage("Installing d3dx9..."); - - QString redistPath; - if (!ensureDirectXRedist(redistPath)) - return false; + emit logMessage("Installing DirectX runtimes..."); const QString dllDir64 = m_prefixPath + "/drive_c/windows/system32"; const QString dllDir32 = m_prefixPath + "/drive_c/windows/syswow64"; - emit logMessage("Extracting d3dx9 (32-bit)..."); - if (!extractFromRedist(redistPath, "*d3dx9*x86*", "d3dx9*.dll", dllDir32)) + // d3dcompiler_47: prebuilt DLLs from Mozilla fxc2 (not in the June 2010 redist). + if (!stepD3DCompiler47()) return false; - emit logMessage("Extracting d3dx9 (64-bit)..."); - if (!extractFromRedist(redistPath, "*d3dx9*x64*", "d3dx9*.dll", dllDir64)) - return false; - - emit logMessage("d3dx9 installed"); - return true; -} - -bool PrefixSetupRunner::stepD3dx11_43() -{ - emit logMessage("Installing d3dx11_43..."); - + // Everything else comes from the DirectX June 2010 redist. QString redistPath; if (!ensureDirectXRedist(redistPath)) return false; - const QString dllDir64 = m_prefixPath + "/drive_c/windows/system32"; - const QString dllDir32 = m_prefixPath + "/drive_c/windows/syswow64"; - - emit logMessage("Extracting d3dx11_43 (32-bit)..."); - if (!extractFromRedist(redistPath, "*d3dx11_43*x86*", "d3dx11_43.dll", dllDir32)) - return false; - - emit logMessage("Extracting d3dx11_43 (64-bit)..."); - if (!extractFromRedist(redistPath, "*d3dx11_43*x64*", "d3dx11_43.dll", dllDir64)) - return false; - - emit logMessage("d3dx11_43 installed"); - return true; -} - -bool PrefixSetupRunner::stepXact() -{ - emit logMessage("Installing XACT (32-bit)..."); - - QString redistPath; - if (!ensureDirectXRedist(redistPath)) - return false; + // All single-DLL extractions: {cabFilter, dllFilter, displayName} + struct DllEntry { const char* cabFilter; const char* dllFilter; const char* name; }; + static const DllEntry singleDlls[] = { + {"*d3dcompiler_42*", "d3dcompiler_42.dll", "d3dcompiler_42"}, + {"*d3dcompiler_43*", "d3dcompiler_43.dll", "d3dcompiler_43"}, + {"*d3dx11_42*", "d3dx11_42.dll", "d3dx11_42"}, + {"*d3dx11_43*", "d3dx11_43.dll", "d3dx11_43"}, + }; - const QString dllDir32 = m_prefixPath + "/drive_c/windows/syswow64"; + // Multi-DLL extractions (wildcards): {cabFilter, dllFilter, displayName} + static const DllEntry multiDlls[] = { + {"*d3dx9*", "d3dx9*.dll", "d3dx9"}, + {"*d3dx10*", "d3dx10*.dll", "d3dx10"}, + {"*_xinput_*", "xinput*.dll", "xinput"}, + }; - // Extract all xact-related cabs and DLLs. - for (const char* cabPat : {"*_xact_*x86*", "*_x3daudio_*x86*", "*_xaudio_*x86*"}) { - for (const char* dllPat : {"xactengine*.dll", "xaudio*.dll", "x3daudio*.dll", "xapofx*.dll"}) { - // Ignore failures for individual patterns — not all cabs contain all DLL types. - extractFromRedist(redistPath, cabPat, dllPat, dllDir32); - } + // Extract single DLLs (both arches). + for (const auto& e : singleDlls) { + if (isCancelled()) return false; + emit logMessage(QStringLiteral("Extracting %1...").arg(e.name)); + extractFromRedist(redistPath, QStringLiteral("%1x86*").arg(e.cabFilter), e.dllFilter, dllDir32); + extractFromRedist(redistPath, QStringLiteral("%1x64*").arg(e.cabFilter), e.dllFilter, dllDir64); } - // Batch-register all xactengine and xaudio DLLs in a single regsvr32 call. - QStringList regDlls; - - const QStringList xactDlls = QDir(dllDir32).entryList({"xactengine*.dll"}, QDir::Files); - regDlls.append(xactDlls); - - for (int i = 0; i <= 7; ++i) { - const QString dll = QStringLiteral("xaudio2_%1.dll").arg(i); - if (QFileInfo::exists(dllDir32 + "/" + dll)) - regDlls.append(dll); + // Extract multi-DLLs (both arches). + for (const auto& e : multiDlls) { + if (isCancelled()) return false; + emit logMessage(QStringLiteral("Extracting %1...").arg(e.name)); + extractFromRedist(redistPath, QStringLiteral("%1x86*").arg(e.cabFilter), e.dllFilter, dllDir32); + extractFromRedist(redistPath, QStringLiteral("%1x64*").arg(e.cabFilter), e.dllFilter, dllDir64); } - if (!regDlls.isEmpty()) { - emit logMessage(QStringLiteral("Registering %1 DLLs...").arg(regDlls.size())); - QMap<QString, QString> env = baseWineEnv(); - env["WINEDLLOVERRIDES"] = "mshtml=d"; - QStringList args = {"regsvr32", "/S"}; - args.append(regDlls); - runProcess(m_wineBin, args, env); + // XACT / XAudio / X3DAudio / XAPOFX — 32-bit. + if (!isCancelled()) { + emit logMessage("Extracting XACT (32-bit)..."); + for (const char* cabPat : {"*_xact_*x86*", "*_x3daudio_*x86*", "*_xaudio_*x86*"}) + for (const char* dllPat : {"xactengine*.dll", "xaudio*.dll", "x3daudio*.dll", "xapofx*.dll"}) + extractFromRedist(redistPath, cabPat, dllPat, dllDir32); } - emit logMessage("XACT (32-bit) installed"); - return true; -} - -bool PrefixSetupRunner::stepXact64() -{ - emit logMessage("Installing XACT (64-bit)..."); - - QString redistPath; - if (!ensureDirectXRedist(redistPath)) - return false; - - const QString dllDir64 = m_prefixPath + "/drive_c/windows/system32"; - - // Extract all xact-related cabs and DLLs. - for (const char* cabPat : {"*_xact_*x64*", "*_x3daudio_*x64*", "*_xaudio_*x64*"}) { - for (const char* dllPat : {"xactengine*.dll", "xaudio*.dll", "x3daudio*.dll", "xapofx*.dll"}) { - extractFromRedist(redistPath, cabPat, dllPat, dllDir64); - } + // XACT — 64-bit. + if (!isCancelled()) { + emit logMessage("Extracting XACT (64-bit)..."); + for (const char* cabPat : {"*_xact_*x64*", "*_x3daudio_*x64*", "*_xaudio_*x64*"}) + for (const char* dllPat : {"xactengine*.dll", "xaudio*.dll", "x3daudio*.dll", "xapofx*.dll"}) + extractFromRedist(redistPath, cabPat, dllPat, dllDir64); } - // Batch-register all 64-bit xactengine and xaudio DLLs. - QStringList regDlls; + // Batch-register XACT DLLs via regsvr32. + auto collectRegDlls = [](const QString& dir) -> QStringList { + QStringList dlls; + dlls.append(QDir(dir).entryList({"xactengine*.dll"}, QDir::Files)); + for (int i = 0; i <= 7; ++i) { + const QString dll = QStringLiteral("xaudio2_%1.dll").arg(i); + if (QFileInfo::exists(dir + "/" + dll)) + dlls.append(dll); + } + return dlls; + }; - const QStringList xactDlls = QDir(dllDir64).entryList({"xactengine*.dll"}, QDir::Files); - regDlls.append(xactDlls); + QMap<QString, QString> env = baseWineEnv(); + env["WINEDLLOVERRIDES"] = "mshtml=d"; - for (int i = 0; i <= 7; ++i) { - const QString dll = QStringLiteral("xaudio2_%1.dll").arg(i); - if (QFileInfo::exists(dllDir64 + "/" + dll)) - regDlls.append(dll); + // 32-bit registration. + QStringList reg32 = collectRegDlls(dllDir32); + if (!reg32.isEmpty()) { + emit logMessage(QStringLiteral("Registering %1 32-bit DLLs...").arg(reg32.size())); + QStringList args = {"regsvr32", "/S"}; + args.append(reg32); + runProcess(m_wineBin, args, env); } - if (!regDlls.isEmpty()) { - emit logMessage(QStringLiteral("Registering %1 DLLs...").arg(regDlls.size())); - QMap<QString, QString> env = baseWineEnv(); - env["WINEDLLOVERRIDES"] = "mshtml=d"; + // 64-bit registration. + QStringList reg64 = collectRegDlls(dllDir64); + if (!reg64.isEmpty()) { + emit logMessage(QStringLiteral("Registering %1 64-bit DLLs...").arg(reg64.size())); QStringList args = {"regsvr32", "/S"}; - args.append(regDlls); + args.append(reg64); runProcess(m_wineBin, args, env); } - emit logMessage("XACT (64-bit) installed"); + emit logMessage("DirectX runtimes installed"); return true; } @@ -1211,6 +1159,32 @@ bool PrefixSetupRunner::stepVcrun2022() return true; } +bool PrefixSetupRunner::stepDotNetRuntimes() +{ + emit logMessage("Installing .NET Runtimes (6-9)..."); + + struct RuntimePair { const char* url32; const char* url64; const char* name; }; + static const RuntimePair runtimes[] = { + {DOTNET6_X86_URL, DOTNET6_X64_URL, ".NET 6"}, + {DOTNET7_X86_URL, DOTNET7_X64_URL, ".NET 7"}, + {DOTNET8_X86_URL, DOTNET8_X64_URL, ".NET 8"}, + }; + + for (const auto& rt : runtimes) { + if (isCancelled()) return false; + if (!stepDotNetInstallPair(rt.url32, rt.url64, rt.name)) + return false; + } + + // .NET 9 is 64-bit only. + if (isCancelled()) return false; + if (!stepDotNetInstall(DOTNET9_RUNTIME_URL, ".NET 9 Runtime")) + return false; + + emit logMessage(".NET Runtimes installed"); + return true; +} + bool PrefixSetupRunner::stepDotNetInstallPair(const QString& url32, const QString& url64, const QString& name) { diff --git a/src/src/prefixsetuprunner.h b/src/src/prefixsetuprunner.h index 4666780..ed8f12c 100644 --- a/src/src/prefixsetuprunner.h +++ b/src/src/prefixsetuprunner.h @@ -90,12 +90,9 @@ private: bool stepProtonInit(); bool stepDriveCleanup(); bool stepD3DCompiler47(); - bool stepD3DCompiler43(); - bool stepD3dx9(); - bool stepD3dx11_43(); - bool stepXact(); - bool stepXact64(); + bool stepDirectXRuntime(); bool stepVcrun2022(); + bool stepDotNetRuntimes(); bool stepDotNetInstall(const QString& url, const QString& name); bool stepDotNetInstallPair(const QString& url32, const QString& url64, const QString& name); |
