vulkan: in addition to size, keep type index consistent

bug: https://bugs.fuchsia.dev/p/fuchsia/issues/detail?id=48401

We were getting VK_ERROR_DEVICE_LOST on NV because an external memory
was created with a different type index than its import allocation.

Change-Id: Ie5a994f2a8db9c635d097372015bf191c2ddbee2
3 files changed
tree: d2e559cf59ee59529c2d82530992f704d1191967
  1. .clang-tidy
  2. .dir-locals.el
  3. .editorconfig
  4. .exrc
  5. .gdbinit
  6. .gitignore
  7. .gitmodules
  8. .gitpublish
  9. .mailmap
  10. .shippable.yml
  11. .travis.yml
  12. .vscode/
  13. CMakeLists.txt
  14. CODING_STYLE
  15. COPYING
  16. COPYING.LIB
  17. COPYING.PYTHON
  18. Changelog
  19. GNUmakefile
  20. HACKING
  21. LICENSE
  22. LICENSES/
  23. MAINTAINERS
  24. MODULE_LICENSE_GPL
  25. Makefile
  26. Makefile.objs
  27. Makefile.target
  28. NOTICE
  29. QEMU_VERSION
  30. README
  31. README.md
  32. accel/
  33. android-info.txt
  34. android-qemu2-glue/
  35. android/
  36. arch_init.c
  37. audio/
  38. backends/
  39. balloon.c
  40. block.c
  41. block/
  42. blockdev-nbd.c
  43. blockdev.c
  44. blockjob.c
  45. bootdevice.c
  46. bsd-user/
  47. bt-host.c
  48. bt-vhci.c
  49. build.gradle
  50. chardev/
  51. cmake-format.json
  52. cmake-main.darwin-x86_64.inc
  53. cmake-main.linux-aarch64.inc
  54. cmake-main.linux-x86_64.inc
  55. cmake-main.windows-x86.inc
  56. cmake-main.windows-x86_64.inc
  57. cmake-main.windows_msvc-x86_64.inc
  58. configure
  59. contrib/
  60. cpus-common.c
  61. cpus.c
  62. crypto/
  63. default-configs/
  64. device-hotplug.c
  65. device_tree.c
  66. disas.c
  67. disas/
  68. dma-helpers.c
  69. docs/
  70. dummy.c
  71. dump.c
  72. exec.c
  73. fpu/
  74. fsdev/
  75. gdb-xml/
  76. gdbstub.c
  77. hmp-commands-info.hx
  78. hmp-commands.hx
  79. hmp.c
  80. hmp.h
  81. hvf-stub.c
  82. hw/
  83. include/
  84. io/
  85. ioport.c
  86. iothread.c
  87. libdecnumber/
  88. linux-headers/
  89. linux-user/
  90. mac.source.properties
  91. memory.c
  92. memory_ldst.inc.c
  93. memory_mapping.c
  94. migration/
  95. module-common.c
  96. monitor.c
  97. nbd/
  98. net/
  99. numa.c
  100. os-posix.c
  101. os-win32.c
  102. pc-bios/
  103. po/
  104. qapi/
  105. qdev-monitor.c
  106. qdict-test-data.txt
  107. qemu-bridge-helper.c
  108. qemu-char.c
  109. qemu-doc.texi
  110. qemu-ga.texi
  111. qemu-img-cmds.hx
  112. qemu-img.c
  113. qemu-img.texi
  114. qemu-io-cmds.c
  115. qemu-io.c
  116. qemu-keymap.c
  117. qemu-nbd.c
  118. qemu-nbd.texi
  119. qemu-option-trace.texi
  120. qemu-options-wrapper.h
  121. qemu-options.def
  122. qemu-options.h
  123. qemu-options.hx
  124. qemu-seccomp.c
  125. qemu-tech.texi
  126. qemu-test.cmake
  127. qemu-version.h.in
  128. qemu.nsi
  129. qemu.sasl
  130. qemu2-auto-generated/
  131. qga/
  132. qmp.c
  133. qobject/
  134. qom/
  135. qtest.c
  136. replay/
  137. replication.c
  138. replication.h
  139. roms/
  140. rules.mak
  141. scripts/
  142. scsi/
  143. slirp/
  144. source.properties
  145. stubs/
  146. target/
  147. tcg/
  148. tests/
  149. thunk.c
  150. tpm.c
  151. trace-events
  152. trace/
  153. ui/
  154. util/
  155. version.rc
  156. vl.c
  157. whpx-stub.c
  158. win.source.properties
README.md

Welcome to the Android Emulator

This document gives you some background on the emulator and outlines how you can start hacking and contributing to the emulator!

Just get me started with development!

Make sure to install Android Studio and the associated SDKs. Do not forget to install the official emulator and create a few android virtual devices. Next follow the instructions for the platform you would like to work on:

We use the Repo tool to manage working accross multiple branches.

About the Emulator

The Android Emulator simulates Android devices on your computer so that you can test your application on a variety of devices and Android API levels without needing to have each physical device.

The emulator provides almost all of the capabilities of a real Android device. You can simulate incoming phone calls and text messages, specify the location of the device, simulate different network speeds, simulate rotation and other hardware sensors, access the Google Play Store, and much more.

Testing your app on the emulator is in some ways faster and easier than doing so on a physical device. For example, you can transfer data faster to the emulator than to a device connected over USB.

The emulator comes with predefined configurations for various Android phone, tablet, Wear OS, and Android TV devices.

Recommended Reading

The following is a list of concepts that are important. Please read these links and any other links you can find. If you find a link that you think does a better job at explaining the concept, please add it here:

QEMU is an open source competitor to VMware Workstation, VirtualBox, HyperV. It is focused on Linux server virtualization on Linux servers. While QEMU does support booting other OS’s, we don’t use that functionality since Android is Linux.

The Android Emulator is downstream from the QEMU emulator. It adds support for booting Android devices, emulates typical Android hardware (OpenGL, GPS, GSM, Sensors) and a GUI interface. The android emulator extends qemu in various ways.

For an overview of Qemu see:

The QEMU emulator leverages technologies like hardware Hypervisors KVM (Linux) and HAXM (Windows/Mac)

https://en.wikipedia.org/wiki/Hypervisor https://en.wikipedia.org/wiki/Kernel-based_Virtual_Machine

The QEMU emulator supports both guest images that require full virtualization and guest images that require paravirtualization technologies like virtio

The emulator passes a device tree blob to a guest kernel to describe the guest hardware

When running a non-x86 image on an x86 host, QEMU will JIT the non-x86 code into x86 code. See this lectutre for more. The MMU (page table hardware) is emulated in software, which is unfortunately slow.

You will need to build Android kernels and system images that the emulator will run. The easiest way to obtain these is to make use of the publicly released images. You can find more details here.

Building the Emulator

The emulator uses Cmake as a meta build generator, and all the necessary compilers and toolchains are included in the repository. Make sure you have read the section above as the requirements to succesfully build vary slightly from platform to platform.

In general you can run the following script:

./android/rebuild.sh

For incremental builds you can use ninja. For example

ninja -C objs

Contributing code

The emulator uses a coding style derived from the Chromium style. We use the repo tool to submit pathces. The usual workflow is roughly as follows:

    repy sync # Pulls in all the changes accross all branches.
    repo start my_awesome_feature

This will create a git branch called my_awesome_feature. You can now work on your patch.

Once you have written a patch you can send it out for code review. We use gerrit for code reviews.

Use the repo tool to upload or update a CL:

    repo upload --cbr --re=”blah@google.com,foo@google.com,bar@google.com
  • “--cbr” means “upload the current branch”,
  • “--re” supplies the initial reviewers list

Add “-t” switch to use the current git branch as a review topic (topic groups CLs together and only allows them to be submitted when all got +2/+verified)

The repo tool will provide you with a url where you can find your change.

Code Reviews

Make sure to check the CL against our coding style: coding style. Coding style isn’t frozen: just edit it in our repository and create a code review to propose a change.

Some good articles on code reviewing, especially when it comes to google:

Below are some short notes relevant to the emulator.

Keep in mind that all of the code reviews are open source and visible to everyone!. In other words, be nice and and provide actionable constructive feedback.

  • C++ over C for all new code. Always.

  • After uploading a CL for review, author should “+1” it when they think it’s ready for reviewing. A CL without author’s “+1” is a “work in progress” and other reviewers may ignore it..

  • Prefer not to send a WIP CL to reviewers and only add them when it’s in a reviewable state. If you realized that you added reviewers too soon, just remove them - “x” button in the browser UI for each reviewer actually works.

  • Avoid large CLs. There are always exceptions, use your best judgement to improve code clarity and to help other maintainers in the future.

    Split the changes into smaller isolated chunks and submit those as a single topic If you touch multiple components, that’s a good way to split the CL.

    Changes into any QEMU files must be in their own CL - otherwise rebasing into the new version becomes 10x more painful.

  • “-2” is sticky, it remains there until the very same reviewer removes it. If you “-2”-ed someone, it’s always a good thing to communicate to them about the follow-up

  • Abandon the CLs you don’t need anymore

  • Tests: when reviewing the code, make sure there’s a test or a really good reason for its absence

Merging downstream Qemu

Merging changes from the qemu branch should be done on the emu-master-qemu branch. You will need to this on a linux machine as qemu development happens in a linux environment. Once you have obtained this branch you can add the remote qemu repository as follows:

cd emu-master-qemu/external/qemu
git remote add qemu https://git.qemu.org/git/qemu.git
git fetch qemu

Now you can start merging in changes:

git merge master

Be smart, merge only a few commits at a time

Next you should try to build qemu standalone:

    ./android/scripts/unix/build-qemu-android.sh  --verbose --verbose --build-dir=$HOME/qemu-build  &&
    cd $HOME/qemu-build/build-linux-x86_64 &&
    source env.sh &&
    cd qemu-android &&
    make

Now you are ready for building, testing, and merging the next set. You could have a look at this script to automate this slightly.