xref: /aosp_15_r20/external/mesa3d/docs/android.rst (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard WorkerAndroid
2*61046927SAndroid Build Coastguard Worker=======
3*61046927SAndroid Build Coastguard Worker
4*61046927SAndroid Build Coastguard WorkerMesa hardware drivers can be built for Android one of two ways: built
5*61046927SAndroid Build Coastguard Workerinto the Android OS using the ndk-build build system on older versions
6*61046927SAndroid Build Coastguard Workerof Android, or out-of-tree using the Meson build system and the
7*61046927SAndroid Build Coastguard WorkerAndroid NDK.
8*61046927SAndroid Build Coastguard Worker
9*61046927SAndroid Build Coastguard WorkerThe ndk-build build system has proven to be hard to maintain, as one
10*61046927SAndroid Build Coastguard Workerneeds a built Android tree to build against, and it has never been
11*61046927SAndroid Build Coastguard Workertested in CI.  The Meson build system flow is frequently used by
12*61046927SAndroid Build Coastguard WorkerChrome OS developers for building and testing Android drivers.
13*61046927SAndroid Build Coastguard Worker
14*61046927SAndroid Build Coastguard WorkerWhen building llvmpipe or lavapipe for Android the ndk-build workflow
15*61046927SAndroid Build Coastguard Workeris also used, but there are additional steps required to add the driver
16*61046927SAndroid Build Coastguard Workerto the Android OS image.
17*61046927SAndroid Build Coastguard Worker
18*61046927SAndroid Build Coastguard WorkerBuilding using the Android NDK
19*61046927SAndroid Build Coastguard Worker------------------------------
20*61046927SAndroid Build Coastguard Worker
21*61046927SAndroid Build Coastguard WorkerDownload and install the NDK using whatever method you normally would.
22*61046927SAndroid Build Coastguard WorkerThen, create your Meson cross file to use it, something like this
23*61046927SAndroid Build Coastguard Worker``~/.local/share/meson/cross/android-aarch64`` file:
24*61046927SAndroid Build Coastguard Worker
25*61046927SAndroid Build Coastguard Worker.. code-block:: ini
26*61046927SAndroid Build Coastguard Worker
27*61046927SAndroid Build Coastguard Worker    [binaries]
28*61046927SAndroid Build Coastguard Worker    ar = 'NDKDIR/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-ar'
29*61046927SAndroid Build Coastguard Worker    c = ['ccache', 'NDKDIR/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android29-clang']
30*61046927SAndroid Build Coastguard Worker    cpp = ['ccache', 'NDKDIR/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android29-clang++', '-fno-exceptions', '-fno-unwind-tables', '-fno-asynchronous-unwind-tables', '-static-libstdc++']
31*61046927SAndroid Build Coastguard Worker    c_ld = 'lld'
32*61046927SAndroid Build Coastguard Worker    cpp_ld = 'lld'
33*61046927SAndroid Build Coastguard Worker    strip = 'NDKDIR/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-strip'
34*61046927SAndroid Build Coastguard Worker    # Android doesn't come with a pkg-config, but we need one for Meson to be happy not
35*61046927SAndroid Build Coastguard Worker    # finding all the optional deps it looks for.  Use system pkg-config pointing at a
36*61046927SAndroid Build Coastguard Worker    # directory we get to populate with any .pc files we want to add for Android
37*61046927SAndroid Build Coastguard Worker    pkg-config = ['env', 'PKG_CONFIG_LIBDIR=NDKDIR/pkgconfig', '/usr/bin/pkg-config']
38*61046927SAndroid Build Coastguard Worker
39*61046927SAndroid Build Coastguard Worker    [host_machine]
40*61046927SAndroid Build Coastguard Worker    system = 'android'
41*61046927SAndroid Build Coastguard Worker    cpu_family = 'aarch64'
42*61046927SAndroid Build Coastguard Worker    cpu = 'armv8'
43*61046927SAndroid Build Coastguard Worker    endian = 'little'
44*61046927SAndroid Build Coastguard Worker
45*61046927SAndroid Build Coastguard WorkerNow, use that cross file for your Android build directory (as in this
46*61046927SAndroid Build Coastguard Workerone cross-compiling the turnip driver for a stock Pixel phone)
47*61046927SAndroid Build Coastguard Worker
48*61046927SAndroid Build Coastguard Worker.. code-block:: sh
49*61046927SAndroid Build Coastguard Worker
50*61046927SAndroid Build Coastguard Worker    meson setup build-android-aarch64 \
51*61046927SAndroid Build Coastguard Worker        --cross-file android-aarch64 \
52*61046927SAndroid Build Coastguard Worker	-Dplatforms=android \
53*61046927SAndroid Build Coastguard Worker	-Dplatform-sdk-version=26 \
54*61046927SAndroid Build Coastguard Worker	-Dandroid-stub=true \
55*61046927SAndroid Build Coastguard Worker	-Dgallium-drivers= \
56*61046927SAndroid Build Coastguard Worker	-Dvulkan-drivers=freedreno \
57*61046927SAndroid Build Coastguard Worker	-Dfreedreno-kmds=kgsl
58*61046927SAndroid Build Coastguard Worker    meson compile -C build-android-aarch64
59*61046927SAndroid Build Coastguard Worker
60*61046927SAndroid Build Coastguard WorkerReplacing Android drivers on stock Android
61*61046927SAndroid Build Coastguard Worker------------------------------------------
62*61046927SAndroid Build Coastguard Worker
63*61046927SAndroid Build Coastguard WorkerThe vendor partition with the drivers is normally mounted from a
64*61046927SAndroid Build Coastguard Workerread-only disk image on ``/vendor``.  To be able to replace them for
65*61046927SAndroid Build Coastguard Workerdriver development, we need to unlock the device and remount
66*61046927SAndroid Build Coastguard Worker``/vendor`` read/write.
67*61046927SAndroid Build Coastguard Worker
68*61046927SAndroid Build Coastguard Worker.. code-block:: sh
69*61046927SAndroid Build Coastguard Worker
70*61046927SAndroid Build Coastguard Worker    adb disable-verity
71*61046927SAndroid Build Coastguard Worker    adb reboot
72*61046927SAndroid Build Coastguard Worker    adb remount -R
73*61046927SAndroid Build Coastguard Worker    adb remount
74*61046927SAndroid Build Coastguard Worker
75*61046927SAndroid Build Coastguard WorkerNow you can replace drivers as in:
76*61046927SAndroid Build Coastguard Worker
77*61046927SAndroid Build Coastguard Worker.. code-block:: sh
78*61046927SAndroid Build Coastguard Worker
79*61046927SAndroid Build Coastguard Worker    adb push build-android-aarch64/src/freedreno/vulkan/libvulkan_freedreno.so /vendor/lib64/hw/vulkan.sdm710.so
80*61046927SAndroid Build Coastguard Worker
81*61046927SAndroid Build Coastguard WorkerNote this command doesn't quite work because libvulkan wants the
82*61046927SAndroid Build Coastguard WorkerSONAME to match. You can use ``patchelf`` to fix this:
83*61046927SAndroid Build Coastguard Worker
84*61046927SAndroid Build Coastguard Worker.. code-block:: sh
85*61046927SAndroid Build Coastguard Worker
86*61046927SAndroid Build Coastguard Worker   cp build-android-aarch64/src/freedreno/vulkan/libvulkan_freedreno.so /tmp/vulkan.sdm710.so
87*61046927SAndroid Build Coastguard Worker   patchelf --set-soname vulkan.sdm710.so /tmp/vulkan.sdm710.so
88*61046927SAndroid Build Coastguard Worker   adb push /tmp/vulkan.sdm710.so /vendor/lib64/hw/
89*61046927SAndroid Build Coastguard Worker
90*61046927SAndroid Build Coastguard WorkerReplacing Android drivers on Chrome OS
91*61046927SAndroid Build Coastguard Worker--------------------------------------
92*61046927SAndroid Build Coastguard Worker
93*61046927SAndroid Build Coastguard WorkerChrome OS's ARC++ is an Android container with hardware drivers inside
94*61046927SAndroid Build Coastguard Workerof it.  The vendor partition with the drivers is normally mounted from
95*61046927SAndroid Build Coastguard Workera read-only squashfs image on disk.  For doing rapid driver
96*61046927SAndroid Build Coastguard Workerdevelopment, you don't want to regenerate that image.  So, we'll take
97*61046927SAndroid Build Coastguard Workerthe existing squashfs image, copy it out on the host, and then use a
98*61046927SAndroid Build Coastguard Workerbind mount instead of a loopback mount so we can update our drivers
99*61046927SAndroid Build Coastguard Workerusing scp from outside the container.
100*61046927SAndroid Build Coastguard Worker
101*61046927SAndroid Build Coastguard WorkerOn your device, you'll want to make ``/`` read-write.  ssh in as root
102*61046927SAndroid Build Coastguard Workerand run:
103*61046927SAndroid Build Coastguard Worker
104*61046927SAndroid Build Coastguard Worker.. code-block:: sh
105*61046927SAndroid Build Coastguard Worker
106*61046927SAndroid Build Coastguard Worker    crossystem dev_boot_signed_only=0
107*61046927SAndroid Build Coastguard Worker    /usr/share/vboot/bin/make_dev_ssd.sh --remove_rootfs_verification --partitions 4
108*61046927SAndroid Build Coastguard Worker    reboot
109*61046927SAndroid Build Coastguard Worker
110*61046927SAndroid Build Coastguard WorkerThen, we'll switch Android from using an image for ``/vendor`` to using a
111*61046927SAndroid Build Coastguard Workerbind-mount from a directory we control.
112*61046927SAndroid Build Coastguard Worker
113*61046927SAndroid Build Coastguard Worker.. code-block:: sh
114*61046927SAndroid Build Coastguard Worker
115*61046927SAndroid Build Coastguard Worker    cd /opt/google/containers/android/
116*61046927SAndroid Build Coastguard Worker    mkdir vendor-ro
117*61046927SAndroid Build Coastguard Worker    mount -o loop vendor.raw.img vendor-ro
118*61046927SAndroid Build Coastguard Worker    cp -a vendor-ro vendor-rw
119*61046927SAndroid Build Coastguard Worker    emacs config.json
120*61046927SAndroid Build Coastguard Worker
121*61046927SAndroid Build Coastguard WorkerIn the ``config.json``, you want to find the block for ``/vendor`` and
122*61046927SAndroid Build Coastguard Workerchange it to::
123*61046927SAndroid Build Coastguard Worker
124*61046927SAndroid Build Coastguard Worker            {
125*61046927SAndroid Build Coastguard Worker                "destination": "/vendor",
126*61046927SAndroid Build Coastguard Worker                "type": "bind",
127*61046927SAndroid Build Coastguard Worker                "source": "/opt/google/containers/android/vendor-rw",
128*61046927SAndroid Build Coastguard Worker                "options": [
129*61046927SAndroid Build Coastguard Worker                    "bind",
130*61046927SAndroid Build Coastguard Worker                    "rw"
131*61046927SAndroid Build Coastguard Worker                ]
132*61046927SAndroid Build Coastguard Worker            },
133*61046927SAndroid Build Coastguard Worker
134*61046927SAndroid Build Coastguard WorkerNow, restart the UI to do a full reload:
135*61046927SAndroid Build Coastguard Worker
136*61046927SAndroid Build Coastguard Worker.. code-block:: sh
137*61046927SAndroid Build Coastguard Worker
138*61046927SAndroid Build Coastguard Worker    restart ui
139*61046927SAndroid Build Coastguard Worker
140*61046927SAndroid Build Coastguard WorkerAt this point, your android container is restarted with your new
141*61046927SAndroid Build Coastguard Workerbind-mount ``/vendor``, and if you use ``android-sh`` to shell into it
142*61046927SAndroid Build Coastguard Workerthen the ``mount`` command should show::
143*61046927SAndroid Build Coastguard Worker
144*61046927SAndroid Build Coastguard Worker    /dev/root on /vendor type ext2 (rw,seclabel,relatime)
145*61046927SAndroid Build Coastguard Worker
146*61046927SAndroid Build Coastguard WorkerNow, replacing your DRI driver with a new one built for Android should
147*61046927SAndroid Build Coastguard Workerbe a matter of:
148*61046927SAndroid Build Coastguard Worker
149*61046927SAndroid Build Coastguard Worker.. code-block:: sh
150*61046927SAndroid Build Coastguard Worker
151*61046927SAndroid Build Coastguard Worker    scp msm_dri.so $HOST:/opt/google/containers/android/vendor-rw/lib64/dri/
152*61046927SAndroid Build Coastguard Worker
153*61046927SAndroid Build Coastguard WorkerYou can do your build of your DRI driver using ``emerge-$BOARD
154*61046927SAndroid Build Coastguard Workerarc-mesa-freedreno`` (for example) if you have a source tree with
155*61046927SAndroid Build Coastguard WorkerARC++, but it should also be possible to build using the NDK as
156*61046927SAndroid Build Coastguard Workerdescribed above.  There are currently rough edges with this, for
157*61046927SAndroid Build Coastguard Workerexample the build will require that you have your arc-libdrm build
158*61046927SAndroid Build Coastguard Workeravailable to the NDK, assuming you're building anything but the
159*61046927SAndroid Build Coastguard WorkerFreedreno Vulkan driver for KGSL.  You can mostly put things in place
160*61046927SAndroid Build Coastguard Workerwith:
161*61046927SAndroid Build Coastguard Worker
162*61046927SAndroid Build Coastguard Worker.. code-block:: sh
163*61046927SAndroid Build Coastguard Worker
164*61046927SAndroid Build Coastguard Worker    scp $HOST:/opt/google/containers/android/vendor-rw/lib64/libdrm.so \
165*61046927SAndroid Build Coastguard Worker        NDKDIR/sysroot/usr/lib/aarch64-linux-android/lib/
166*61046927SAndroid Build Coastguard Worker
167*61046927SAndroid Build Coastguard Worker    ln -s \
168*61046927SAndroid Build Coastguard Worker        /usr/include/xf86drm.h \
169*61046927SAndroid Build Coastguard Worker	/usr/include/libsync.h \
170*61046927SAndroid Build Coastguard Worker	/usr/include/libdrm \
171*61046927SAndroid Build Coastguard Worker	NDKDIR/sysroot/usr/include/
172*61046927SAndroid Build Coastguard Worker
173*61046927SAndroid Build Coastguard WorkerIt seems that new invocations of an application will often reload the
174*61046927SAndroid Build Coastguard WorkerDRI driver, but depending on the component you're working on you may
175*61046927SAndroid Build Coastguard Workerfind you need to reload the whole Android container.  To do so without
176*61046927SAndroid Build Coastguard Workerhaving to log in to Chrome again every time, you can just kill the
177*61046927SAndroid Build Coastguard Workercontainer and let it restart:
178*61046927SAndroid Build Coastguard Worker
179*61046927SAndroid Build Coastguard Worker.. code-block:: sh
180*61046927SAndroid Build Coastguard Worker
181*61046927SAndroid Build Coastguard Worker    kill $(cat /run/containers/android-run_oci/container.pid )
182*61046927SAndroid Build Coastguard Worker
183*61046927SAndroid Build Coastguard WorkerAdding drivers to Android OS image
184*61046927SAndroid Build Coastguard Worker----------------------------------
185*61046927SAndroid Build Coastguard Worker
186*61046927SAndroid Build Coastguard WorkerWhen building your own Android OS images it's possible to add
187*61046927SAndroid Build Coastguard Workerdrivers built out of tree directly into the OS image. For
188*61046927SAndroid Build Coastguard Workerrunning llvmpipe and lavapipe on Android this step is required
189*61046927SAndroid Build Coastguard Workerto ensure Android is able to load the drivers correctly.
190*61046927SAndroid Build Coastguard Worker
191*61046927SAndroid Build Coastguard WorkerThe following steps provide and example for building
192*61046927SAndroid Build Coastguard Workerthe android cuttlefish image following the official Android
193*61046927SAndroid Build Coastguard Workerdocumentation from https://source.android.com/docs/setup
194*61046927SAndroid Build Coastguard Worker
195*61046927SAndroid Build Coastguard WorkerWhen building llvmpipe or lavapipe for Android, it is required
196*61046927SAndroid Build Coastguard Workerto do this so that the permissions for accessing the library
197*61046927SAndroid Build Coastguard Workerare set correctly.
198*61046927SAndroid Build Coastguard Worker
199*61046927SAndroid Build Coastguard WorkerFollowing the Android documentation, we can run the following
200*61046927SAndroid Build Coastguard Workercommands
201*61046927SAndroid Build Coastguard Worker
202*61046927SAndroid Build Coastguard Worker.. code-block:: sh
203*61046927SAndroid Build Coastguard Worker
204*61046927SAndroid Build Coastguard Worker   repo init -b main -u https://android.googlesource.com/platform/manifest
205*61046927SAndroid Build Coastguard Worker   repo sync -c -j8
206*61046927SAndroid Build Coastguard Worker
207*61046927SAndroid Build Coastguard Worker   source build/envsetup.sh
208*61046927SAndroid Build Coastguard Worker   lunch aosp_cf_x86_64_phone-trunk_staging-userdebug
209*61046927SAndroid Build Coastguard Worker
210*61046927SAndroid Build Coastguard WorkerBe aware that the sync command can take a long time to run as
211*61046927SAndroid Build Coastguard Workerit will download all of the source code. This will set up
212*61046927SAndroid Build Coastguard Workerthe ``aosp_cf_x86_64_phone-trunk_staging-userdebug`` build target
213*61046927SAndroid Build Coastguard Workerfor Android. Please note that the x86_64 cuttlefish target will require
214*61046927SAndroid Build Coastguard Workeryou to build mesa for 32bit and 64bit. Next we need to copy the build
215*61046927SAndroid Build Coastguard Workerdriver libraries into the source tree of Android and patch the binary names.
216*61046927SAndroid Build Coastguard WorkerNote that as of ``9b7bb6cc9fa``, libgallium will include the build tag in the
217*61046927SAndroid Build Coastguard Workername, so the name of that library will need to match the tag used in the build.
218*61046927SAndroid Build Coastguard Worker
219*61046927SAndroid Build Coastguard Worker.. code-block:: sh
220*61046927SAndroid Build Coastguard Worker
221*61046927SAndroid Build Coastguard Worker   mkdir prebuilts/mesa
222*61046927SAndroid Build Coastguard Worker   mkdir prebuilts/mesa/x86_64
223*61046927SAndroid Build Coastguard Worker   mkdir prebuilts/mesa/x86
224*61046927SAndroid Build Coastguard Worker   cp ${INSTALL_PREFIX_64}/lib/libEGL.so prebuilts/mesa/x86_64/
225*61046927SAndroid Build Coastguard Worker   cp ${INSTALL_PREFIX_64}/lib/libglapi.so prebuilts/mesa/x86_64/
226*61046927SAndroid Build Coastguard Worker   cp ${INSTALL_PREFIX_64}/lib/libgallium-24.3.0-devel.so prebuilts/mesa/x86_64/
227*61046927SAndroid Build Coastguard Worker   cp ${INSTALL_PREFIX_64}/lib/libGLESv1_CM.so  prebuilts/mesa/x86_64/
228*61046927SAndroid Build Coastguard Worker   cp ${INSTALL_PREFIX_64}/lib/libGLESv2.so  prebuilts/mesa/x86_64/
229*61046927SAndroid Build Coastguard Worker   cp ${INSTALL_PREFIX_64}/lib/libvulkan_lvp.so prebuilts/mesa/x86_64/
230*61046927SAndroid Build Coastguard Worker   cp ${INSTALL_PREFIX_32}/lib/libEGL.so prebuilts/mesa/x86
231*61046927SAndroid Build Coastguard Worker   cp ${INSTALL_PREFIX_32}/lib/libglapi.so prebuilts/mesa/x86
232*61046927SAndroid Build Coastguard Worker   cp ${INSTALL_PREFIX_32}/lib/libgallium-24.3.0-devel.so prebuilts/mesa/x86/
233*61046927SAndroid Build Coastguard Worker   cp ${INSTALL_PREFIX_32}/lib/libGLESv1_CM.so  prebuilts/mesa/x86
234*61046927SAndroid Build Coastguard Worker   cp ${INSTALL_PREFIX_32}/lib/libGLESv2.so  prebuilts/mesa/x86
235*61046927SAndroid Build Coastguard Worker   cp ${INSTALL_PREFIX_32}/lib/libvulkan_lvp.so prebuilts/mesa/x86
236*61046927SAndroid Build Coastguard Worker
237*61046927SAndroid Build Coastguard Worker   patchelf --set-soname libEGL_lp.so prebuilts/mesa/x86_64/libEGL.so
238*61046927SAndroid Build Coastguard Worker   patchelf --set-soname libGLESv1_CM_lp.so prebuilts/mesa/x86_64/libGLESv1_CM.so
239*61046927SAndroid Build Coastguard Worker   patchelf --set-soname libGLESv2_lp.so prebuilts/mesa/x86_64/libGLESv2.so
240*61046927SAndroid Build Coastguard Worker   patchelf --set-soname vulkan.lvp.so prebuilts/mesa/x86_64/libvulkan_lvp.so
241*61046927SAndroid Build Coastguard Worker   patchelf --set-soname libEGL_lp.so prebuilts/mesa/x86/libEGL.so
242*61046927SAndroid Build Coastguard Worker   patchelf --set-soname libGLESv1_CM_lp.so prebuilts/mesa/x86/libGLESv1_CM.so
243*61046927SAndroid Build Coastguard Worker   patchelf --set-soname libGLESv2_lp.so prebuilts/mesa/x86/libGLESv2.so
244*61046927SAndroid Build Coastguard Worker   patchelf --set-soname vulkan.lvp.so prebuilts/mesa/x86/libvulkan_lvp.so
245*61046927SAndroid Build Coastguard Worker
246*61046927SAndroid Build Coastguard WorkerWe then need to create an ``prebuilts/mesa/Android.bp`` build file to include
247*61046927SAndroid Build Coastguard Workerthe libraries in the build.
248*61046927SAndroid Build Coastguard Worker
249*61046927SAndroid Build Coastguard Worker.. code-block::
250*61046927SAndroid Build Coastguard Worker
251*61046927SAndroid Build Coastguard Worker   cc_prebuilt_library_shared {
252*61046927SAndroid Build Coastguard Worker       name: "libglapi",
253*61046927SAndroid Build Coastguard Worker       arch: {
254*61046927SAndroid Build Coastguard Worker           x86_64: {
255*61046927SAndroid Build Coastguard Worker               srcs: ["x86_64/libglapi.so"],
256*61046927SAndroid Build Coastguard Worker           },
257*61046927SAndroid Build Coastguard Worker           x86: {
258*61046927SAndroid Build Coastguard Worker               srcs: ["x86/libglapi.so"],
259*61046927SAndroid Build Coastguard Worker           },
260*61046927SAndroid Build Coastguard Worker       },
261*61046927SAndroid Build Coastguard Worker       strip: {
262*61046927SAndroid Build Coastguard Worker           none: true,
263*61046927SAndroid Build Coastguard Worker       },
264*61046927SAndroid Build Coastguard Worker       relative_install_path: "egl",
265*61046927SAndroid Build Coastguard Worker       shared_libs: ["libc", "libdl", "liblog", "libm"],
266*61046927SAndroid Build Coastguard Worker       vendor: true
267*61046927SAndroid Build Coastguard Worker   }
268*61046927SAndroid Build Coastguard Worker
269*61046927SAndroid Build Coastguard Worker   cc_prebuilt_library_shared {
270*61046927SAndroid Build Coastguard Worker       name: "libgallium-24.3.0-devel",
271*61046927SAndroid Build Coastguard Worker       arch: {
272*61046927SAndroid Build Coastguard Worker           x86_64: {
273*61046927SAndroid Build Coastguard Worker               srcs: ["x86_64/libgallium-24.3.0-devel.so"],
274*61046927SAndroid Build Coastguard Worker           },
275*61046927SAndroid Build Coastguard Worker           x86: {
276*61046927SAndroid Build Coastguard Worker               srcs: ["x86/libgallium-24.3.0-devel.so"],
277*61046927SAndroid Build Coastguard Worker           },
278*61046927SAndroid Build Coastguard Worker       },
279*61046927SAndroid Build Coastguard Worker       strip: {
280*61046927SAndroid Build Coastguard Worker           none: true,
281*61046927SAndroid Build Coastguard Worker       },
282*61046927SAndroid Build Coastguard Worker       relative_install_path: "egl",
283*61046927SAndroid Build Coastguard Worker       shared_libs: ["libc", "libdl", "liblog", "libm"],
284*61046927SAndroid Build Coastguard Worker       check_elf_files: false,
285*61046927SAndroid Build Coastguard Worker       vendor: true
286*61046927SAndroid Build Coastguard Worker   }
287*61046927SAndroid Build Coastguard Worker
288*61046927SAndroid Build Coastguard Worker   cc_prebuilt_library_shared {
289*61046927SAndroid Build Coastguard Worker       name: "libEGL_lp",
290*61046927SAndroid Build Coastguard Worker       arch: {
291*61046927SAndroid Build Coastguard Worker           x86_64: {
292*61046927SAndroid Build Coastguard Worker               srcs: ["x86_64/libEGL.so"],
293*61046927SAndroid Build Coastguard Worker           },
294*61046927SAndroid Build Coastguard Worker           x86: {
295*61046927SAndroid Build Coastguard Worker               srcs: ["x86/libEGL.so"],
296*61046927SAndroid Build Coastguard Worker           },
297*61046927SAndroid Build Coastguard Worker       },
298*61046927SAndroid Build Coastguard Worker       strip: {
299*61046927SAndroid Build Coastguard Worker           none: true,
300*61046927SAndroid Build Coastguard Worker       },
301*61046927SAndroid Build Coastguard Worker       relative_install_path: "egl",
302*61046927SAndroid Build Coastguard Worker       shared_libs: ["libc", "libdl", "liblog", "libm", "libcutils", "libdrm", "libhardware", "liblog", "libnativewindow", "libsync"],
303*61046927SAndroid Build Coastguard Worker       check_elf_files: false,
304*61046927SAndroid Build Coastguard Worker       vendor: true
305*61046927SAndroid Build Coastguard Worker   }
306*61046927SAndroid Build Coastguard Worker
307*61046927SAndroid Build Coastguard Worker   cc_prebuilt_library_shared {
308*61046927SAndroid Build Coastguard Worker       name: "libGLESv1_CM_lp",
309*61046927SAndroid Build Coastguard Worker       arch: {
310*61046927SAndroid Build Coastguard Worker           x86_64: {
311*61046927SAndroid Build Coastguard Worker               srcs: ["x86_64/libGLESv1_CM.so"],
312*61046927SAndroid Build Coastguard Worker           },
313*61046927SAndroid Build Coastguard Worker           x86: {
314*61046927SAndroid Build Coastguard Worker               srcs: ["x86/libGLESv1_CM.so"],
315*61046927SAndroid Build Coastguard Worker           },
316*61046927SAndroid Build Coastguard Worker       },
317*61046927SAndroid Build Coastguard Worker       strip: {
318*61046927SAndroid Build Coastguard Worker           none: true,
319*61046927SAndroid Build Coastguard Worker       },
320*61046927SAndroid Build Coastguard Worker       relative_install_path: "egl",
321*61046927SAndroid Build Coastguard Worker       shared_libs: ["libc", "libdl", "liblog", "libm"],
322*61046927SAndroid Build Coastguard Worker       check_elf_files: false,
323*61046927SAndroid Build Coastguard Worker       vendor: true
324*61046927SAndroid Build Coastguard Worker   }
325*61046927SAndroid Build Coastguard Worker
326*61046927SAndroid Build Coastguard Worker   cc_prebuilt_library_shared {
327*61046927SAndroid Build Coastguard Worker       name: "libGLESv2_lp",
328*61046927SAndroid Build Coastguard Worker       arch: {
329*61046927SAndroid Build Coastguard Worker           x86_64: {
330*61046927SAndroid Build Coastguard Worker               srcs: ["x86_64/libGLESv2.so"],
331*61046927SAndroid Build Coastguard Worker           },
332*61046927SAndroid Build Coastguard Worker           x86: {
333*61046927SAndroid Build Coastguard Worker               srcs: ["x86_64/libGLESv2.so"],
334*61046927SAndroid Build Coastguard Worker           },
335*61046927SAndroid Build Coastguard Worker       },
336*61046927SAndroid Build Coastguard Worker       strip: {
337*61046927SAndroid Build Coastguard Worker           none: true,
338*61046927SAndroid Build Coastguard Worker       },
339*61046927SAndroid Build Coastguard Worker       relative_install_path: "egl",
340*61046927SAndroid Build Coastguard Worker       shared_libs: ["libc", "libdl", "liblog", "libm"],
341*61046927SAndroid Build Coastguard Worker       check_elf_files: false,
342*61046927SAndroid Build Coastguard Worker       vendor: true
343*61046927SAndroid Build Coastguard Worker   }
344*61046927SAndroid Build Coastguard Worker
345*61046927SAndroid Build Coastguard Worker   cc_prebuilt_library_shared {
346*61046927SAndroid Build Coastguard Worker       name: "vulkan.lvp",
347*61046927SAndroid Build Coastguard Worker       arch: {
348*61046927SAndroid Build Coastguard Worker           x86_64: {
349*61046927SAndroid Build Coastguard Worker               srcs: ["x86_64/libvulkan_lvp.so"],
350*61046927SAndroid Build Coastguard Worker           },
351*61046927SAndroid Build Coastguard Worker           x86: {
352*61046927SAndroid Build Coastguard Worker               srcs: ["x86/libvulkan_lvp.so"],
353*61046927SAndroid Build Coastguard Worker           },
354*61046927SAndroid Build Coastguard Worker       },
355*61046927SAndroid Build Coastguard Worker       strip: {
356*61046927SAndroid Build Coastguard Worker           none: true,
357*61046927SAndroid Build Coastguard Worker       },
358*61046927SAndroid Build Coastguard Worker       relative_install_path: "hw",
359*61046927SAndroid Build Coastguard Worker       shared_libs: ["libc", "libdl", "liblog", "libm", "libcutils", "libdrm", "liblog", "libnativewindow", "libsync", "libz"],
360*61046927SAndroid Build Coastguard Worker       vendor: true
361*61046927SAndroid Build Coastguard Worker   }
362*61046927SAndroid Build Coastguard Worker
363*61046927SAndroid Build Coastguard Worker
364*61046927SAndroid Build Coastguard WorkerNext we need to update the device configuration to include the libraries
365*61046927SAndroid Build Coastguard Workerin the build, as well as set the appropriate system properties. We can
366*61046927SAndroid Build Coastguard Workercreate the file
367*61046927SAndroid Build Coastguard Worker``device/google/cuttlefish/shared/mesa/device_vendor.mk``
368*61046927SAndroid Build Coastguard Worker
369*61046927SAndroid Build Coastguard Worker
370*61046927SAndroid Build Coastguard Worker.. code-block:: makefile
371*61046927SAndroid Build Coastguard Worker
372*61046927SAndroid Build Coastguard Worker   PRODUCT_SOONG_NAMESPACES += prebuilts/mesa
373*61046927SAndroid Build Coastguard Worker   PRODUCT_PACKAGES += libglapi \
374*61046927SAndroid Build Coastguard Worker                       libGLESv1_CM_lp \
375*61046927SAndroid Build Coastguard Worker                       libGLESv2_lp \
376*61046927SAndroid Build Coastguard Worker                       libEGL_lp \
377*61046927SAndroid Build Coastguard Worker                       libgallium-24.3.0-devel.so \
378*61046927SAndroid Build Coastguard Worker                       vulkan.lvp
379*61046927SAndroid Build Coastguard Worker   PRODUCT_VENDOR_PROPERTIES += \
380*61046927SAndroid Build Coastguard Worker           ro.hardware.egl=lp \
381*61046927SAndroid Build Coastguard Worker           ro.hardware.vulkan=lvp \
382*61046927SAndroid Build Coastguard Worker           mesa.libgl.always.software=true \
383*61046927SAndroid Build Coastguard Worker           mesa.android.no.kms.swrast=true \
384*61046927SAndroid Build Coastguard Worker           debug.hwui.renderer=opengl \
385*61046927SAndroid Build Coastguard Worker           ro.gfx.angle.supported=false \
386*61046927SAndroid Build Coastguard Worker           debug.sf.disable_hwc_vds=1 \
387*61046927SAndroid Build Coastguard Worker           ro.vendor.hwcomposer.mode=client
388*61046927SAndroid Build Coastguard Worker
389*61046927SAndroid Build Coastguard WorkerAlso the file ``device/google/cuttlefish/shared/mesa/BoardConfig.mk``
390*61046927SAndroid Build Coastguard Worker
391*61046927SAndroid Build Coastguard Worker.. code-block:: makefile
392*61046927SAndroid Build Coastguard Worker
393*61046927SAndroid Build Coastguard Worker   BOARD_VENDOR_SEPOLICY_DIRS += \
394*61046927SAndroid Build Coastguard Worker           device/google/cuttlefish/shared/mesa/sepolicy
395*61046927SAndroid Build Coastguard Worker
396*61046927SAndroid Build Coastguard WorkerNext the file ``device/google/cuttlefish/shared/mesa/sepolicy/file_contexts``
397*61046927SAndroid Build Coastguard Worker
398*61046927SAndroid Build Coastguard Worker.. code-block:: sh
399*61046927SAndroid Build Coastguard Worker
400*61046927SAndroid Build Coastguard Worker   /vendor/lib(64)?/egl/libEGL_lp\.so u:object_r:same_process_hal_file:s0
401*61046927SAndroid Build Coastguard Worker   /vendor/lib(64)?/egl/libGLESv1_CM_lp\.so u:object_r:same_process_hal_file:s0
402*61046927SAndroid Build Coastguard Worker   /vendor/lib(64)?/egl/libGLESv2_lp\.so u:object_r:same_process_hal_file:s0
403*61046927SAndroid Build Coastguard Worker   /vendor/lib(64)?/egl/libglapi\.so u:object_r:same_process_hal_file:s0
404*61046927SAndroid Build Coastguard Worker   /vendor/lib(64)?/egl/libgallium\-24.3.0\-devel\.so u:object_r:same_process_hal_file:s0
405*61046927SAndroid Build Coastguard Worker   /vendor/lib(64)?/hw/vulkan\.lvp\.so u:object_r:same_process_hal_file:s0
406*61046927SAndroid Build Coastguard Worker
407*61046927SAndroid Build Coastguard WorkerAfter creating these files we need to modify the existing config files
408*61046927SAndroid Build Coastguard Workerto include these build files. First we modify
409*61046927SAndroid Build Coastguard Worker``device/google/cuttlefish/shared/phone/device_vendor.mk``
410*61046927SAndroid Build Coastguard Workerto add the below code in the spot where other device_vendor
411*61046927SAndroid Build Coastguard Workerfiles are included.
412*61046927SAndroid Build Coastguard Worker
413*61046927SAndroid Build Coastguard Worker.. code-block:: sh
414*61046927SAndroid Build Coastguard Worker
415*61046927SAndroid Build Coastguard Worker   $(call inherit-product, device/google/cuttlefish/shared/mesa/device_vendor.mk)
416*61046927SAndroid Build Coastguard Worker
417*61046927SAndroid Build Coastguard WorkerLastly we modify
418*61046927SAndroid Build Coastguard Worker``device/google/cuttlefish/vsoc_x86_64/BoardConfig.mk`` to include
419*61046927SAndroid Build Coastguard Workerthe following line where the other BoardConfig files are included
420*61046927SAndroid Build Coastguard Worker
421*61046927SAndroid Build Coastguard Worker.. code-block:: sh
422*61046927SAndroid Build Coastguard Worker
423*61046927SAndroid Build Coastguard Worker   -include device/google/cuttlefish/shared/mesa/BoardConfig.mk
424*61046927SAndroid Build Coastguard Worker
425*61046927SAndroid Build Coastguard WorkerThen we are set to continue following the official instructions to
426*61046927SAndroid Build Coastguard Workerbuild the cuttlefish target and run it in the cuttlefish emulator.
427