From d2f9cf133da69e3293a86b652c8f4bd5e39b788e Mon Sep 17 00:00:00 2001 From: Charles Lombardo Date: Sat, 11 Mar 2023 00:37:48 -0500 Subject: [PATCH] android: Convert GpuDriverHelper to Kotlin --- .../yuzu/yuzu_emu/utils/GpuDriverHelper.java | 130 ---------------- .../yuzu/yuzu_emu/utils/GpuDriverHelper.kt | 145 ++++++++++++++++++ 2 files changed, 145 insertions(+), 130 deletions(-) delete mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GpuDriverHelper.java create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GpuDriverHelper.kt diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GpuDriverHelper.java b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GpuDriverHelper.java deleted file mode 100644 index 822a3f1f9..000000000 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GpuDriverHelper.java +++ /dev/null @@ -1,130 +0,0 @@ -package org.yuzu.yuzu_emu.utils; - -import android.content.Context; -import android.net.Uri; - -import org.yuzu.yuzu_emu.NativeLibrary; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; - -public class GpuDriverHelper { - private static final String META_JSON_FILENAME = "meta.json"; - private static final String DRIVER_INTERNAL_FILENAME = "gpu_driver.zip"; - private static String fileRedirectionPath; - private static String driverInstallationPath; - private static String hookLibPath; - - private static void unzip(String zipFilePath, String destDir) throws IOException { - File dir = new File(destDir); - - // Create output directory if it doesn't exist - if (!dir.exists()) dir.mkdirs(); - - // Unpack the files. - ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFilePath)); - byte[] buffer = new byte[1024]; - ZipEntry ze = zis.getNextEntry(); - while (ze != null) { - String fileName = ze.getName(); - File newFile = new File(destDir + fileName); - newFile.getParentFile().mkdirs(); - FileOutputStream fos = new FileOutputStream(newFile); - int len; - while ((len = zis.read(buffer)) > 0) { - fos.write(buffer, 0, len); - } - fos.close(); - zis.closeEntry(); - ze = zis.getNextEntry(); - } - zis.closeEntry(); - } - - public static void initializeDriverParameters(Context context) { - try { - // Initialize the file redirection directory. - fileRedirectionPath = context.getExternalFilesDir(null).getCanonicalPath() + "/gpu/vk_file_redirect/"; - - // Initialize the driver installation directory. - driverInstallationPath = context.getFilesDir().getCanonicalPath() + "/gpu_driver/"; - } catch (IOException e) { - throw new RuntimeException(e); - } - - // Initialize directories. - initializeDirectories(); - - // Initialize hook libraries directory. - hookLibPath = context.getApplicationInfo().nativeLibraryDir + "/"; - - // Initialize GPU driver. - NativeLibrary.InitializeGpuDriver(hookLibPath, driverInstallationPath, getCustomDriverLibraryName(), fileRedirectionPath); - } - - public static void installDefaultDriver(Context context) { - // Removing the installed driver will result in the backend using the default system driver. - File driverInstallationDir = new File(driverInstallationPath); - deleteRecursive(driverInstallationDir); - initializeDriverParameters(context); - } - - public static void installCustomDriver(Context context, Uri driverPathUri) { - // Revert to system default in the event the specified driver is bad. - installDefaultDriver(context); - - // Ensure we have directories. - initializeDirectories(); - - // Copy the zip file URI into our private storage. - FileUtil.copyUriToInternalStorage(context, driverPathUri, driverInstallationPath, DRIVER_INTERNAL_FILENAME); - - // Unzip the driver. - try { - unzip(driverInstallationPath + DRIVER_INTERNAL_FILENAME, driverInstallationPath); - } catch (IOException e) { - throw new RuntimeException(e); - } - - // Initialize the driver parameters. - initializeDriverParameters(context); - } - - public static String getCustomDriverName() { - // Parse the custom driver metadata to retrieve the name. - GpuDriverMetadata metadata = new GpuDriverMetadata(driverInstallationPath + META_JSON_FILENAME); - return metadata.name; - } - - private static String getCustomDriverLibraryName() { - // Parse the custom driver metadata to retrieve the library name. - GpuDriverMetadata metadata = new GpuDriverMetadata(driverInstallationPath + META_JSON_FILENAME); - return metadata.libraryName; - } - - private static void initializeDirectories() { - // Ensure the file redirection directory exists. - File fileRedirectionDir = new File(fileRedirectionPath); - if (!fileRedirectionDir.exists()) { - fileRedirectionDir.mkdirs(); - } - // Ensure the driver installation directory exists. - File driverInstallationDir = new File(driverInstallationPath); - if (!driverInstallationDir.exists()) { - driverInstallationDir.mkdirs(); - } - } - - private static void deleteRecursive(File fileOrDirectory) { - if (fileOrDirectory.isDirectory()) { - for (File child : fileOrDirectory.listFiles()) { - deleteRecursive(child); - } - } - fileOrDirectory.delete(); - } -} diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GpuDriverHelper.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GpuDriverHelper.kt new file mode 100644 index 000000000..399491ffb --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GpuDriverHelper.kt @@ -0,0 +1,145 @@ +package org.yuzu.yuzu_emu.utils + +import android.content.Context +import android.net.Uri +import org.yuzu.yuzu_emu.NativeLibrary +import org.yuzu.yuzu_emu.utils.FileUtil.copyUriToInternalStorage +import java.io.File +import java.io.FileInputStream +import java.io.FileOutputStream +import java.io.IOException +import java.util.zip.ZipInputStream + +object GpuDriverHelper { + private const val META_JSON_FILENAME = "meta.json" + private const val DRIVER_INTERNAL_FILENAME = "gpu_driver.zip" + private var fileRedirectionPath: String? = null + private var driverInstallationPath: String? = null + private var hookLibPath: String? = null + + @Throws(IOException::class) + private fun unzip(zipFilePath: String, destDir: String) { + val dir = File(destDir) + + // Create output directory if it doesn't exist + if (!dir.exists()) dir.mkdirs() + + // Unpack the files. + val zis = ZipInputStream(FileInputStream(zipFilePath)) + val buffer = ByteArray(1024) + var ze = zis.nextEntry + while (ze != null) { + val fileName = ze.name + val newFile = File(destDir + fileName) + newFile.parentFile!!.mkdirs() + val fos = FileOutputStream(newFile) + var len: Int + while (zis.read(buffer).also { len = it } > 0) { + fos.write(buffer, 0, len) + } + fos.close() + zis.closeEntry() + ze = zis.nextEntry + } + zis.closeEntry() + } + + @JvmStatic + fun initializeDriverParameters(context: Context) { + try { + // Initialize the file redirection directory. + fileRedirectionPath = + context.getExternalFilesDir(null)!!.canonicalPath + "/gpu/vk_file_redirect/" + + // Initialize the driver installation directory. + driverInstallationPath = context.filesDir.canonicalPath + "/gpu_driver/" + } catch (e: IOException) { + throw RuntimeException(e) + } + + // Initialize directories. + initializeDirectories() + + // Initialize hook libraries directory. + hookLibPath = context.applicationInfo.nativeLibraryDir + "/" + + // Initialize GPU driver. + NativeLibrary.InitializeGpuDriver( + hookLibPath, + driverInstallationPath, + customDriverLibraryName, + fileRedirectionPath + ) + } + + fun installDefaultDriver(context: Context) { + // Removing the installed driver will result in the backend using the default system driver. + val driverInstallationDir = File(driverInstallationPath!!) + deleteRecursive(driverInstallationDir) + initializeDriverParameters(context) + } + + fun installCustomDriver(context: Context, driverPathUri: Uri?) { + // Revert to system default in the event the specified driver is bad. + installDefaultDriver(context) + + // Ensure we have directories. + initializeDirectories() + + // Copy the zip file URI into our private storage. + copyUriToInternalStorage( + context, + driverPathUri, + driverInstallationPath!!, + DRIVER_INTERNAL_FILENAME + ) + + // Unzip the driver. + try { + unzip(driverInstallationPath + DRIVER_INTERNAL_FILENAME, driverInstallationPath!!) + } catch (e: IOException) { + throw RuntimeException(e) + } + + // Initialize the driver parameters. + initializeDriverParameters(context) + } + + // Parse the custom driver metadata to retrieve the name. + val customDriverName: String? + get() { + // Parse the custom driver metadata to retrieve the name. + val metadata = GpuDriverMetadata(driverInstallationPath + META_JSON_FILENAME) + return metadata.name + } + + // Parse the custom driver metadata to retrieve the library name. + private val customDriverLibraryName: String? + get() { + // Parse the custom driver metadata to retrieve the library name. + val metadata = GpuDriverMetadata(driverInstallationPath + META_JSON_FILENAME) + return metadata.libraryName + } + + private fun initializeDirectories() { + // Ensure the file redirection directory exists. + val fileRedirectionDir = File(fileRedirectionPath!!) + if (!fileRedirectionDir.exists()) { + fileRedirectionDir.mkdirs() + } + // Ensure the driver installation directory exists. + val driverInstallationDir = File(driverInstallationPath!!) + if (!driverInstallationDir.exists()) { + driverInstallationDir.mkdirs() + } + } + + private fun deleteRecursive(fileOrDirectory: File) { + if (fileOrDirectory.isDirectory) { + for (child in fileOrDirectory.listFiles()!!) { + deleteRecursive(child) + } + } + fileOrDirectory.delete() + } +}