diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2024-05-16 16:37:31 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2024-05-16 16:37:31 +0000 |
commit | 2c0731cb00a1c3d9794c297b80c0f2337d3d0722 (patch) | |
tree | e7d85b7ac6fba07b2eeb3fe950cf88e31ff55dcc | |
parent | 2a95e5051da364ab2fa0624de9ab2f2c8b37aa9e (diff) | |
parent | 2baf767bcfc40250a071fda52f7431b4c356986d (diff) | |
download | qemu-emu-35-1-release.tar.gz |
Merge "Snap for 11848231 from d8932dc352a181adbb4f7e0ca99900909a4c3f60 to emu-35-1-release" into emu-35-1-releaseemu-35-1-release
19 files changed, 283 insertions, 134 deletions
diff --git a/android-qemu2-glue/main.cpp b/android-qemu2-glue/main.cpp index ccfba68d72..5e5f26d5e0 100644 --- a/android-qemu2-glue/main.cpp +++ b/android-qemu2-glue/main.cpp @@ -377,7 +377,7 @@ static void prepareSkinConfig(AndroidHwConfig* hw, const char* dataDirectory) { if (android_foldable_is_pixel_fold()) { const char* skin = nullptr; if (((hw->hw_device_name && - "pixel_fold" == std::string(hw->hw_device_name)) || + !strncmp("pixel_fold",hw->hw_device_name, 10)) || resizableEnabled34())) { skin = "pixel_fold"; } else { diff --git a/android/android-emu/android/emulation/resizable_display_config.cpp b/android/android-emu/android/emulation/resizable_display_config.cpp index 9ba5e862ed..9d08ce518f 100644 --- a/android/android-emu/android/emulation/resizable_display_config.cpp +++ b/android/android-emu/android/emulation/resizable_display_config.cpp @@ -30,6 +30,7 @@ #include "host-common/opengles.h" #include "studio_stats.pb.h" +#include <atomic> #include <map> using android::metrics::MetricsReporter; @@ -220,11 +221,21 @@ public: mMetricsRegistered = true; } + bool isTransitionInProgress() const { + bool result = mTransitionInProgress.load(std::memory_order_relaxed); + return result; + } + + void setTransitionInProgress(int inProgress) { + mTransitionInProgress.store(inProgress, std::memory_order_relaxed); + } + private: std::map<PresetEmulatorSizeType, PresetEmulatorSizeInfo> mConfigs; PresetEmulatorSizeType mActiveConfigId = PRESET_SIZE_MAX; std::map<PresetEmulatorSizeType, uint32_t> mTypeCount; bool mMetricsRegistered = false; + std::atomic<bool> mTransitionInProgress{false}; }; static android::base::LazyInstance<ResizableConfig> sResizableConfig = @@ -254,6 +265,19 @@ void updateAndroidDisplayConfigPath(enum PresetEmulatorSizeType id) { android::emulation::sResizableConfig->updateAndroidDisplayConfigPath(id); } +bool isResizableTransitionInProgress() { + if (!resizableEnabled()) + return false; + + return android::emulation::sResizableConfig->isTransitionInProgress(); +} + +void setResizableTransitionInProgress(bool inProgress) { + if (!resizableEnabled()) + return; + android::emulation::sResizableConfig->setTransitionInProgress(inProgress); +} + bool resizableEnabled34() { const char* pconfigs = getConsoleAgents()->settings->hw()->hw_resizable_configs; diff --git a/android/android-emu/android/emulation/resizable_display_config.h b/android/android-emu/android/emulation/resizable_display_config.h index 921841b183..caf6162f6e 100644 --- a/android/android-emu/android/emulation/resizable_display_config.h +++ b/android/android-emu/android/emulation/resizable_display_config.h @@ -32,6 +32,8 @@ struct PresetEmulatorSizeInfo { int dpi; }; +bool isResizableTransitionInProgress(); +void setResizableTransitionInProgress(bool inProgress); bool resizableEnabled(); bool resizableEnabled34(); void resizableInit(); diff --git a/android/android-emu/android/hw-sensors.cpp b/android/android-emu/android/hw-sensors.cpp index c6f2808654..13d6853b17 100644 --- a/android/android-emu/android/hw-sensors.cpp +++ b/android/android-emu/android/hw-sensors.cpp @@ -1412,6 +1412,9 @@ int android_foldable_pixel_fold_second_display_id() { // We still need to discuss how to support foldable for secondary displays bool android_foldable_hinge_enabled() { + if (isResizableTransitionInProgress()) { + return false; + } return ((android_foldable_hinge_configured() || android_foldable_folded_area_configured(0) || android_foldable_rollable_configured()) && @@ -1532,7 +1535,7 @@ bool android_foldable_unfold() { } bool android_foldable_set_posture(int posture) { - if (!android_foldable_hinge_configured()) { + if (!android_foldable_hinge_enabled()) { return false; } struct FoldableState state; diff --git a/android/android-emu/android/physics/FoldableModel.cpp b/android/android-emu/android/physics/FoldableModel.cpp index c576b9ab1f..f4764834fb 100644 --- a/android/android-emu/android/physics/FoldableModel.cpp +++ b/android/android-emu/android/physics/FoldableModel.cpp @@ -424,6 +424,9 @@ void FoldableModel::setHingeAngle(uint32_t hingeIndex, PhysicalInterpolation mode, std::recursive_mutex& mutex) { VLOG(foldable) << "setHingeAngle index " << hingeIndex << " degrees " << degrees; + if (!android_foldable_hinge_enabled()) { + return; + } std::unique_lock<std::recursive_mutex> lock(mutex); if (hingeIndex >= ANDROID_FOLDABLE_MAX_HINGES) return; diff --git a/android/android-emugl/host/libs/libOpenglRender/tests/Vulkan_unittest.cpp b/android/android-emugl/host/libs/libOpenglRender/tests/Vulkan_unittest.cpp index 1c3eeb844c..2612eeeb91 100644 --- a/android/android-emugl/host/libs/libOpenglRender/tests/Vulkan_unittest.cpp +++ b/android/android-emugl/host/libs/libOpenglRender/tests/Vulkan_unittest.cpp @@ -51,23 +51,13 @@ namespace emugl { static std::string libDir() { return pj({TestSystem::getProgramDirectoryFromPlatform(), -#ifdef _WIN32 - // Windows uses mock Vulkan ICD. - "testlib64" -#else "lib64", "vulkan" -#endif }); } static std::string testIcdFilename() { return pj(libDir(), -#ifdef _WIN32 - // Windows uses mock Vulkan ICD. - "VkICD_mock_icd.json" -#else "vk_swiftshader_icd.json" -#endif ); } diff --git a/android/android-grpc/services/emulator-controller/server/src/android/emulation/control/EmulatorService.cpp b/android/android-grpc/services/emulator-controller/server/src/android/emulation/control/EmulatorService.cpp index 429eff6322..25803e6ba7 100644 --- a/android/android-grpc/services/emulator-controller/server/src/android/emulation/control/EmulatorService.cpp +++ b/android/android-grpc/services/emulator-controller/server/src/android/emulation/control/EmulatorService.cpp @@ -690,20 +690,23 @@ public: int cPixels = reply.image().size(); bool clientAvailable = !context->IsCancelled(); - if (clientAvailable) { - auto status = getScreenshot(context, request, &reply); - if (!status.ok()) { - return status; - } - - assert(reply.image().size() >= cPixels); - cPixels = reply.image().size(); - clientAvailable = !context->IsCancelled() && writer->Write(reply); - } - bool lastFrameWasEmpty = reply.format().width() == 0; int frame = 0; + { + uint32_t width, height; + bool enabled = true; + bool multiDisplayQueryWorks = mAgents->emu->getMultiDisplay( + request->display(), nullptr, nullptr, &width, &height, nullptr, + nullptr, &enabled); + if (!enabled) { + return Status( + ::grpc::StatusCode::INVALID_ARGUMENT, + "Invalid display: " + std::to_string(request->display()), + ""); + } + } + // TODO(jansen): Move to ScreenshotUtils. std::unique_ptr<EventWaiter> frameEvent; std::unique_ptr<RaiiEventListener<gfxstream::Renderer, @@ -755,6 +758,10 @@ public: AEMU_SCOPED_TRACE("streamScreenshot::frame\r\n"); frame += framesArrived; Stopwatch sw; auto status = getScreenshot(context, request, &reply); + if (status.error_code() == grpc::StatusCode::FAILED_PRECONDITION) { + continue; + } + if (!status.ok()) { return status; } @@ -972,7 +979,6 @@ public: cPixels = img.getPixelCount(); } else { // Let's make a fast call to learn how many pixels we need // to reserve. - while (1) { width = 0; height = 0; cPixels = 0; @@ -981,10 +987,9 @@ public: request->format(), rotation, newWidth, newHeight, pixels, &cPixels, &width, &height, rect); if (width > 0 && height > 0 && cPixels > 0) { - break; + } else { + return Status(grpc::StatusCode::FAILED_PRECONDITION, "Unable to getScreenshot"); } - std::this_thread::sleep_for(std::chrono::milliseconds(100)); - } } auto format = reply->mutable_format(); diff --git a/android/android-ui/modules/aemu-ui-qt/src/android/skin/qt/tool-window.cpp b/android/android-ui/modules/aemu-ui-qt/src/android/skin/qt/tool-window.cpp index b76db16dc6..d4f332fa10 100644 --- a/android/android-ui/modules/aemu-ui-qt/src/android/skin/qt/tool-window.cpp +++ b/android/android-ui/modules/aemu-ui-qt/src/android/skin/qt/tool-window.cpp @@ -476,6 +476,9 @@ void ToolWindow::on_sleep_timer_done() { emugl::setShouldSkipDraw(false); android_redrawOpenglesWindow(); } + if (isResizableTransitionInProgress()) { + setResizableTransitionInProgress(false); + } if (mSleepKeySent) { mEmulatorWindow->getAdbInterface()-> enqueueCommand( {"shell", "input", "keyevent", "KEYCODE_WAKEUP"}); @@ -978,6 +981,9 @@ void ToolWindow::presetSizeAdvance(PresetEmulatorSizeType newSize) { if (getResizableActiveConfigId() == newSize) { return; } + if (isResizableTransitionInProgress()) { + return; + } if (android_foldable_is_folded()) { startUnfoldTimer(newSize); return; @@ -998,6 +1004,7 @@ void ToolWindow::presetSizeAdvance(PresetEmulatorSizeType newSize) { on_new_posture_requested(POSTURE_OPENED); } + setResizableTransitionInProgress(true); emugl::setShouldSkipDraw(true); startSleepTimer(); std::string updateMsg = "Updating device size\n"; diff --git a/android/build/cmake/config.toml.in b/android/build/cmake/config.toml.in index f32f6ed80a..db70aa4d00 100644 --- a/android/build/cmake/config.toml.in +++ b/android/build/cmake/config.toml.in @@ -148,7 +148,8 @@ zip = { path = "${AOSP_ROOT}/external/rust/crates/zip" } backtrace = { path = "${AOSP_ROOT}/external/qemu/android/build/cmake/rust/crates/backtrace" } googletest = { path = "${AOSP_ROOT}/external/qemu/android/build/cmake/rust/crates/googletest" } hermit-abi = { path = "${AOSP_ROOT}/external/qemu/android/build/cmake/rust/crates/hermit-abi" } -redox_syscall = { path = "${AOSP_ROOT}/external/qemu/android/build/cmake/rust/crates/redox_syscall" } +redox_syscall = { version = "0.2.9", path = "${AOSP_ROOT}/external/qemu/android/build/cmake/rust/crates/redox_syscall" } +redox_syscall2 = { version = "0.4.1", path = "${AOSP_ROOT}/external/qemu/android/build/cmake/rust/crates/redox_syscall2", package="redox_syscall" } remove_dir_all = { path = "${AOSP_ROOT}/external/qemu/android/build/cmake/rust/crates/remove_dir_all" } sha2 = { path = "${AOSP_ROOT}/external/qemu/android/build/cmake/rust/crates/sha2" } windows-sys = { path = "${AOSP_ROOT}/external/qemu/android/third_party/rust/crates/windows-sys-0.48.0" } diff --git a/android/build/cmake/config/emu-qt5-config.cmake b/android/build/cmake/config/emu-qt5-config.cmake index 278d363d11..2272cb5553 100644 --- a/android/build/cmake/config/emu-qt5-config.cmake +++ b/android/build/cmake/config/emu-qt5-config.cmake @@ -361,40 +361,38 @@ elseif(LINUX) ${PREBUILT_ROOT}/plugins/imageformats/libqwbmp${QT_LIBINFIX}.so>lib64/qt/plugins/imageformats/libqwbmp${QT_LIBINFIX}.so
)
- if(NOT LINUX_AARCH64)
+ list(APPEND QT5_SHARED_DEPENDENCIES
+ ${PREBUILT_ROOT}/plugins/platforms/libqxcb${QT_LIBINFIX}.so>lib64/qt/plugins/platforms/libqxcb${QT_LIBINFIX}.so;
+ ${PREBUILT_ROOT}/plugins/platforms/libqlinuxfb${QT_LIBINFIX}.so>lib64/qt/plugins/platforms/libqlinuxfb${QT_LIBINFIX}.so;
+ ${PREBUILT_ROOT}/plugins/platforms/libqminimal${QT_LIBINFIX}.so>lib64/qt/plugins/platforms/libqminimal${QT_LIBINFIX}.so;
+ ${PREBUILT_ROOT}/plugins/platforms/libqoffscreen${QT_LIBINFIX}.so>lib64/qt/plugins/platforms/libqoffscreen${QT_LIBINFIX}.so;
+ ${PREBUILT_ROOT}/plugins/platforms/libqvnc${QT_LIBINFIX}.so>lib64/qt/plugins/platforms/libqvnc${QT_LIBINFIX}.so;
+ ${PREBUILT_ROOT}/plugins/platforminputcontexts/libcomposeplatforminputcontextplugin${QT_LIBINFIX}.so>lib64/qt/plugins/platforminputcontexts/libcomposeplatforminputcontextplugin${QT_LIBINFIX}.so;
+ ${PREBUILT_ROOT}/plugins/platforminputcontexts/libibusplatforminputcontextplugin${QT_LIBINFIX}.so>lib64/qt/plugins/platforminputcontexts/libibusplatforminputcontextplugin${QT_LIBINFIX}.so;
+ ${PREBUILT_ROOT}/lib/libQt${QT_VERSION_MAJOR}XcbQpa${QT_LIBINFIX}.so.6>lib64/qt/lib/libQt${QT_VERSION_MAJOR}XcbQpa${QT_LIBINFIX}.so.6;
+ ${PREBUILT_ROOT}/lib/libfreetype.so.6>lib64/qt/lib/libfreetype.so.6;
+ ${PREBUILT_ROOT}/lib/libxkbcommon.so.0>lib64/qt/lib/libxkbcommon.so.0;
+ ${PREBUILT_ROOT}/lib/libX11-xcb.so.1>lib64/qt/lib/libX11-xcb.so.1;
+ ${PREBUILT_ROOT}/lib/libXau.so.6>lib64/qt/lib/libXau.so.6;
+ ${PREBUILT_ROOT}/lib/libXdmcp.so.6>lib64/qt/lib/libXdmcp.so.6;
+ ${PREBUILT_ROOT}/lib/libxcb-xkb.so.1>lib64/qt/lib/libxcb-xkb.so.1;
+ ${PREBUILT_ROOT}/lib/libxcb-cursor.so.0>lib64/qt/lib/libxcb-cursor.so.0;
+ ${PREBUILT_ROOT}/lib/libxcb-icccm.so.4>lib64/qt/lib/libxcb-icccm.so.4;
+ ${PREBUILT_ROOT}/lib/libxcb-image.so.0>lib64/qt/lib/libxcb-image.so.0;
+ ${PREBUILT_ROOT}/lib/libxcb-keysyms.so.1>lib64/qt/lib/libxcb-keysyms.so.1;
+ ${PREBUILT_ROOT}/lib/libxcb-randr.so.0>lib64/qt/lib/libxcb-randr.so.0;
+ ${PREBUILT_ROOT}/lib/libxcb-render-util.so.0>lib64/qt/lib/libxcb-render-util.so.0;
+ ${PREBUILT_ROOT}/lib/libxcb-render.so.0>lib64/qt/lib/libxcb-render.so.0;
+ ${PREBUILT_ROOT}/lib/libxcb-shape.so.0>lib64/qt/lib/libxcb-shape.so.0;
+ ${PREBUILT_ROOT}/lib/libxcb-shm.so.0>lib64/qt/lib/libxcb-shm.so.0;
+ ${PREBUILT_ROOT}/lib/libxcb-sync.so.1>lib64/qt/lib/libxcb-sync.so.1;
+ ${PREBUILT_ROOT}/lib/libxcb-util.so.1>lib64/qt/lib/libxcb-util.so.1;
+ ${PREBUILT_ROOT}/lib/libxcb-xfixes.so.0>lib64/qt/lib/libxcb-xfixes.so.0;
+ ${PREBUILT_ROOT}/lib/libxkbcommon-x11.so.0>lib64/qt/lib/libxkbcommon-x11.so.0;
+ ${PREBUILT_ROOT}/lib/libfontconfig.so.1>lib64/qt/lib/libfontconfig.so.1)
+ if(QTWEBENGINE)
list(APPEND QT5_SHARED_DEPENDENCIES
- ${PREBUILT_ROOT}/plugins/platforms/libqxcb${QT_LIBINFIX}.so>lib64/qt/plugins/platforms/libqxcb${QT_LIBINFIX}.so;
- ${PREBUILT_ROOT}/plugins/platforms/libqlinuxfb${QT_LIBINFIX}.so>lib64/qt/plugins/platforms/libqlinuxfb${QT_LIBINFIX}.so;
- ${PREBUILT_ROOT}/plugins/platforms/libqminimal${QT_LIBINFIX}.so>lib64/qt/plugins/platforms/libqminimal${QT_LIBINFIX}.so;
- ${PREBUILT_ROOT}/plugins/platforms/libqoffscreen${QT_LIBINFIX}.so>lib64/qt/plugins/platforms/libqoffscreen${QT_LIBINFIX}.so;
- ${PREBUILT_ROOT}/plugins/platforms/libqvnc${QT_LIBINFIX}.so>lib64/qt/plugins/platforms/libqvnc${QT_LIBINFIX}.so;
- ${PREBUILT_ROOT}/plugins/platforminputcontexts/libcomposeplatforminputcontextplugin${QT_LIBINFIX}.so>lib64/qt/plugins/platforminputcontexts/libcomposeplatforminputcontextplugin${QT_LIBINFIX}.so;
- ${PREBUILT_ROOT}/plugins/platforminputcontexts/libibusplatforminputcontextplugin${QT_LIBINFIX}.so>lib64/qt/plugins/platforminputcontexts/libibusplatforminputcontextplugin${QT_LIBINFIX}.so;
- ${PREBUILT_ROOT}/lib/libQt${QT_VERSION_MAJOR}XcbQpa${QT_LIBINFIX}.so.6>lib64/qt/lib/libQt${QT_VERSION_MAJOR}XcbQpa${QT_LIBINFIX}.so.6;
- ${PREBUILT_ROOT}/lib/libfreetype.so.6>lib64/qt/lib/libfreetype.so.6;
- ${PREBUILT_ROOT}/lib/libxkbcommon.so.0>lib64/qt/lib/libxkbcommon.so.0;
- ${PREBUILT_ROOT}/lib/libX11-xcb.so.1>lib64/qt/lib/libX11-xcb.so.1;
- ${PREBUILT_ROOT}/lib/libXau.so.6>lib64/qt/lib/libXau.so.6;
- ${PREBUILT_ROOT}/lib/libXdmcp.so.6>lib64/qt/lib/libXdmcp.so.6;
- ${PREBUILT_ROOT}/lib/libxcb-xkb.so.1>lib64/qt/lib/libxcb-xkb.so.1;
- ${PREBUILT_ROOT}/lib/libxcb-cursor.so.0>lib64/qt/lib/libxcb-cursor.so.0;
- ${PREBUILT_ROOT}/lib/libxcb-icccm.so.4>lib64/qt/lib/libxcb-icccm.so.4;
- ${PREBUILT_ROOT}/lib/libxcb-image.so.0>lib64/qt/lib/libxcb-image.so.0;
- ${PREBUILT_ROOT}/lib/libxcb-keysyms.so.1>lib64/qt/lib/libxcb-keysyms.so.1;
- ${PREBUILT_ROOT}/lib/libxcb-randr.so.0>lib64/qt/lib/libxcb-randr.so.0;
- ${PREBUILT_ROOT}/lib/libxcb-render-util.so.0>lib64/qt/lib/libxcb-render-util.so.0;
- ${PREBUILT_ROOT}/lib/libxcb-render.so.0>lib64/qt/lib/libxcb-render.so.0;
- ${PREBUILT_ROOT}/lib/libxcb-shape.so.0>lib64/qt/lib/libxcb-shape.so.0;
- ${PREBUILT_ROOT}/lib/libxcb-shm.so.0>lib64/qt/lib/libxcb-shm.so.0;
- ${PREBUILT_ROOT}/lib/libxcb-sync.so.1>lib64/qt/lib/libxcb-sync.so.1;
- ${PREBUILT_ROOT}/lib/libxcb-util.so.1>lib64/qt/lib/libxcb-util.so.1;
- ${PREBUILT_ROOT}/lib/libxcb-xfixes.so.0>lib64/qt/lib/libxcb-xfixes.so.0;
- ${PREBUILT_ROOT}/lib/libxkbcommon-x11.so.0>lib64/qt/lib/libxkbcommon-x11.so.0;
- ${PREBUILT_ROOT}/lib/libfontconfig.so.1>lib64/qt/lib/libfontconfig.so.1)
- if(QTWEBENGINE)
- list(APPEND QT5_SHARED_DEPENDENCIES
- ${PREBUILT_ROOT}/lib/libpcre2-16.so.0>lib64/qt/lib/libpcre2-16.so.0)
- endif()
+ ${PREBUILT_ROOT}/lib/libpcre2-16.so.0>lib64/qt/lib/libpcre2-16.so.0)
endif()
set(QT5_SHARED_PROPERTIES
diff --git a/android/build/cmake/config/emu-vulkan-config.cmake b/android/build/cmake/config/emu-vulkan-config.cmake index b787d1a56b..57d5d8673e 100644 --- a/android/build/cmake/config/emu-vulkan-config.cmake +++ b/android/build/cmake/config/emu-vulkan-config.cmake @@ -30,17 +30,12 @@ if(LINUX_X86_64) set(VULKAN_TEST_DEPENDENCIES # Loader (for testing) "${PREBUILT_ROOT}/libvulkan.so>testlib64/libvulkan.so" - # Mock ICD - "${PREBUILT_ROOT}/icds/libVkICD_mock_icd.so>testlib64/libVkICD_mock_icd.so" - "${PREBUILT_ROOT}/icds/VkICD_mock_icd.json>testlib64/VkICD_mock_icd.json" # Debug / validation layers "${PREBUILT_ROOT}/layers/libVkLayer_api_dump.so>testlib64/layers/libVkLayer_api_dump.so" - "${PREBUILT_ROOT}/layers/libVkLayer_device_simulation.so>testlib64/layers/libVkLayer_device_simulation.so" "${PREBUILT_ROOT}/layers/libVkLayer_khronos_validation.so>testlib64/layers/libVkLayer_khronos_validation.so" "${PREBUILT_ROOT}/layers/libVkLayer_monitor.so>testlib64/layers/libVkLayer_monitor.so" "${PREBUILT_ROOT}/layers/libVkLayer_screenshot.so>testlib64/layers/libVkLayer_screenshot.so" "${PREBUILT_ROOT}/layers/VkLayer_api_dump.json>testlib64/layers/VkLayer_api_dump.json" - "${PREBUILT_ROOT}/layers/VkLayer_device_simulation.json>testlib64/layers/VkLayer_device_simulation.json" "${PREBUILT_ROOT}/layers/VkLayer_khronos_validation.json>testlib64/layers/VkLayer_khronos_validation.json" "${PREBUILT_ROOT}/layers/VkLayer_monitor.json>testlib64/layers/VkLayer_monitor.json" "${PREBUILT_ROOT}/layers/VkLayer_screenshot.json>testlib64/layers/VkLayer_screenshot.json" @@ -62,15 +57,10 @@ elseif(DARWIN_X86_64 OR DARWIN_AARCH64) set(VULKAN_TEST_DEPENDENCIES # Loader (for testing) "${PREBUILT_ROOT}/libvulkan.dylib>testlib64/libvulkan.dylib" - # Mock ICD - "${PREBUILT_ROOT}/icds/libVkICD_mock_icd.dylib>testlib64/libVkICD_mock_icd.dylib" - "${PREBUILT_ROOT}/icds/VkICD_mock_icd.json>testlib64/VkICD_mock_icd.json" # Debug / validation layers "${PREBUILT_ROOT}/layers/libVkLayer_api_dump.dylib>testlib64/layers/libVkLayer_api_dump.dylib" - "${PREBUILT_ROOT}/layers/libVkLayer_device_simulation.dylib>testlib64/layers/libVkLayer_device_simulation.dylib" "${PREBUILT_ROOT}/layers/libVkLayer_khronos_validation.dylib>testlib64/layers/libVkLayer_khronos_validation.dylib" "${PREBUILT_ROOT}/layers/VkLayer_api_dump.json>testlib64/layers/VkLayer_api_dump.json" - "${PREBUILT_ROOT}/layers/VkLayer_device_simulation.json>testlib64/layers/VkLayer_device_simulation.json" "${PREBUILT_ROOT}/layers/VkLayer_khronos_validation.json>testlib64/layers/VkLayer_khronos_validation.json" # shaders ${VULKAN_COMMON_DEPENDENCIES}) @@ -90,14 +80,9 @@ elseif(WINDOWS) set(VULKAN_TEST_DEPENDENCIES # Loader (for testing) "${PREBUILT_ROOT}/vulkan-1.dll>testlib64/vulkan-1.dll" - # Mock ICD - "${PREBUILT_ROOT}/icds/VkICD_mock_icd.dll>testlib64/VkICD_mock_icd.dll" - "${PREBUILT_ROOT}/icds/VkICD_mock_icd.json>testlib64/VkICD_mock_icd.json" # Debug / validation layers "${PREBUILT_ROOT}/layers/VkLayer_api_dump.dll>testlib64/layers/VkLayer_api_dump.dll" "${PREBUILT_ROOT}/layers/VkLayer_api_dump.json>testlib64/layers/VkLayer_api_dump.json" - "${PREBUILT_ROOT}/layers/VkLayer_device_simulation.dll>testlib64/layers/VkLayer_device_simulation.dll" - "${PREBUILT_ROOT}/layers/VkLayer_device_simulation.json>testlib64/layers/VkLayer_device_simulation.json" "${PREBUILT_ROOT}/layers/VkLayer_gfxreconstruct.dll>testlib64/layers/VkLayer_gfxreconstruct.dll" "${PREBUILT_ROOT}/layers/VkLayer_gfxreconstruct.json>testlib64/layers/VkLayer_gfxreconstruct.json" "${PREBUILT_ROOT}/layers/VkLayer_khronos_validation.dll>testlib64/layers/VkLayer_khronos_validation.dll" diff --git a/android/build/cmake/rust/crates/redox_syscall2/Cargo.toml b/android/build/cmake/rust/crates/redox_syscall2/Cargo.toml new file mode 100644 index 0000000000..fae9af5c16 --- /dev/null +++ b/android/build/cmake/rust/crates/redox_syscall2/Cargo.toml @@ -0,0 +1,3 @@ +[package] +name = "redox_syscall" +version = "0.4.1" diff --git a/android/build/cmake/rust/crates/redox_syscall2/src/lib.rs b/android/build/cmake/rust/crates/redox_syscall2/src/lib.rs new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/android/build/cmake/rust/crates/redox_syscall2/src/lib.rs diff --git a/android/build/docker/darwin-aarch64/qt6-linux-aarch64/Dockerfile b/android/build/docker/darwin-aarch64/qt6-linux-aarch64/Dockerfile new file mode 100644 index 0000000000..887483a82c --- /dev/null +++ b/android/build/docker/darwin-aarch64/qt6-linux-aarch64/Dockerfile @@ -0,0 +1,83 @@ +# Copyright (C) 2024 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This docker image is for build Qt 6.5.3 for linux-aarch64 on an arm mac. +# We want to build on arm mac so we can use an arm linux image. +# +# To build the docker image for arm architecture: +# > docker build -t <image_name> . +# > docker run --mount type=bind,source="/Volumes/android/emu-prebuilts",target="/emu" -dt <image_name> +# > docker exec -it <container_id> bash +# $ cd emu && tools/buildSrc/servers/build_tools.py --out_dir /emu/out-prebuilts --dist_dir /emu/dist-prebuilts/12345678 --build-id 12345678 --prebuilts +FROM ubuntu:focal-20200423 + +# tzdata complains when running apt-get install below, so we need to set the timezone. +ENV TZ=America/Los_Angeles +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +RUN apt update +# Install necessary utilities +RUN apt install -y software-properties-common curl git + +# Install python 3.10, ninja +RUN add-apt-repository -y ppa:deadsnakes/ppa +RUN apt install -y python3.10 python3.10-distutils pip ninja-build + +# Install deps for building Qt +RUN apt -y install \ + patchelf \ + libfontconfig1-dev \ + libfreetype6-dev \ + libx11-dev \ + libx11-xcb-dev \ + libxext-dev \ + libxfixes-dev \ + libxi-dev \ + libxrender-dev \ + libxcb-cursor-dev \ + libxcb-glx0-dev \ + libxcb-keysyms1-dev \ + libxcb-image0-dev \ + libxcb-shm0-dev \ + libxcb-icccm4-dev \ + libxcb-sync-dev \ + libxcb-xfixes0-dev \ + libxcb-shape0-dev \ + libxcb-randr0-dev \ + libxcb-render-util0-dev \ + libxcb-util-dev \ + libxcb-xinerama0-dev \ + libxcb-xkb-dev \ + libxkbcommon-dev \ + libxkbcommon-x11-dev \ + libsm-dev \ + libice-dev \ + libdbus-1-dev \ + libxcomposite-dev \ + libxcursor-dev \ + libxrandr-dev \ + libxshmfence-dev \ + libcupsfilters-dev \ + libegl1-mesa-dev \ + libglib2.0-dev \ + libcups2-dev \ + libnss3-dev \ + libxtst-dev \ + libxkbfile-dev \ + libdrm-dev + +# Install cmake >= 3.19; apt version is 3.16 +RUN curl -L https://github.com/Kitware/CMake/releases/download/v3.29.3/cmake-3.29.3-linux-aarch64.tar.gz > /cmake-3.29.3-linux-aarch64.tar.gz +RUN tar -xvf /cmake-3.29.3-linux-aarch64.tar.gz +ENV PATH=/cmake-3.29.3-linux-aarch64/bin:$PATH diff --git a/android/build/python/aemu/prebuilts/qt.py b/android/build/python/aemu/prebuilts/qt.py index 4b098b520f..874a7f77ee 100644 --- a/android/build/python/aemu/prebuilts/qt.py +++ b/android/build/python/aemu/prebuilts/qt.py @@ -32,6 +32,7 @@ import platform AOSP_ROOT = Path(__file__).resolve().parents[7] HOST_OS = platform.system().lower() +HOST_ARCH = platform.machine().lower() QT_VERSION = "6.5.3" QT_SUBMODULES = [ @@ -81,22 +82,25 @@ def checkDependencies(): logging.info(">> Checking Ninja >= 1.7.2") deps_common.checkNinjaVersion(min_vers=(1, 7, 2)) - # Need node.js version 12 or later for QtWebEngine - logging.info(">> Checking for node.js version >= 12") - deps_common.checkNodeJsVersion(min_vers=(12, 0)) - - # QtWebEngine needs python html5lib package - logging.info(">> Checking for python package html5lib") - deps_common.checkPythonPackage("html5lib") - - # QtWebEngine requires GNUWin32 dependencies gperf, bison, flex - # TODO(joshuaduong): Locally I installed bison from https://gnuwin32.sourceforge.net/packages.html, but maybe we use chocolatey on the buildbot. - logging.info(">> Checking for gperf") - deps_common.checkGperfVersion() - logging.info(">> Checking for bison") - deps_common.checkBisonVersion() - logging.info(">> Checking for flex") - deps_common.checkFlexVersion() + if HOST_OS == "linux" and HOST_ARCH == "aarch64": + logging.info("Skipping QtWebEngine dependency check for linux-aarch64") + else: + # Need node.js version 12 or later for QtWebEngine + logging.info(">> Checking for node.js version >= 12") + deps_common.checkNodeJsVersion(min_vers=(12, 0)) + + # QtWebEngine needs python html5lib package + logging.info(">> Checking for python package html5lib") + deps_common.checkPythonPackage("html5lib") + + # QtWebEngine requires GNUWin32 dependencies gperf, bison, flex + # TODO(joshuaduong): Locally I installed bison from https://gnuwin32.sourceforge.net/packages.html, but maybe we use chocolatey on the buildbot. + logging.info(">> Checking for gperf") + deps_common.checkGperfVersion() + logging.info(">> Checking for bison") + deps_common.checkBisonVersion() + logging.info(">> Checking for flex") + deps_common.checkFlexVersion() if HOST_OS == "windows": # - Visual Studio 2019 v16.11+ @@ -109,7 +113,7 @@ def checkDependencies(): elif HOST_OS == "darwin": # MacOS sdk >= 13 deps_mac.checkMacOsSDKVersion(min_vers=(12, 0)) - elif HOST_OS == "linux": + elif HOST_OS == "linux" and HOST_ARCH != "aarch64": pkgconfig_libs = [ ("xrender", [0, 9, 0]), ("xcb-render", [1, 11]), @@ -240,25 +244,29 @@ def configureQtBuild(srcdir, builddir, installdir, qtsubmodules, crosscompile_ta if HOST_OS == "windows": conf_args += ["-platform", "win32-msvc"] elif HOST_OS == "linux": - if crosscompile_target == "linux_aarch64": + if HOST_ARCH == "aarch64" or crosscompile_target == "linux_aarch64": # Cross-compiling requires a host installation of Qt, so we must build Qt for # linux-x86_64 prior to cross-compiling to linux_aarch64. - if not qt_host_path: - logging.fatal(f"No Qt host path was provided for {crosscompile_target} cross-compilation.") - conf_args += ["-platform", "linux-aarch64-gnu-g++", + conf_args += ["-platform", "linux-aarch64-gnu-g++"] + if crosscompile_target: + if not qt_host_path: + logging.fatal(f"No Qt host path was provided for {crosscompile_target} cross-compilation.") + # We have to disable a lot of things for cross-compilation without a full sysroot. + logging.warning("GUI support is not supported in cross-compilation.") + conf_args += [ "-device-option", "CROSS_COMPILE=aarch64-linux-gnu-", "-no-glib", "-qt-host-path", qt_host_path, "-qt-pcre", "-qt-zlib", "-qt-doubleconversion", "-qt-freetype", "-qt-harfbuzz", "-no-feature-gssapi", "-no-feature-brotli", "-no-xcb", "-no-xkbcommon", "-qt-webp", "-no-libudev", "-no-mtdev", "-no-linuxfb"] - os.environ["CC"] = "aarch64-linux-gnu-gcc" - os.environ["CXX"] = "aarch64-linux-gnu-g++" + conf_args += ["--", "-DCMAKE_SYSTEM_NAME=Linux", "-DCMAKE_SYSTEM_PROCESSOR=arm", + f"-DQT_HOST_PATH={qt_host_path}", "-DCMAKE_LINKER_FLAGS=-Wl,--as-needed"] + os.environ["CC"] = "aarch64-linux-gnu-gcc" + os.environ["CXX"] = "aarch64-linux-gnu-g++" extra_cflags = "-march=armv8-a" extra_cxxflags = "-march=armv8-a" os.environ["CFLAGS"] = extra_cflags os.environ["CXXFLAGS"] = extra_cxxflags - conf_args += ["--", "-DCMAKE_SYSTEM_NAME=Linux", "-DCMAKE_SYSTEM_PROCESSOR=arm", - f"-DQT_HOST_PATH={qt_host_path}", "-DCMAKE_LINKER_FLAGS=-Wl,--as-needed"] else: conf_args += ["-linker", "lld", "-platform", "linux-clang-libc++", @@ -281,7 +289,11 @@ def configureQtBuild(srcdir, builddir, installdir, qtsubmodules, crosscompile_ta toolchain_dir = Path(builddir) / "toolchain" os.makedirs(Path(builddir) / "toolchain") - clang_dir = deps_common.getClangDirectory() + if HOST_ARCH == "aarch64": + clang_dir = "/usr" + else: + clang_dir = deps_common.getClangDirectory() + with open(toolchain_dir / "clang", 'x') as f: f.write(f"#!/bin/sh\n{clang_dir}/bin/clang {extra_cflags} $@") os.chmod(toolchain_dir / "clang", 0o777) @@ -298,8 +310,6 @@ def configureQtBuild(srcdir, builddir, installdir, qtsubmodules, crosscompile_ta f.write(f"#!/bin/sh\n{clang_dir}/bin/lld $@") os.chmod(toolchain_dir / "lld", 0o777) - # Add path to libc++.so.1 as some binaries (syncqt) that require it are ran during the - # configure step. os.environ["LD_LIBRARY_PATH"] = str(deps_common.getClangDirectory() / "lib") addToSearchPath(str(toolchain_dir)) @@ -421,15 +431,19 @@ def mac_postInstall(installdir): def linux_postInstall(installdir, target, is_webengine): # Install prebuilt clang's libc++.so.1 and libc++abi.so.1 to lib/ as Qt's compiler # tools (moc, rcc, uic) depends on it. - clang_libs = ["libc++.so.1", "libc++abi.so.1"] - for lib in clang_libs: - src_lib = deps_common.getClangDirectory() / "lib" / lib - dst_lib = f"{installdir}/lib/{lib}" - logging.info(f"Copy {src_lib} ==> {dst_lib}") - shutil.copyfile(src_lib, dst_lib) + if HOST_ARCH == "aarch64": + sysroot_dir = Path("/lib/aarch64-linux-gnu") + else: + clang_libs = ["libc++.so.1", "libc++abi.so.1"] + clang_dir = deps_common.getClangDirectory() + sysroot_dir = Path("/lib/x86_64-linux-gnu") + for lib in clang_libs: + src_lib = clang_dir / "lib" / lib + dst_lib = f"{installdir}/lib/{lib}" + logging.info(f"Copy {src_lib} ==> {dst_lib}") + shutil.copyfile(src_lib, dst_lib) # We also need additional libraries from the sysroot for linux - sysroot_dir = Path("/lib/x86_64-linux-gnu") sysroot_libs = [ "libpcre2-16.so.0", "libfreetype.so.6", @@ -454,13 +468,33 @@ def linux_postInstall(installdir, target, is_webengine): "libfontconfig.so.1"] if target == "linux" and is_webengine: sysroot_libs += ["libjpeg.so.8"] + if target == "linux" and HOST_ARCH == "aarch64": + # Need additional libraries to build emulator + sysroot_libs += [ + "libxcb.so.1", + "libX11.so.6", + "libz.so.1", + "libpng16.so.16", + "libexpat.so.1", + "libuuid.so.1", + "libdbus-1.so.3", + "libsystemd.so.0", + "liblzma.so.5", + "liblz4.so.1", + "libgcrypt.so.20", + "libgpg-error.so.0", + "libbsd.so.0"] for lib in sysroot_libs: src_lib = sysroot_dir / lib dst_lib = f"{installdir}/lib/{lib}" logging.info(f"Copy {src_lib} ==> {dst_lib}") shutil.copyfile(src_lib, dst_lib) + if target == "linux" and HOST_ARCH == "aarch64": + # These symlinks are needed to make emulator build compile + os.symlink("libX11.so.6", f"{installdir}/lib/libX11.so") + os.symlink("libXau.so.6", f"{installdir}/lib/libXau.so") - if target != "linux_aarch64": + if target != "linux_aarch64" and HOST_ARCH != "aarch64": # need libunwind.so.1 for syncqt src_libunwind = AOSP_ROOT / "prebuilts" / "android-emulator-build" / "common" / "libunwind" \ / "linux-x86_64" / "lib" / "libunwind.so" @@ -503,10 +537,14 @@ def buildPrebuilt(args, prebuilts_out_dir): logging.fatal(f"[{vcvarsall}] does not exist") exit(-1) deps_win.inheritSubprocessEnv([vcvarsall, "amd64", ">NUL", "2>&1"]) - # Use cmake from our prebuilts - addToSearchPath(CMAKE_PATH) - # Use ninja from our prebuilts - addToSearchPath(NINJA_PATH) + + if HOST_OS == "linux" and HOST_ARCH == "aarch64": + logging.info("Using system-installed cmake/ninja on linux-aarch64 host") + else: + # Use cmake from our prebuilts + addToSearchPath(CMAKE_PATH) + # Use ninja from our prebuilts + addToSearchPath(NINJA_PATH) logging.info(os.environ) if not checkDependencies(): @@ -549,16 +587,19 @@ def buildPrebuilt(args, prebuilts_out_dir): postInstall(qt_install_dir, args.target, False) shutil.rmtree(qt_build_path) - logging.info("Building Qt6 w/ QtWebEngine") - qt_install_dir = os.path.join(prebuilts_out_dir, "qt") - configureQtBuild(qt_src_path, qt_build_path, qt_install_dir, QT_SUBMODULES) - buildQt(QT_SUBMODULES, qt_build_path) - installQt(QT_SUBMODULES, qt_build_path, qt_install_dir) - postInstall(qt_install_dir, args.target, True) + if HOST_OS == "linux" and HOST_ARCH == "aarch64": + logging.info("Skipping QtWebEngine build on linux-aarch64 machine") + else: + logging.info("Building Qt6 w/ QtWebEngine") + qt_install_dir = os.path.join(prebuilts_out_dir, "qt") + configureQtBuild(qt_src_path, qt_build_path, qt_install_dir, QT_SUBMODULES) + buildQt(QT_SUBMODULES, qt_build_path) + installQt(QT_SUBMODULES, qt_build_path, qt_install_dir) + postInstall(qt_install_dir, args.target, True) # Since linux_aarch64 cross-compilation requires having a host build of Qt, let's just build it # in the linux x86_64 host instead of creating an additional linux_aarch64 build target. - if HOST_OS == "linux": + if HOST_OS == "linux" and HOST_ARCH != "aarch64": logging.info("Cross-compiling Qt 6 (no QtWebEngine) for linux_aarch64") crosscompile_target = "linux_aarch64" qt_install_dir = os.path.join(prebuilts_out_dir, "qt-nowebengine-linux_aarch64") diff --git a/android/third_party/boringssl/CMakeLists.txt b/android/third_party/boringssl/CMakeLists.txt index 5248689c81..060fd92838 100644 --- a/android/third_party/boringssl/CMakeLists.txt +++ b/android/third_party/boringssl/CMakeLists.txt @@ -18,11 +18,10 @@ target_include_directories(ssl PUBLIC ${BORINGSSL_ROOT}/src/include) target_include_directories(ssl PRIVATE ${BORINGSSL_ROOT}/src/ssl) android_target_compile_options(ssl windows PRIVATE "-UNDEBUG") -# Setup the crypto libraries: -# On Windows x86_64 (and x86), BoringSSL uses NASM. On other platforms, -# BoringSSL uses gas-compatible assembly syntax. Within an assembly syntax, the -# files are conditioned by the underlying platfor, so it is not necessary to -# condition on the target beyond this. +# Setup the crypto libraries: On Windows x86_64 (and x86), BoringSSL uses NASM. +# On other platforms, BoringSSL uses gas-compatible assembly syntax. Within an +# assembly syntax, the files are conditioned by the underlying platfor, so it is +# not necessary to condition on the target beyond this. if(WINDOWS_MSVC_X86_64) android_add_library( TARGET crypto @@ -68,9 +67,8 @@ target_link_libraries(ssl PUBLIC crypto) # Tests if((NOT WINDOWS) AND (NOT DARWIN_AARCH64)) - # BUG: 147893224: clang 10 results in a flaky failure in - # ABITest.SanityCheck on Windows - # BUG: 252237763: timeout on Mac M2 + # BUG: 147893224: clang 10 results in a flaky failure in ABITest.SanityCheck + # on Windows BUG: 252237763: timeout on Mac M2 android_add_library( TARGET boringssl_test_support NODISTRIBUTE SRC # cmake-format: sortable ${test_support_sources}) @@ -79,11 +77,17 @@ if((NOT WINDOWS) AND (NOT DARWIN_AARCH64)) ${ssl_test_sources}) target_link_libraries(boringssl_ssl_unittests PRIVATE gmock_main ssl crypto boringssl_test_support) + set_property( + TEST boringssl_ssl_unittests + PROPERTY ENVIRONMENT "BORINGSSL_TEST_DATA_ROOT=${BORINGSSL_ROOT}/src") android_add_test( TARGET boringssl_crypto_unittests SRC # cmake-format: sortable ${crypto_test_sources}) target_link_libraries(boringssl_crypto_unittests PRIVATE gmock_main crypto boringssl_test_support) + set_property( + TEST boringssl_crypto_unittests + PROPERTY ENVIRONMENT "BORINGSSL_TEST_DATA_ROOT=${BORINGSSL_ROOT}/src") android_target_link_libraries(boringssl_test_support windows PRIVATE ws2_32::ws2_32 dbghelp::dbghelp) endif() diff --git a/mac.source.properties b/mac.source.properties index 3f1db07be1..bb4982318f 100644 --- a/mac.source.properties +++ b/mac.source.properties @@ -1,4 +1,4 @@ Pkg.UserSrc=false -Pkg.Revision=35.1.9 +Pkg.Revision=35.1.10 Pkg.Path=emulator Pkg.Desc=Android Emulator diff --git a/source.properties b/source.properties index 3f1db07be1..bb4982318f 100644 --- a/source.properties +++ b/source.properties @@ -1,4 +1,4 @@ Pkg.UserSrc=false -Pkg.Revision=35.1.9 +Pkg.Revision=35.1.10 Pkg.Path=emulator Pkg.Desc=Android Emulator diff --git a/win.source.properties b/win.source.properties index 3f1db07be1..bb4982318f 100644 --- a/win.source.properties +++ b/win.source.properties @@ -1,4 +1,4 @@ Pkg.UserSrc=false -Pkg.Revision=35.1.9 +Pkg.Revision=35.1.10 Pkg.Path=emulator Pkg.Desc=Android Emulator |