From b7ba126db0d796348ba884333b341e50252433ad Mon Sep 17 00:00:00 2001 From: JosJuice Date: Thu, 20 May 2021 16:34:30 +0200 Subject: [PATCH 1/2] Android: Use JNI for getting post-processsing shaders The Java implementation of getting the list of post-processing shaders only looked in the Sys folder and not the User folder. This could be fixed in the Java implementation, but it's simpler to just call the C++ implementation instead. --- .../settings/model/PostProcessing.java | 15 +++++ .../ui/SettingsFragmentPresenter.java | 55 ++++--------------- .../jni/AndroidCommon/AndroidCommon.cpp | 4 +- .../Android/jni/AndroidCommon/AndroidCommon.h | 2 + Source/Android/jni/CMakeLists.txt | 3 +- .../Android/jni/{ => Config}/NativeConfig.cpp | 0 Source/Android/jni/Config/PostProcessing.cpp | 35 ++++++++++++ 7 files changed, 67 insertions(+), 47 deletions(-) create mode 100644 Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/PostProcessing.java rename Source/Android/jni/{ => Config}/NativeConfig.cpp (100%) create mode 100644 Source/Android/jni/Config/PostProcessing.cpp diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/PostProcessing.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/PostProcessing.java new file mode 100644 index 0000000000..4d7ccd5032 --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/PostProcessing.java @@ -0,0 +1,15 @@ +package org.dolphinemu.dolphinemu.features.settings.model; + +import androidx.annotation.NonNull; + +public class PostProcessing +{ + @NonNull + public static native String[] getShaderList(); + + @NonNull + public static native String[] getAnaglyphShaderList(); + + @NonNull + public static native String[] getPassiveShaderList(); +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java index f23e0cf374..75c0faaa09 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java @@ -17,6 +17,7 @@ import org.dolphinemu.dolphinemu.features.settings.model.IntSetting; import org.dolphinemu.dolphinemu.features.settings.model.LegacyBooleanSetting; import org.dolphinemu.dolphinemu.features.settings.model.LegacyIntSetting; import org.dolphinemu.dolphinemu.features.settings.model.LegacyStringSetting; +import org.dolphinemu.dolphinemu.features.settings.model.PostProcessing; import org.dolphinemu.dolphinemu.features.settings.model.Settings; import org.dolphinemu.dolphinemu.features.settings.model.StringSetting; import org.dolphinemu.dolphinemu.features.settings.model.WiimoteProfileStringSetting; @@ -622,11 +623,17 @@ public final class SettingsFragmentPresenter int stereoModeValue = IntSetting.GFX_STEREO_MODE.getInt(mSettings); final int anaglyphMode = 3; - String subDir = stereoModeValue == anaglyphMode ? "Anaglyph" : null; - String[] shaderListEntries = getShaderList(subDir); - String[] shaderListValues = new String[shaderListEntries.length]; - System.arraycopy(shaderListEntries, 0, shaderListValues, 0, shaderListEntries.length); + String[] shaderList = stereoModeValue == anaglyphMode ? + PostProcessing.getAnaglyphShaderList() : PostProcessing.getShaderList(); + + String[] shaderListEntries = new String[shaderList.length + 1]; + shaderListEntries[0] = mContext.getString(R.string.off); + System.arraycopy(shaderList, 0, shaderListEntries, 1, shaderList.length); + + String[] shaderListValues = new String[shaderList.length + 1]; shaderListValues[0] = ""; + System.arraycopy(shaderList, 0, shaderListValues, 1, shaderList.length); + sl.add(new StringSingleChoiceSetting(mContext, StringSetting.GFX_ENHANCE_POST_SHADER, R.string.post_processing_shader, 0, shaderListEntries, shaderListValues)); @@ -664,46 +671,6 @@ public final class SettingsFragmentPresenter } } - private String[] getShaderList(String subDir) - { - try - { - String shadersPath = - DirectoryInitialization.getDolphinInternalDirectory() + "/Shaders"; - if (!TextUtils.isEmpty(subDir)) - { - shadersPath += "/" + subDir; - } - - File file = new File(shadersPath); - File[] shaderFiles = file.listFiles(); - if (shaderFiles != null) - { - String[] result = new String[shaderFiles.length + 1]; - result[0] = mView.getActivity().getString(R.string.off); - for (int i = 0; i < shaderFiles.length; i++) - { - String name = shaderFiles[i].getName(); - int extensionIndex = name.indexOf(".glsl"); - if (extensionIndex > 0) - { - name = name.substring(0, extensionIndex); - } - result[i + 1] = name; - } - - return result; - } - } - catch (Exception ex) - { - Log.debug("[Settings] Unable to find shader files"); - // return empty list - } - - return new String[]{}; - } - private void addHackSettings(ArrayList sl) { sl.add(new HeaderSetting(mContext, R.string.embedded_frame_buffer, 0)); diff --git a/Source/Android/jni/AndroidCommon/AndroidCommon.cpp b/Source/Android/jni/AndroidCommon/AndroidCommon.cpp index b5a5a7faaa..06da3774c2 100644 --- a/Source/Android/jni/AndroidCommon/AndroidCommon.cpp +++ b/Source/Android/jni/AndroidCommon/AndroidCommon.cpp @@ -44,7 +44,7 @@ std::vector JStringArrayToVector(JNIEnv* env, jobjectArray array) return result; } -jobjectArray JStringArrayFromVector(JNIEnv* env, std::vector vector) +jobjectArray VectorToJStringArray(JNIEnv* env, std::vector vector) { jobjectArray result = env->NewObjectArray(vector.size(), IDCache::GetStringClass(), nullptr); for (jsize i = 0; i < vector.size(); ++i) @@ -145,7 +145,7 @@ std::vector DoFileSearchAndroidContent(const std::string& directory JNIEnv* env = IDCache::GetEnvForThread(); jobject result = env->CallStaticObjectMethod( IDCache::GetContentHandlerClass(), IDCache::GetContentHandlerDoFileSearch(), - ToJString(env, directory), JStringArrayFromVector(env, extensions), recursive); + ToJString(env, directory), VectorToJStringArray(env, extensions), recursive); return JStringArrayToVector(env, reinterpret_cast(result)); } diff --git a/Source/Android/jni/AndroidCommon/AndroidCommon.h b/Source/Android/jni/AndroidCommon/AndroidCommon.h index 7d4f5d0fbc..b5b0d0eaa9 100644 --- a/Source/Android/jni/AndroidCommon/AndroidCommon.h +++ b/Source/Android/jni/AndroidCommon/AndroidCommon.h @@ -12,7 +12,9 @@ std::string GetJString(JNIEnv* env, jstring jstr); jstring ToJString(JNIEnv* env, const std::string& str); + std::vector JStringArrayToVector(JNIEnv* env, jobjectArray array); +jobjectArray VectorToJStringArray(JNIEnv* env, std::vector vector); // Returns true if the given path should be opened as Android content instead of a normal file. bool IsPathAndroidContent(const std::string& uri); diff --git a/Source/Android/jni/CMakeLists.txt b/Source/Android/jni/CMakeLists.txt index 405d621958..d358ed46d1 100644 --- a/Source/Android/jni/CMakeLists.txt +++ b/Source/Android/jni/CMakeLists.txt @@ -1,10 +1,11 @@ add_library(main SHARED + Config/NativeConfig.cpp + Config/PostProcessing.cpp GameList/GameFile.cpp GameList/GameFile.h GameList/GameFileCache.cpp IniFile.cpp MainAndroid.cpp - NativeConfig.cpp WiiUtils.cpp ) diff --git a/Source/Android/jni/NativeConfig.cpp b/Source/Android/jni/Config/NativeConfig.cpp similarity index 100% rename from Source/Android/jni/NativeConfig.cpp rename to Source/Android/jni/Config/NativeConfig.cpp diff --git a/Source/Android/jni/Config/PostProcessing.cpp b/Source/Android/jni/Config/PostProcessing.cpp new file mode 100644 index 0000000000..a96afca1a7 --- /dev/null +++ b/Source/Android/jni/Config/PostProcessing.cpp @@ -0,0 +1,35 @@ +// Copyright 2021 Dolphin Emulator Project +// Licensed under GPLv2+ +// Refer to the license.txt file included. + +#include +#include + +#include + +#include "VideoCommon/PostProcessing.cpp" +#include "jni/AndroidCommon/AndroidCommon.h" + +extern "C" { + +JNIEXPORT jobjectArray JNICALL +Java_org_dolphinemu_dolphinemu_features_settings_model_PostProcessing_getShaderList(JNIEnv* env, + jclass) +{ + return VectorToJStringArray(env, VideoCommon::PostProcessing::GetShaderList()); +} + +JNIEXPORT jobjectArray JNICALL +Java_org_dolphinemu_dolphinemu_features_settings_model_PostProcessing_getAnaglyphShaderList( + JNIEnv* env, jclass) +{ + return VectorToJStringArray(env, VideoCommon::PostProcessing::GetAnaglyphShaderList()); +} + +JNIEXPORT jobjectArray JNICALL +Java_org_dolphinemu_dolphinemu_features_settings_model_PostProcessing_getPassiveShaderList( + JNIEnv* env, jclass) +{ + return VectorToJStringArray(env, VideoCommon::PostProcessing::GetPassiveShaderList()); +} +} From 69626f17264dffe7ba9a78c33ba8b6c2355a5840 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Thu, 20 May 2021 16:48:33 +0200 Subject: [PATCH 2/2] Android: Remove getDolphinInternalDirectory I was going to rename this to getSysDirectory to make it clearer what the returned path actually is, but it turns out we're not actually using this for anything anymore. --- .../features/settings/utils/SettingsFile.java | 28 ------------------- .../utils/DirectoryInitialization.java | 12 -------- 2 files changed, 40 deletions(-) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/utils/SettingsFile.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/utils/SettingsFile.java index 82ea3a84f1..4ed3f1363e 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/utils/SettingsFile.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/utils/SettingsFile.java @@ -234,18 +234,6 @@ public final class SettingsFile readFile(getCustomGameSettingsFile(gameId), ini, view); } - public static void readGenericGameSettings(final String gameId, IniFile ini, - SettingsActivityView view) - { - readFile(getGenericGameSettingsFile(gameId), ini, view); - } - - public static void readGenericGameSettingsForAllRegions(final String gameId, - IniFile ini, SettingsActivityView view) - { - readFile(getGenericGameSettingsForAllRegions(gameId), ini, view); - } - /** * Saves a given .ini file on disk. * If unsuccessful, outputs an error telling why it failed. @@ -296,22 +284,6 @@ public final class SettingsFile DirectoryInitialization.getUserDirectory() + "/Config/" + fileName + ".ini"); } - private static File getGenericGameSettingsForAllRegions(String gameId) - { - // Use the first 3 chars from the gameId to load the generic game settings for all regions - gameId = gameId.substring(0, 3); - return new File( - DirectoryInitialization.getDolphinInternalDirectory() + "/GameSettings/" + - gameId + ".ini"); - } - - private static File getGenericGameSettingsFile(String gameId) - { - return new File( - DirectoryInitialization.getDolphinInternalDirectory() + "/GameSettings/" + - gameId + ".ini"); - } - public static File getCustomGameSettingsFile(String gameId) { return new File( diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/DirectoryInitialization.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/DirectoryInitialization.java index 7af6350d64..9bb68e8b13 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/DirectoryInitialization.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/DirectoryInitialization.java @@ -42,7 +42,6 @@ public final class DirectoryInitialization DirectoryInitializationState.NOT_YET_INITIALIZED; private static volatile boolean areDirectoriesAvailable = false; private static String userPath; - private static String internalPath; private static AtomicBoolean isDolphinDirectoryInitializationRunning = new AtomicBoolean(false); public enum DirectoryInitializationState @@ -128,7 +127,6 @@ public final class DirectoryInitialization private static void initializeInternalStorage(Context context) { File sysDirectory = new File(context.getFilesDir(), "Sys"); - internalPath = sysDirectory.getAbsolutePath(); SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); String revision = NativeLibrary.GetGitRevision(); @@ -241,16 +239,6 @@ public final class DirectoryInitialization return userPath; } - public static String getDolphinInternalDirectory() - { - if (!areDirectoriesAvailable) - { - throw new IllegalStateException( - "DirectoryInitialization must run before accessing the internal directory!"); - } - return internalPath; - } - private static void sendBroadcastState(DirectoryInitializationState state, Context context) { Intent localIntent =