116 lines
3.9 KiB
Python
116 lines
3.9 KiB
Python
# Copyright 2019 The Chromium Authors. All rights reserved.
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
|
|
"""Implements commands for running and interacting with Fuchsia on AEMU."""
|
|
|
|
import emu_target
|
|
import os
|
|
import platform
|
|
import qemu_target
|
|
import logging
|
|
|
|
from common import GetEmuRootForPlatform
|
|
|
|
|
|
def GetTargetType():
|
|
return AemuTarget
|
|
|
|
|
|
class AemuTarget(qemu_target.QemuTarget):
|
|
EMULATOR_NAME = 'aemu'
|
|
|
|
def __init__(self, out_dir, target_cpu, system_log_file, cpu_cores,
|
|
require_kvm, ram_size_mb, enable_graphics, hardware_gpu):
|
|
super(AemuTarget, self).__init__(out_dir, target_cpu, system_log_file,
|
|
cpu_cores, require_kvm, ram_size_mb)
|
|
|
|
self._enable_graphics = enable_graphics
|
|
self._hardware_gpu = hardware_gpu
|
|
|
|
@staticmethod
|
|
def CreateFromArgs(args):
|
|
return AemuTarget(args.out_dir, args.target_cpu, args.system_log_file,
|
|
args.cpu_cores, args.require_kvm, args.ram_size_mb,
|
|
args.enable_graphics, args.hardware_gpu)
|
|
|
|
@staticmethod
|
|
def RegisterArgs(arg_parser):
|
|
aemu_args = arg_parser.add_argument_group('aemu', 'AEMU arguments')
|
|
aemu_args.add_argument('--enable-graphics',
|
|
action='store_true',
|
|
default=False,
|
|
help='Start AEMU with graphics instead of '\
|
|
'headless.')
|
|
aemu_args.add_argument('--hardware-gpu',
|
|
action='store_true',
|
|
default=False,
|
|
help='Use local GPU hardware instead of '\
|
|
'Swiftshader.')
|
|
|
|
def _EnsureEmulatorExists(self, path):
|
|
assert os.path.exists(path), \
|
|
'This checkout is missing %s.' % (self.EMULATOR_NAME)
|
|
|
|
def _BuildCommand(self):
|
|
aemu_folder = GetEmuRootForPlatform(self.EMULATOR_NAME)
|
|
|
|
self._EnsureEmulatorExists(aemu_folder)
|
|
aemu_path = os.path.join(aemu_folder, 'emulator')
|
|
|
|
# `VirtioInput` is needed for touch input device support on Fuchsia.
|
|
# `RefCountPipe` is needed for proper cleanup of resources when a process
|
|
# that uses Vulkan dies inside the guest
|
|
aemu_features = 'VirtioInput,RefCountPipe'
|
|
|
|
# Configure the CPU to emulate.
|
|
# On Linux, we can enable lightweight virtualization (KVM) if the host and
|
|
# guest architectures are the same.
|
|
if self._IsKvmEnabled():
|
|
aemu_features += ',KVM,GLDirectMem,Vulkan'
|
|
else:
|
|
if self._target_cpu != 'arm64':
|
|
aemu_features += ',-GLDirectMem'
|
|
|
|
# Use Swiftshader for Vulkan if requested
|
|
gpu_target = 'swiftshader_indirect'
|
|
if self._hardware_gpu:
|
|
gpu_target = 'host'
|
|
|
|
aemu_command = [aemu_path]
|
|
if not self._enable_graphics:
|
|
aemu_command.append('-no-window')
|
|
# All args after -fuchsia flag gets passed to QEMU
|
|
aemu_command.extend([
|
|
'-feature', aemu_features, '-window-size', '1024x600', '-gpu',
|
|
gpu_target, '-verbose', '-fuchsia'
|
|
])
|
|
|
|
aemu_command.extend(self._BuildQemuConfig())
|
|
|
|
aemu_command.extend([
|
|
'-vga', 'none',
|
|
'-device', 'virtio-keyboard-pci',
|
|
'-device', 'virtio_input_multi_touch_pci_1',
|
|
'-device', 'ich9-ahci,id=ahci'])
|
|
if platform.machine() == 'x86_64':
|
|
aemu_command.extend(['-device', 'isa-debug-exit,iobase=0xf4,iosize=0x04'])
|
|
|
|
logging.info(' '.join(aemu_command))
|
|
return aemu_command
|
|
|
|
def _GetVulkanIcdFile(self):
|
|
return os.path.join(GetEmuRootForPlatform(self.EMULATOR_NAME), 'lib64',
|
|
'vulkan', 'vk_swiftshader_icd.json')
|
|
|
|
def _SetEnv(self):
|
|
env = os.environ.copy()
|
|
aemu_logging_env = {
|
|
"ANDROID_EMU_VK_NO_CLEANUP": "1",
|
|
"ANDROID_EMUGL_LOG_PRINT": "1",
|
|
"ANDROID_EMUGL_VERBOSE": "1",
|
|
"VK_ICD_FILENAMES": self._GetVulkanIcdFile(),
|
|
"VK_LOADER_DEBUG": "info,error",
|
|
}
|
|
env.update(aemu_logging_env)
|
|
return env
|