diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java index dfad0b9f1..8292ded8c 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java @@ -320,12 +320,16 @@ public class MainActivity extends BaseActivity implements ControlButtonMenuListe if(Tools.LOCAL_RENDERER == null) { Tools.LOCAL_RENDERER = LauncherPreferences.PREF_RENDERER; } + if(!Tools.checkRendererCompatible(this, Tools.LOCAL_RENDERER)) { + Tools.RenderersList renderersList = Tools.getCompatibleRenderers(this); + String firstCompatibleRenderer = renderersList.rendererIds.get(0); + Log.w("runCraft","Incompatible renderer "+Tools.LOCAL_RENDERER+ " will be replaced with "+firstCompatibleRenderer); + Tools.LOCAL_RENDERER = firstCompatibleRenderer; + Tools.releaseRenderersCache(); + } MinecraftAccount minecraftAccount = PojavProfile.getCurrentProfileContent(this, null); Logger.appendToLog("--------- beginning with launcher debug"); printLauncherInfo(versionId, Tools.isValidString(minecraftProfile.javaArgs) ? minecraftProfile.javaArgs : LauncherPreferences.PREF_CUSTOM_JAVA_ARGS); - if (Tools.LOCAL_RENDERER.equals("vulkan_zink")) { - checkVulkanZinkIsSupported(); - } JREUtils.redirectAndPrintJRELog(); LauncherProfiles.load(); int requiredJavaVersion = 8; diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java index e2f7d711b..21e3f9514 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java @@ -16,7 +16,9 @@ import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; import android.content.res.Configuration; +import android.content.res.Resources; import android.database.Cursor; import android.net.Uri; import android.os.Build; @@ -39,6 +41,7 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.app.NotificationManagerCompat; +import androidx.core.content.res.TypedArrayUtils; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentTransaction; @@ -116,6 +119,7 @@ public final class Tools { public static String CTRLMAP_PATH; public static String CTRLDEF_FILE; public static final int RUN_MOD_INSTALLER = 2050; + private static RenderersList sCompatibleRenderers; private static File getPojavStorageRoot(Context ctx) { @@ -1076,4 +1080,56 @@ public final class Tools { t.measure(widthMeasureSpec, heightMeasureSpec); return t.getMeasuredHeight(); } + + public static class RenderersList { + public final List rendererIds; + public final String[] rendererDisplayNames; + + public RenderersList(List rendererIds, String[] rendererDisplayNames) { + this.rendererIds = rendererIds; + this.rendererDisplayNames = rendererDisplayNames; + } + } + + /** Return the renderers that are compatible with this device */ + public static RenderersList getCompatibleRenderers(Context context) { + if(sCompatibleRenderers != null) return sCompatibleRenderers; + Resources resources = context.getResources(); + String[] defaultRenderers = resources.getStringArray(R.array.renderer_values); + String[] defaultRendererNames = resources.getStringArray(R.array.renderer); + PackageManager packageManager = context.getPackageManager(); + boolean deviceHasVulkan; + if (SDK_INT >= Build.VERSION_CODES.N) { + deviceHasVulkan = packageManager.hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_LEVEL) && + packageManager.hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION); + }else{ + deviceHasVulkan = false; + } + // Currently, only 32-bit x86 does not have the Zink binary + boolean deviceHasZinkBinary = !(Architecture.is32BitsDevice() && Architecture.isx86Device()); + List rendererIds = new ArrayList<>(defaultRenderers.length); + List rendererNames = new ArrayList<>(defaultRendererNames.length); + for(int i = 0; i < defaultRenderers.length; i++) { + String rendererId = defaultRenderers[i]; + if(rendererId.contains("vulkan") && !deviceHasVulkan) continue; + if(rendererId.contains("zink") && !deviceHasZinkBinary) continue; + rendererIds.add(rendererId); + rendererNames.add(defaultRendererNames[i]); + } + sCompatibleRenderers = new RenderersList(rendererIds, + rendererNames.toArray(new String[0])); + + return sCompatibleRenderers; + } + + /** Checks if the renderer Id is compatible with the current device */ + public static boolean checkRendererCompatible(Context context, String rendererName) { + return getCompatibleRenderers(context).rendererIds.contains(rendererName); + } + + /** Releases the cache of compatible renderers. */ + public static void releaseRenderersCache() { + sCompatibleRenderers = null; + System.gc(); + } } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/fragments/ProfileEditorFragment.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/fragments/ProfileEditorFragment.java index 2cb0ff6e2..9e8218f10 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/fragments/ProfileEditorFragment.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/fragments/ProfileEditorFragment.java @@ -29,7 +29,6 @@ import net.kdt.pojavlaunch.value.launcherprofiles.MinecraftProfile; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.List; public class ProfileEditorFragment extends Fragment { @@ -67,13 +66,13 @@ public class ProfileEditorFragment extends Fragment { @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - mRenderNames = Arrays.asList(getResources().getStringArray(R.array.renderer_values)); bindViews(view); - // Renderer spinner - List renderList = new ArrayList<>(5); - Collections.addAll(renderList, getResources().getStringArray(R.array.renderer)); - renderList.add("Default"); + Tools.RenderersList renderersList = Tools.getCompatibleRenderers(view.getContext()); + mRenderNames = renderersList.rendererIds; + List renderList = new ArrayList<>(renderersList.rendererDisplayNames.length + 1); + renderList.addAll(Arrays.asList(renderersList.rendererDisplayNames)); + renderList.add(view.getContext().getString(R.string.global_default)); mDefaultRenderer.setAdapter(new ArrayAdapter<>(getContext(), R.layout.item_simple_list_1, renderList)); // Set up behaviors diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/screens/LauncherPreferenceVideoFragment.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/screens/LauncherPreferenceVideoFragment.java index 319121887..15621faae 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/screens/LauncherPreferenceVideoFragment.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/screens/LauncherPreferenceVideoFragment.java @@ -6,10 +6,12 @@ import android.content.SharedPreferences; import android.os.Build; import android.os.Bundle; +import androidx.preference.ListPreference; import androidx.preference.SwitchPreference; import androidx.preference.SwitchPreferenceCompat; import net.kdt.pojavlaunch.R; +import net.kdt.pojavlaunch.Tools; import net.kdt.pojavlaunch.prefs.CustomSeekBarPreference; import net.kdt.pojavlaunch.prefs.LauncherPreferences; @@ -36,6 +38,12 @@ public class LauncherPreferenceVideoFragment extends LauncherPreferenceFragment // Sustained performance is only available since Nougat SwitchPreference sustainedPerfSwitch = findPreference("sustainedPerformance"); sustainedPerfSwitch.setVisible(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N); + + ListPreference rendererListPreference = findPreference("renderer"); + Tools.RenderersList renderersList = Tools.getCompatibleRenderers(getContext()); + rendererListPreference.setEntries(renderersList.rendererDisplayNames); + rendererListPreference.setEntryValues(renderersList.rendererIds.toArray(new String[0])); + computeVisibility(); } diff --git a/app_pojavlauncher/src/main/jniLibs/arm64-v8a/libOSMesa.so b/app_pojavlauncher/src/main/jniLibs/arm64-v8a/libOSMesa.so old mode 100755 new mode 100644 index 69491768c..ceafc92fc Binary files a/app_pojavlauncher/src/main/jniLibs/arm64-v8a/libOSMesa.so and b/app_pojavlauncher/src/main/jniLibs/arm64-v8a/libOSMesa.so differ diff --git a/app_pojavlauncher/src/main/jniLibs/armeabi-v7a/libOSMesa_8.so b/app_pojavlauncher/src/main/jniLibs/armeabi-v7a/libOSMesa.so similarity index 50% rename from app_pojavlauncher/src/main/jniLibs/armeabi-v7a/libOSMesa_8.so rename to app_pojavlauncher/src/main/jniLibs/armeabi-v7a/libOSMesa.so index 647871624..7e4f0f3a9 100644 Binary files a/app_pojavlauncher/src/main/jniLibs/armeabi-v7a/libOSMesa_8.so and b/app_pojavlauncher/src/main/jniLibs/armeabi-v7a/libOSMesa.so differ diff --git a/app_pojavlauncher/src/main/jniLibs/armeabi-v7a/libepoxy_0.so b/app_pojavlauncher/src/main/jniLibs/armeabi-v7a/libepoxy_0.so deleted file mode 100644 index 953c8860b..000000000 Binary files a/app_pojavlauncher/src/main/jniLibs/armeabi-v7a/libepoxy_0.so and /dev/null differ diff --git a/app_pojavlauncher/src/main/jniLibs/armeabi-v7a/libvirgl_test_server.so b/app_pojavlauncher/src/main/jniLibs/armeabi-v7a/libvirgl_test_server.so deleted file mode 100644 index 79a7c2353..000000000 Binary files a/app_pojavlauncher/src/main/jniLibs/armeabi-v7a/libvirgl_test_server.so and /dev/null differ diff --git a/app_pojavlauncher/src/main/jniLibs/armeabi-v7a/libvirglrenderer_1.so b/app_pojavlauncher/src/main/jniLibs/armeabi-v7a/libvirglrenderer_1.so deleted file mode 100644 index dd009149d..000000000 Binary files a/app_pojavlauncher/src/main/jniLibs/armeabi-v7a/libvirglrenderer_1.so and /dev/null differ diff --git a/app_pojavlauncher/src/main/jniLibs/x86_64/libOSMesa_8.so b/app_pojavlauncher/src/main/jniLibs/x86_64/libOSMesa.so similarity index 56% rename from app_pojavlauncher/src/main/jniLibs/x86_64/libOSMesa_8.so rename to app_pojavlauncher/src/main/jniLibs/x86_64/libOSMesa.so index 9ee7b0124..05af0536c 100644 Binary files a/app_pojavlauncher/src/main/jniLibs/x86_64/libOSMesa_8.so and b/app_pojavlauncher/src/main/jniLibs/x86_64/libOSMesa.so differ diff --git a/app_pojavlauncher/src/main/jniLibs/x86_64/libepoxy_0.so b/app_pojavlauncher/src/main/jniLibs/x86_64/libepoxy_0.so deleted file mode 100644 index ad7997cab..000000000 Binary files a/app_pojavlauncher/src/main/jniLibs/x86_64/libepoxy_0.so and /dev/null differ diff --git a/app_pojavlauncher/src/main/jniLibs/x86_64/libvirgl_test_server.so b/app_pojavlauncher/src/main/jniLibs/x86_64/libvirgl_test_server.so deleted file mode 100644 index 6c96e6a68..000000000 Binary files a/app_pojavlauncher/src/main/jniLibs/x86_64/libvirgl_test_server.so and /dev/null differ diff --git a/app_pojavlauncher/src/main/jniLibs/x86_64/libvirglrenderer_1.so b/app_pojavlauncher/src/main/jniLibs/x86_64/libvirglrenderer_1.so deleted file mode 100644 index 19e66c7cb..000000000 Binary files a/app_pojavlauncher/src/main/jniLibs/x86_64/libvirglrenderer_1.so and /dev/null differ diff --git a/app_pojavlauncher/src/main/res/values/strings.xml b/app_pojavlauncher/src/main/res/values/strings.xml index 3274eaf5d..98904cd64 100644 --- a/app_pojavlauncher/src/main/res/values/strings.xml +++ b/app_pojavlauncher/src/main/res/values/strings.xml @@ -127,6 +127,7 @@ Wait Select Retry + Default Application/Game exited with code %d, check latestlog.txt for more details. diff --git a/app_pojavlauncher/src/main/res/xml/pref_video.xml b/app_pojavlauncher/src/main/res/xml/pref_video.xml index faaca6621..e2848e1cc 100644 --- a/app_pojavlauncher/src/main/res/xml/pref_video.xml +++ b/app_pojavlauncher/src/main/res/xml/pref_video.xml @@ -9,8 +9,6 @@ android:title="@string/mcl_setting_category_renderer" android:key="renderer" android:defaultValue="opengles2" - android:entries="@array/renderer" - android:entryValues="@array/renderer_values" android:icon="@drawable/ic_setting_engine" app2:useSimpleSummaryProvider="true"/>