committed by
bunnei
2 changed files with 145 additions and 130 deletions
-
130src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GpuDriverHelper.java
-
145src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GpuDriverHelper.kt
@ -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() |
||||
|
} |
||||
|
} |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue