(experimental) Enable VirGL if the flag file exists
If `/sdcard/linux/virglrenderer` exists, it overrides GPU config with
VirGL
Bug: 380366206
Test: create /sdcard/linux/virglrenderer and check crosvm params
Change-Id: I3e4907d2b5f98b8f6309894509334a0d61562b0e
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/ImageArchive.java b/android/TerminalApp/java/com/android/virtualization/terminal/ImageArchive.java
index 12f485a..c4d11e8 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/ImageArchive.java
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/ImageArchive.java
@@ -58,10 +58,13 @@
mPath = path;
}
+ public static Path getSdcardPathForTesting() {
+ return Environment.getExternalStoragePublicDirectory(DIR_IN_SDCARD).toPath();
+ }
+
/** Creates ImageArchive which is located in the sdcard. This archive is for testing only. */
public static ImageArchive fromSdCard() {
- Path dir = Environment.getExternalStoragePublicDirectory(DIR_IN_SDCARD).toPath();
- Path file = dir.resolve(ARCHIVE_NAME);
+ Path file = getSdcardPathForTesting().resolve(ARCHIVE_NAME);
return new ImageArchive(file);
}
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/VmLauncherService.java b/android/TerminalApp/java/com/android/virtualization/terminal/VmLauncherService.java
index 879b5e5..b8a427c 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/VmLauncherService.java
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/VmLauncherService.java
@@ -35,6 +35,7 @@
import android.system.virtualmachine.VirtualMachineCustomImageConfig.Disk;
import android.system.virtualmachine.VirtualMachineException;
import android.util.Log;
+import android.widget.Toast;
import io.grpc.Grpc;
import io.grpc.InsecureServerCredentials;
@@ -156,9 +157,7 @@
VirtualMachineConfig.Builder configBuilder = json.toConfigBuilder(this);
VirtualMachineCustomImageConfig.Builder customImageConfigBuilder =
json.toCustomImageConfigBuilder(this);
- Path backupFile = InstallUtils.getBackupFile(this);
- if (Files.exists(backupFile)) {
- customImageConfigBuilder.addDisk(Disk.RWDisk(backupFile.toString()));
+ if (overrideConfigIfNecessary(customImageConfigBuilder)) {
configBuilder.setCustomImageConfig(customImageConfigBuilder.build());
}
VirtualMachineConfig config = configBuilder.build();
@@ -202,6 +201,32 @@
return START_NOT_STICKY;
}
+ private boolean overrideConfigIfNecessary(VirtualMachineCustomImageConfig.Builder builder) {
+ boolean changed = false;
+ // TODO: check if ANGLE is enabled for the app.
+ if (Files.exists(ImageArchive.getSdcardPathForTesting().resolve("virglrenderer"))) {
+ builder.setGpuConfig(
+ new VirtualMachineCustomImageConfig.GpuConfig.Builder()
+ .setBackend("virglrenderer")
+ .setRendererUseEgl(true)
+ .setRendererUseGles(true)
+ .setRendererUseGlx(false)
+ .setRendererUseSurfaceless(true)
+ .setRendererUseVulkan(false)
+ .setContextTypes(new String[] {"virgl2"})
+ .build());
+ Toast.makeText(this, R.string.virgl_enabled, Toast.LENGTH_SHORT).show();
+ changed = true;
+ }
+
+ Path backupFile = InstallUtils.getBackupFile(this);
+ if (Files.exists(backupFile)) {
+ builder.addDisk(Disk.RWDisk(backupFile.toString()));
+ changed = true;
+ }
+ return changed;
+ }
+
private void startDebianServer() {
ServerInterceptor interceptor =
new ServerInterceptor() {
diff --git a/android/TerminalApp/res/values/strings.xml b/android/TerminalApp/res/values/strings.xml
index 851eaab..da8ca84 100644
--- a/android/TerminalApp/res/values/strings.xml
+++ b/android/TerminalApp/res/values/strings.xml
@@ -132,4 +132,7 @@
<string name="service_notification_content">Click to open the terminal</string>
<!-- Notification action button for closing the virtual machine [CHAR LIMIT=20] -->
<string name="service_notification_quit_action">Close</string>
+
+ <!-- VirGL is the name of hardware acceleration for VM, the name is supposed not to be translated. [CHAR LIMIT=20] -->
+ <string name="virgl_enabled">VirGL is enabled</string>
</resources>
diff --git a/docs/custom_vm.md b/docs/custom_vm.md
index eaff2a4..7597131 100644
--- a/docs/custom_vm.md
+++ b/docs/custom_vm.md
@@ -42,4 +42,8 @@
(or `localhost:6080` if port forwarding is enabled.)
`weston` with VNC backend might be another option, but it isn't available in
-Debian package repository for bookworm.
\ No newline at end of file
+Debian package repository for bookworm.
+
+## Hardware accelration
+If the file `/sdcard/linux/virglrenderer` exists on the device, it enables VirGL for VM.
+This requires enabling ANGLE for the Terminal app. (https://chromium.googlesource.com/angle/angle.git/+/HEAD/doc/DevSetupAndroid.md)