add gfx_stream gpu mode

bug: 146066070

To be used with compatible crosvm + gfxstream libraries on host

Test:

With current tree's crosvm (no 2d or gfxstream backend):
launch_cvd...boot complete using swiftshader (expected)
launch_cvd --gpu_mode=drm_virgl...boot complete using virgl (expected)
launch_cvd --gpu_mode=gfxstream...fails (expected)

With 2d + gfxstream crosvm + gfxstream host libs in LD_LIBRARY_PATH:
launch_cvd...boot complete using swiftshader (expected)
launch_cvd --gpu_mode=drm_virgl...boot complete using virgl (expected)
launch_cvd --gpu_mode=gfxstream...boot complete using gfxstream (expected)

Change-Id: Ia571202f380eca8fbf5e87a308c78bce7248ec77
diff --git a/host/commands/run_cvd/launch.cc b/host/commands/run_cvd/launch.cc
index 3c92959..dc2e108 100644
--- a/host/commands/run_cvd/launch.cc
+++ b/host/commands/run_cvd/launch.cc
@@ -110,7 +110,8 @@
   cmd->AddParameter("-keyboard_fd=", keyboard_server);
 
   cvd::SharedFD frames_server;
-  if (config.gpu_mode() == vsoc::kGpuModeDrmVirgl) {
+  if (config.gpu_mode() == vsoc::kGpuModeDrmVirgl ||
+      config.gpu_mode() == vsoc::kGpuModeGfxStream) {
     frames_server = CreateUnixInputServer(instance.frames_socket_path());
   } else {
     frames_server = cvd::SharedFD::VsockServer(SOCK_STREAM);
diff --git a/host/libs/config/cuttlefish_config.cpp b/host/libs/config/cuttlefish_config.cpp
index 818cb6d..50bbe30 100644
--- a/host/libs/config/cuttlefish_config.cpp
+++ b/host/libs/config/cuttlefish_config.cpp
@@ -163,6 +163,7 @@
 
 const char* const kGpuModeGuestSwiftshader = "guest_swiftshader";
 const char* const kGpuModeDrmVirgl = "drm_virgl";
+const char* const kGpuModeGfxStream = "gfxstream";
 
 std::string DefaultEnvironmentPath(const char* environment_key,
                                    const char* default_value,
diff --git a/host/libs/config/cuttlefish_config.h b/host/libs/config/cuttlefish_config.h
index 2ee6135..04adc29 100644
--- a/host/libs/config/cuttlefish_config.h
+++ b/host/libs/config/cuttlefish_config.h
@@ -390,4 +390,5 @@
 // GPU modes
 extern const char* const kGpuModeGuestSwiftshader;
 extern const char* const kGpuModeDrmVirgl;
+extern const char* const kGpuModeGfxStream;
 }  // namespace vsoc
diff --git a/host/libs/screen_connector/screen_connector.cpp b/host/libs/screen_connector/screen_connector.cpp
index 906435a..39c0fa3 100644
--- a/host/libs/screen_connector/screen_connector.cpp
+++ b/host/libs/screen_connector/screen_connector.cpp
@@ -26,7 +26,8 @@
 
 ScreenConnector* ScreenConnector::Get(int frames_fd) {
   auto config = vsoc::CuttlefishConfig::Get();
-  if (config->gpu_mode() == vsoc::kGpuModeDrmVirgl) {
+  if (config->gpu_mode() == vsoc::kGpuModeDrmVirgl ||
+      config->gpu_mode() == vsoc::kGpuModeGfxStream) {
     return new WaylandScreenConnector(frames_fd);
   } else if (config->gpu_mode() == vsoc::kGpuModeGuestSwiftshader) {
     return new SocketBasedScreenConnector(frames_fd);
diff --git a/host/libs/vm_manager/crosvm_manager.cpp b/host/libs/vm_manager/crosvm_manager.cpp
index 5674a21..7cc1f14 100644
--- a/host/libs/vm_manager/crosvm_manager.cpp
+++ b/host/libs/vm_manager/crosvm_manager.cpp
@@ -84,6 +84,15 @@
         "androidboot.hardware.vulkan=pastel",
     };
   }
+  if (gpu_mode == vsoc::kGpuModeGfxStream) {
+    return {
+        "androidboot.hardware.gralloc=minigbm",
+        "androidboot.hardware.hwcomposer=ranchu",
+        "androidboot.hardware.egl=emulation",
+        "androidboot.hardware.vulkan=ranchu",
+        "androidboot.hardware.gltransport=virtio-gpu-pipe",
+    };
+  }
   return {};
 }
 
@@ -108,8 +117,12 @@
   });
   crosvm_cmd.AddParameter("run");
 
-  if (config_->gpu_mode() == vsoc::kGpuModeDrmVirgl) {
-    crosvm_cmd.AddParameter("--gpu=",
+  auto gpu_mode = config_->gpu_mode();
+
+  if (gpu_mode == vsoc::kGpuModeDrmVirgl ||
+      gpu_mode == vsoc::kGpuModeGfxStream) {
+    crosvm_cmd.AddParameter(gpu_mode == vsoc::kGpuModeGfxStream ?
+                                "--gpu=gfxstream," : "--gpu=",
                             "width=", config_->x_res(), ",",
                             "height=", config_->y_res(), ",",
                             "egl=true,surfaceless=true,glx=false,gles=false");