Merge GPU preference feature branch to main branch version 2.0.2 for testing (#3)

* modernized UI for GPU Preference option

* feat: auto-detect dedicated GPU on hybrid laptops (iGPU+dGPU)

* feat: detailed GPU info in auto-detection feature on startup

* feat: add GPU options for launcher

- Add GPU preference setting (Auto/Integrated/Dedicated)
- Implement Linux GPU selection with DRI_PRIME and NVIDIA env vars
- Add GPU detection using Electron's app.getGPUInfo()
- Update settings UI with GPU preference dropdown
- Integrate GPU preference into game launch process

* feat: auto-detect dedicated GPU on hybrid laptops (iGPU+dGPU)

* added fallbacks to and option to use integrated GPU.

* add package-lock and fix deps version

* changed 'Nvidia' string to 'NVIDIA'

* fix: selecting `dedicated` option while using nvidia GPU did not set its specific env variables

* remove unused `CONFIG_FILE` variable on launcher core modules

* fix: duplicated save-load gpu detection functions

* move game option settings to the top, while custom java to the bottom

* fix: settings-header margin-bottom from 3rem to 1rem and supress line-clamp warning
This commit is contained in:
Fazri Gading
2026-01-20 23:45:38 +08:00
committed by GitHub
parent 5e3506a9ac
commit 905a9d754c
11 changed files with 413 additions and 23 deletions

48
main.js
View File

@@ -161,6 +161,19 @@ app.whenReady().then(async () => {
console.log('Node.js version:', process.versions.node);
console.log('Log directory:', logger.getLogDirectory());
try {
const { loadGpuPreference, detectGpu } = require('./backend/launcher');
const savedPreference = loadGpuPreference();
if (savedPreference === 'auto') {
global.detectedGpu = detectGpu(); // if 'auto' selected = preload GPU detection
console.log('GPU auto-detection completed on startup:', global.detectedGpu);
} else {
console.log('GPU preference is manual, skipping auto-detection');
}
} catch (error) {
console.warn('Failed to preload GPU detection:', error.message);
global.detectedGpu = { mode: 'integrated', vendor: 'intel' };
}
// Initialize Profile Manager (runs migration if needed)
@@ -282,7 +295,7 @@ app.on('window-all-closed', () => {
}
});
ipcMain.handle('launch-game', async (event, playerName, javaPath, installPath) => {
ipcMain.handle('launch-game', async (event, playerName, javaPath, installPath, gpuPreference) => {
try {
const progressCallback = (message, percent, speed, downloaded, total) => {
if (mainWindow && !mainWindow.isDestroyed()) {
@@ -297,8 +310,8 @@ ipcMain.handle('launch-game', async (event, playerName, javaPath, installPath) =
}
};
const result = await launchGameWithVersionCheck(playerName, progressCallback, javaPath, installPath);
const result = await launchGameWithVersionCheck(playerName, progressCallback, javaPath, installPath, gpuPreference);
return result;
} catch (error) {
console.error('Launch error:', error);
@@ -710,6 +723,35 @@ ipcMain.handle('get-update-info', async () => {
return updateManager.getUpdateInfo();
});
ipcMain.handle('get-gpu-info', () => {
try {
return app.getGPUInfo('complete');
} catch (error) {
console.error('Error getting GPU info:', error);
return {};
}
});
ipcMain.handle('save-gpu-preference', (event, gpuPreference) => {
const { saveGpuPreference } = require('./backend/launcher');
saveGpuPreference(gpuPreference);
return { success: true };
});
ipcMain.handle('load-gpu-preference', () => {
const { loadGpuPreference } = require('./backend/launcher');
return loadGpuPreference();
});
ipcMain.handle('get-detected-gpu', () => {
if (global.detectedGpu) {
return global.detectedGpu;
}
const { detectGpu } = require('./backend/launcher');
global.detectedGpu = detectGpu();
return global.detectedGpu;
});
ipcMain.handle('window-close', () => {
if (mainWindow && !mainWindow.isDestroyed()) {
mainWindow.close();