Skip to content

Commit a35f438

Browse files
committed
Add OpenGL and Vulkan renderer options and update launcher logic
1 parent 4f02888 commit a35f438

6 files changed

Lines changed: 43 additions & 11 deletions

File tree

HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,8 @@ private void launch0() {
174174
}),
175175
Task.composeAsync(() -> {
176176
Renderer renderer = setting.getRenderer();
177-
if (renderer == Renderer.DEFAULT || OperatingSystem.CURRENT_OS != OperatingSystem.WINDOWS) {
177+
if (renderer == null || renderer.getMesaLoaderName() == null
178+
|| OperatingSystem.CURRENT_OS != OperatingSystem.WINDOWS) {
178179
return null;
179180
}
180181

@@ -187,7 +188,7 @@ private void launch0() {
187188
return null;
188189
}
189190

190-
String agent = FileUtils.getAbsolutePath(file) + "=" + renderer.getLoaderName();
191+
String agent = FileUtils.getAbsolutePath(file) + "=" + renderer.getMesaLoaderName();
191192

192193
if (GameLibrariesTask.shouldDownloadLibrary(repository, version.get(), lib, integrityCheck)) {
193194
return new LibraryDownloadTask(dependencyManager, file, lib)

HMCL/src/main/resources/assets/lang/I18N.properties

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1386,6 +1386,10 @@ settings.advanced.renderer.lavapipe=Mesa Lavapipe
13861386
settings.advanced.renderer.lavapipe.desc=Software Vulkan Renderer
13871387
settings.advanced.renderer.llvmpipe=Mesa LLVMpipe
13881388
settings.advanced.renderer.llvmpipe.desc=Software OpenGL Renderer
1389+
settings.advanced.renderer.opengl=OpenGL
1390+
settings.advanced.renderer.opengl.desc=Use system OpenGL renderer
1391+
settings.advanced.renderer.vulkan=Vulkan
1392+
settings.advanced.renderer.vulkan.desc=Use system Vulkan renderer
13891393
settings.advanced.renderer.dozen=Mesa Dozen
13901394
settings.advanced.renderer.dozen.desc=Vulkan renderer based on DirectX 12
13911395
settings.advanced.renderer.zink=Mesa Zink

HMCL/src/main/resources/assets/lang/I18N_zh.properties

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1173,6 +1173,10 @@ settings.advanced.renderer.lavapipe=Mesa Lavapipe
11731173
settings.advanced.renderer.lavapipe.desc=軟體 Vulkan 繪製器
11741174
settings.advanced.renderer.llvmpipe=Mesa LLVMpipe
11751175
settings.advanced.renderer.llvmpipe.desc=軟體 OpenGL 繪製器
1176+
settings.advanced.renderer.opengl=OpenGL
1177+
settings.advanced.renderer.opengl.desc=使用系統 OpenGL 繪製器
1178+
settings.advanced.renderer.vulkan=Vulkan
1179+
settings.advanced.renderer.vulkan.desc=使用系統預設 Vulkan 繪製器
11761180
settings.advanced.renderer.dozen=Mesa Dozen
11771181
settings.advanced.renderer.dozen.desc=基於 DirectX 12 的 Vulkan 繪製器
11781182
settings.advanced.renderer.zink=Mesa Zink

HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1180,6 +1180,10 @@ settings.advanced.renderer.lavapipe=Mesa Lavapipe
11801180
settings.advanced.renderer.lavapipe.desc=软件 Vulkan 渲染器
11811181
settings.advanced.renderer.llvmpipe=Mesa LLVMpipe
11821182
settings.advanced.renderer.llvmpipe.desc=软件 OpenGL 渲染器
1183+
settings.advanced.renderer.opengl=OpenGL
1184+
settings.advanced.renderer.opengl.desc=使用系统 OpenGL 渲染器
1185+
settings.advanced.renderer.vulkan=Vulkan
1186+
settings.advanced.renderer.vulkan.desc=使用系统默认 Vulkan 渲染器
11831187
settings.advanced.renderer.zink=Mesa Zink
11841188
settings.advanced.renderer.zink.desc=基于 Vulkan 的 OpenGL 渲染器
11851189
settings.advanced.server_ip=服务器地址

HMCLCore/src/main/java/org/jackhuang/hmcl/game/Renderer.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,22 @@
2121
import org.jetbrains.annotations.Nullable;
2222

2323
import java.util.List;
24+
import java.util.Locale;
2425
import java.util.stream.Stream;
2526

2627
/// @author Glavo
2728
@NotNullByDefault
2829
public enum Renderer {
2930
DEFAULT(null, null, null),
3031

32+
VULKAN(API.VULKAN, null, null),
3133
LAVAPIPE(API.VULKAN, "lavapipe", "lvp"),
3234

3335
// Currently, Dozen does not support the VK_KHR_push_descriptor feature, so it cannot launch Minecraft 26.2
3436
// Using Dozen can run Minecraft 1.21.11 + VulkanMod, but it will cause the game to crash after playing for a while
3537
// DOZEN(API.VULKAN, "dzn", "dzn"),
3638

39+
OPENGL(API.OPENGL, null, null),
3740
ZINK(API.OPENGL, "zink", null),
3841
LLVMPIPE(API.OPENGL, "llvmpipe", null),
3942
D3D12(API.OPENGL, "d3d12", null),
@@ -70,7 +73,7 @@ public enum Renderer {
7073
return api;
7174
}
7275

73-
public @Nullable String getLoaderName() {
76+
public @Nullable String getMesaLoaderName() {
7477
return loaderName;
7578
}
7679

@@ -85,6 +88,12 @@ public enum Renderer {
8588
/// The Graphics API.
8689
public enum API {
8790
OPENGL,
88-
VULKAN,
91+
VULKAN;
92+
93+
private final String minecraftArg = name().toLowerCase(Locale.ROOT);
94+
95+
public String getMinecraftArg() {
96+
return minecraftArg;
97+
}
8998
}
9099
}

HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,9 @@ private Command generateCommandLine(Path nativeFolder) throws IOException {
265265
res.addDefault("-Dfml.ignorePatchDiscrepancies=", "true");
266266
}
267267

268-
if (OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS && options.getRenderer() != null) {
268+
if (OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS
269+
&& options.getRenderer() != null
270+
&& options.getRenderer().getMesaLoaderName() != null) {
269271
res.addDefault("-Dorg.glavo.mesa.loader.nativeDir=", FileUtils.getAbsolutePath(nativeFolder.resolve("mesa-loader")));
270272
}
271273

@@ -399,6 +401,12 @@ private Command generateCommandLine(Path nativeFolder) throws IOException {
399401
}
400402
}
401403

404+
if (options.getRenderer().getApi() != null
405+
&& gameVersion.isPresent() && gameVersion.get().compareTo("26.2-snapshot-2") >= 0) {
406+
res.add("--graphicsBackend");
407+
res.add(options.getRenderer().getApi().getMinecraftArg());
408+
}
409+
402410
res.addAllWithoutParsing(Arguments.parseStringArguments(options.getGameArguments(), configuration));
403411

404412
res.removeIf(it -> getForbiddens().containsKey(it) && getForbiddens().get(it).get());
@@ -629,14 +637,16 @@ private Map<String, String> getEnvVars(Path nativeFolder) {
629637
Renderer renderer = options.getRenderer();
630638
if (renderer != Renderer.DEFAULT) {
631639
if (OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS) {
632-
if (renderer != Renderer.LLVMPIPE)
633-
env.put("GALLIUM_DRIVER", renderer.name().toLowerCase(Locale.ROOT));
640+
if (renderer.getMesaLoaderName() != null) {
641+
if (renderer != Renderer.LLVMPIPE)
642+
env.put("GALLIUM_DRIVER", renderer.name().toLowerCase(Locale.ROOT));
634643

635-
if (renderer.getApi() == Renderer.API.VULKAN) {
636-
String icdFile = FileUtils.getAbsolutePath(nativeFolder.resolve("mesa-loader/" + renderer.getIcdFileName()));
644+
if (renderer.getApi() == Renderer.API.VULKAN) {
645+
String icdFile = FileUtils.getAbsolutePath(nativeFolder.resolve("mesa-loader/" + renderer.getIcdFileName()));
637646

638-
env.put("VK_ICD_FILENAMES", icdFile);
639-
env.put("VK_DRIVER_FILES", icdFile);
647+
env.put("VK_ICD_FILENAMES", icdFile);
648+
env.put("VK_DRIVER_FILES", icdFile);
649+
}
640650
}
641651
} else if (OperatingSystem.CURRENT_OS == OperatingSystem.LINUX) {
642652
switch (renderer) {

0 commit comments

Comments
 (0)