android: Convert GpuDriverHelper to Kotlin
This commit is contained in:
		@@ -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();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -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()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user