From af63c3aa3a7c6301fba1287802f4cd39c9c9efef Mon Sep 17 00:00:00 2001 From: Glavo Date: Fri, 24 Feb 2023 01:32:15 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B8=B2=E6=9F=93=E5=99=A8?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=20(#2145)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit close #2143 --- .../hmcl/game/HMCLGameRepository.java | 2 +- .../jackhuang/hmcl/game/LauncherHelper.java | 11 ++-- .../hmcl/setting/VersionSetting.java | 37 +++++++++---- .../versions/AdvancedVersionSettingPage.java | 33 +++++++++--- .../jackhuang/hmcl/util/NativePatcher.java | 8 ++- .../resources/assets/lang/I18N.properties | 6 ++- .../resources/assets/lang/I18N_zh.properties | 6 ++- .../assets/lang/I18N_zh_CN.properties | 6 ++- HMCL/src/main/resources/assets/natives.json | 52 ++++++++++++++----- .../jackhuang/hmcl/game/LaunchOptions.java | 14 ++--- .../org/jackhuang/hmcl/game/Renderer.java | 8 +++ .../hmcl/launch/DefaultLauncher.java | 13 +++-- 12 files changed, 140 insertions(+), 56 deletions(-) create mode 100644 HMCLCore/src/main/java/org/jackhuang/hmcl/game/Renderer.java diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java index 818b414e0..06bff89ec 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java @@ -346,7 +346,7 @@ public class HMCLGameRepository extends DefaultGameRepository { .setNativesDirType(vs.getNativesDirType()) .setNativesDir(vs.getNativesDir()) .setProcessPriority(vs.getProcessPriority()) - .setUseSoftwareRenderer(vs.isUseSoftwareRenderer()) + .setRenderer(vs.getRenderer()) .setUseNativeGLFW(vs.isUseNativeGLFW()) .setUseNativeOpenAL(vs.isUseNativeOpenAL()) .setDaemon(!makeLaunchScript && vs.getLauncherVisibility().isDaemon()) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java index 25b4b234d..e5caa832e 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java @@ -150,8 +150,9 @@ public final class LauncherHelper { } }), Task.composeAsync(() -> { - if (setting.isUseSoftwareRenderer() && OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS) { - Library lib = NativePatcher.getSoftwareRendererLoader(javaVersion); + Renderer renderer = setting.getRenderer(); + if (renderer != Renderer.DEFAULT && OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS) { + Library lib = NativePatcher.getMesaLoader(javaVersion, renderer); if (lib == null) return null; File file = dependencyManager.getGameRepository().getLibraryFile(version.get(), lib); @@ -160,11 +161,13 @@ public final class LauncherHelper { return null; } + String agent = file.getAbsolutePath() + "=" + renderer.name().toLowerCase(Locale.ROOT); + if (GameLibrariesTask.shouldDownloadLibrary(repository, version.get(), lib, integrityCheck)) { return new LibraryDownloadTask(dependencyManager, file, lib) - .thenRunAsync(() -> javaAgents.add(file.getAbsolutePath())); + .thenRunAsync(() -> javaAgents.add(agent)); } else { - javaAgents.add(file.getAbsolutePath()); + javaAgents.add(agent); return null; } } else { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionSetting.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionSetting.java index cb8676205..bd20b487f 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionSetting.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionSetting.java @@ -38,6 +38,7 @@ import java.lang.reflect.Type; import java.nio.file.InvalidPathException; import java.nio.file.Paths; import java.util.List; +import java.util.Locale; import java.util.Optional; import java.util.concurrent.CancellationException; import java.util.stream.Collectors; @@ -553,18 +554,18 @@ public final class VersionSetting implements Cloneable { processPriorityProperty.set(processPriority); } - private final BooleanProperty useSoftwareRenderer = new SimpleBooleanProperty(this, "softwareRenderer", false); + private final ObjectProperty rendererProperty = new SimpleObjectProperty<>(this, "renderer", Renderer.DEFAULT); - public boolean isUseSoftwareRenderer() { - return useSoftwareRenderer.get(); + public Renderer getRenderer() { + return rendererProperty.get(); } - public BooleanProperty useSoftwareRendererProperty() { - return useSoftwareRenderer; + public ObjectProperty rendererProperty() { + return rendererProperty; } - public void setUseSoftwareRenderer(boolean useSoftwareRenderer) { - this.useSoftwareRenderer.set(useSoftwareRenderer); + public void setRenderer(Renderer renderer) { + this.rendererProperty.set(renderer); } private final BooleanProperty useNativeGLFW = new SimpleBooleanProperty(this, "nativeGLFW", false); @@ -704,7 +705,7 @@ public final class VersionSetting implements Cloneable { gameDirTypeProperty.addListener(listener); gameDirProperty.addListener(listener); processPriorityProperty.addListener(listener); - useSoftwareRenderer.addListener(listener); + rendererProperty.addListener(listener); useNativeGLFW.addListener(listener); useNativeOpenAL.addListener(listener); launcherVisibilityProperty.addListener(listener); @@ -742,7 +743,7 @@ public final class VersionSetting implements Cloneable { versionSetting.setGameDirType(getGameDirType()); versionSetting.setGameDir(getGameDir()); versionSetting.setProcessPriority(getProcessPriority()); - versionSetting.setUseSoftwareRenderer(isUseSoftwareRenderer()); + versionSetting.setRenderer(getRenderer()); versionSetting.setUseNativeGLFW(isUseNativeGLFW()); versionSetting.setUseNativeOpenAL(isUseNativeOpenAL()); versionSetting.setLauncherVisibility(getLauncherVisibility()); @@ -781,7 +782,6 @@ public final class VersionSetting implements Cloneable { obj.addProperty("gameDir", src.getGameDir()); obj.addProperty("launcherVisibility", src.getLauncherVisibility().ordinal()); obj.addProperty("processPriority", src.getProcessPriority().ordinal()); - obj.addProperty("useSoftwareRenderer", src.isUseSoftwareRenderer()); obj.addProperty("useNativeGLFW", src.isUseNativeGLFW()); obj.addProperty("useNativeOpenAL", src.isUseNativeOpenAL()); obj.addProperty("gameDirType", src.getGameDirType().ordinal()); @@ -790,6 +790,10 @@ public final class VersionSetting implements Cloneable { obj.addProperty("nativesDirType", src.getNativesDirType().ordinal()); obj.addProperty("versionIcon", src.getVersionIcon().ordinal()); + obj.addProperty("renderer", src.getRenderer().name()); + if (src.getRenderer() == Renderer.LLVMPIPE) + obj.addProperty("useSoftwareRenderer", true); + return obj; } @@ -836,7 +840,6 @@ public final class VersionSetting implements Cloneable { vs.setShowLogs(Optional.ofNullable(obj.get("showLogs")).map(JsonElement::getAsBoolean).orElse(false)); vs.setLauncherVisibility(getOrDefault(LauncherVisibility.values(), obj.get("launcherVisibility"), LauncherVisibility.HIDE)); vs.setProcessPriority(getOrDefault(ProcessPriority.values(), obj.get("processPriority"), ProcessPriority.NORMAL)); - vs.setUseSoftwareRenderer(Optional.ofNullable(obj.get("useSoftwareRenderer")).map(JsonElement::getAsBoolean).orElse(false)); vs.setUseNativeGLFW(Optional.ofNullable(obj.get("useNativeGLFW")).map(JsonElement::getAsBoolean).orElse(false)); vs.setUseNativeOpenAL(Optional.ofNullable(obj.get("useNativeOpenAL")).map(JsonElement::getAsBoolean).orElse(false)); vs.setGameDirType(getOrDefault(GameDirectoryType.values(), obj.get("gameDirType"), GameDirectoryType.ROOT_FOLDER)); @@ -844,6 +847,18 @@ public final class VersionSetting implements Cloneable { vs.setNativesDirType(getOrDefault(NativesDirectoryType.values(), obj.get("nativesDirType"), NativesDirectoryType.VERSION_FOLDER)); vs.setVersionIcon(getOrDefault(VersionIconType.values(), obj.get("versionIcon"), VersionIconType.DEFAULT)); + vs.setRenderer(Optional.ofNullable(obj.get("renderer")).map(JsonElement::getAsString) + .flatMap(name -> { + try { + return Optional.of(Renderer.valueOf(name.toUpperCase(Locale.ROOT))); + } catch (IllegalArgumentException ignored) { + return Optional.empty(); + } + }).orElseGet(() -> { + boolean useSoftwareRenderer = Optional.ofNullable(obj.get("useSoftwareRenderer")).map(JsonElement::getAsBoolean).orElse(false); + return useSoftwareRenderer ? Renderer.LLVMPIPE : Renderer.DEFAULT; + })); + return vs; } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/AdvancedVersionSettingPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/AdvancedVersionSettingPage.java index 1d65a2bb9..9f9754661 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/AdvancedVersionSettingPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/AdvancedVersionSettingPage.java @@ -1,15 +1,18 @@ package org.jackhuang.hmcl.ui.versions; +import com.jfoenix.controls.JFXComboBox; import com.jfoenix.controls.JFXTextField; import javafx.beans.binding.Bindings; import javafx.beans.property.ObjectProperty; import javafx.beans.property.ReadOnlyObjectProperty; import javafx.beans.property.SimpleObjectProperty; +import javafx.geometry.Pos; import javafx.scene.control.Label; import javafx.scene.control.ScrollPane; import javafx.scene.layout.*; import org.jackhuang.hmcl.game.NativesDirectoryType; import org.jackhuang.hmcl.setting.Profile; +import org.jackhuang.hmcl.game.Renderer; import org.jackhuang.hmcl.setting.VersionSetting; import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.ui.construct.*; @@ -17,7 +20,9 @@ import org.jackhuang.hmcl.ui.decorator.DecoratorPage; import java.nio.file.Paths; import java.util.Arrays; +import java.util.Locale; +import static org.jackhuang.hmcl.ui.FXUtils.stringConverter; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public final class AdvancedVersionSettingPage extends StackPane implements DecoratorPage { @@ -38,12 +43,12 @@ public final class AdvancedVersionSettingPage extends StackPane implements Decor private final OptionToggleButton noGameCheckPane; private final OptionToggleButton noJVMCheckPane; private final OptionToggleButton noNativesPatchPane; - private final OptionToggleButton useSoftwareRenderer; private final OptionToggleButton useNativeGLFWPane; private final OptionToggleButton useNativeOpenALPane; private final ComponentSublist nativesDirSublist; private final MultiFileItem nativesDirItem; private final MultiFileItem.FileOption nativesDirCustomOption; + private final JFXComboBox cboRenderer; public AdvancedVersionSettingPage(Profile profile, String versionId, VersionSetting versionSetting) { this.profile = profile; @@ -152,6 +157,20 @@ public final class AdvancedVersionSettingPage extends StackPane implements Decor nativesDirHint.setText(i18n("settings.advanced.natives_directory.hint")); nativesDirItem.getChildren().add(nativesDirHint); + BorderPane rendererPane = new BorderPane(); + { + Label label = new Label(i18n("settings.advanced.renderer")); + rendererPane.setLeft(label); + BorderPane.setAlignment(label, Pos.CENTER_LEFT); + + cboRenderer = new JFXComboBox<>(); + cboRenderer.getItems().setAll(Renderer.values()); + cboRenderer.setConverter(stringConverter(e -> i18n("settings.advanced.renderer." + e.name().toLowerCase(Locale.ROOT)))); + rendererPane.setRight(cboRenderer); + BorderPane.setAlignment(cboRenderer, Pos.CENTER_RIGHT); + FXUtils.setLimitWidth(cboRenderer, 300); + } + noJVMArgsPane = new OptionToggleButton(); noJVMArgsPane.setTitle(i18n("settings.advanced.no_jvm_args")); @@ -164,9 +183,6 @@ public final class AdvancedVersionSettingPage extends StackPane implements Decor noNativesPatchPane = new OptionToggleButton(); noNativesPatchPane.setTitle(i18n("settings.advanced.dont_patch_natives")); - useSoftwareRenderer = new OptionToggleButton(); - useSoftwareRenderer.setTitle(i18n("settings.advanced.use_software_renderer")); - useNativeGLFWPane = new OptionToggleButton(); useNativeGLFWPane.setTitle(i18n("settings.advanced.use_native_glfw")); @@ -174,9 +190,9 @@ public final class AdvancedVersionSettingPage extends StackPane implements Decor useNativeOpenALPane.setTitle(i18n("settings.advanced.use_native_openal")); workaroundPane.getContent().setAll( - nativesDirSublist, + nativesDirSublist, rendererPane, noJVMArgsPane, noGameCheckPane, noJVMCheckPane, noNativesPatchPane, - useSoftwareRenderer, useNativeGLFWPane, useNativeOpenALPane); + useNativeGLFWPane, useNativeOpenALPane); } rootPane.getChildren().addAll( @@ -188,6 +204,7 @@ public final class AdvancedVersionSettingPage extends StackPane implements Decor bindProperties(); } + @SuppressWarnings("deprecation") void bindProperties() { nativesDirCustomOption.bindBidirectional(versionSetting.nativesDirProperty()); FXUtils.bindString(txtJVMArgs, versionSetting.javaArgsProperty()); @@ -195,11 +212,11 @@ public final class AdvancedVersionSettingPage extends StackPane implements Decor FXUtils.bindString(txtMetaspace, versionSetting.permSizeProperty()); FXUtils.bindString(txtWrapper, versionSetting.wrapperProperty()); FXUtils.bindString(txtPreLaunchCommand, versionSetting.preLaunchCommandProperty()); + FXUtils.bindEnum(cboRenderer, versionSetting.rendererProperty()); noGameCheckPane.selectedProperty().bindBidirectional(versionSetting.notCheckGameProperty()); noJVMCheckPane.selectedProperty().bindBidirectional(versionSetting.notCheckJVMProperty()); noJVMArgsPane.selectedProperty().bindBidirectional(versionSetting.noJVMArgsProperty()); noNativesPatchPane.selectedProperty().bindBidirectional(versionSetting.notPatchNativesProperty()); - useSoftwareRenderer.selectedProperty().bindBidirectional(versionSetting.useSoftwareRendererProperty()); useNativeGLFWPane.selectedProperty().bindBidirectional(versionSetting.useNativeGLFWProperty()); useNativeOpenALPane.selectedProperty().bindBidirectional(versionSetting.useNativeOpenALProperty()); @@ -216,11 +233,11 @@ public final class AdvancedVersionSettingPage extends StackPane implements Decor FXUtils.unbind(txtWrapper, versionSetting.wrapperProperty()); FXUtils.unbind(txtPreLaunchCommand, versionSetting.preLaunchCommandProperty()); FXUtils.unbind(txtPostExitCommand, versionSetting.postExitCommandProperty()); + FXUtils.unbindEnum(cboRenderer); noGameCheckPane.selectedProperty().unbindBidirectional(versionSetting.notCheckGameProperty()); noJVMCheckPane.selectedProperty().unbindBidirectional(versionSetting.notCheckJVMProperty()); noJVMArgsPane.selectedProperty().unbindBidirectional(versionSetting.noJVMArgsProperty()); noNativesPatchPane.selectedProperty().unbindBidirectional(versionSetting.notPatchNativesProperty()); - useSoftwareRenderer.selectedProperty().unbindBidirectional(versionSetting.useSoftwareRendererProperty()); useNativeGLFWPane.selectedProperty().unbindBidirectional(versionSetting.useNativeGLFWProperty()); useNativeOpenALPane.selectedProperty().unbindBidirectional(versionSetting.useNativeOpenALProperty()); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/util/NativePatcher.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/NativePatcher.java index d8f518b86..bf458dfd0 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/util/NativePatcher.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/util/NativePatcher.java @@ -1,9 +1,7 @@ package org.jackhuang.hmcl.util; import com.google.gson.reflect.TypeToken; -import org.jackhuang.hmcl.game.Library; -import org.jackhuang.hmcl.game.NativesDirectoryType; -import org.jackhuang.hmcl.game.Version; +import org.jackhuang.hmcl.game.*; import org.jackhuang.hmcl.setting.VersionSetting; import org.jackhuang.hmcl.util.gson.JsonUtils; import org.jackhuang.hmcl.util.platform.Architecture; @@ -92,9 +90,9 @@ public final class NativePatcher { return version.setLibraries(newLibraries); } - public static Library getSoftwareRendererLoader(JavaVersion javaVersion) { + public static Library getMesaLoader(JavaVersion javaVersion, Renderer renderer) { Map map = Hole.nativeReplacement.get(javaVersion.getPlatform().toString()); - return map != null ? map.get("software-renderer-loader") : null; + return map != null ? map.get(renderer == Renderer.LLVMPIPE ? "software-renderer-loader" : "mesa-loader") : null; } private static final class Hole { diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index f29361bce..e2bbf3ab4 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -1003,11 +1003,15 @@ settings.advanced.process_priority.above_normal=Above Normal settings.advanced.process_priority.high=High settings.advanced.post_exit_command=Post-exit Command settings.advanced.post_exit_command.prompt=Commands to execute after the game exits +settings.advanced.renderer=Renderer +settings.advanced.renderer.default=OpenGL (Default) +settings.advanced.renderer.d3d12=DirectX 12 (Poor performance and compatibility) +settings.advanced.renderer.llvmpipe=軟渲染器 (Poor efficiency and best compatibility) +settings.advanced.renderer.zink=Vulkan (Best performance and poor compatibility) settings.advanced.server_ip=Server Address settings.advanced.server_ip.prompt=Join automatically after launching the game. settings.advanced.use_native_glfw=[Linux Only] Use system GLFW settings.advanced.use_native_openal=[Linux Only] Use system OpenAL -settings.advanced.use_software_renderer=Use OpenGL software renderer (better compatibility, but less performance) settings.advanced.workaround=Workarounds settings.advanced.workaround.warning=Workaround options are intended only for expert users. Tweaking with these options may crash the game. Unless you know what you are doing, please do not modify these options. settings.advanced.wrapper_launcher=Wrapper Command diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh.properties b/HMCL/src/main/resources/assets/lang/I18N_zh.properties index fe97018eb..66f7c4594 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties @@ -876,11 +876,15 @@ settings.advanced.process_priority.above_normal=較高(優先保證遊戲運 settings.advanced.process_priority.high=高(優先保證遊戲運行,但可能會導致其他程式卡頓) settings.advanced.post_exit_command=遊戲結束後執行命令 settings.advanced.post_exit_command.prompt=將在遊戲結束後呼叫使用 +settings.advanced.renderer=渲染器 +settings.advanced.renderer.default=OpenGL(默認) +settings.advanced.renderer.d3d12=DirectX 12(效能與相容性較差,用於調試) +settings.advanced.renderer.llvmpipe=軟渲染器(效能較差,相容性最好) +settings.advanced.renderer.zink=Vulkan(效能最好,相容性較差) settings.advanced.server_ip=伺服器位址 settings.advanced.server_ip.prompt=預設,啟動遊戲後直接進入對應伺服器 settings.advanced.use_native_glfw=[Linux] 使用系統 GLFW settings.advanced.use_native_openal=[Linux] 使用系統 OpenAL -settings.advanced.use_software_renderer=使用 OpenGL 軟渲染器(相容性更好,但效能較差) settings.advanced.workaround=除錯選項 settings.advanced.workaround.warning=除錯選項僅提供給專業玩家使用。修改除錯選項可能會導致遊戲無法啟動。除非你知道你在做什麼,否則請不要修改這些選項。 settings.advanced.wrapper_launcher=前置指令 diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties index cf719fcc2..24e4586e1 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -874,11 +874,15 @@ settings.advanced.process_priority.above_normal=较高(优先保证游戏运 settings.advanced.process_priority.high=高(优先保证游戏运行,但可能会导致其他程序卡顿) settings.advanced.post_exit_command=游戏结束后执行命令 settings.advanced.post_exit_command.prompt=将在游戏结束后调用 +settings.advanced.renderer=渲染器 +settings.advanced.renderer.default=OpenGL(默认) +settings.advanced.renderer.d3d12=DirectX 12(性能与兼容性较差,用于调试) +settings.advanced.renderer.llvmpipe=软渲染器(性能较差,兼容性最好) +settings.advanced.renderer.zink=Vulkan(性能最好,兼容性较差) settings.advanced.server_ip=服务器地址 settings.advanced.server_ip.prompt=默认,启动游戏后可以直接进入对应服务器 settings.advanced.use_native_glfw=[Linux] 使用系统 GLFW settings.advanced.use_native_openal=[Linux] 使用系统 OpenAL -settings.advanced.use_software_renderer=使用 OpenGL 软渲染器(兼容性更好,但性能较差) settings.advanced.workaround=调试选项 settings.advanced.workaround.warning=调试选项仅提供给专业玩家使用。调试选项可能会导致游戏无法启动。除非你知道你在做什么,否则请不要修改这些选项! settings.advanced.wrapper_launcher=包装命令 diff --git a/HMCL/src/main/resources/assets/natives.json b/HMCL/src/main/resources/assets/natives.json index f8007369e..b1c770a11 100644 --- a/HMCL/src/main/resources/assets/natives.json +++ b/HMCL/src/main/resources/assets/natives.json @@ -1530,6 +1530,30 @@ "size": 12964773 } } + }, + "mesa-loader": { + "name": "org.glavo:mesa-loader-windows:0.2.0:x64", + "downloads": { + "artifact": { + "path": "org/glavo/mesa-loader-windows/0.2.0/mesa-loader-windows-0.2.0-x64.jar", + "url": "https://repo1.maven.org/maven2/org/glavo/mesa-loader-windows/0.2.0/mesa-loader-windows-0.2.0-x64.jar", + "sha1": "adb4a16ecb95c8944a016829b05d70f934ea1a29", + "size": 22823052 + } + } + } + }, + "windows-x86": { + "mesa-loader": { + "name": "org.glavo:mesa-loader-windows:0.2.0:x86", + "downloads": { + "artifact": { + "path": "org/glavo/mesa-loader-windows/0.2.0/mesa-loader-windows-0.2.0-x86.jar", + "url": "https://repo1.maven.org/maven2/org/glavo/mesa-loader-windows/0.2.0/mesa-loader-windows-0.2.0-x86.jar", + "sha1": "93c0b9b7382d984e713d3aa299ceb337fde2897b", + "size": 18273286 + } + } } }, "windows-arm64": { @@ -2074,7 +2098,7 @@ "downloads": { "artifact": { "path": "org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1-natives-macos-arm64.jar", - "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1-natives-macos-arm64.jar", + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1-natives-macos-arm64.jar", "sha1": "71d0d5e469c9c95351eb949064497e3391616ac9", "size": 42693 } @@ -2096,7 +2120,7 @@ "downloads": { "artifact": { "path": "org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1-natives-macos-arm64.jar", - "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1-natives-macos-arm64.jar", + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1-natives-macos-arm64.jar", "sha1": "e577b87d8ad2ade361aaea2fcf226c660b15dee8", "size": 103475 } @@ -2118,7 +2142,7 @@ "downloads": { "artifact": { "path": "org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1-natives-macos-arm64.jar", - "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1-natives-macos-arm64.jar", + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1-natives-macos-arm64.jar", "sha1": "23d55e7490b57495320f6c9e1936d78fd72c4ef8", "size": 346125 } @@ -2140,7 +2164,7 @@ "downloads": { "artifact": { "path": "org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1-natives-macos-arm64.jar", - "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1-natives-macos-arm64.jar", + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1-natives-macos-arm64.jar", "sha1": "eafe34b871d966292e8db0f1f3d6b8b110d4e91d", "size": 41665 } @@ -2162,7 +2186,7 @@ "downloads": { "artifact": { "path": "org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1-natives-macos-arm64.jar", - "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1-natives-macos-arm64.jar", + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1-natives-macos-arm64.jar", "sha1": "cac0d3f712a3da7641fa174735a5f315de7ffe0a", "size": 129077 } @@ -2184,7 +2208,7 @@ "downloads": { "artifact": { "path": "org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1-natives-macos-arm64.jar", - "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1-natives-macos-arm64.jar", + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1-natives-macos-arm64.jar", "sha1": "fcf073ed911752abdca5f0b00a53cfdf17ff8e8b", "size": 178408 } @@ -2206,7 +2230,7 @@ "downloads": { "artifact": { "path": "org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1-natives-macos-arm64.jar", - "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1-natives-macos-arm64.jar", + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1-natives-macos-arm64.jar", "sha1": "972ecc17bad3571e81162153077b4d47b7b9eaa9", "size": 41380 } @@ -2228,7 +2252,7 @@ "downloads": { "artifact": { "path": "org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1-natives-macos-arm64.jar", - "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1-natives-macos-arm64.jar", + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1-natives-macos-arm64.jar", "sha1": "71d0d5e469c9c95351eb949064497e3391616ac9", "size": 42693 } @@ -2250,7 +2274,7 @@ "downloads": { "artifact": { "path": "org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1-natives-macos-arm64.jar", - "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1-natives-macos-arm64.jar", + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1-natives-macos-arm64.jar", "sha1": "e577b87d8ad2ade361aaea2fcf226c660b15dee8", "size": 103475 } @@ -2272,7 +2296,7 @@ "downloads": { "artifact": { "path": "org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1-natives-macos-arm64.jar", - "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1-natives-macos-arm64.jar", + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1-natives-macos-arm64.jar", "sha1": "23d55e7490b57495320f6c9e1936d78fd72c4ef8", "size": 346125 } @@ -2294,7 +2318,7 @@ "downloads": { "artifact": { "path": "org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1-natives-macos-arm64.jar", - "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1-natives-macos-arm64.jar", + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1-natives-macos-arm64.jar", "sha1": "eafe34b871d966292e8db0f1f3d6b8b110d4e91d", "size": 41665 } @@ -2316,7 +2340,7 @@ "downloads": { "artifact": { "path": "org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1-natives-macos-arm64.jar", - "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1-natives-macos-arm64.jar", + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1-natives-macos-arm64.jar", "sha1": "cac0d3f712a3da7641fa174735a5f315de7ffe0a", "size": 129077 } @@ -2338,7 +2362,7 @@ "downloads": { "artifact": { "path": "org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1-natives-macos-arm64.jar", - "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1-natives-macos-arm64.jar", + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1-natives-macos-arm64.jar", "sha1": "fcf073ed911752abdca5f0b00a53cfdf17ff8e8b", "size": 178408 } @@ -2360,7 +2384,7 @@ "downloads": { "artifact": { "path": "org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1-natives-macos-arm64.jar", - "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1-natives-macos-arm64.jar", + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1-natives-macos-arm64.jar", "sha1": "972ecc17bad3571e81162153077b4d47b7b9eaa9", "size": 41380 } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/LaunchOptions.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/LaunchOptions.java index d1174a26c..4775d3d38 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/LaunchOptions.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/LaunchOptions.java @@ -59,7 +59,7 @@ public class LaunchOptions implements Serializable { private NativesDirectoryType nativesDirType; private String nativesDir; private ProcessPriority processPriority = ProcessPriority.NORMAL; - private boolean useSoftwareRenderer; + private Renderer renderer = Renderer.DEFAULT; private boolean useNativeGLFW; private boolean useNativeOpenAL; private boolean daemon; @@ -252,8 +252,8 @@ public class LaunchOptions implements Serializable { return processPriority; } - public boolean isUseSoftwareRenderer() { - return useSoftwareRenderer; + public Renderer getRenderer() { + return renderer; } public boolean isUseNativeGLFW() { @@ -442,8 +442,8 @@ public class LaunchOptions implements Serializable { return options.nativesDir; } - public boolean isUseSoftwareRenderer() { - return options.useSoftwareRenderer; + public Renderer getRenderer() { + return options.renderer; } public boolean isUseNativeGLFW() { @@ -592,8 +592,8 @@ public class LaunchOptions implements Serializable { return this; } - public Builder setUseSoftwareRenderer(boolean useSoftwareRenderer) { - options.useSoftwareRenderer = useSoftwareRenderer; + public Builder setRenderer(@NotNull Renderer renderer) { + options.renderer = renderer; return this; } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Renderer.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Renderer.java new file mode 100644 index 000000000..6d3fe4b86 --- /dev/null +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Renderer.java @@ -0,0 +1,8 @@ +package org.jackhuang.hmcl.game; + +public enum Renderer { + DEFAULT, + ZINK, + LLVMPIPE, + D3D12 +} diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java index 028125f79..fa3a911e5 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java @@ -469,9 +469,16 @@ public class DefaultLauncher extends Launcher { env.put("INST_MC_DIR", repository.getRunDirectory(version.getId()).getAbsolutePath()); env.put("INST_JAVA", options.getJava().getBinary().toString()); - if (options.isUseSoftwareRenderer() && OperatingSystem.CURRENT_OS == OperatingSystem.LINUX) { - env.put("LIBGL_ALWAYS_SOFTWARE", "1"); - env.put("__GLX_VENDOR_LIBRARY_NAME", "mesa"); + Renderer renderer = options.getRenderer(); + if (renderer != Renderer.DEFAULT && OperatingSystem.CURRENT_OS != OperatingSystem.OSX) { + if (OperatingSystem.CURRENT_OS == OperatingSystem.LINUX) { + env.put("__GLX_VENDOR_LIBRARY_NAME", "mesa"); + if (renderer == Renderer.LLVMPIPE) + env.put("LIBGL_ALWAYS_SOFTWARE", "1"); + } + + if (renderer != Renderer.LLVMPIPE) + env.put("GALLIUM_DRIVER", renderer.name().toLowerCase(Locale.ROOT)); } LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(version);