commit | e81891a3affd40437c0f39f885b55ef800b57d5c | [log] [tgz] |
---|---|---|
author | Gurchetan Singh <[email protected]> | Tue Jun 11 10:31:17 2024 -0700 |
committer | Gurchetan Singh <[email protected]> | Mon Jul 01 10:39:11 2024 -0700 |
tree | 3878423d264c5c369e499a32d6a389fa3c350ff0 | |
parent | 59f581f2a15524fd46a5dc0c0bf8d620589a97ab [diff] |
gfxstream: guest: enable virtio-gpu kumquat This uses libvirtgpu_kumquat_ffi.so to send commands to the Kumquat Media Server. The implementation of Kumquat is found at crrev.com/c/5645904. This is a more complex, but more fully featured end-to-end testing framework. This biggest benefit it is can run complex apps (vkcube, gfxbench + ANGLE/Zink) on Linux, without a VM or a full Android tree. The rutabaga FFI path -- which relied on a nested Vulkan loader -- didn't work for complex apps and funkiness was observed with the nested Vulkan loader. Plus, app 1 + app 2 could connect Kumquat at the same time. This may also benefit snapshot tests, particular since end to end flow relies on external blob. For example, a snapshot save command could actually call stream_renderer_teardown(..) on the host-side, while the guest retains it's state (ASG mappings + vulkano mappings). A snapshot restore would actually call stream_renderer_init(..) + stream_renderer_restore(..), which an actual upstream VMM would do. Another additional benefit is multi-context testing. Since libvirtgpu_kumquat_ffi.so is portable, other libraries (minigbm) can also call it. We can mimic the cross-domain context allocating via libminigbm.so, while context libgfxstream_vulkan.so imports the file descriptor. This change only transitions the meson build since the main goal is once again is Linux on Linux testing w/o an Android tree. BUG=300140266 TEST=run apps via Kumquat Change-Id: I37494a6146a969f5f21ac208141b640d2272692e
Graphics Streaming Kit is a code generator that makes it easier to serialize and forward graphics API calls from one place to another:
The latest directions for the standalone Linux build are provided here.
Make sure the latest CMake is installed. Make sure Visual Studio 2019 is installed on your system along with all the Clang C++ toolchain components. Then:
mkdir build cd build cmake . ../ -A x64 -T ClangCL
A solution file should be generated. Then open the solution file in Visual studio and build the gfxstream_backend
target.
Be in the Android build system. Then:
m libgfxstream_backend
It then ends up in out/host
This also builds for Android on-device.
libgfxstream_backend.(dll|so|dylib)
To re-generate both guest and Vulkan code, please run:
scripts/generate-gfxstream-vulkan.sh
First, build build/gfxstream-generic-apigen
. Then run:
scripts/generate-apigen-source.sh
There are a bunch of test executables generated. They require libEGL.dll
and libGLESv2.dll
and vulkan-1.dll
to be available, possibly from your GPU vendor or ANGLE, in the %PATH%
.
There are Android mock testa available, runnable on Linux. To build these tests, run:
m GfxstreamEnd2EndTests
CMakeLists.txt
: specifies all host-side build targets. This includes all backends along with client/server setups that live only on the host. SomeAndroid.bp
: specifies all guest-side build targets for Android:BUILD.gn
: specifies all guest-side build targets for Fuchsiabase/
: common libraries that are built for both the guest and host. Contains utility code related to synchronization, threading, and suballocation.protocols/
: implementations of protocols for various graphics APIs. May contain code generators to make it easy to regen the protocol based on certain things.host-common/
: implementations of host-side support code that makes it easier to run the server in a variety of virtual device environments. Contains concrete implementations of auxiliary virtual devices such as Address Space Device and Goldfish Pipe.stream-servers/
: implementations of various backends for various graphics APIs that consume protocol. gfxstream-virtio-gpu-renderer.cpp
contains a virtio-gpu backend implementation.gfxstream vulkan is the most actively developed component. Some key commponents of the current design include:
struct gfxstream_vk_device
and the gfxstream object goldfish_device
both are internal representations of Vulkan opaque handle VkDevice
. The Mesa object is used first, since Mesa provides dispatch. The Mesa object contains a key to the hash table to get a gfxstream internal object (for example, gfxstream_vk_device::internal_object
). Eventually, gfxstream objects will be phased out and Mesa objects used exclusively.