o3de / o3de

Open 3D Engine (O3DE) is an Apache 2.0-licensed multi-platform 3D engine that enables developers and content creators to build AAA games, cinema-quality 3D worlds, and high-fidelity simulations without any fees or commercial obligations.

Home Page:https://o3de.org

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Applications Running Natively On Meta Quest Devices Are Deadlocked

galibzon opened this issue · comments

Describe the bug
When my app runs natively on Meta Quest Pro it is deadlocked since initialization.

Assets required
Can be tested with OpenXRTest project found in the o3de-extras/

Steps to reproduce
Compile and deploy OpenXRTest (or any other OpenXR enabled project) to run as APK on a Meta Quest Pro.

Expected behavior
Whatever default level it should open and render fine.

Actual behavior
The application deadlocks. The headset views are black.

Logcat message:

<12:32:08> 
Trace::Assert
 C:/GIT/o3de/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Vulkan.h(102): (544755841392) 'void AZ::Vulkan::AssertSuccess(VkResult)'
Trace::Assert
 C:/GIT/o3de/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Vulkan.h(102): (544755841392) 'void AZ::Vulkan::AssertSuccess(VkResult)'
<12:32:08> 
ASSERT: Vulkan API method failed: Timeout
ASSERT: Vulkan API method failed: Timeout
<12:32:08> 

Vulkan Validation Error:

[Error] (vkDebugMessage) - [ERROR][Validation] Validation Error: [ UNASSIGNED-Threading-MultipleThreads ] Object 0: handle = 0x908683000000001d, type = VK_OBJECT_TYPE_FENCE; | MessageID = 0x141cb623 | THREADING ERROR : vkResetFences(): object of type VkFence is simultaneously used in thread 544755841392 and thread 541604301168

Callstack during deadlock assert:

tgkill 0x0000007f858e0e98
AZ::Debug::Platform::DebugBreak() Trace_UnixLike.cpp:97
AZ::Debug::Trace::Break() Trace.cpp:282
AZ::Debug::Trace::Assert(char const*, int, char const*, char const*, ...) Trace.cpp:399
AZ::Vulkan::AssertSuccess(VkResult) Vulkan.h:102
AZ::Vulkan::BinaryFence::WaitOnCpuInternal() const BinaryFence.cpp:93
AZ::Vulkan::Fence::WaitOnCpuInternal() const Fence.cpp:81
AZ::RHI::Fence::WaitOnCpu() const Fence.cpp:89
AZ::Vulkan::AsyncUploadQueue::QueueUpload(const AZ::RHI::StreamingImageExpandRequestTemplate<…> &, unsigned int) AsyncUploadQueue.cpp:418
AZ::Vulkan::StreamingImagePool::InitImageInternal(const AZ::RHI::StreamingImageInitRequestTemplate<…> &) StreamingImagePool.cpp:165
$_7::operator()() const StreamingImagePool.cpp:100
AZStd::Internal::INVOKE<…>($_7 &) invoke_traits.h:208
AZStd::invoke<…>($_7 &) invoke.h:54
AZStd::Internal::function_util::invoke_void_return_wrapper::call<…>($_7 &) function_template.h:32
AZStd::Internal::function_util::get_invoker::call<…>(AZStd::Internal::function_util::function_buffer &) function_template.h:172
AZStd::function_intermediate::operator()() const function_template.h:604
AZStd::function::operator()() const function_template.h:684
AZ::RHI::ResourcePool::InitResource(AZ::RHI::Resource *, const AZStd::function<…> &) ResourcePool.cpp:186
AZ::RHI::ImagePoolBase::InitImage(AZ::RHI::Image *, const AZ::RHI::ImageDescriptor &, AZStd::function<…>) ImagePoolBase.cpp:20
AZ::RHI::StreamingImagePool::InitImage(const AZ::RHI::StreamingImageInitRequestTemplate<…> &) StreamingImagePool.cpp:95
AZ::RPI::StreamingImage::Init(AZ::RPI::StreamingImageAsset &) StreamingImage.cpp:147
AZ::RPI::StreamingImage::CreateInternal(AZ::RPI::StreamingImageAsset &) StreamingImage.cpp:102
$_4::operator()(AZ::Data::AssetData *) const ImageSystem.cpp:164
AZStd::Internal::INVOKE<…>($_4 &, AZ::Data::AssetData *&&) invoke_traits.h:208
AZStd::invoke<…>($_4 &, AZ::Data::AssetData *&&) invoke.h:54
AZStd::Internal::function_util::invoke_void_return_wrapper::call<…>($_4 &, AZ::Data::AssetData *&&) function_template.h:32
AZStd::Internal::function_util::get_invoker::call<…>(AZStd::Internal::function_util::function_buffer &, AZ::Data::AssetData *&&) function_template.h:172
AZStd::function_intermediate::operator()(AZ::Data::AssetData *&&) const function_template.h:604
AZStd::function::operator()(AZ::Data::AssetData *) const function_template.h:684
AZ::Data::InstanceDatabase::EmplaceInstance(const AZ::Data::InstanceId &, const AZ::Data::Asset<…> &, const AZStd::any *) InstanceDatabase.h:408
AZ::Data::InstanceDatabase::FindOrCreate(const AZ::Data::InstanceId &, const AZ::Data::Asset<…> &, const AZStd::any *) InstanceDatabase.h:332
AZ::RPI::StreamingImage::CreateFromCpuData(const AZ::RPI::StreamingImagePool &, AZ::RHI::ImageDimension, AZ::RHI::Size, AZ::RHI::Format, const void *, unsigned long, AZ::Uuid) StreamingImage.cpp:96
AZ::RPI::ImageSystem::CreateDefaultResources(const AZ::RPI::ImageSystemDescriptor &) ImageSystem.cpp:462
AZ::RPI::ImageSystem::Init(const AZ::RPI::ImageSystemDescriptor &) ImageSystem.cpp:195
AZ::RPI::RPISystem::InitializeSystemAssets() RPISystem.cpp:446
$_0::operator()() const RPISystemComponent.cpp:144
AZStd::Internal::INVOKE<…>($_0 &&) invoke_traits.h:208
AZStd::invoke<…>($_0 &&) invoke.h:54
<lambda>::operator()() BusImpl.h:875
decltype(InvokeTraits::forward<AZ::RPI::RPISystemComponent::Activate()::$_0>(fp)()) AZStd::Internal::INVOKE<void AZ::BusInternal::EBusBroadcastQueue<AZ::EBus<AZ::TickEvents, AZ::TickEvents>, AZ::BusInternal::EBusImplTraits<AZ::TickEvents, AZ::TickEvents>>::QueueFunction<AZ::RPI::RPISystemComponent::Activate()::$_0>(AZ::RPI::RPISystemComponent::Activate()::$_0&&)::'lambda'()&>(AZ::RPI::RPISystemComponent::Activate()::$_0&&) invoke_traits.h:208
AZStd::invoke_result<AZ::RPI::RPISystemComponent::Activate()::$_0>::type AZStd::invoke<void AZ::BusInternal::EBusBroadcastQueue<AZ::EBus<AZ::TickEvents, AZ::TickEvents>, AZ::BusInternal::EBusImplTraits<AZ::TickEvents, AZ::TickEvents>>::QueueFunction<AZ::RPI::RPISystemComponent::Activate()::$_0>(AZ::RPI::RPISystemComponent::Activate()::$_0&&)::'lambda'()&>(AZ::RPI::RPISystemComponent::Activate()::$_0&&) invoke.h:54
void AZStd::Internal::function_util::invoke_void_return_wrapper<void>::call<void AZ::BusInternal::EBusBroadcastQueue<AZ::EBus<AZ::TickEvents, AZ::TickEvents>, AZ::BusInternal::EBusImplTraits<AZ::TickEvents, AZ::TickEvents>>::QueueFunction<AZ::RPI::RPISystemComponent::Activate()::$_0>(AZ::RPI::RPISystemComponent::Activate()::$_0&&)::'lambda'()&>(void AZ::BusInternal::EBusBroadcastQueue<AZ::EBus<AZ::TickEvents, AZ::TickEvents>, AZ::BusInternal::EBusImplTraits<AZ::TickEvents, AZ::TickEvents>>::QueueFunction<AZ::RPI::RPISystemComponent::Activate()::$_0>(AZ::RPI::RPISystemComponent::Activate()::$_0&&)::'lambda'()&) function_template.h:41
void AZStd::Internal::function_util::get_invoker<void (), AZStd::Internal::function_util::function_obj_tag, AZStd::stateless_allocator>::call<void AZ::BusInternal::EBusBroadcastQueue<AZ::EBus<AZ::TickEvents, AZ::TickEvents>, AZ::BusInternal::EBusImplTraits<AZ::TickEvents, AZ::TickEvents>>::QueueFunction<AZ::RPI::RPISystemComponent::Activate()::$_0>(AZ::RPI::RPISystemComponent::Activate()::$_0&&)::'lambda'()>(AZStd::Internal::function_util::function_buffer&) function_template.h:147
AZStd::function_intermediate::operator()() const function_template.h:604
AZStd::function::operator()() const function_template.h:684
AZ::EBusQueuePolicy::Execute() Policies.h:266
AZ::BusInternal::EBusBroadcastQueue::ExecuteQueuedEvents() BusImpl.h:366
O3DELauncher::Run(const O3DELauncher::PlatformMainInfo &) Launcher.cpp:587
android_main(android_app *) Launcher_Android.cpp:421
android_app_entry android_native_app_glue.c:226
__pthread_start(void *) 0x0000007f858f22ac
__start_thread 0x0000007f8589e370

Screenshots/Video
N/A

Found in Branch
commit e7da962 (HEAD -> development, origin/development)
Author: Gene Walters 32776221+AMZN-Gene@users.noreply.github.com
Date: Tue May 7 13:58:15 2024 -0700

Print Warning When Using Legacy Asset IDs (#17863)

Desktop/Device (please complete the following information):

  • Meta Quest Pro

Additional context
Something similar happened recently when Huawei introduced Timeline Semaphores in this PR:
#17569
Which broke Quest devices runtime.
And got fixed with two PRs:

  1. #17766
  2. #17877