Feat[renderer]: compatibility checking + multiarch binaries

This commit is contained in:
artdeell 2023-09-17 12:32:47 +03:00
parent cc84e8a754
commit ce87be9f4e
15 changed files with 77 additions and 11 deletions

View File

@ -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;

View File

@ -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<String> rendererIds;
public final String[] rendererDisplayNames;
public RenderersList(List<String> 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<String> rendererIds = new ArrayList<>(defaultRenderers.length);
List<String> 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();
}
}

View File

@ -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<String> 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<String> 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

View File

@ -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();
}

BIN
app_pojavlauncher/src/main/jniLibs/arm64-v8a/libOSMesa.so Executable file → Normal file

Binary file not shown.

View File

@ -127,6 +127,7 @@
<string name="global_waiting">Wait</string>
<string name="global_select">Select</string>
<string name="global_retry">Retry</string>
<string name="global_default">Default</string>
<!-- MainActivity: strings -->
<string name="mcn_exit_title">Application/Game exited with code %d, check latestlog.txt for more details.</string>

View File

@ -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"/>