From 3866aa33f3fab81a536f56e2f41a40b6bc124e9b Mon Sep 17 00:00:00 2001 From: Aurimas Liutikas Date: Fri, 17 Feb 2023 19:50:50 +0000 Subject: Move goldfish address space logs to verbose type Bug: 269772119 Change-Id: Ief475b5290118d6652301be93278dfb60acfd08b Test: None --- .../include/goldfish_address_space_android.impl | 6 +++--- .../GoldfishAddressSpace/include/goldfish_address_space_host.impl | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/shared/GoldfishAddressSpace/include/goldfish_address_space_android.impl b/shared/GoldfishAddressSpace/include/goldfish_address_space_android.impl index af464441..f0112e63 100644 --- a/shared/GoldfishAddressSpace/include/goldfish_address_space_android.impl +++ b/shared/GoldfishAddressSpace/include/goldfish_address_space_android.impl @@ -180,7 +180,7 @@ GoldfishAddressSpaceBlock &GoldfishAddressSpaceBlock::operator=(const GoldfishAd bool GoldfishAddressSpaceBlock::allocate(GoldfishAddressSpaceBlockProvider *provider, size_t size) { - ALOGD("%s: Ask for block of size 0x%llx\n", __func__, + ALOGV("%s: Ask for block of size 0x%llx\n", __func__, (unsigned long long)size); destroy(); @@ -203,7 +203,7 @@ bool GoldfishAddressSpaceBlock::allocate(GoldfishAddressSpaceBlockProvider *prov m_handle = provider->m_handle; m_is_shared_mapping = false; - ALOGD("%s: ioctl allocate returned offset 0x%llx size 0x%llx\n", __func__, + ALOGV("%s: ioctl allocate returned offset 0x%llx size 0x%llx\n", __func__, (unsigned long long)m_offset, (unsigned long long)m_size); @@ -213,7 +213,7 @@ bool GoldfishAddressSpaceBlock::allocate(GoldfishAddressSpaceBlockProvider *prov bool GoldfishAddressSpaceBlock::claimShared(GoldfishAddressSpaceBlockProvider *provider, uint64_t offset, uint64_t size) { - ALOGD("%s: Ask to claim region [0x%llx 0x%llx]\n", __func__, + ALOGV("%s: Ask to claim region [0x%llx 0x%llx]\n", __func__, (unsigned long long)offset, (unsigned long long)offset + size); diff --git a/shared/GoldfishAddressSpace/include/goldfish_address_space_host.impl b/shared/GoldfishAddressSpace/include/goldfish_address_space_host.impl index d1fa4a34..c7d5c43e 100644 --- a/shared/GoldfishAddressSpace/include/goldfish_address_space_host.impl +++ b/shared/GoldfishAddressSpace/include/goldfish_address_space_host.impl @@ -108,7 +108,7 @@ GoldfishAddressSpaceBlock &GoldfishAddressSpaceBlock::operator=(const GoldfishAd bool GoldfishAddressSpaceBlock::allocate(GoldfishAddressSpaceBlockProvider *provider, size_t size) { - ALOGD("%s: Ask for block of size 0x%llx\n", __func__, + ALOGV("%s: Ask for block of size 0x%llx\n", __func__, (unsigned long long)size); destroy(); -- cgit v1.2.3 From 1d099f9257b1ed4516fe26d237f62dae1b1d397b Mon Sep 17 00:00:00 2001 From: Jason Macnak Date: Fri, 10 Mar 2023 16:12:05 -0800 Subject: Fix switch statement for HDR conversion strat Bug: n/a Test: build Change-Id: I83475c261b2dbcbaaeb9b5fc3aa62996bbc2e422 --- system/hwc3/ComposerClient.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/system/hwc3/ComposerClient.cpp b/system/hwc3/ComposerClient.cpp index ad23406b..2cadedeb 100644 --- a/system/hwc3/ComposerClient.cpp +++ b/system/hwc3/ComposerClient.cpp @@ -604,11 +604,18 @@ ndk::ScopedAStatus ComposerClient::setHdrConversionStrategy( aidl::android::hardware::graphics::common::Hdr* preferredHdrOutputType) { DEBUG_LOG("%s", __FUNCTION__); using HdrConversionStrategyTag = aidl::android::hardware::graphics::common::HdrConversionStrategy::Tag; - switch (conversionStrategy.getTag() == HdrConversionStrategyTag::autoAllowedHdrTypes) { + switch (conversionStrategy.getTag()) { + case HdrConversionStrategyTag::autoAllowedHdrTypes: { auto autoHdrTypes = conversionStrategy.get(); if (autoHdrTypes.size() != 0) { return ToBinderStatus(HWC3::Error::Unsupported); } + break; + } + case HdrConversionStrategyTag::passthrough: + case HdrConversionStrategyTag::forceHdrConversion: { + break; + } } *preferredHdrOutputType = aidl::android::hardware::graphics::common::Hdr::INVALID; return ToBinderStatus(HWC3::Error::None); -- cgit v1.2.3 From 00a5267f46badaec8a88159928de1942716d7cfe Mon Sep 17 00:00:00 2001 From: Jason Macnak Date: Wed, 7 Jun 2023 09:13:51 -0700 Subject: Handle AHB and swapchain info in VkBindImageMemoryInfo ... in order to help handle deferred AHB binding. Bug: b/286234683 Test: cvd start --gpu_mode=gfxstream_guest_angle Test: cvd start --gpu_mode=gfxstream_guest_angle_host_swiftshader Change-Id: I3d5e65be8331980ce544078f81f1937cfbcf520f --- system/vulkan_enc/ResourceTracker.cpp | 136 +++++++++++++++++++++++++--------- system/vulkan_enc/ResourceTracker.h | 8 +- system/vulkan_enc/VkEncoder.cpp | 8 +- system/vulkan_enc/vk_struct_id.h | 2 + 4 files changed, 113 insertions(+), 41 deletions(-) diff --git a/system/vulkan_enc/ResourceTracker.cpp b/system/vulkan_enc/ResourceTracker.cpp index f6dec28f..4a17d1f6 100644 --- a/system/vulkan_enc/ResourceTracker.cpp +++ b/system/vulkan_enc/ResourceTracker.cpp @@ -5184,28 +5184,34 @@ public: void* context, VkResult, VkDevice device, uint32_t bindingCount, const VkBindImageMemoryInfo* pBindInfos) { VkEncoder* enc = (VkEncoder*)context; - // Do not forward calls with invalid handles to host. - if (!pBindInfos || - info_VkDeviceMemory.find(pBindInfos->memory) == - info_VkDeviceMemory.end() || - info_VkImage.find(pBindInfos->image) == info_VkImage.end()) { + + if (bindingCount < 1 || !pBindInfos) { return VK_ERROR_OUT_OF_DEVICE_MEMORY; } + + for (uint32_t i = 0; i < bindingCount; i++) { + const VkBindImageMemoryInfo& bimi = pBindInfos[i]; + + auto imageIt = info_VkImage.find(bimi.image); + if (imageIt == info_VkImage.end()) { + return VK_ERROR_OUT_OF_DEVICE_MEMORY; + } + + if (bimi.memory != VK_NULL_HANDLE) { + auto memoryIt = info_VkDeviceMemory.find(bimi.memory); + if (memoryIt == info_VkDeviceMemory.end()) { + return VK_ERROR_OUT_OF_DEVICE_MEMORY; + } + } + } + return enc->vkBindImageMemory2(device, bindingCount, pBindInfos, true /* do lock */); } VkResult on_vkBindImageMemory2KHR( - void* context, VkResult, + void* context, VkResult result, VkDevice device, uint32_t bindingCount, const VkBindImageMemoryInfo* pBindInfos) { - VkEncoder* enc = (VkEncoder*)context; - // Do not forward calls with invalid handles to host. - if (!pBindInfos || - info_VkDeviceMemory.find(pBindInfos->memory) == - info_VkDeviceMemory.end() || - info_VkImage.find(pBindInfos->image) == info_VkImage.end()) { - return VK_ERROR_OUT_OF_DEVICE_MEMORY; - } - return enc->vkBindImageMemory2KHR(device, bindingCount, pBindInfos, true /* do lock */); + return on_vkBindImageMemory2(context, result, device, bindingCount, pBindInfos); } VkResult on_vkCreateBuffer( @@ -6094,33 +6100,36 @@ public: #ifdef VK_USE_PLATFORM_ANDROID_KHR void unwrap_VkNativeBufferANDROID( - const VkImageCreateInfo* pCreateInfo, - VkImageCreateInfo* local_pCreateInfo) { - - if (!pCreateInfo->pNext) return; + const VkNativeBufferANDROID* inputNativeInfo, + VkNativeBufferANDROID* outputNativeInfo) { - const VkNativeBufferANDROID* nativeInfo = - vk_find_struct(pCreateInfo); - if (!nativeInfo) { + if (!inputNativeInfo || !inputNativeInfo->handle) { return; } - if (!nativeInfo->handle) return; - - VkNativeBufferANDROID* nativeInfoOut = - reinterpret_cast( - const_cast( - local_pCreateInfo->pNext)); - - if (!nativeInfoOut->handle) { + if (!outputNativeInfo || !outputNativeInfo) { ALOGE("FATAL: Local native buffer info not properly allocated!"); abort(); } - *(uint32_t*)(nativeInfoOut->handle) = - ResourceTracker::threadingCallbacks.hostConnectionGetFunc()-> - grallocHelper()->getHostHandle( - (const native_handle_t*)nativeInfo->handle); + auto* gralloc = ResourceTracker::threadingCallbacks.hostConnectionGetFunc()->grallocHelper(); + + *(uint32_t*)(outputNativeInfo->handle) = + gralloc->getHostHandle((const native_handle_t*)inputNativeInfo->handle); + } + + void unwrap_vkCreateImage_pCreateInfo( + const VkImageCreateInfo* pCreateInfo, + VkImageCreateInfo* local_pCreateInfo) { + + const VkNativeBufferANDROID* inputNativeInfo = + vk_find_struct(pCreateInfo); + + VkNativeBufferANDROID* outputNativeInfo = + const_cast( + vk_find_struct(local_pCreateInfo)); + + unwrap_VkNativeBufferANDROID(inputNativeInfo, outputNativeInfo); } void unwrap_vkAcquireImageANDROID_nativeFenceFd(int fd, int*) { @@ -6142,6 +6151,52 @@ public: close(fd); } } + + void unwrap_VkBindImageMemorySwapchainInfoKHR( + const VkBindImageMemorySwapchainInfoKHR* inputBimsi, + VkBindImageMemorySwapchainInfoKHR* outputBimsi) { + if (!inputBimsi || !inputBimsi->swapchain) { + return; + } + + if (!outputBimsi || !outputBimsi->swapchain) { + ALOGE("FATAL: Local VkBindImageMemorySwapchainInfoKHR not properly allocated!"); + abort(); + } + + // Android based swapchains are implemented by the Android framework's + // libvulkan. The only exist within the guest and should not be sent to + // the host. + outputBimsi->swapchain = VK_NULL_HANDLE; + } + + void unwrap_VkBindImageMemory2_pBindInfos( + uint32_t bindInfoCount, + const VkBindImageMemoryInfo* inputBindInfos, + VkBindImageMemoryInfo* outputBindInfos) { + for (uint32_t i = 0; i < bindInfoCount; ++i) { + const VkBindImageMemoryInfo* inputBindInfo = &inputBindInfos[i]; + VkBindImageMemoryInfo* outputBindInfo = &outputBindInfos[i]; + + const VkNativeBufferANDROID* inputNativeInfo = + vk_find_struct(inputBindInfo); + + VkNativeBufferANDROID* outputNativeInfo = + const_cast( + vk_find_struct(outputBindInfo)); + + unwrap_VkNativeBufferANDROID(inputNativeInfo, outputNativeInfo); + + const VkBindImageMemorySwapchainInfoKHR* inputBimsi = + vk_find_struct(inputBindInfo); + + VkBindImageMemorySwapchainInfoKHR* outputBimsi = + const_cast( + vk_find_struct(outputBindInfo)); + + unwrap_VkBindImageMemorySwapchainInfoKHR(inputBimsi, outputBimsi); + } + } #endif // Action of vkMapMemoryIntoAddressSpaceGOOGLE: @@ -7883,11 +7938,11 @@ VkResult ResourceTracker::on_vkImportSemaphoreFdKHR( return mImpl->on_vkImportSemaphoreFdKHR(context, input_result, device, pImportSemaphoreFdInfo); } -void ResourceTracker::unwrap_VkNativeBufferANDROID( +void ResourceTracker::unwrap_vkCreateImage_pCreateInfo( const VkImageCreateInfo* pCreateInfo, VkImageCreateInfo* local_pCreateInfo) { #ifdef VK_USE_PLATFORM_ANDROID_KHR - mImpl->unwrap_VkNativeBufferANDROID(pCreateInfo, local_pCreateInfo); + mImpl->unwrap_vkCreateImage_pCreateInfo(pCreateInfo, local_pCreateInfo); #endif } @@ -7897,6 +7952,15 @@ void ResourceTracker::unwrap_vkAcquireImageANDROID_nativeFenceFd(int fd, int* fd #endif } +void ResourceTracker::unwrap_VkBindImageMemory2_pBindInfos( + uint32_t bindInfoCount, + const VkBindImageMemoryInfo* inputBindInfos, + VkBindImageMemoryInfo* outputBindInfos) { +#ifdef VK_USE_PLATFORM_ANDROID_KHR + mImpl->unwrap_VkBindImageMemory2_pBindInfos(bindInfoCount, inputBindInfos, outputBindInfos); +#endif +} + #ifdef VK_USE_PLATFORM_FUCHSIA VkResult ResourceTracker::on_vkGetMemoryZirconHandleFUCHSIA( void* context, VkResult input_result, diff --git a/system/vulkan_enc/ResourceTracker.h b/system/vulkan_enc/ResourceTracker.h index 1c76aa64..e7af1c20 100644 --- a/system/vulkan_enc/ResourceTracker.h +++ b/system/vulkan_enc/ResourceTracker.h @@ -256,11 +256,17 @@ public: void* context, VkResult input_result, VkQueue queue); - void unwrap_VkNativeBufferANDROID( + void unwrap_vkCreateImage_pCreateInfo( const VkImageCreateInfo* pCreateInfo, VkImageCreateInfo* local_pCreateInfo); + void unwrap_vkAcquireImageANDROID_nativeFenceFd(int fd, int* fd_out); + void unwrap_VkBindImageMemory2_pBindInfos( + uint32_t bindInfoCount, + const VkBindImageMemoryInfo* inputBindInfos, + VkBindImageMemoryInfo* outputBindInfos); + #ifdef VK_USE_PLATFORM_FUCHSIA VkResult on_vkGetMemoryZirconHandleFUCHSIA( void* context, VkResult input_result, diff --git a/system/vulkan_enc/VkEncoder.cpp b/system/vulkan_enc/VkEncoder.cpp index b530af58..045e05c1 100644 --- a/system/vulkan_enc/VkEncoder.cpp +++ b/system/vulkan_enc/VkEncoder.cpp @@ -6613,7 +6613,7 @@ VkResult VkEncoder::vkCreateImage(VkDevice device, const VkImageCreateInfo* pCre deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator)); } - sResourceTracker->unwrap_VkNativeBufferANDROID(pCreateInfo, local_pCreateInfo); + sResourceTracker->unwrap_vkCreateImage_pCreateInfo(pCreateInfo, local_pCreateInfo); local_pAllocator = nullptr; if (local_pCreateInfo) { sResourceTracker->transformImpl_VkImageCreateInfo_tohost(local_pCreateInfo, 1); @@ -16600,8 +16600,6 @@ VkResult VkEncoder::vkBindImageMemory2(VkDevice device, uint32_t bindInfoCount, }) .build(); - ENCODER_DEBUG_LOG("vkBindImageMemory2(device:%p, bindInfoCount:%d, pBindInfos:%p)", device, - bindInfoCount, pBindInfos); (void)doLock; bool queueSubmitWithCommandsEnabled = sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT; @@ -16622,6 +16620,8 @@ VkResult VkEncoder::vkBindImageMemory2(VkDevice device, uint32_t bindInfoCount, (VkBindImageMemoryInfo*)(local_pBindInfos + i)); } } + sResourceTracker->unwrap_VkBindImageMemory2_pBindInfos(bindInfoCount, pBindInfos, + local_pBindInfos); if (local_pBindInfos) { for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) { transform_tohost_VkBindImageMemoryInfo(sResourceTracker, @@ -59158,7 +59158,7 @@ VkResult VkEncoder::vkCreateImageWithRequirementsGOOGLE( deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator, (VkAllocationCallbacks*)(local_pAllocator)); } - sResourceTracker->unwrap_VkNativeBufferANDROID(pCreateInfo, local_pCreateInfo); + sResourceTracker->unwrap_vkCreateImage_pCreateInfo(pCreateInfo, local_pCreateInfo); local_pAllocator = nullptr; if (local_pCreateInfo) { sResourceTracker->transformImpl_VkImageCreateInfo_tohost(local_pCreateInfo, 1); diff --git a/system/vulkan_enc/vk_struct_id.h b/system/vulkan_enc/vk_struct_id.h index 16a0f29e..22f23618 100644 --- a/system/vulkan_enc/vk_struct_id.h +++ b/system/vulkan_enc/vk_struct_id.h @@ -75,6 +75,8 @@ REGISTER_VK_STRUCT_ID(VkPhysicalDeviceProperties2, VK_STRUCTURE_TYPE_PHYSICAL_DE REGISTER_VK_STRUCT_ID(VkPhysicalDeviceDeviceMemoryReportFeaturesEXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT); REGISTER_VK_STRUCT_ID(VkMemoryAllocateFlagsInfo, VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO); REGISTER_VK_STRUCT_ID(VkMemoryOpaqueCaptureAddressAllocateInfo, VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO); +REGISTER_VK_STRUCT_ID(VkBindImageMemoryInfo, VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO); +REGISTER_VK_STRUCT_ID(VkBindImageMemorySwapchainInfoKHR, VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR); #undef REGISTER_VK_STRUCT_ID -- cgit v1.2.3 From bde95200937d8be4f669a89e1b74fda46d151b9e Mon Sep 17 00:00:00 2001 From: ramindani Date: Thu, 8 Jun 2023 16:24:16 -0700 Subject: [Cuttlefish] Upgrade cuttlefish to composer version 3 Adds getDisplayConfigurations API Test: build, device boots, existing vts pass BUG: 284866749 BUG: 287518063 Change-Id: I39e98f558f9f507d6c04a7a5a848836371b5d9a1 --- system/hwc3/Android.mk | 2 +- system/hwc3/ComposerClient.cpp | 9 +++++++++ system/hwc3/ComposerClient.h | 2 ++ system/hwc3/Display.cpp | 24 ++++++++++++++++++++++++ system/hwc3/Display.h | 1 + system/hwc3/hwc3.xml | 2 +- 6 files changed, 38 insertions(+), 2 deletions(-) diff --git a/system/hwc3/Android.mk b/system/hwc3/Android.mk index 65d33102..87349d1b 100644 --- a/system/hwc3/Android.mk +++ b/system/hwc3/Android.mk @@ -30,7 +30,7 @@ LOCAL_VENDOR_MODULE := true LOCAL_SHARED_LIBRARIES := \ android.hardware.graphics.composer@2.1-resources \ android.hardware.graphics.composer@2.2-resources \ - android.hardware.graphics.composer3-V2-ndk \ + android.hardware.graphics.composer3-V3-ndk \ android.hardware.graphics.mapper@2.0 \ android.hardware.graphics.mapper@4.0 \ libbase \ diff --git a/system/hwc3/ComposerClient.cpp b/system/hwc3/ComposerClient.cpp index 2cadedeb..ad2c4963 100644 --- a/system/hwc3/ComposerClient.cpp +++ b/system/hwc3/ComposerClient.cpp @@ -752,6 +752,15 @@ ndk::ScopedAStatus ComposerClient::setRefreshRateChangedCallbackDebugEnabled( return ToBinderStatus(HWC3::Error::Unsupported); } +ndk::ScopedAStatus ComposerClient::getDisplayConfigurations( + int64_t displayId, std::vector* outDisplayConfig) { + DEBUG_LOG("%s", __FUNCTION__); + + GET_DISPLAY_OR_RETURN_ERROR(); + + return ToBinderStatus(display->getDisplayConfigurations(outDisplayConfig)); +} + ndk::SpAIBinder ComposerClient::createBinder() { auto binder = BnComposerClient::createBinder(); AIBinder_setInheritRt(binder.get(), true); diff --git a/system/hwc3/ComposerClient.h b/system/hwc3/ComposerClient.h index 41ca7ba1..a09990a8 100644 --- a/system/hwc3/ComposerClient.h +++ b/system/hwc3/ComposerClient.h @@ -135,6 +135,8 @@ class ComposerClient : public BnComposerClient { int32_t timeoutMs) override; ndk::ScopedAStatus setRefreshRateChangedCallbackDebugEnabled(int64_t displayId, bool enabled) override; + ndk::ScopedAStatus getDisplayConfigurations(int64_t displayId, + std::vector*) override; protected: ndk::SpAIBinder createBinder() override; diff --git a/system/hwc3/Display.cpp b/system/hwc3/Display.cpp index 40f0382c..6f085737 100644 --- a/system/hwc3/Display.cpp +++ b/system/hwc3/Display.cpp @@ -270,6 +270,30 @@ HWC3::Error Display::getDisplayConfigs(std::vector* outConfigIds) { return HWC3::Error::None; } +HWC3::Error Display::getDisplayConfigurations(std::vector* outConfigs) { + DEBUG_LOG("%s: display:%" PRId64, __FUNCTION__, mId); + + std::unique_lock lock(mStateMutex); + + outConfigs->clear(); + outConfigs->reserve(mConfigs.size()); + + for (const auto& [configId, displayConfig] : mConfigs) { + DisplayConfiguration displayConfiguration; + displayConfiguration.configId = configId; + displayConfiguration.width = displayConfig.getWidth(); + displayConfiguration.height = displayConfig.getHeight(); + displayConfiguration.dpi = { static_cast(displayConfig.getDpiX()), + static_cast(displayConfig.getDpiY()) }; + displayConfiguration.vsyncPeriod = displayConfig.getVsyncPeriod(); + displayConfiguration.configGroup = displayConfig.getConfigGroup(); + + outConfigs->emplace_back(displayConfiguration); + } + + return HWC3::Error::None; +} + HWC3::Error Display::getDisplayConnectionType(DisplayConnectionType* outType) { if (IsCuttlefishFoldable() || IsAutoDevice()) { // Android Auto OS needs to set all displays to INTERNAL since they're used diff --git a/system/hwc3/Display.h b/system/hwc3/Display.h index 707bc19e..84b1b42e 100644 --- a/system/hwc3/Display.h +++ b/system/hwc3/Display.h @@ -85,6 +85,7 @@ class Display { HWC3::Error getColorModes(std::vector* outColorModes); HWC3::Error getDisplayCapabilities(std::vector* caps); HWC3::Error getDisplayConfigs(std::vector* configs); + HWC3::Error getDisplayConfigurations(std::vector* outConfigs); HWC3::Error getDisplayConnectionType(DisplayConnectionType* outType); HWC3::Error getDisplayIdentificationData( DisplayIdentification* outIdentification); diff --git a/system/hwc3/hwc3.xml b/system/hwc3/hwc3.xml index 861b4b7f..7f0d8b7a 100644 --- a/system/hwc3/hwc3.xml +++ b/system/hwc3/hwc3.xml @@ -1,7 +1,7 @@ android.hardware.graphics.composer3 - 2 + 3 IComposer default -- cgit v1.2.3 From 7a9760d81d268bb6445b179cc1ba4a6fb3298274 Mon Sep 17 00:00:00 2001 From: ramindani Date: Tue, 18 Jul 2023 20:56:12 -0700 Subject: [Cuttlefish] Update cuttlefish with recent composer HAL changes for VRR Test: build, device boots, existing vts pass BUG: 287517352 Change-Id: Id5bc26dc66a256f27370a88603ed4b79f33e257a --- system/hwc3/ComposerClient.cpp | 15 ++++++++++++++- system/hwc3/ComposerClient.h | 5 ++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/system/hwc3/ComposerClient.cpp b/system/hwc3/ComposerClient.cpp index ad2c4963..0a1a000b 100644 --- a/system/hwc3/ComposerClient.cpp +++ b/system/hwc3/ComposerClient.cpp @@ -753,7 +753,9 @@ ndk::ScopedAStatus ComposerClient::setRefreshRateChangedCallbackDebugEnabled( } ndk::ScopedAStatus ComposerClient::getDisplayConfigurations( - int64_t displayId, std::vector* outDisplayConfig) { + int64_t displayId, + int32_t /*maxFrameIntervalNs*/, + std::vector* outDisplayConfig) { DEBUG_LOG("%s", __FUNCTION__); GET_DISPLAY_OR_RETURN_ERROR(); @@ -761,6 +763,17 @@ ndk::ScopedAStatus ComposerClient::getDisplayConfigurations( return ToBinderStatus(display->getDisplayConfigurations(outDisplayConfig)); } +ndk::ScopedAStatus ComposerClient::notifyExpectedPresent( + int64_t displayId, + const ClockMonotonicTimestamp& /*expectedPresentTime*/, + int32_t /*frameIntervalNs*/) { + DEBUG_LOG("%s", __FUNCTION__); + + GET_DISPLAY_OR_RETURN_ERROR(); + + return ToBinderStatus(HWC3::Error::Unsupported); +} + ndk::SpAIBinder ComposerClient::createBinder() { auto binder = BnComposerClient::createBinder(); AIBinder_setInheritRt(binder.get(), true); diff --git a/system/hwc3/ComposerClient.h b/system/hwc3/ComposerClient.h index a09990a8..dddaadcc 100644 --- a/system/hwc3/ComposerClient.h +++ b/system/hwc3/ComposerClient.h @@ -135,8 +135,11 @@ class ComposerClient : public BnComposerClient { int32_t timeoutMs) override; ndk::ScopedAStatus setRefreshRateChangedCallbackDebugEnabled(int64_t displayId, bool enabled) override; - ndk::ScopedAStatus getDisplayConfigurations(int64_t displayId, + ndk::ScopedAStatus getDisplayConfigurations(int64_t displayId, int32_t maxFrameIntervalNs, std::vector*) override; + ndk::ScopedAStatus notifyExpectedPresent(int64_t displayId, + const ClockMonotonicTimestamp& expectedPresentTime, + int32_t maxFrameIntervalNs) override; protected: ndk::SpAIBinder createBinder() override; -- cgit v1.2.3 From 13c51a46dab007033f566e9f9dbd9264ea1c51fd Mon Sep 17 00:00:00 2001 From: Devin Moore Date: Fri, 25 Aug 2023 21:09:44 +0000 Subject: Switch hwc3 implementaiton to use GraphicBufferMapper mapper4 is replaced by mapper5. Instead of migrating to mapper5, this change migrates to GraphicBufferMapper which is a backwards compatible wrapper around mapper4/mapper5/.... Test: launch_cvd (with and without mapper4 impl installed) Bug: 297378004 Change-Id: Ic199ef1a074ff6e6d2a286db1c4824f513af3cdd --- system/hwc3/Android.mk | 2 - system/hwc3/Gralloc.cpp | 234 +++++++++++------------------------------------- system/hwc3/Gralloc.h | 12 +-- 3 files changed, 53 insertions(+), 195 deletions(-) diff --git a/system/hwc3/Android.mk b/system/hwc3/Android.mk index c64e9766..7648e265 100644 --- a/system/hwc3/Android.mk +++ b/system/hwc3/Android.mk @@ -31,8 +31,6 @@ LOCAL_SHARED_LIBRARIES := \ android.hardware.graphics.composer@2.1-resources \ android.hardware.graphics.composer@2.2-resources \ android.hardware.graphics.composer3-V3-ndk \ - android.hardware.graphics.mapper@2.0 \ - android.hardware.graphics.mapper@4.0 \ libbase \ libbinder_ndk \ libEGL \ diff --git a/system/hwc3/Gralloc.cpp b/system/hwc3/Gralloc.cpp index 9234df4b..e3c5e982 100644 --- a/system/hwc3/Gralloc.cpp +++ b/system/hwc3/Gralloc.cpp @@ -16,160 +16,81 @@ #include "Gralloc.h" +#include #include #include #include #include -#include #include +#include #include #include "Drm.h" +using aidl::android::hardware::graphics::common::BufferUsage; using aidl::android::hardware::graphics::common::PlaneLayout; using aidl::android::hardware::graphics::common::PlaneLayoutComponent; using aidl::android::hardware::graphics::common::PlaneLayoutComponentType; -using android::hardware::hidl_handle; -using android::hardware::hidl_vec; -using android::hardware::graphics::common::V1_2::BufferUsage; -using android::hardware::graphics::mapper::V4_0::Error; -using android::hardware::graphics::mapper::V4_0::IMapper; -using MetadataType = - android::hardware::graphics::mapper::V4_0::IMapper::MetadataType; +using android::OK; +using android::Rect; +using android::status_t; +using android::GraphicBufferMapper; namespace aidl::android::hardware::graphics::composer3::impl { -Gralloc::Gralloc() { - ::android::hardware::preloadPassthroughService(); - - gralloc4_ = IMapper::getService(); - if (gralloc4_ != nullptr) { - ALOGE("%s using Gralloc4.", __FUNCTION__); - return; - } - ALOGE("%s Gralloc4 not available.", __FUNCTION__); - - ALOGE("%s No Grallocs available!", __FUNCTION__); -} - -Error Gralloc::GetMetadata(buffer_handle_t buffer, MetadataType type, - hidl_vec* metadata) { - if (gralloc4_ == nullptr) { - ALOGE("%s Gralloc4 not available.", __FUNCTION__); - return Error::NO_RESOURCES; - } - - if (metadata == nullptr) { - return Error::BAD_VALUE; - } - - Error error = Error::NONE; - - auto native_handle = const_cast(buffer); - - auto ret = - gralloc4_->get(native_handle, type, - [&](const auto& get_error, const auto& get_metadata) { - error = get_error; - *metadata = get_metadata; - }); - - if (!ret.isOk()) { - error = Error::NO_RESOURCES; - } - - if (error != Error::NONE) { - ALOGE("%s failed to get metadata %s", __FUNCTION__, type.name.c_str()); - } - return error; -} - std::optional Gralloc::GetWidth(buffer_handle_t buffer) { - if (gralloc4_ == nullptr) { - ALOGE("%s Gralloc4 not available.", __FUNCTION__); + uint64_t width = 0; + status_t status = GraphicBufferMapper::get().getWidth(buffer, &width); + if (status != OK) { return std::nullopt; } - hidl_vec encoded_width; - - Error error = GetMetadata(buffer, ::android::gralloc4::MetadataType_Width, - &encoded_width); - if (error != Error::NONE) { + if (width > std::numeric_limits::max()) { + ALOGE("%s Width too large to cast to uint32_t: %ld", __FUNCTION__, width); return std::nullopt; } - - uint64_t width = 0; - ::android::gralloc4::decodeWidth(encoded_width, &width); return static_cast(width); } std::optional Gralloc::GetHeight(buffer_handle_t buffer) { - if (gralloc4_ == nullptr) { - ALOGE("%s Gralloc4 not available.", __FUNCTION__); + uint64_t height = 0; + status_t status = GraphicBufferMapper::get().getHeight(buffer, &height); + if (status != OK) { return std::nullopt; } - hidl_vec encoded_height; - - Error error = GetMetadata(buffer, ::android::gralloc4::MetadataType_Height, - &encoded_height); - if (error != Error::NONE) { + if (height > std::numeric_limits::max()) { + ALOGE("%s Height too large to cast to uint32_t: %ld", __FUNCTION__, height); return std::nullopt; } - - uint64_t height = 0; - ::android::gralloc4::decodeHeight(encoded_height, &height); return static_cast(height); } std::optional Gralloc::GetDrmFormat(buffer_handle_t buffer) { - if (gralloc4_ == nullptr) { - ALOGE("%s Gralloc4 not available.", __FUNCTION__); - return std::nullopt; - } - - hidl_vec encoded_format; - - Error error = - GetMetadata(buffer, ::android::gralloc4::MetadataType_PixelFormatFourCC, - &encoded_format); - if (error != Error::NONE) { + uint32_t format = 0; + status_t status = GraphicBufferMapper::get().getPixelFormatFourCC(buffer, &format); + if (status != OK) { return std::nullopt; } - uint32_t format = 0; - ::android::gralloc4::decodePixelFormatFourCC(encoded_format, &format); - return static_cast(format); + return format; } std::optional> Gralloc::GetPlaneLayouts( buffer_handle_t buffer) { - if (gralloc4_ == nullptr) { - ALOGE("%s Gralloc4 not available.", __FUNCTION__); + std::vector layouts; + status_t status = GraphicBufferMapper::get().getPlaneLayouts( + buffer, &layouts); + if (status != OK) { return std::nullopt; } - hidl_vec encoded_layouts; - - Error error = GetMetadata( - buffer, ::android::gralloc4::MetadataType_PlaneLayouts, &encoded_layouts); - if (error != Error::NONE) { - return std::nullopt; - } - - std::vector plane_layouts; - ::android::gralloc4::decodePlaneLayouts(encoded_layouts, &plane_layouts); - return plane_layouts; + return layouts; } std::optional Gralloc::GetMonoPlanarStrideBytes( buffer_handle_t buffer) { - if (gralloc4_ == nullptr) { - ALOGE("%s Gralloc4 not available.", __FUNCTION__); - return std::nullopt; - } - auto plane_layouts_opt = GetPlaneLayouts(buffer); if (!plane_layouts_opt) { return std::nullopt; @@ -180,57 +101,37 @@ std::optional Gralloc::GetMonoPlanarStrideBytes( return std::nullopt; } + if (plane_layouts[0].strideInBytes > std::numeric_limits::max()) { + ALOGE("%s strideInBytes too large to cast to uint32_t: %ld", __FUNCTION__, plane_layouts[0].strideInBytes); + return std::nullopt; + } return static_cast(plane_layouts[0].strideInBytes); } std::optional Gralloc::Import(buffer_handle_t buffer) { - if (gralloc4_ == nullptr) { - ALOGE("%s Gralloc4 not available.", __FUNCTION__); - return std::nullopt; - } - buffer_handle_t imported_buffer; - Error error; - auto ret = - gralloc4_->importBuffer(buffer, [&](const auto& err, const auto& buf) { - error = err; - if (err == Error::NONE) { - imported_buffer = static_cast(buf); - } - }); - - if (!ret.isOk() || error != Error::NONE) { - ALOGE("%s failed to import buffer", __FUNCTION__); + status_t status = + GraphicBufferMapper::get().importBufferNoValidate(buffer, &imported_buffer); + + if (status != OK) { + ALOGE("%s failed to import buffer: %d", __FUNCTION__, status); return std::nullopt; } return GrallocBuffer(this, imported_buffer); } void Gralloc::Release(buffer_handle_t buffer) { - if (gralloc4_ == nullptr) { - ALOGE("%s Gralloc4 not available.", __FUNCTION__); - return; - } - - auto native_buffer = const_cast(buffer); - auto ret = gralloc4_->freeBuffer(native_buffer); + status_t status = GraphicBufferMapper::get().freeBuffer(buffer); - if (!ret.isOk()) { - ALOGE("%s failed to release buffer", __FUNCTION__); + if (status != OK) { + ALOGE("%s failed to release buffer: %d", __FUNCTION__, status); } } std::optional Gralloc::Lock(buffer_handle_t buffer) { - if (gralloc4_ == nullptr) { - ALOGE("%s Gralloc4 not available.", __FUNCTION__); - return std::nullopt; - } - - auto native_buffer = const_cast(buffer); - - const auto buffer_usage = static_cast(BufferUsage::CPU_READ_OFTEN | - BufferUsage::CPU_WRITE_OFTEN); + const auto buffer_usage = static_cast(BufferUsage::CPU_READ_OFTEN) | + static_cast(BufferUsage::CPU_WRITE_OFTEN); auto width_opt = GetWidth(buffer); if (!width_opt) { @@ -242,33 +143,21 @@ std::optional Gralloc::Lock(buffer_handle_t buffer) { return std::nullopt; } - IMapper::Rect buffer_region; + Rect buffer_region; buffer_region.left = 0; buffer_region.top = 0; - buffer_region.width = *width_opt; - buffer_region.height = *height_opt; + // width = right - left + buffer_region.right = *width_opt; + // height = bottom - top + buffer_region.bottom = *height_opt; - // Empty fence, lock immedietly. - hidl_handle fence; - - Error error = Error::NONE; void* data = nullptr; - auto ret = - gralloc4_->lock(native_buffer, buffer_usage, buffer_region, fence, - [&](const auto& lock_error, const auto& lock_data) { - error = lock_error; - if (lock_error == Error::NONE) { - data = lock_data; - } - }); - - if (!ret.isOk()) { - error = Error::NO_RESOURCES; - } + status_t status = + GraphicBufferMapper::get().lock(buffer, buffer_usage, buffer_region, &data); - if (error != Error::NONE) { - ALOGE("%s failed to lock buffer", __FUNCTION__); + if (status != OK) { + ALOGE("%s failed to lock buffer: %d", __FUNCTION__, status); return std::nullopt; } @@ -276,11 +165,6 @@ std::optional Gralloc::Lock(buffer_handle_t buffer) { } std::optional Gralloc::LockYCbCr(buffer_handle_t buffer) { - if (gralloc4_ == nullptr) { - ALOGE("%s Gralloc4 not available.", __FUNCTION__); - return std::nullopt; - } - auto format_opt = GetDrmFormat(buffer); if (!format_opt) { ALOGE("%s failed to check format of buffer", __FUNCTION__); @@ -350,24 +234,10 @@ std::optional Gralloc::LockYCbCr(buffer_handle_t buffer) { } void Gralloc::Unlock(buffer_handle_t buffer) { - if (gralloc4_ == nullptr) { - ALOGE("%s Gralloc4 not available.", __FUNCTION__); - return; - } - - auto native_handle = const_cast(buffer); - - Error error = Error::NONE; - auto ret = gralloc4_->unlock( - native_handle, - [&](const auto& unlock_error, const auto&) { error = unlock_error; }); - - if (!ret.isOk()) { - error = Error::NO_RESOURCES; - } + status_t status = GraphicBufferMapper::get().unlock(buffer); - if (error != Error::NONE) { - ALOGE("%s failed to unlock buffer", __FUNCTION__); + if (status != OK) { + ALOGE("%s failed to unlock buffer %d", __FUNCTION__, status); } } diff --git a/system/hwc3/Gralloc.h b/system/hwc3/Gralloc.h index f259f296..b3c6c6c9 100644 --- a/system/hwc3/Gralloc.h +++ b/system/hwc3/Gralloc.h @@ -18,7 +18,6 @@ #define ANDROID_HWC_GRALLOC_H #include -#include #include #include #include @@ -103,7 +102,6 @@ class GrallocBuffer { class Gralloc { public: - Gralloc(); virtual ~Gralloc() = default; // Imports the given buffer handle into the current process and returns an @@ -145,16 +143,8 @@ class Gralloc { // Returns the stride of the buffer if it is a single plane buffer or fails // and returns nullopt if the buffer is for a multi plane buffer. std::optional GetMonoPlanarStrideBytes(buffer_handle_t); - - // See GrallocBuffer::GetMetadata. - ::android::hardware::graphics::mapper::V4_0::Error GetMetadata( - buffer_handle_t buffer, - ::android::hardware::graphics::mapper::V4_0::IMapper::MetadataType type, - ::android::hardware::hidl_vec* metadata); - - ::android::sp<::android::hardware::graphics::mapper::V4_0::IMapper> gralloc4_; }; } // namespace aidl::android::hardware::graphics::composer3::impl -#endif \ No newline at end of file +#endif -- cgit v1.2.3 From caeb5cc3330ce1b456aee0fd2b05151fb0f95886 Mon Sep 17 00:00:00 2001 From: Bo Hu Date: Thu, 14 Sep 2023 10:46:34 -0700 Subject: update android.hardware.media.c2-default-seccomp_policy This is the new file name to be used. Bug: 300171107 Change-Id: Ic56dd6ed0e9fc7d20ecfb9a908e425f5a13c0f45 --- system/codecs/c2/service/service.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/codecs/c2/service/service.cpp b/system/codecs/c2/service/service.cpp index 0e97dd2b..1a0f8eb4 100644 --- a/system/codecs/c2/service/service.cpp +++ b/system/codecs/c2/service/service.cpp @@ -16,7 +16,7 @@ // Default policy for codec2.0 service. static constexpr char kBaseSeccompPolicyPath[] = "/vendor/etc/seccomp_policy/" - "android.hardware.media.c2@1.2-default-seccomp_policy"; + "android.hardware.media.c2-default-seccomp_policy"; // Additional device-specific seccomp permissions can be added in this file. static constexpr char kExtSeccompPolicyPath[] = -- cgit v1.2.3 From 400649a951a055b37e8f335e4f7afa4ccb23f360 Mon Sep 17 00:00:00 2001 From: Sally Qi Date: Thu, 21 Sep 2023 12:45:04 -0700 Subject: Disable overlaysupport on cuttlefish. - return nosupported instead. Bug: 267234573 Test: GraphicsComposerAidlV2Test Change-Id: Ib8784db9d63613dfc3f687b732e4d1399950b814 --- system/hwc3/ComposerClient.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/system/hwc3/ComposerClient.cpp b/system/hwc3/ComposerClient.cpp index 0a1a000b..03e6be81 100644 --- a/system/hwc3/ComposerClient.cpp +++ b/system/hwc3/ComposerClient.cpp @@ -422,13 +422,10 @@ ndk::ScopedAStatus ComposerClient::getHdrCapabilities( } ndk::ScopedAStatus ComposerClient::getOverlaySupport( - OverlayProperties* properties) { + OverlayProperties* /*properties*/) { DEBUG_LOG("%s", __FUNCTION__); - // no supported combinations - properties->combinations.clear(); - - return ToBinderStatus(HWC3::Error::None); + return ToBinderStatus(HWC3::Error::Unsupported); } ndk::ScopedAStatus ComposerClient::getMaxVirtualDisplayCount( @@ -1452,4 +1449,4 @@ HWC3::Error ComposerClient::handleHotplug(bool connected, uint32_t id, return HWC3::Error::None; } -} // namespace aidl::android::hardware::graphics::composer3::impl \ No newline at end of file +} // namespace aidl::android::hardware::graphics::composer3::impl -- cgit v1.2.3 From a8496131d7f150239ac053793b79463a4638cca3 Mon Sep 17 00:00:00 2001 From: Yahan Zhou Date: Mon, 16 Oct 2023 10:19:59 -0700 Subject: Fix dEQP-VK.wsi.android.maintenance1 - There is a bug in the wait implementation. - We should not send VK_IMAGE_LAYOUT_MAX_ENUM to host. Bug: 300276632 Test: dEQP-VK.wsi.android.maintenance1.* Change-Id: I65a4577f82874f7a09cdb8ba454dbb0dc9b41272 Merged-In: If0c1896c6acef97db9ec3ae3abfe88eea333b42f --- android-emu/aemu/base/threads/AndroidWorkPool.cpp | 2 +- system/vulkan_enc/ResourceTracker.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/android-emu/aemu/base/threads/AndroidWorkPool.cpp b/android-emu/aemu/base/threads/AndroidWorkPool.cpp index b5baa418..f4e9cdea 100644 --- a/android-emu/aemu/base/threads/AndroidWorkPool.cpp +++ b/android-emu/aemu/base/threads/AndroidWorkPool.cpp @@ -131,7 +131,7 @@ private: while (conditionFunc()) { doWait(currTimeout); - if (!conditionFunc()) { + if (conditionFunc()) { // Decrement timeout for wakeups uint64_t nextTime = currTimeUs(); WorkPool::TimeoutUs waited = diff --git a/system/vulkan_enc/ResourceTracker.cpp b/system/vulkan_enc/ResourceTracker.cpp index 014ecaaa..843dc04f 100644 --- a/system/vulkan_enc/ResourceTracker.cpp +++ b/system/vulkan_enc/ResourceTracker.cpp @@ -1677,7 +1677,7 @@ public: .usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, - .initialLayout = VK_IMAGE_LAYOUT_MAX_ENUM, + .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, }; VkImage image = VK_NULL_HANDLE; VkResult res = enc->vkCreateImage(device, &createInfo, nullptr, &image, true /* do lock */); -- cgit v1.2.3 From 8d5f887abab10432a40f0c1af6c912198cb10d18 Mon Sep 17 00:00:00 2001 From: Yahan Zhou Date: Mon, 23 Oct 2023 14:32:24 -0700 Subject: VkImageCreateInfo should ignore queeu family indices in some situation The spec says indices pointer should be ignored when sharingMode is not VK_SHARING_MODE_CONCURRENT. We need to explicitly set index count to 0 and index pointer to null, otherwise encoder will still try to encode it. Spec: https://registry.khronos.org/vulkan/specs/1.3/html/vkspec.html#VUID-VkBufferCreateInfo-sharingMode-00913 Bug: 307378870 Test: dEQP-VK.wsi.android.swapchain.create.exclusive_nonzero_queues Change-Id: Ib131b075e277fb1cf71ba1e4c01a6adcc1a82d63 Merged-In: If0c1896c6acef97db9ec3ae3abfe88eea333b42f --- system/vulkan_enc/ResourceTracker.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/system/vulkan_enc/ResourceTracker.cpp b/system/vulkan_enc/ResourceTracker.cpp index 843dc04f..d5ae1d38 100644 --- a/system/vulkan_enc/ResourceTracker.cpp +++ b/system/vulkan_enc/ResourceTracker.cpp @@ -4109,6 +4109,11 @@ public: VkEncoder* enc = (VkEncoder*)context; VkImageCreateInfo localCreateInfo = vk_make_orphan_copy(*pCreateInfo); + if (localCreateInfo.sharingMode != VK_SHARING_MODE_CONCURRENT) { + localCreateInfo.queueFamilyIndexCount = 0; + localCreateInfo.pQueueFamilyIndices = nullptr; + } + vk_struct_chain_iterator structChainIter = vk_make_chain_iterator(&localCreateInfo); VkExternalMemoryImageCreateInfo localExtImgCi; -- cgit v1.2.3 From 6d62e1e7a2e27058dadc417e5befc11497073ae0 Mon Sep 17 00:00:00 2001 From: Jooyung Han Date: Fri, 10 Nov 2023 12:43:56 +0900 Subject: hwcomposer3 in Android.bp Bug: 205619241 Test: build CF; launch; hwcomposer runs ok Change-Id: Idb6005af8e4704a3859048ae952707216377840d --- Android.mk | 1 - system/hwc3/Android.bp | 95 +++++++++++++++++++++++++++++++++++++++++++ system/hwc3/Android.mk | 108 ------------------------------------------------- 3 files changed, 95 insertions(+), 109 deletions(-) create mode 100644 system/hwc3/Android.bp delete mode 100644 system/hwc3/Android.mk diff --git a/Android.mk b/Android.mk index b8a3d24a..6ab1d7d6 100644 --- a/Android.mk +++ b/Android.mk @@ -144,7 +144,6 @@ include $(GOLDFISH_OPENGL_PATH)/system/hals/Android.mk endif ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 28 -o $(IS_AT_LEAST_QPR1) = true && echo isApi29OrHigher),isApi29OrHigher) - include $(GOLDFISH_OPENGL_PATH)/system/hwc3/Android.mk # hardware codecs enabled after P include $(GOLDFISH_OPENGL_PATH)/system/codecs/omx/common/Android.mk include $(GOLDFISH_OPENGL_PATH)/system/codecs/omx/plugin/Android.mk diff --git a/system/hwc3/Android.bp b/system/hwc3/Android.bp new file mode 100644 index 00000000..54441aa7 --- /dev/null +++ b/system/hwc3/Android.bp @@ -0,0 +1,95 @@ +// +// Copyright 2022 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. +// + +package { + // See: http://go/android-license-faq + default_applicable_licenses: [ + "device_generic_goldfish-opengl_license", + ], +} + +cc_binary { + + name: "android.hardware.graphics.composer3-service.ranchu", + + relative_install_path: "hw", + vendor: true, + + shared_libs: [ + "android.hardware.graphics.composer@2.1-resources", + "android.hardware.graphics.composer@2.2-resources", + "android.hardware.graphics.composer3-V3-ndk", + "libbase", + "libbinder_ndk", + "libcutils", + "libcuttlefish_device_config", + "libcuttlefish_device_config_proto", + "libdrm", + "libgralloctypes", + "libhidlbase", + "libjsoncpp", + "liblog", + "libsync", + "libui", + "libutils", + "libOpenglSystemCommon", + "libui", + ], + + static_libs: [ + "libaidlcommonsupport", + "libyuv_static", + ], + + header_libs: [ + "libminigbm_gralloc_headers", + ], + + srcs: [ + "ClientFrameComposer.cpp", + "Common.cpp", + "Composer.cpp", + "ComposerClient.cpp", + "ComposerResources.cpp", + "Device.cpp", + "Display.cpp", + "DisplayConfig.cpp", + "DisplayFinder.cpp", + "Drm.cpp", + "DrmSwapchain.cpp", + "DrmAtomicRequest.cpp", + "DrmBuffer.cpp", + "DrmClient.cpp", + "DrmConnector.cpp", + "DrmCrtc.cpp", + "DrmDisplay.cpp", + "DrmEventListener.cpp", + "DrmMode.cpp", + "DrmPlane.cpp", + "Gralloc.cpp", + "GuestFrameComposer.cpp", + "HostFrameComposer.cpp", + "HostUtils.cpp", + "Layer.cpp", + "Main.cpp", + "NoOpFrameComposer.cpp", + "VsyncThread.cpp", + ], + + vintf_fragments: ["hwc3.xml"], + init_rc: ["hwc3.rc"], + +} diff --git a/system/hwc3/Android.mk b/system/hwc3/Android.mk deleted file mode 100644 index 72d32f29..00000000 --- a/system/hwc3/Android.mk +++ /dev/null @@ -1,108 +0,0 @@ -# -# Copyright 2022 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. -# - -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE := android.hardware.graphics.composer3-service.ranchu - -LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0 -LOCAL_LICENSE_CONDITIONS := notice -LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../../LICENSE - -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_RELATIVE_PATH := hw -LOCAL_VENDOR_MODULE := true - -LOCAL_SHARED_LIBRARIES := \ - android.hardware.graphics.composer@2.1-resources \ - android.hardware.graphics.composer@2.2-resources \ - android.hardware.graphics.composer3-V3-ndk \ - libbase \ - libbinder_ndk \ - libEGL \ - libcutils \ - libcuttlefish_device_config \ - libcuttlefish_device_config_proto \ - libcuttlefish_utils \ - libcuttlefish_fs \ - libdrm \ - libgralloctypes \ - libhardware \ - libhidlbase \ - libjsoncpp \ - libjpeg \ - liblog \ - libsync \ - libui \ - libutils \ - libutils \ - libOpenglSystemCommon \ - lib_renderControl_enc \ - libui - -LOCAL_STATIC_LIBRARIES := \ - libaidlcommonsupport \ - libyuv_static - -LOCAL_C_INCLUDES := \ - external/libdrm \ - external/minigbm/cros_gralloc \ - hardware/google/gfxstream/guest/android-emu \ - hardware/google/gfxstream/guest/include \ - hardware/google/gfxstream/guest/iostream/include/libOpenglRender \ - hardware/google/gfxstream/guest/OpenglCodecCommon \ - hardware/google/gfxstream/guest/OpenglSystemCommon \ - hardware/google/gfxstream/guest/platform/include \ - hardware/google/gfxstream/guest/renderControl_enc \ - system/core/libsync \ - system/core/libsync/include \ - -LOCAL_SRC_FILES := \ - ClientFrameComposer.cpp \ - Common.cpp \ - Composer.cpp \ - ComposerClient.cpp \ - ComposerResources.cpp \ - Device.cpp \ - Display.cpp \ - DisplayConfig.cpp \ - DisplayFinder.cpp \ - Drm.cpp \ - DrmSwapchain.cpp \ - DrmAtomicRequest.cpp \ - DrmBuffer.cpp \ - DrmClient.cpp \ - DrmConnector.cpp \ - DrmCrtc.cpp \ - DrmDisplay.cpp \ - DrmEventListener.cpp \ - DrmMode.cpp \ - DrmPlane.cpp \ - Gralloc.cpp \ - GuestFrameComposer.cpp \ - HostFrameComposer.cpp \ - HostUtils.cpp \ - Layer.cpp \ - Main.cpp \ - NoOpFrameComposer.cpp \ - VsyncThread.cpp \ - -LOCAL_VINTF_FRAGMENTS := hwc3.xml -LOCAL_INIT_RC := hwc3.rc - -include $(BUILD_EXECUTABLE) - -- cgit v1.2.3 From 2859e0d41d8c7751150b7e5625d753ace16758d7 Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Thu, 16 Nov 2023 07:56:49 -0800 Subject: gralloc: Update namespace in libandroidemu to gfxstream::guest Bug: 300132337 Test: m gralloc.goldfish Change-Id: I32639e6a88c5c83fa08949500ede3388efa319de --- system/gralloc/gralloc_old.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/gralloc/gralloc_old.cpp b/system/gralloc/gralloc_old.cpp index 080b34c9..4332dc29 100644 --- a/system/gralloc/gralloc_old.cpp +++ b/system/gralloc/gralloc_old.cpp @@ -79,7 +79,7 @@ static const bool isHidlGralloc = true; static const bool isHidlGralloc = false; #endif -using android::base::guest::getCurrentThreadId; +using gfxstream::guest::getCurrentThreadId; const uint32_t CB_HANDLE_MAGIC_OLD = CB_HANDLE_MAGIC_BASE | 0x1; const int kBufferFdIndex = 0; -- cgit v1.2.3 From ce9ab5683ba45290034170a42c9a654f329744bb Mon Sep 17 00:00:00 2001 From: Jason Macnak Date: Wed, 29 Nov 2023 13:37:45 -0800 Subject: Pass local CommandResultWriter to execute*() functions ... instead of relying on it being stored in ComposerClient as there will be multiple parallel command executions soon. Bug: b/248355957 Test: vts -m VtsHalGraphicsComposer3_TargetTest Change-Id: I3b65e30031a0c7fd07b27e151c751e3198e0aa5c --- system/hwc3/ComposerClient.cpp | 304 +++++++++++++++++++++-------------------- system/hwc3/ComposerClient.h | 95 ++++++------- 2 files changed, 203 insertions(+), 196 deletions(-) diff --git a/system/hwc3/ComposerClient.cpp b/system/hwc3/ComposerClient.cpp index 03e6be81..8edc1618 100644 --- a/system/hwc3/ComposerClient.cpp +++ b/system/hwc3/ComposerClient.cpp @@ -238,16 +238,12 @@ ndk::ScopedAStatus ComposerClient::executeCommands( std::unique_lock lock(mStateMutex); - mCommandResults = - std::make_unique(commandResultPayloads); - + CommandResultWriter commandResults(commandResultPayloads); for (const DisplayCommand& command : commands) { - executeDisplayCommand(command); - mCommandResults->nextCommand(); + executeDisplayCommand(commandResults, command); + commandResults.nextCommand(); } - mCommandResults.reset(); - return ToBinderStatus(HWC3::Error::None); } @@ -779,34 +775,34 @@ ndk::SpAIBinder ComposerClient::createBinder() { namespace { -#define DISPATCH_LAYER_COMMAND(layerCmd, display, layer, field, funcName) \ - do { \ - if (layerCmd.field) { \ - ComposerClient::executeLayerCommandSetLayer##funcName(display, layer, \ - *layerCmd.field); \ - } \ +#define DISPATCH_LAYER_COMMAND(layerCmd, commandResults, display, layer, field, funcName) \ + do { \ + if (layerCmd.field) { \ + ComposerClient::executeLayerCommandSetLayer##funcName(commandResults, display, layer, \ + *layerCmd.field); \ + } \ } while (0) -#define DISPATCH_DISPLAY_COMMAND(displayCmd, display, field, funcName) \ - do { \ - if (displayCmd.field) { \ - executeDisplayCommand##funcName(display, *displayCmd.field); \ - } \ +#define DISPATCH_DISPLAY_COMMAND(displayCmd, commandResults, display, field, funcName) \ + do { \ + if (displayCmd.field) { \ + executeDisplayCommand##funcName(commandResults, display, *displayCmd.field); \ + } \ } while (0) -#define DISPATCH_DISPLAY_BOOL_COMMAND(displayCmd, display, field, funcName) \ - do { \ - if (displayCmd.field) { \ - executeDisplayCommand##funcName(display); \ - } \ +#define DISPATCH_DISPLAY_BOOL_COMMAND(displayCmd, commandResults, display, field, funcName) \ + do { \ + if (displayCmd.field) { \ + executeDisplayCommand##funcName(commandResults, display); \ + } \ } while (0) -#define DISPATCH_DISPLAY_BOOL_COMMAND_AND_DATA(displayCmd, display, field, \ - data, funcName) \ - do { \ - if (displayCmd.field) { \ - executeDisplayCommand##funcName(display, displayCmd.data); \ - } \ +#define DISPATCH_DISPLAY_BOOL_COMMAND_AND_DATA(displayCmd, commandResults, display, field, data, \ + funcName) \ + do { \ + if (displayCmd.field) { \ + executeDisplayCommand##funcName(commandResults, display, displayCmd.data); \ + } \ } while (0) #define LOG_DISPLAY_COMMAND_ERROR(display, error) \ @@ -826,97 +822,96 @@ namespace { } // namespace -void ComposerClient::executeDisplayCommand( - const DisplayCommand& displayCommand) { +void ComposerClient::executeDisplayCommand(CommandResultWriter& commandResults, + const DisplayCommand& displayCommand) { Display* display = getDisplay(displayCommand.display); if (display == nullptr) { - mCommandResults->addError(HWC3::Error::BadDisplay); + commandResults.addError(HWC3::Error::BadDisplay); return; } for (const LayerCommand& layerCmd : displayCommand.layers) { - executeLayerCommand(display, layerCmd); + executeLayerCommand(commandResults, display, layerCmd); } - DISPATCH_DISPLAY_COMMAND(displayCommand, display, colorTransformMatrix, + DISPATCH_DISPLAY_COMMAND(displayCommand, commandResults, display, colorTransformMatrix, SetColorTransform); - DISPATCH_DISPLAY_COMMAND(displayCommand, display, brightness, SetBrightness); - DISPATCH_DISPLAY_COMMAND(displayCommand, display, clientTarget, - SetClientTarget); - DISPATCH_DISPLAY_COMMAND(displayCommand, display, virtualDisplayOutputBuffer, + DISPATCH_DISPLAY_COMMAND(displayCommand, commandResults, display, brightness, SetBrightness); + DISPATCH_DISPLAY_COMMAND(displayCommand, commandResults, display, clientTarget, SetClientTarget); + DISPATCH_DISPLAY_COMMAND(displayCommand, commandResults, display, virtualDisplayOutputBuffer, SetOutputBuffer); - DISPATCH_DISPLAY_BOOL_COMMAND_AND_DATA(displayCommand, display, - validateDisplay, expectedPresentTime, - ValidateDisplay); - DISPATCH_DISPLAY_BOOL_COMMAND(displayCommand, display, acceptDisplayChanges, + DISPATCH_DISPLAY_BOOL_COMMAND_AND_DATA(displayCommand, commandResults, display, validateDisplay, + expectedPresentTime, ValidateDisplay); + DISPATCH_DISPLAY_BOOL_COMMAND(displayCommand, commandResults, display, acceptDisplayChanges, AcceptDisplayChanges); - DISPATCH_DISPLAY_BOOL_COMMAND(displayCommand, display, presentDisplay, + DISPATCH_DISPLAY_BOOL_COMMAND(displayCommand, commandResults, display, presentDisplay, PresentDisplay); - DISPATCH_DISPLAY_BOOL_COMMAND_AND_DATA( - displayCommand, display, presentOrValidateDisplay, expectedPresentTime, - PresentOrValidateDisplay); + DISPATCH_DISPLAY_BOOL_COMMAND_AND_DATA(displayCommand, commandResults, display, + presentOrValidateDisplay, expectedPresentTime, + PresentOrValidateDisplay); } -void ComposerClient::executeLayerCommand(Display* display, +void ComposerClient::executeLayerCommand(CommandResultWriter& commandResults, Display* display, const LayerCommand& layerCommand) { Layer* layer = display->getLayer(layerCommand.layer); if (layer == nullptr) { - mCommandResults->addError(HWC3::Error::BadLayer); + commandResults.addError(HWC3::Error::BadLayer); return; } - DISPATCH_LAYER_COMMAND(layerCommand, display, layer, cursorPosition, + DISPATCH_LAYER_COMMAND(layerCommand, commandResults, display, layer, cursorPosition, CursorPosition); - DISPATCH_LAYER_COMMAND(layerCommand, display, layer, buffer, Buffer); - DISPATCH_LAYER_COMMAND(layerCommand, display, layer, damage, SurfaceDamage); - DISPATCH_LAYER_COMMAND(layerCommand, display, layer, blendMode, BlendMode); - DISPATCH_LAYER_COMMAND(layerCommand, display, layer, color, Color); - DISPATCH_LAYER_COMMAND(layerCommand, display, layer, composition, - Composition); - DISPATCH_LAYER_COMMAND(layerCommand, display, layer, dataspace, Dataspace); - DISPATCH_LAYER_COMMAND(layerCommand, display, layer, displayFrame, - DisplayFrame); - DISPATCH_LAYER_COMMAND(layerCommand, display, layer, planeAlpha, PlaneAlpha); - DISPATCH_LAYER_COMMAND(layerCommand, display, layer, sidebandStream, + DISPATCH_LAYER_COMMAND(layerCommand, commandResults, display, layer, buffer, Buffer); + DISPATCH_LAYER_COMMAND(layerCommand, commandResults, display, layer, damage, SurfaceDamage); + DISPATCH_LAYER_COMMAND(layerCommand, commandResults, display, layer, blendMode, BlendMode); + DISPATCH_LAYER_COMMAND(layerCommand, commandResults, display, layer, color, Color); + DISPATCH_LAYER_COMMAND(layerCommand, commandResults, display, layer, composition, Composition); + DISPATCH_LAYER_COMMAND(layerCommand, commandResults, display, layer, dataspace, Dataspace); + DISPATCH_LAYER_COMMAND(layerCommand, commandResults, display, layer, displayFrame, DisplayFrame); + DISPATCH_LAYER_COMMAND(layerCommand, commandResults, display, layer, planeAlpha, PlaneAlpha); + DISPATCH_LAYER_COMMAND(layerCommand, commandResults, display, layer, sidebandStream, SidebandStream); - DISPATCH_LAYER_COMMAND(layerCommand, display, layer, sourceCrop, SourceCrop); - DISPATCH_LAYER_COMMAND(layerCommand, display, layer, transform, Transform); - DISPATCH_LAYER_COMMAND(layerCommand, display, layer, visibleRegion, + DISPATCH_LAYER_COMMAND(layerCommand, commandResults, display, layer, sourceCrop, SourceCrop); + DISPATCH_LAYER_COMMAND(layerCommand, commandResults, display, layer, transform, Transform); + DISPATCH_LAYER_COMMAND(layerCommand, commandResults, display, layer, visibleRegion, VisibleRegion); - DISPATCH_LAYER_COMMAND(layerCommand, display, layer, z, ZOrder); - DISPATCH_LAYER_COMMAND(layerCommand, display, layer, colorTransform, + DISPATCH_LAYER_COMMAND(layerCommand, commandResults, display, layer, z, ZOrder); + DISPATCH_LAYER_COMMAND(layerCommand, commandResults, display, layer, colorTransform, ColorTransform); - DISPATCH_LAYER_COMMAND(layerCommand, display, layer, brightness, Brightness); - DISPATCH_LAYER_COMMAND(layerCommand, display, layer, perFrameMetadata, + DISPATCH_LAYER_COMMAND(layerCommand, commandResults, display, layer, brightness, Brightness); + DISPATCH_LAYER_COMMAND(layerCommand, commandResults, display, layer, perFrameMetadata, PerFrameMetadata); - DISPATCH_LAYER_COMMAND(layerCommand, display, layer, perFrameMetadataBlob, + DISPATCH_LAYER_COMMAND(layerCommand, commandResults, display, layer, perFrameMetadataBlob, PerFrameMetadataBlobs); } -void ComposerClient::executeDisplayCommandSetColorTransform( - Display* display, const std::vector& matrix) { +void ComposerClient::executeDisplayCommandSetColorTransform(CommandResultWriter& commandResults, + Display* display, + const std::vector& matrix) { DEBUG_LOG("%s", __FUNCTION__); auto error = display->setColorTransform(matrix); if (error != HWC3::Error::None) { LOG_DISPLAY_COMMAND_ERROR(display, error); - mCommandResults->addError(error); + commandResults.addError(error); } } -void ComposerClient::executeDisplayCommandSetBrightness( - Display* display, const DisplayBrightness& brightness) { +void ComposerClient::executeDisplayCommandSetBrightness(CommandResultWriter& commandResults, + Display* display, + const DisplayBrightness& brightness) { DEBUG_LOG("%s", __FUNCTION__); auto error = display->setBrightness(brightness.brightness); if (error != HWC3::Error::None) { LOG_DISPLAY_COMMAND_ERROR(display, error); - mCommandResults->addError(error); + commandResults.addError(error); } } -void ComposerClient::executeDisplayCommandSetClientTarget( - Display* display, const ClientTarget& clientTarget) { +void ComposerClient::executeDisplayCommandSetClientTarget(CommandResultWriter& commandResults, + Display* display, + const ClientTarget& clientTarget) { DEBUG_LOG("%s", __FUNCTION__); // Owned by mResources. @@ -927,7 +922,7 @@ void ComposerClient::executeDisplayCommandSetClientTarget( display->getId(), clientTarget.buffer, &importedBuffer, releaser.get()); if (error != HWC3::Error::None) { LOG_DISPLAY_COMMAND_ERROR(display, error); - mCommandResults->addError(error); + commandResults.addError(error); return; } @@ -935,13 +930,13 @@ void ComposerClient::executeDisplayCommandSetClientTarget( clientTarget.dataspace, clientTarget.damage); if (error != HWC3::Error::None) { LOG_DISPLAY_COMMAND_ERROR(display, error); - mCommandResults->addError(error); + commandResults.addError(error); return; } } -void ComposerClient::executeDisplayCommandSetOutputBuffer( - Display* display, const Buffer& buffer) { +void ComposerClient::executeDisplayCommandSetOutputBuffer(CommandResultWriter& commandResults, + Display* display, const Buffer& buffer) { DEBUG_LOG("%s", __FUNCTION__); // Owned by mResources. @@ -952,27 +947,27 @@ void ComposerClient::executeDisplayCommandSetOutputBuffer( display->getId(), buffer, &importedBuffer, releaser.get()); if (error != HWC3::Error::None) { LOG_DISPLAY_COMMAND_ERROR(display, error); - mCommandResults->addError(error); + commandResults.addError(error); return; } error = display->setOutputBuffer(importedBuffer, buffer.fence); if (error != HWC3::Error::None) { LOG_DISPLAY_COMMAND_ERROR(display, error); - mCommandResults->addError(error); + commandResults.addError(error); return; } } void ComposerClient::executeDisplayCommandValidateDisplay( - Display* display, + CommandResultWriter& commandResults, Display* display, const std::optional expectedPresentTime) { DEBUG_LOG("%s", __FUNCTION__); auto error = display->setExpectedPresentTime(expectedPresentTime); if (error != HWC3::Error::None) { LOG_DISPLAY_COMMAND_ERROR(display, error); - mCommandResults->addError(error); + commandResults.addError(error); } DisplayChanges changes; @@ -980,27 +975,27 @@ void ComposerClient::executeDisplayCommandValidateDisplay( error = display->validate(&changes); if (error != HWC3::Error::None) { LOG_DISPLAY_COMMAND_ERROR(display, error); - mCommandResults->addError(error); + commandResults.addError(error); } else { - mCommandResults->addChanges(changes); + commandResults.addChanges(changes); } mResources->setDisplayMustValidateState(display->getId(), false); } -void ComposerClient::executeDisplayCommandAcceptDisplayChanges( - Display* display) { +void ComposerClient::executeDisplayCommandAcceptDisplayChanges(CommandResultWriter& commandResults, + Display* display) { DEBUG_LOG("%s", __FUNCTION__); auto error = display->acceptChanges(); if (error != HWC3::Error::None) { LOG_DISPLAY_COMMAND_ERROR(display, error); - mCommandResults->addError(error); + commandResults.addError(error); } } void ComposerClient::executeDisplayCommandPresentOrValidateDisplay( - Display* display, + CommandResultWriter& commandResults, Display* display, const std::optional expectedPresentTime) { DEBUG_LOG("%s", __FUNCTION__); @@ -1009,7 +1004,7 @@ void ComposerClient::executeDisplayCommandPresentOrValidateDisplay( auto error = display->setExpectedPresentTime(expectedPresentTime); if (error != HWC3::Error::None) { LOG_DISPLAY_COMMAND_ERROR(display, error); - mCommandResults->addError(error); + commandResults.addError(error); } DisplayChanges changes; @@ -1017,24 +1012,24 @@ void ComposerClient::executeDisplayCommandPresentOrValidateDisplay( error = display->validate(&changes); if (error != HWC3::Error::None) { LOG_DISPLAY_COMMAND_ERROR(display, error); - mCommandResults->addError(error); + commandResults.addError(error); } else { const int64_t displayId = display->getId(); - mCommandResults->addChanges(changes); - mCommandResults->addPresentOrValidateResult( - displayId, PresentOrValidate::Result::Validated); + commandResults.addChanges(changes); + commandResults.addPresentOrValidateResult(displayId, PresentOrValidate::Result::Validated); } mResources->setDisplayMustValidateState(display->getId(), false); } -void ComposerClient::executeDisplayCommandPresentDisplay(Display* display) { +void ComposerClient::executeDisplayCommandPresentDisplay(CommandResultWriter& commandResults, + Display* display) { DEBUG_LOG("%s", __FUNCTION__); if (mResources->mustValidateDisplay(display->getId())) { ALOGE("%s: display:%" PRIu64 " not validated", __FUNCTION__, display->getId()); - mCommandResults->addError(HWC3::Error::NotValidated); + commandResults.addError(HWC3::Error::NotValidated); return; } @@ -1044,27 +1039,28 @@ void ComposerClient::executeDisplayCommandPresentDisplay(Display* display) { auto error = display->present(&displayFence, &layerFences); if (error != HWC3::Error::None) { LOG_DISPLAY_COMMAND_ERROR(display, error); - mCommandResults->addError(error); + commandResults.addError(error); } else { const int64_t displayId = display->getId(); - mCommandResults->addPresentFence(displayId, std::move(displayFence)); - mCommandResults->addReleaseFences(displayId, std::move(layerFences)); + commandResults.addPresentFence(displayId, std::move(displayFence)); + commandResults.addReleaseFences(displayId, std::move(layerFences)); } } void ComposerClient::executeLayerCommandSetLayerCursorPosition( - Display* display, Layer* layer, const common::Point& cursorPosition) { + CommandResultWriter& commandResults, Display* display, Layer* layer, + const common::Point& cursorPosition) { DEBUG_LOG("%s", __FUNCTION__); auto error = layer->setCursorPosition(cursorPosition); if (error != HWC3::Error::None) { LOG_LAYER_COMMAND_ERROR(display, layer, error); - mCommandResults->addError(error); + commandResults.addError(error); } } -void ComposerClient::executeLayerCommandSetLayerBuffer(Display* display, - Layer* layer, +void ComposerClient::executeLayerCommandSetLayerBuffer(CommandResultWriter& commandResults, + Display* display, Layer* layer, const Buffer& buffer) { DEBUG_LOG("%s", __FUNCTION__); @@ -1077,98 +1073,103 @@ void ComposerClient::executeLayerCommandSetLayerBuffer(Display* display, &importedBuffer, releaser.get()); if (error != HWC3::Error::None) { LOG_LAYER_COMMAND_ERROR(display, layer, error); - mCommandResults->addError(error); + commandResults.addError(error); return; } error = layer->setBuffer(importedBuffer, buffer.fence); if (error != HWC3::Error::None) { LOG_LAYER_COMMAND_ERROR(display, layer, error); - mCommandResults->addError(error); + commandResults.addError(error); } } void ComposerClient::executeLayerCommandSetLayerSurfaceDamage( - Display* display, Layer* layer, + CommandResultWriter& commandResults, Display* display, Layer* layer, const std::vector>& damage) { DEBUG_LOG("%s", __FUNCTION__); auto error = layer->setSurfaceDamage(damage); if (error != HWC3::Error::None) { LOG_LAYER_COMMAND_ERROR(display, layer, error); - mCommandResults->addError(error); + commandResults.addError(error); } } -void ComposerClient::executeLayerCommandSetLayerBlendMode( - Display* display, Layer* layer, const ParcelableBlendMode& blendMode) { +void ComposerClient::executeLayerCommandSetLayerBlendMode(CommandResultWriter& commandResults, + Display* display, Layer* layer, + const ParcelableBlendMode& blendMode) { DEBUG_LOG("%s", __FUNCTION__); auto error = layer->setBlendMode(blendMode.blendMode); if (error != HWC3::Error::None) { LOG_LAYER_COMMAND_ERROR(display, layer, error); - mCommandResults->addError(error); + commandResults.addError(error); } } -void ComposerClient::executeLayerCommandSetLayerColor(Display* display, - Layer* layer, +void ComposerClient::executeLayerCommandSetLayerColor(CommandResultWriter& commandResults, + Display* display, Layer* layer, const Color& color) { DEBUG_LOG("%s", __FUNCTION__); auto error = layer->setColor(color); if (error != HWC3::Error::None) { LOG_LAYER_COMMAND_ERROR(display, layer, error); - mCommandResults->addError(error); + commandResults.addError(error); } } void ComposerClient::executeLayerCommandSetLayerComposition( - Display* display, Layer* layer, const ParcelableComposition& composition) { + CommandResultWriter& commandResults, Display* display, Layer* layer, + const ParcelableComposition& composition) { DEBUG_LOG("%s", __FUNCTION__); auto error = layer->setCompositionType(composition.composition); if (error != HWC3::Error::None) { LOG_LAYER_COMMAND_ERROR(display, layer, error); - mCommandResults->addError(error); + commandResults.addError(error); } } -void ComposerClient::executeLayerCommandSetLayerDataspace( - Display* display, Layer* layer, const ParcelableDataspace& dataspace) { +void ComposerClient::executeLayerCommandSetLayerDataspace(CommandResultWriter& commandResults, + Display* display, Layer* layer, + const ParcelableDataspace& dataspace) { DEBUG_LOG("%s", __FUNCTION__); auto error = layer->setDataspace(dataspace.dataspace); if (error != HWC3::Error::None) { LOG_LAYER_COMMAND_ERROR(display, layer, error); - mCommandResults->addError(error); + commandResults.addError(error); } } -void ComposerClient::executeLayerCommandSetLayerDisplayFrame( - Display* display, Layer* layer, const common::Rect& rect) { +void ComposerClient::executeLayerCommandSetLayerDisplayFrame(CommandResultWriter& commandResults, + Display* display, Layer* layer, + const common::Rect& rect) { DEBUG_LOG("%s", __FUNCTION__); auto error = layer->setDisplayFrame(rect); if (error != HWC3::Error::None) { LOG_LAYER_COMMAND_ERROR(display, layer, error); - mCommandResults->addError(error); + commandResults.addError(error); } } -void ComposerClient::executeLayerCommandSetLayerPlaneAlpha( - Display* display, Layer* layer, const PlaneAlpha& planeAlpha) { +void ComposerClient::executeLayerCommandSetLayerPlaneAlpha(CommandResultWriter& commandResults, + Display* display, Layer* layer, + const PlaneAlpha& planeAlpha) { DEBUG_LOG("%s", __FUNCTION__); auto error = layer->setPlaneAlpha(planeAlpha.alpha); if (error != HWC3::Error::None) { LOG_LAYER_COMMAND_ERROR(display, layer, error); - mCommandResults->addError(error); + commandResults.addError(error); } } void ComposerClient::executeLayerCommandSetLayerSidebandStream( - Display* display, Layer* layer, + CommandResultWriter& commandResults, Display* display, Layer* layer, const aidl::android::hardware::common::NativeHandle& handle) { DEBUG_LOG("%s", __FUNCTION__); @@ -1181,107 +1182,110 @@ void ComposerClient::executeLayerCommandSetLayerSidebandStream( releaser.get()); if (error != HWC3::Error::None) { LOG_LAYER_COMMAND_ERROR(display, layer, error); - mCommandResults->addError(error); + commandResults.addError(error); return; } error = layer->setSidebandStream(importedStream); if (error != HWC3::Error::None) { LOG_LAYER_COMMAND_ERROR(display, layer, error); - mCommandResults->addError(error); + commandResults.addError(error); } } -void ComposerClient::executeLayerCommandSetLayerSourceCrop( - Display* display, Layer* layer, const common::FRect& sourceCrop) { +void ComposerClient::executeLayerCommandSetLayerSourceCrop(CommandResultWriter& commandResults, + Display* display, Layer* layer, + const common::FRect& sourceCrop) { DEBUG_LOG("%s", __FUNCTION__); auto error = layer->setSourceCrop(sourceCrop); if (error != HWC3::Error::None) { LOG_LAYER_COMMAND_ERROR(display, layer, error); - mCommandResults->addError(error); + commandResults.addError(error); } } -void ComposerClient::executeLayerCommandSetLayerTransform( - Display* display, Layer* layer, const ParcelableTransform& transform) { +void ComposerClient::executeLayerCommandSetLayerTransform(CommandResultWriter& commandResults, + Display* display, Layer* layer, + const ParcelableTransform& transform) { DEBUG_LOG("%s", __FUNCTION__); auto error = layer->setTransform(transform.transform); if (error != HWC3::Error::None) { LOG_LAYER_COMMAND_ERROR(display, layer, error); - mCommandResults->addError(error); + commandResults.addError(error); } } void ComposerClient::executeLayerCommandSetLayerVisibleRegion( - Display* display, Layer* layer, + CommandResultWriter& commandResults, Display* display, Layer* layer, const std::vector>& visibleRegion) { DEBUG_LOG("%s", __FUNCTION__); auto error = layer->setVisibleRegion(visibleRegion); if (error != HWC3::Error::None) { LOG_LAYER_COMMAND_ERROR(display, layer, error); - mCommandResults->addError(error); + commandResults.addError(error); } } -void ComposerClient::executeLayerCommandSetLayerZOrder(Display* display, - Layer* layer, +void ComposerClient::executeLayerCommandSetLayerZOrder(CommandResultWriter& commandResults, + Display* display, Layer* layer, const ZOrder& zOrder) { DEBUG_LOG("%s", __FUNCTION__); auto error = layer->setZOrder(zOrder.z); if (error != HWC3::Error::None) { LOG_LAYER_COMMAND_ERROR(display, layer, error); - mCommandResults->addError(error); + commandResults.addError(error); } } void ComposerClient::executeLayerCommandSetLayerPerFrameMetadata( - Display* display, Layer* layer, + CommandResultWriter& commandResults, Display* display, Layer* layer, const std::vector>& perFrameMetadata) { DEBUG_LOG("%s", __FUNCTION__); auto error = layer->setPerFrameMetadata(perFrameMetadata); if (error != HWC3::Error::None) { LOG_LAYER_COMMAND_ERROR(display, layer, error); - mCommandResults->addError(error); + commandResults.addError(error); } } void ComposerClient::executeLayerCommandSetLayerColorTransform( - Display* display, Layer* layer, const std::vector& colorTransform) { + CommandResultWriter& commandResults, Display* display, Layer* layer, + const std::vector& colorTransform) { DEBUG_LOG("%s", __FUNCTION__); auto error = layer->setColorTransform(colorTransform); if (error != HWC3::Error::None) { LOG_LAYER_COMMAND_ERROR(display, layer, error); - mCommandResults->addError(error); + commandResults.addError(error); } } -void ComposerClient::executeLayerCommandSetLayerBrightness( - Display* display, Layer* layer, const LayerBrightness& brightness) { +void ComposerClient::executeLayerCommandSetLayerBrightness(CommandResultWriter& commandResults, + Display* display, Layer* layer, + const LayerBrightness& brightness) { DEBUG_LOG("%s", __FUNCTION__); auto error = layer->setBrightness(brightness.brightness); if (error != HWC3::Error::None) { LOG_LAYER_COMMAND_ERROR(display, layer, error); - mCommandResults->addError(error); + commandResults.addError(error); } } void ComposerClient::executeLayerCommandSetLayerPerFrameMetadataBlobs( - Display* display, Layer* layer, - const std::vector>& - perFrameMetadataBlob) { + CommandResultWriter& commandResults, Display* display, Layer* layer, + const std::vector>& perFrameMetadataBlob) { DEBUG_LOG("%s", __FUNCTION__); auto error = layer->setPerFrameMetadataBlobs(perFrameMetadataBlob); if (error != HWC3::Error::None) { LOG_LAYER_COMMAND_ERROR(display, layer, error); - mCommandResults->addError(error); + commandResults.addError(error); } } diff --git a/system/hwc3/ComposerClient.h b/system/hwc3/ComposerClient.h index dddaadcc..b301f2b6 100644 --- a/system/hwc3/ComposerClient.h +++ b/system/hwc3/ComposerClient.h @@ -147,68 +147,75 @@ class ComposerClient : public BnComposerClient { private: class CommandResultWriter; - void executeDisplayCommand(const DisplayCommand& displayCommand); - void executeLayerCommand(Display* display, const LayerCommand& layerCommand); + void executeDisplayCommand(CommandResultWriter& commandResults, + const DisplayCommand& displayCommand); - void executeDisplayCommandSetColorTransform(Display* display, + void executeLayerCommand(CommandResultWriter& commandResults, Display* display, + const LayerCommand& layerCommand); + + void executeDisplayCommandSetColorTransform(CommandResultWriter& commandResults, Display* display, const std::vector& matrix); - void executeDisplayCommandSetBrightness(Display* display, + void executeDisplayCommandSetBrightness(CommandResultWriter& commandResults, Display* display, const DisplayBrightness& brightness); - void executeDisplayCommandSetClientTarget(Display* display, + void executeDisplayCommandSetClientTarget(CommandResultWriter& commandResults, Display* display, const ClientTarget& command); - void executeDisplayCommandSetOutputBuffer(Display* display, + void executeDisplayCommandSetOutputBuffer(CommandResultWriter& commandResults, Display* display, const Buffer& buffer); void executeDisplayCommandValidateDisplay( - Display* display, + CommandResultWriter& commandResults, Display* display, const std::optional expectedPresentTime); - void executeDisplayCommandAcceptDisplayChanges(Display* display); + void executeDisplayCommandAcceptDisplayChanges(CommandResultWriter& commandResults, + Display* display); void executeDisplayCommandPresentOrValidateDisplay( - Display* display, + CommandResultWriter& commandResults, Display* display, const std::optional expectedPresentTime); - void executeDisplayCommandPresentDisplay(Display* display); + void executeDisplayCommandPresentDisplay(CommandResultWriter& commandResults, Display* display); - void executeLayerCommandSetLayerCursorPosition( - Display* display, Layer* layer, const common::Point& cursorPosition); - void executeLayerCommandSetLayerBuffer(Display* display, Layer* layer, - const Buffer& buffer); + void executeLayerCommandSetLayerCursorPosition(CommandResultWriter& commandResults, + Display* display, Layer* layer, + const common::Point& cursorPosition); + void executeLayerCommandSetLayerBuffer(CommandResultWriter& commandResults, Display* display, + Layer* layer, const Buffer& buffer); void executeLayerCommandSetLayerSurfaceDamage( - Display* display, Layer* layer, + CommandResultWriter& commandResults, Display* display, Layer* layer, const std::vector>& damage); - void executeLayerCommandSetLayerBlendMode( - Display* display, Layer* layer, const ParcelableBlendMode& blendMode); - void executeLayerCommandSetLayerColor(Display* display, Layer* layer, - const Color& color); - void executeLayerCommandSetLayerComposition( - Display* display, Layer* layer, const ParcelableComposition& composition); - void executeLayerCommandSetLayerDataspace( - Display* display, Layer* layer, const ParcelableDataspace& dataspace); - void executeLayerCommandSetLayerDisplayFrame(Display* display, Layer* layer, + void executeLayerCommandSetLayerBlendMode(CommandResultWriter& commandResults, Display* display, + Layer* layer, const ParcelableBlendMode& blendMode); + void executeLayerCommandSetLayerColor(CommandResultWriter& commandResults, Display* display, + Layer* layer, const Color& color); + void executeLayerCommandSetLayerComposition(CommandResultWriter& commandResults, Display* display, + Layer* layer, + const ParcelableComposition& composition); + void executeLayerCommandSetLayerDataspace(CommandResultWriter& commandResults, Display* display, + Layer* layer, const ParcelableDataspace& dataspace); + void executeLayerCommandSetLayerDisplayFrame(CommandResultWriter& commandResults, + Display* display, Layer* layer, const common::Rect& rect); - void executeLayerCommandSetLayerPlaneAlpha(Display* display, Layer* layer, - const PlaneAlpha& planeAlpha); + void executeLayerCommandSetLayerPlaneAlpha(CommandResultWriter& commandResults, Display* display, + Layer* layer, const PlaneAlpha& planeAlpha); void executeLayerCommandSetLayerSidebandStream( - Display* display, Layer* layer, + CommandResultWriter& commandResults, Display* display, Layer* layer, const aidl::android::hardware::common::NativeHandle& sidebandStream); - void executeLayerCommandSetLayerSourceCrop(Display* display, Layer* layer, - const common::FRect& sourceCrop); - void executeLayerCommandSetLayerTransform( - Display* display, Layer* layer, const ParcelableTransform& transform); + void executeLayerCommandSetLayerSourceCrop(CommandResultWriter& commandResults, Display* display, + Layer* layer, const common::FRect& sourceCrop); + void executeLayerCommandSetLayerTransform(CommandResultWriter& commandResults, Display* display, + Layer* layer, const ParcelableTransform& transform); void executeLayerCommandSetLayerVisibleRegion( - Display* display, Layer* layer, + CommandResultWriter& commandResults, Display* display, Layer* layer, const std::vector>& visibleRegion); - void executeLayerCommandSetLayerZOrder(Display* display, Layer* layer, - const ZOrder& zOrder); + void executeLayerCommandSetLayerZOrder(CommandResultWriter& commandResults, Display* display, + Layer* layer, const ZOrder& zOrder); void executeLayerCommandSetLayerPerFrameMetadata( - Display* display, Layer* layer, + CommandResultWriter& commandResults, Display* display, Layer* layer, const std::vector>& perFrameMetadata); - void executeLayerCommandSetLayerColorTransform( - Display* display, Layer* layer, const std::vector& colorTransform); - void executeLayerCommandSetLayerBrightness(Display* display, Layer* layer, - const LayerBrightness& brightness); + void executeLayerCommandSetLayerColorTransform(CommandResultWriter& commandResults, + Display* display, Layer* layer, + const std::vector& colorTransform); + void executeLayerCommandSetLayerBrightness(CommandResultWriter& commandResults, Display* display, + Layer* layer, const LayerBrightness& brightness); void executeLayerCommandSetLayerPerFrameMetadataBlobs( - Display* display, Layer* layer, - const std::vector>& - perFrameMetadataBlob); + CommandResultWriter& commandResults, Display* display, Layer* layer, + const std::vector>& perFrameMetadataBlob); // Returns the display with the given id or nullptr if not found. Display* getDisplay(int64_t displayId); @@ -246,10 +253,6 @@ class ComposerClient : public BnComposerClient { // the host using opengl. Owned by Device. FrameComposer* mComposer = nullptr; - // For the duration of a executeCommands(), the helper used to collect - // individual command results. - std::unique_ptr mCommandResults; - // Manages importing and caching gralloc buffers for displays and layers. std::unique_ptr mResources; }; -- cgit v1.2.3 From a4c37e980a092f8e395ec04cc4f9ddf7515bf22d Mon Sep 17 00:00:00 2001 From: Jason Macnak Date: Wed, 29 Nov 2023 16:00:04 -0800 Subject: Move GuestFrameComposer's intermediate storage into per display info ... as upcoming changes will composition to happen in parallel across displays. Bug: b/248355957 Test: vts -m VtsHalGraphicsComposer3_TargetTest Change-Id: Ie01cde25e89f465593a7843b51db4242d97246f2 --- system/hwc3/AlternatingImageStorage.cpp | 41 ++++++++++++++++++++++++++ system/hwc3/AlternatingImageStorage.h | 51 +++++++++++++++++++++++++++++++++ system/hwc3/Android.bp | 1 + system/hwc3/GuestFrameComposer.cpp | 51 ++++++++++----------------------- system/hwc3/GuestFrameComposer.h | 29 ++++++++----------- 5 files changed, 120 insertions(+), 53 deletions(-) create mode 100644 system/hwc3/AlternatingImageStorage.cpp create mode 100644 system/hwc3/AlternatingImageStorage.h diff --git a/system/hwc3/AlternatingImageStorage.cpp b/system/hwc3/AlternatingImageStorage.cpp new file mode 100644 index 00000000..6ca2b0b1 --- /dev/null +++ b/system/hwc3/AlternatingImageStorage.cpp @@ -0,0 +1,41 @@ +/* + * Copyright 2023 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. + */ + +#include "AlternatingImageStorage.h" + +namespace aidl::android::hardware::graphics::composer3::impl { + +uint8_t* AlternatingImageStorage::getRotatingScratchBuffer(std::size_t neededSize, + std::uint32_t imageIndex) { + std::size_t totalNeededSize = neededSize * kNumScratchBufferPieces; + if (mScratchBuffer.size() < totalNeededSize) { + mScratchBuffer.resize(totalNeededSize); + } + + std::size_t bufferIndex = imageIndex % kNumScratchBufferPieces; + std::size_t bufferOffset = bufferIndex * neededSize; + return &mScratchBuffer[bufferOffset]; +} + +uint8_t* AlternatingImageStorage::getSpecialScratchBuffer(size_t neededSize) { + if (mSpecialScratchBuffer.size() < neededSize) { + mSpecialScratchBuffer.resize(neededSize); + } + + return &mSpecialScratchBuffer[0]; +} + +} // namespace aidl::android::hardware::graphics::composer3::impl diff --git a/system/hwc3/AlternatingImageStorage.h b/system/hwc3/AlternatingImageStorage.h new file mode 100644 index 00000000..31c44675 --- /dev/null +++ b/system/hwc3/AlternatingImageStorage.h @@ -0,0 +1,51 @@ +/* + * Copyright 2023 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. + */ + +#ifndef ANDROID_HWC_ALTERNATINGIMAGESTORAGE_H +#define ANDROID_HWC_ALTERNATINGIMAGESTORAGE_H + +#include +#include + +#include "Common.h" + +namespace aidl::android::hardware::graphics::composer3::impl { + +// Provides storage for images when transforming images with the expectation +// that image N will no longer be used after producing image N + 1. With this, +// the storage just needs to be 2x the needed image size and the returned buffers +// can alternate back and forth. +class AlternatingImageStorage { + public: + AlternatingImageStorage() = default; + + uint8_t* getRotatingScratchBuffer(std::size_t neededSize, std::uint32_t imageIndex); + + uint8_t* getSpecialScratchBuffer(std::size_t neededSize); + + private: + static constexpr const int kNumScratchBufferPieces = 2; + + // The main alternating storage. + std::vector mScratchBuffer; + + // Extra additional storage for one-off operations (scaling). + std::vector mSpecialScratchBuffer; +}; + +} // namespace aidl::android::hardware::graphics::composer3::impl + +#endif diff --git a/system/hwc3/Android.bp b/system/hwc3/Android.bp index 9b19b860..8abf442f 100644 --- a/system/hwc3/Android.bp +++ b/system/hwc3/Android.bp @@ -59,6 +59,7 @@ cc_binary { ], srcs: [ + "AlternatingImageStorage.cpp", "ClientFrameComposer.cpp", "Common.cpp", "Composer.cpp", diff --git a/system/hwc3/GuestFrameComposer.cpp b/system/hwc3/GuestFrameComposer.cpp index b4eef6a4..c469bfe2 100644 --- a/system/hwc3/GuestFrameComposer.cpp +++ b/system/hwc3/GuestFrameComposer.cpp @@ -855,11 +855,12 @@ HWC3::Error GuestFrameComposer::presentDisplay( continue; } - HWC3::Error error = composeLayerInto(layer, // - compositionResultBufferData, // - compositionResultBufferWidth, // - compositionResultBufferHeight, // - compositionResultBufferStride, // + HWC3::Error error = composeLayerInto(displayInfo.compositionIntermediateStorage, // + layer, // + compositionResultBufferData, // + compositionResultBufferWidth, // + compositionResultBufferHeight, // + compositionResultBufferStride, // 4); if (error != HWC3::Error::None) { ALOGE("%s: display:%" PRIu64 " failed to compose layer:%" PRIu64, @@ -935,6 +936,7 @@ bool GuestFrameComposer::canComposeLayer(Layer* layer) { } HWC3::Error GuestFrameComposer::composeLayerInto( + AlternatingImageStorage& compositionIntermediateStorage, Layer* srcLayer, // std::uint8_t* dstBuffer, // std::uint32_t dstBufferWidth, // @@ -1012,11 +1014,10 @@ HWC3::Error GuestFrameComposer::composeLayerInto( // framebuffer) is one of them, so only N-1 temporary buffers are needed. // Vertical flip is not taken into account because it can be done together // with any other operation. - int neededScratchBuffers = (needsFill ? 1 : 0) + - (needsConversion ? 1 : 0) + - (needsScaling ? 1 : 0) + (needsRotation ? 1 : 0) + - (needsAttenuation ? 1 : 0) + - (needsBlending ? 1 : 0) + (needsCopy ? 1 : 0) - 1; + int neededIntermediateImages = (needsFill ? 1 : 0) + (needsConversion ? 1 : 0) + + (needsScaling ? 1 : 0) + (needsRotation ? 1 : 0) + + (needsAttenuation ? 1 : 0) + (needsBlending ? 1 : 0) + + (needsCopy ? 1 : 0) - 1; int mScratchBufferWidth = srcLayerDisplayFrame.right - srcLayerDisplayFrame.left; @@ -1027,9 +1028,9 @@ HWC3::Error GuestFrameComposer::composeLayerInto( int mScratchBufferSizeBytes = mScratchBufferHeight * mScratchBufferStrideBytes; - for (int i = 0; i < neededScratchBuffers; i++) { + for (int i = 0; i < neededIntermediateImages; i++) { BufferSpec mScratchBufferspec( - getRotatingScratchBuffer(mScratchBufferSizeBytes, i), + compositionIntermediateStorage.getRotatingScratchBuffer(mScratchBufferSizeBytes, i), mScratchBufferWidth, mScratchBufferHeight, mScratchBufferStrideBytes); dstBufferStack.push_back(mScratchBufferspec); } @@ -1064,7 +1065,7 @@ HWC3::Error GuestFrameComposer::composeLayerInto( int srcHeight = srcLayerSpec.cropHeight; int dst_stride_bytes = AlignToPower2(srcWidth * dstBufferBytesPerPixel, 4); - size_t needed_size = dst_stride_bytes * srcHeight; + size_t neededSize = dst_stride_bytes * srcHeight; dstBufferSpec.width = srcWidth; dstBufferSpec.height = srcHeight; // Adjust the stride accordingly @@ -1076,7 +1077,7 @@ HWC3::Error GuestFrameComposer::composeLayerInto( // In case of a scale, the source frame may be bigger than the default tmp // buffer size - dstBufferSpec.buffer = getSpecialScratchBuffer(needed_size); + dstBufferSpec.buffer = compositionIntermediateStorage.getSpecialScratchBuffer(neededSize); } int retval = DoConversion(srcLayerSpec, dstBufferSpec, needsVFlip); @@ -1198,26 +1199,4 @@ HWC3::Error GuestFrameComposer::applyColorTransformToRGBA( return HWC3::Error::None; } -uint8_t* GuestFrameComposer::getRotatingScratchBuffer(std::size_t neededSize, - std::uint32_t order) { - static constexpr const int kNumScratchBufferPieces = 2; - - std::size_t totalNeededSize = neededSize * kNumScratchBufferPieces; - if (mScratchBuffer.size() < totalNeededSize) { - mScratchBuffer.resize(totalNeededSize); - } - - std::size_t bufferIndex = order % kNumScratchBufferPieces; - std::size_t bufferOffset = bufferIndex * neededSize; - return &mScratchBuffer[bufferOffset]; -} - -uint8_t* GuestFrameComposer::getSpecialScratchBuffer(size_t neededSize) { - if (mSpecialScratchBuffer.size() < neededSize) { - mSpecialScratchBuffer.resize(neededSize); - } - - return &mSpecialScratchBuffer[0]; -} - } // namespace aidl::android::hardware::graphics::composer3::impl diff --git a/system/hwc3/GuestFrameComposer.h b/system/hwc3/GuestFrameComposer.h index 2df2f32b..9e67898d 100644 --- a/system/hwc3/GuestFrameComposer.h +++ b/system/hwc3/GuestFrameComposer.h @@ -17,6 +17,7 @@ #ifndef ANDROID_HWC_GUESTFRAMECOMPOSER_H #define ANDROID_HWC_GUESTFRAMECOMPOSER_H +#include "AlternatingImageStorage.h" #include "Common.h" #include "Display.h" #include "DrmClient.h" @@ -85,10 +86,9 @@ class GuestFrameComposer : public FrameComposer { bool canComposeLayer(Layer* layer); // Composes the given layer into the given destination buffer. - HWC3::Error composeLayerInto(Layer* layer, std::uint8_t* dstBuffer, - std::uint32_t dstBufferWidth, - std::uint32_t dstBufferHeight, - std::uint32_t dstBufferStrideBytes, + HWC3::Error composeLayerInto(AlternatingImageStorage& storage, Layer* layer, + std::uint8_t* dstBuffer, std::uint32_t dstBufferWidth, + std::uint32_t dstBufferHeight, std::uint32_t dstBufferStrideBytes, std::uint32_t dstBufferBytesPerPixel); struct DisplayInfo { @@ -96,6 +96,9 @@ class GuestFrameComposer : public FrameComposer { buffer_handle_t compositionResultBuffer = nullptr; std::shared_ptr compositionResultDrmBuffer; + + // Scratch storage space for intermediate images during composition. + AlternatingImageStorage compositionIntermediateStorage; }; std::unordered_map mDisplayInfos; @@ -108,19 +111,11 @@ class GuestFrameComposer : public FrameComposer { // spamming logcat with DRM commit failures. bool mPresentDisabled = false; - uint8_t* getRotatingScratchBuffer(std::size_t neededSize, - std::uint32_t order); - uint8_t* getSpecialScratchBuffer(std::size_t neededSize); - - HWC3::Error applyColorTransformToRGBA( - const std::array& colorTransform, // - std::uint8_t* buffer, // - std::uint32_t bufferWidth, // - std::uint32_t bufferHeight, // - std::uint32_t bufferStrideBytes); - - std::vector mScratchBuffer; - std::vector mSpecialScratchBuffer; + HWC3::Error applyColorTransformToRGBA(const std::array& colorTransform, // + std::uint8_t* buffer, // + std::uint32_t bufferWidth, // + std::uint32_t bufferHeight, // + std::uint32_t bufferStrideBytes); }; } // namespace aidl::android::hardware::graphics::composer3::impl -- cgit v1.2.3 From cfebf82d183e9d5b040cd80d0828718117a07b44 Mon Sep 17 00:00:00 2001 From: Jason Macnak Date: Wed, 29 Nov 2023 16:23:29 -0800 Subject: Use shared_ptr for displays and remove excess locking ... as multiple threads should be able to interact with different displays independently. Bug: b/248355957 Test: vts -m VtsHalGraphicsComposer3_TargetTest Change-Id: Ic8d3a5930443333adc67f0057449bf3a4840e3eb --- system/hwc3/ComposerClient.cpp | 232 +++++++++++++++-------------------------- system/hwc3/ComposerClient.h | 61 ++++++----- 2 files changed, 114 insertions(+), 179 deletions(-) diff --git a/system/hwc3/ComposerClient.cpp b/system/hwc3/ComposerClient.cpp index 8edc1618..452cd874 100644 --- a/system/hwc3/ComposerClient.cpp +++ b/system/hwc3/ComposerClient.cpp @@ -28,7 +28,7 @@ namespace aidl::android::hardware::graphics::composer3::impl { namespace { #define GET_DISPLAY_OR_RETURN_ERROR() \ - Display* display = getDisplay(displayId); \ + std::shared_ptr display = getDisplay(displayId); \ if (display == nullptr) { \ ALOGE("%s failed to get display:%" PRIu64, __FUNCTION__, displayId); \ return ToBinderStatus(HWC3::Error::BadDisplay); \ @@ -106,7 +106,7 @@ ComposerClient::ComposerClient() { DEBUG_LOG("%s", __FUNCTION__); } ComposerClient::~ComposerClient() { DEBUG_LOG("%s", __FUNCTION__); - std::unique_lock lock(mStateMutex); + std::unique_lock lock(mDisplaysMutex); destroyDisplaysLocked(); @@ -120,7 +120,7 @@ HWC3::Error ComposerClient::init() { HWC3::Error error = HWC3::Error::None; - std::unique_lock lock(mStateMutex); + std::unique_lock lock(mDisplaysMutex); mResources = std::make_unique(); if (!mResources) { @@ -170,8 +170,6 @@ ndk::ScopedAStatus ComposerClient::createLayer(int64_t displayId, int64_t* layerId) { DEBUG_LOG("%s display:%" PRIu64, __FUNCTION__, displayId); - std::unique_lock lock(mStateMutex); - GET_DISPLAY_OR_RETURN_ERROR(); HWC3::Error error = display->createLayer(layerId); @@ -203,8 +201,6 @@ ndk::ScopedAStatus ComposerClient::destroyLayer(int64_t displayId, int64_t layerId) { DEBUG_LOG("%s display:%" PRIu64, __FUNCTION__, displayId); - std::unique_lock lock(mStateMutex); - GET_DISPLAY_OR_RETURN_ERROR(); HWC3::Error error = display->destroyLayer(layerId); @@ -236,8 +232,6 @@ ndk::ScopedAStatus ComposerClient::executeCommands( std::vector* commandResultPayloads) { DEBUG_LOG("%s", __FUNCTION__); - std::unique_lock lock(mStateMutex); - CommandResultWriter commandResults(commandResultPayloads); for (const DisplayCommand& command : commands) { executeDisplayCommand(commandResults, command); @@ -251,8 +245,6 @@ ndk::ScopedAStatus ComposerClient::getActiveConfig(int64_t displayId, int32_t* config) { DEBUG_LOG("%s", __FUNCTION__); - std::unique_lock lock(mStateMutex); - GET_DISPLAY_OR_RETURN_ERROR(); return ToBinderStatus(display->getActiveConfig(config)); @@ -262,8 +254,6 @@ ndk::ScopedAStatus ComposerClient::getColorModes( int64_t displayId, std::vector* colorModes) { DEBUG_LOG("%s", __FUNCTION__); - std::unique_lock lock(mStateMutex); - GET_DISPLAY_OR_RETURN_ERROR(); return ToBinderStatus(display->getColorModes(colorModes)); @@ -296,8 +286,6 @@ ndk::ScopedAStatus ComposerClient::getDisplayAttribute( int32_t* value) { DEBUG_LOG("%s", __FUNCTION__); - std::unique_lock lock(mStateMutex); - GET_DISPLAY_OR_RETURN_ERROR(); return ToBinderStatus(display->getDisplayAttribute(config, attribute, value)); @@ -307,8 +295,6 @@ ndk::ScopedAStatus ComposerClient::getDisplayCapabilities( int64_t displayId, std::vector* outCaps) { DEBUG_LOG("%s", __FUNCTION__); - std::unique_lock lock(mStateMutex); - GET_DISPLAY_OR_RETURN_ERROR(); return ToBinderStatus(display->getDisplayCapabilities(outCaps)); @@ -318,8 +304,6 @@ ndk::ScopedAStatus ComposerClient::getDisplayConfigs( int64_t displayId, std::vector* outConfigs) { DEBUG_LOG("%s", __FUNCTION__); - std::unique_lock lock(mStateMutex); - GET_DISPLAY_OR_RETURN_ERROR(); return ToBinderStatus(display->getDisplayConfigs(outConfigs)); @@ -329,8 +313,6 @@ ndk::ScopedAStatus ComposerClient::getDisplayConnectionType( int64_t displayId, DisplayConnectionType* outType) { DEBUG_LOG("%s", __FUNCTION__); - std::unique_lock lock(mStateMutex); - GET_DISPLAY_OR_RETURN_ERROR(); return ToBinderStatus(display->getDisplayConnectionType(outType)); @@ -340,8 +322,6 @@ ndk::ScopedAStatus ComposerClient::getDisplayIdentificationData( int64_t displayId, DisplayIdentification* outIdentification) { DEBUG_LOG("%s", __FUNCTION__); - std::unique_lock lock(mStateMutex); - GET_DISPLAY_OR_RETURN_ERROR(); return ToBinderStatus( @@ -352,8 +332,6 @@ ndk::ScopedAStatus ComposerClient::getDisplayName(int64_t displayId, std::string* outName) { DEBUG_LOG("%s", __FUNCTION__); - std::unique_lock lock(mStateMutex); - GET_DISPLAY_OR_RETURN_ERROR(); return ToBinderStatus(display->getDisplayName(outName)); @@ -363,8 +341,6 @@ ndk::ScopedAStatus ComposerClient::getDisplayVsyncPeriod( int64_t displayId, int32_t* outVsyncPeriod) { DEBUG_LOG("%s", __FUNCTION__); - std::unique_lock lock(mStateMutex); - GET_DISPLAY_OR_RETURN_ERROR(); return ToBinderStatus(display->getDisplayVsyncPeriod(outVsyncPeriod)); @@ -375,8 +351,6 @@ ndk::ScopedAStatus ComposerClient::getDisplayedContentSample( DisplayContentSample* outSamples) { DEBUG_LOG("%s", __FUNCTION__); - std::unique_lock lock(mStateMutex); - GET_DISPLAY_OR_RETURN_ERROR(); return ToBinderStatus( @@ -387,8 +361,6 @@ ndk::ScopedAStatus ComposerClient::getDisplayedContentSamplingAttributes( int64_t displayId, DisplayContentSamplingAttributes* outAttributes) { DEBUG_LOG("%s", __FUNCTION__); - std::unique_lock lock(mStateMutex); - GET_DISPLAY_OR_RETURN_ERROR(); return ToBinderStatus( @@ -399,8 +371,6 @@ ndk::ScopedAStatus ComposerClient::getDisplayPhysicalOrientation( int64_t displayId, common::Transform* outOrientation) { DEBUG_LOG("%s", __FUNCTION__); - std::unique_lock lock(mStateMutex); - GET_DISPLAY_OR_RETURN_ERROR(); return ToBinderStatus(display->getDisplayPhysicalOrientation(outOrientation)); @@ -410,8 +380,6 @@ ndk::ScopedAStatus ComposerClient::getHdrCapabilities( int64_t displayId, HdrCapabilities* outCapabilities) { DEBUG_LOG("%s", __FUNCTION__); - std::unique_lock lock(mStateMutex); - GET_DISPLAY_OR_RETURN_ERROR(); return ToBinderStatus(display->getHdrCapabilities(outCapabilities)); @@ -438,8 +406,6 @@ ndk::ScopedAStatus ComposerClient::getPerFrameMetadataKeys( int64_t displayId, std::vector* outKeys) { DEBUG_LOG("%s", __FUNCTION__); - std::unique_lock lock(mStateMutex); - GET_DISPLAY_OR_RETURN_ERROR(); return ToBinderStatus(display->getPerFrameMetadataKeys(outKeys)); @@ -449,8 +415,6 @@ ndk::ScopedAStatus ComposerClient::getReadbackBufferAttributes( int64_t displayId, ReadbackBufferAttributes* outAttributes) { DEBUG_LOG("%s", __FUNCTION__); - std::unique_lock lock(mStateMutex); - GET_DISPLAY_OR_RETURN_ERROR(); return ToBinderStatus(display->getReadbackBufferAttributes(outAttributes)); @@ -460,8 +424,6 @@ ndk::ScopedAStatus ComposerClient::getReadbackBufferFence( int64_t displayId, ndk::ScopedFileDescriptor* outAcquireFence) { DEBUG_LOG("%s", __FUNCTION__); - std::unique_lock lock(mStateMutex); - GET_DISPLAY_OR_RETURN_ERROR(); return ToBinderStatus(display->getReadbackBufferFence(outAcquireFence)); @@ -471,8 +433,6 @@ ndk::ScopedAStatus ComposerClient::getRenderIntents( int64_t displayId, ColorMode mode, std::vector* outIntents) { DEBUG_LOG("%s", __FUNCTION__); - std::unique_lock lock(mStateMutex); - GET_DISPLAY_OR_RETURN_ERROR(); return ToBinderStatus(display->getRenderIntents(mode, outIntents)); @@ -482,8 +442,6 @@ ndk::ScopedAStatus ComposerClient::getSupportedContentTypes( int64_t displayId, std::vector* outTypes) { DEBUG_LOG("%s", __FUNCTION__); - std::unique_lock lock(mStateMutex); - GET_DISPLAY_OR_RETURN_ERROR(); return ToBinderStatus(display->getSupportedContentTypes(outTypes)); @@ -494,8 +452,6 @@ ndk::ScopedAStatus ComposerClient::getDisplayDecorationSupport( std::optional* outSupport) { DEBUG_LOG("%s", __FUNCTION__); - std::unique_lock lock(mStateMutex); - GET_DISPLAY_OR_RETURN_ERROR(); return ToBinderStatus(display->getDecorationSupport(outSupport)); @@ -505,8 +461,6 @@ ndk::ScopedAStatus ComposerClient::registerCallback( const std::shared_ptr& callback) { DEBUG_LOG("%s", __FUNCTION__); - std::unique_lock lock(mStateMutex); - const bool isFirstRegisterCallback = mCallbacks == nullptr; mCallbacks = callback; @@ -516,8 +470,17 @@ ndk::ScopedAStatus ComposerClient::registerCallback( } if (isFirstRegisterCallback) { - lock.unlock(); - for (auto& [displayId, _] : mDisplays) { + std::vector displayIds; + { + std::unique_lock lock(mDisplaysMutex); + for (auto& [displayId, _] : mDisplays) { + displayIds.push_back(displayId); + } + } + + for (auto displayId : displayIds) { + DEBUG_LOG("%s initial registration, hotplug connecting display:%" PRIu64, __FUNCTION__, + displayId); mCallbacks->onHotplug(displayId, /*connected=*/true); } } @@ -530,8 +493,6 @@ ndk::ScopedAStatus ComposerClient::setActiveConfig(int64_t displayId, DEBUG_LOG("%s display:%" PRIu64 " config:%" PRIu32, __FUNCTION__, displayId, configId); - std::unique_lock lock(mStateMutex); - GET_DISPLAY_OR_RETURN_ERROR(); return ToBinderStatus(display->setActiveConfig(configId)); @@ -544,8 +505,6 @@ ndk::ScopedAStatus ComposerClient::setActiveConfigWithConstraints( DEBUG_LOG("%s display:%" PRIu64 " config:%" PRIu32, __FUNCTION__, displayId, configId); - std::unique_lock lock(mStateMutex); - GET_DISPLAY_OR_RETURN_ERROR(); return ToBinderStatus(display->setActiveConfigWithConstraints( @@ -557,8 +516,6 @@ ndk::ScopedAStatus ComposerClient::setBootDisplayConfig(int64_t displayId, DEBUG_LOG("%s display:%" PRIu64 " config:%" PRIu32, __FUNCTION__, displayId, configId); - std::unique_lock lock(mStateMutex); - GET_DISPLAY_OR_RETURN_ERROR(); return ToBinderStatus(display->setBootConfig(configId)); @@ -567,8 +524,6 @@ ndk::ScopedAStatus ComposerClient::setBootDisplayConfig(int64_t displayId, ndk::ScopedAStatus ComposerClient::clearBootDisplayConfig(int64_t displayId) { DEBUG_LOG("%s display:%" PRIu64, __FUNCTION__, displayId); - std::unique_lock lock(mStateMutex); - GET_DISPLAY_OR_RETURN_ERROR(); return ToBinderStatus(display->clearBootConfig()); @@ -578,8 +533,6 @@ ndk::ScopedAStatus ComposerClient::getPreferredBootDisplayConfig( int64_t displayId, int32_t* outConfigId) { DEBUG_LOG("%s display:%" PRIu64, __FUNCTION__, displayId); - std::unique_lock lock(mStateMutex); - GET_DISPLAY_OR_RETURN_ERROR(); return ToBinderStatus(display->getPreferredBootConfig(outConfigId)); @@ -618,8 +571,6 @@ ndk::ScopedAStatus ComposerClient::setAutoLowLatencyMode(int64_t displayId, bool on) { DEBUG_LOG("%s", __FUNCTION__); - std::unique_lock lock(mStateMutex); - GET_DISPLAY_OR_RETURN_ERROR(); return ToBinderStatus(display->setAutoLowLatencyMode(on)); @@ -629,8 +580,6 @@ ndk::ScopedAStatus ComposerClient::setClientTargetSlotCount(int64_t displayId, int32_t count) { DEBUG_LOG("%s", __FUNCTION__); - std::unique_lock lock(mStateMutex); - GET_DISPLAY_OR_RETURN_ERROR(); return ToBinderStatus( @@ -642,8 +591,6 @@ ndk::ScopedAStatus ComposerClient::setColorMode(int64_t displayId, RenderIntent intent) { DEBUG_LOG("%s", __FUNCTION__); - std::unique_lock lock(mStateMutex); - GET_DISPLAY_OR_RETURN_ERROR(); return ToBinderStatus(display->setColorMode(mode, intent)); @@ -653,8 +600,6 @@ ndk::ScopedAStatus ComposerClient::setContentType(int64_t displayId, ContentType type) { DEBUG_LOG("%s", __FUNCTION__); - std::unique_lock lock(mStateMutex); - GET_DISPLAY_OR_RETURN_ERROR(); return ToBinderStatus(display->setContentType(type)); @@ -665,8 +610,6 @@ ndk::ScopedAStatus ComposerClient::setDisplayedContentSamplingEnabled( int64_t maxFrames) { DEBUG_LOG("%s", __FUNCTION__); - std::unique_lock lock(mStateMutex); - GET_DISPLAY_OR_RETURN_ERROR(); return ToBinderStatus(display->setDisplayedContentSamplingEnabled( @@ -677,8 +620,6 @@ ndk::ScopedAStatus ComposerClient::setPowerMode(int64_t displayId, PowerMode mode) { DEBUG_LOG("%s", __FUNCTION__); - std::unique_lock lock(mStateMutex); - GET_DISPLAY_OR_RETURN_ERROR(); return ToBinderStatus(display->setPowerMode(mode)); @@ -690,8 +631,6 @@ ndk::ScopedAStatus ComposerClient::setReadbackBuffer( const ndk::ScopedFileDescriptor& releaseFence) { DEBUG_LOG("%s", __FUNCTION__); - std::unique_lock lock(mStateMutex); - GET_DISPLAY_OR_RETURN_ERROR(); // Owned by mResources. @@ -718,8 +657,6 @@ ndk::ScopedAStatus ComposerClient::setVsyncEnabled(int64_t displayId, bool enabled) { DEBUG_LOG("%s", __FUNCTION__); - std::unique_lock lock(mStateMutex); - GET_DISPLAY_OR_RETURN_ERROR(); return ToBinderStatus(display->setVsyncEnabled(enabled)); @@ -729,8 +666,6 @@ ndk::ScopedAStatus ComposerClient::setIdleTimerEnabled(int64_t displayId, int32_t timeoutMs) { DEBUG_LOG("%s", __FUNCTION__); - std::unique_lock lock(mStateMutex); - GET_DISPLAY_OR_RETURN_ERROR(); return ToBinderStatus(display->setIdleTimerEnabled(timeoutMs)); @@ -809,14 +744,14 @@ namespace { do { \ const std::string errorString = toString(error); \ ALOGE("%s: display:%" PRId64 " failed with:%s", __FUNCTION__, \ - display->getId(), errorString.c_str()); \ + display.getId(), errorString.c_str()); \ } while (0) #define LOG_LAYER_COMMAND_ERROR(display, layer, error) \ do { \ const std::string errorString = toString(error); \ ALOGE("%s: display:%" PRId64 " layer:%" PRId64 " failed with:%s", \ - __FUNCTION__, display->getId(), layer->getId(), \ + __FUNCTION__, display.getId(), layer->getId(), \ errorString.c_str()); \ } while (0) @@ -824,36 +759,36 @@ namespace { void ComposerClient::executeDisplayCommand(CommandResultWriter& commandResults, const DisplayCommand& displayCommand) { - Display* display = getDisplay(displayCommand.display); + std::shared_ptr display = getDisplay(displayCommand.display); if (display == nullptr) { commandResults.addError(HWC3::Error::BadDisplay); return; } for (const LayerCommand& layerCmd : displayCommand.layers) { - executeLayerCommand(commandResults, display, layerCmd); + executeLayerCommand(commandResults, *display, layerCmd); } - DISPATCH_DISPLAY_COMMAND(displayCommand, commandResults, display, colorTransformMatrix, + DISPATCH_DISPLAY_COMMAND(displayCommand, commandResults, *display, colorTransformMatrix, SetColorTransform); - DISPATCH_DISPLAY_COMMAND(displayCommand, commandResults, display, brightness, SetBrightness); - DISPATCH_DISPLAY_COMMAND(displayCommand, commandResults, display, clientTarget, SetClientTarget); - DISPATCH_DISPLAY_COMMAND(displayCommand, commandResults, display, virtualDisplayOutputBuffer, + DISPATCH_DISPLAY_COMMAND(displayCommand, commandResults, *display, brightness, SetBrightness); + DISPATCH_DISPLAY_COMMAND(displayCommand, commandResults, *display, clientTarget, SetClientTarget); + DISPATCH_DISPLAY_COMMAND(displayCommand, commandResults, *display, virtualDisplayOutputBuffer, SetOutputBuffer); - DISPATCH_DISPLAY_BOOL_COMMAND_AND_DATA(displayCommand, commandResults, display, validateDisplay, + DISPATCH_DISPLAY_BOOL_COMMAND_AND_DATA(displayCommand, commandResults, *display, validateDisplay, expectedPresentTime, ValidateDisplay); - DISPATCH_DISPLAY_BOOL_COMMAND(displayCommand, commandResults, display, acceptDisplayChanges, + DISPATCH_DISPLAY_BOOL_COMMAND(displayCommand, commandResults, *display, acceptDisplayChanges, AcceptDisplayChanges); - DISPATCH_DISPLAY_BOOL_COMMAND(displayCommand, commandResults, display, presentDisplay, + DISPATCH_DISPLAY_BOOL_COMMAND(displayCommand, commandResults, *display, presentDisplay, PresentDisplay); - DISPATCH_DISPLAY_BOOL_COMMAND_AND_DATA(displayCommand, commandResults, display, + DISPATCH_DISPLAY_BOOL_COMMAND_AND_DATA(displayCommand, commandResults, *display, presentOrValidateDisplay, expectedPresentTime, PresentOrValidateDisplay); } -void ComposerClient::executeLayerCommand(CommandResultWriter& commandResults, Display* display, +void ComposerClient::executeLayerCommand(CommandResultWriter& commandResults, Display& display, const LayerCommand& layerCommand) { - Layer* layer = display->getLayer(layerCommand.layer); + Layer* layer = display.getLayer(layerCommand.layer); if (layer == nullptr) { commandResults.addError(HWC3::Error::BadLayer); return; @@ -886,11 +821,11 @@ void ComposerClient::executeLayerCommand(CommandResultWriter& commandResults, Di } void ComposerClient::executeDisplayCommandSetColorTransform(CommandResultWriter& commandResults, - Display* display, + Display& display, const std::vector& matrix) { DEBUG_LOG("%s", __FUNCTION__); - auto error = display->setColorTransform(matrix); + auto error = display.setColorTransform(matrix); if (error != HWC3::Error::None) { LOG_DISPLAY_COMMAND_ERROR(display, error); commandResults.addError(error); @@ -898,11 +833,11 @@ void ComposerClient::executeDisplayCommandSetColorTransform(CommandResultWriter& } void ComposerClient::executeDisplayCommandSetBrightness(CommandResultWriter& commandResults, - Display* display, + Display& display, const DisplayBrightness& brightness) { DEBUG_LOG("%s", __FUNCTION__); - auto error = display->setBrightness(brightness.brightness); + auto error = display.setBrightness(brightness.brightness); if (error != HWC3::Error::None) { LOG_DISPLAY_COMMAND_ERROR(display, error); commandResults.addError(error); @@ -910,7 +845,7 @@ void ComposerClient::executeDisplayCommandSetBrightness(CommandResultWriter& com } void ComposerClient::executeDisplayCommandSetClientTarget(CommandResultWriter& commandResults, - Display* display, + Display& display, const ClientTarget& clientTarget) { DEBUG_LOG("%s", __FUNCTION__); @@ -919,14 +854,14 @@ void ComposerClient::executeDisplayCommandSetClientTarget(CommandResultWriter& c auto releaser = mResources->createReleaser(/*isBuffer=*/true); auto error = mResources->getDisplayClientTarget( - display->getId(), clientTarget.buffer, &importedBuffer, releaser.get()); + display.getId(), clientTarget.buffer, &importedBuffer, releaser.get()); if (error != HWC3::Error::None) { LOG_DISPLAY_COMMAND_ERROR(display, error); commandResults.addError(error); return; } - error = display->setClientTarget(importedBuffer, clientTarget.buffer.fence, + error = display.setClientTarget(importedBuffer, clientTarget.buffer.fence, clientTarget.dataspace, clientTarget.damage); if (error != HWC3::Error::None) { LOG_DISPLAY_COMMAND_ERROR(display, error); @@ -936,7 +871,7 @@ void ComposerClient::executeDisplayCommandSetClientTarget(CommandResultWriter& c } void ComposerClient::executeDisplayCommandSetOutputBuffer(CommandResultWriter& commandResults, - Display* display, const Buffer& buffer) { + Display& display, const Buffer& buffer) { DEBUG_LOG("%s", __FUNCTION__); // Owned by mResources. @@ -944,14 +879,14 @@ void ComposerClient::executeDisplayCommandSetOutputBuffer(CommandResultWriter& c auto releaser = mResources->createReleaser(/*isBuffer=*/true); auto error = mResources->getDisplayOutputBuffer( - display->getId(), buffer, &importedBuffer, releaser.get()); + display.getId(), buffer, &importedBuffer, releaser.get()); if (error != HWC3::Error::None) { LOG_DISPLAY_COMMAND_ERROR(display, error); commandResults.addError(error); return; } - error = display->setOutputBuffer(importedBuffer, buffer.fence); + error = display.setOutputBuffer(importedBuffer, buffer.fence); if (error != HWC3::Error::None) { LOG_DISPLAY_COMMAND_ERROR(display, error); commandResults.addError(error); @@ -960,11 +895,11 @@ void ComposerClient::executeDisplayCommandSetOutputBuffer(CommandResultWriter& c } void ComposerClient::executeDisplayCommandValidateDisplay( - CommandResultWriter& commandResults, Display* display, + CommandResultWriter& commandResults, Display& display, const std::optional expectedPresentTime) { DEBUG_LOG("%s", __FUNCTION__); - auto error = display->setExpectedPresentTime(expectedPresentTime); + auto error = display.setExpectedPresentTime(expectedPresentTime); if (error != HWC3::Error::None) { LOG_DISPLAY_COMMAND_ERROR(display, error); commandResults.addError(error); @@ -972,7 +907,7 @@ void ComposerClient::executeDisplayCommandValidateDisplay( DisplayChanges changes; - error = display->validate(&changes); + error = display.validate(&changes); if (error != HWC3::Error::None) { LOG_DISPLAY_COMMAND_ERROR(display, error); commandResults.addError(error); @@ -980,14 +915,14 @@ void ComposerClient::executeDisplayCommandValidateDisplay( commandResults.addChanges(changes); } - mResources->setDisplayMustValidateState(display->getId(), false); + mResources->setDisplayMustValidateState(display.getId(), false); } void ComposerClient::executeDisplayCommandAcceptDisplayChanges(CommandResultWriter& commandResults, - Display* display) { + Display& display) { DEBUG_LOG("%s", __FUNCTION__); - auto error = display->acceptChanges(); + auto error = display.acceptChanges(); if (error != HWC3::Error::None) { LOG_DISPLAY_COMMAND_ERROR(display, error); commandResults.addError(error); @@ -995,13 +930,13 @@ void ComposerClient::executeDisplayCommandAcceptDisplayChanges(CommandResultWrit } void ComposerClient::executeDisplayCommandPresentOrValidateDisplay( - CommandResultWriter& commandResults, Display* display, + CommandResultWriter& commandResults, Display& display, const std::optional expectedPresentTime) { DEBUG_LOG("%s", __FUNCTION__); // TODO: Support SKIP_VALIDATE. - auto error = display->setExpectedPresentTime(expectedPresentTime); + auto error = display.setExpectedPresentTime(expectedPresentTime); if (error != HWC3::Error::None) { LOG_DISPLAY_COMMAND_ERROR(display, error); commandResults.addError(error); @@ -1009,26 +944,26 @@ void ComposerClient::executeDisplayCommandPresentOrValidateDisplay( DisplayChanges changes; - error = display->validate(&changes); + error = display.validate(&changes); if (error != HWC3::Error::None) { LOG_DISPLAY_COMMAND_ERROR(display, error); commandResults.addError(error); } else { - const int64_t displayId = display->getId(); + const int64_t displayId = display.getId(); commandResults.addChanges(changes); commandResults.addPresentOrValidateResult(displayId, PresentOrValidate::Result::Validated); } - mResources->setDisplayMustValidateState(display->getId(), false); + mResources->setDisplayMustValidateState(display.getId(), false); } void ComposerClient::executeDisplayCommandPresentDisplay(CommandResultWriter& commandResults, - Display* display) { + Display& display) { DEBUG_LOG("%s", __FUNCTION__); - if (mResources->mustValidateDisplay(display->getId())) { + if (mResources->mustValidateDisplay(display.getId())) { ALOGE("%s: display:%" PRIu64 " not validated", __FUNCTION__, - display->getId()); + display.getId()); commandResults.addError(HWC3::Error::NotValidated); return; } @@ -1036,19 +971,19 @@ void ComposerClient::executeDisplayCommandPresentDisplay(CommandResultWriter& co ::android::base::unique_fd displayFence; std::unordered_map layerFences; - auto error = display->present(&displayFence, &layerFences); + auto error = display.present(&displayFence, &layerFences); if (error != HWC3::Error::None) { LOG_DISPLAY_COMMAND_ERROR(display, error); commandResults.addError(error); } else { - const int64_t displayId = display->getId(); + const int64_t displayId = display.getId(); commandResults.addPresentFence(displayId, std::move(displayFence)); commandResults.addReleaseFences(displayId, std::move(layerFences)); } } void ComposerClient::executeLayerCommandSetLayerCursorPosition( - CommandResultWriter& commandResults, Display* display, Layer* layer, + CommandResultWriter& commandResults, Display& display, Layer* layer, const common::Point& cursorPosition) { DEBUG_LOG("%s", __FUNCTION__); @@ -1060,7 +995,7 @@ void ComposerClient::executeLayerCommandSetLayerCursorPosition( } void ComposerClient::executeLayerCommandSetLayerBuffer(CommandResultWriter& commandResults, - Display* display, Layer* layer, + Display& display, Layer* layer, const Buffer& buffer) { DEBUG_LOG("%s", __FUNCTION__); @@ -1069,7 +1004,7 @@ void ComposerClient::executeLayerCommandSetLayerBuffer(CommandResultWriter& comm auto releaser = mResources->createReleaser(/*isBuffer=*/true); auto error = - mResources->getLayerBuffer(display->getId(), layer->getId(), buffer, + mResources->getLayerBuffer(display.getId(), layer->getId(), buffer, &importedBuffer, releaser.get()); if (error != HWC3::Error::None) { LOG_LAYER_COMMAND_ERROR(display, layer, error); @@ -1085,7 +1020,7 @@ void ComposerClient::executeLayerCommandSetLayerBuffer(CommandResultWriter& comm } void ComposerClient::executeLayerCommandSetLayerSurfaceDamage( - CommandResultWriter& commandResults, Display* display, Layer* layer, + CommandResultWriter& commandResults, Display& display, Layer* layer, const std::vector>& damage) { DEBUG_LOG("%s", __FUNCTION__); @@ -1097,7 +1032,7 @@ void ComposerClient::executeLayerCommandSetLayerSurfaceDamage( } void ComposerClient::executeLayerCommandSetLayerBlendMode(CommandResultWriter& commandResults, - Display* display, Layer* layer, + Display& display, Layer* layer, const ParcelableBlendMode& blendMode) { DEBUG_LOG("%s", __FUNCTION__); @@ -1109,7 +1044,7 @@ void ComposerClient::executeLayerCommandSetLayerBlendMode(CommandResultWriter& c } void ComposerClient::executeLayerCommandSetLayerColor(CommandResultWriter& commandResults, - Display* display, Layer* layer, + Display& display, Layer* layer, const Color& color) { DEBUG_LOG("%s", __FUNCTION__); @@ -1121,7 +1056,7 @@ void ComposerClient::executeLayerCommandSetLayerColor(CommandResultWriter& comma } void ComposerClient::executeLayerCommandSetLayerComposition( - CommandResultWriter& commandResults, Display* display, Layer* layer, + CommandResultWriter& commandResults, Display& display, Layer* layer, const ParcelableComposition& composition) { DEBUG_LOG("%s", __FUNCTION__); @@ -1133,7 +1068,7 @@ void ComposerClient::executeLayerCommandSetLayerComposition( } void ComposerClient::executeLayerCommandSetLayerDataspace(CommandResultWriter& commandResults, - Display* display, Layer* layer, + Display& display, Layer* layer, const ParcelableDataspace& dataspace) { DEBUG_LOG("%s", __FUNCTION__); @@ -1145,7 +1080,7 @@ void ComposerClient::executeLayerCommandSetLayerDataspace(CommandResultWriter& c } void ComposerClient::executeLayerCommandSetLayerDisplayFrame(CommandResultWriter& commandResults, - Display* display, Layer* layer, + Display& display, Layer* layer, const common::Rect& rect) { DEBUG_LOG("%s", __FUNCTION__); @@ -1157,7 +1092,7 @@ void ComposerClient::executeLayerCommandSetLayerDisplayFrame(CommandResultWriter } void ComposerClient::executeLayerCommandSetLayerPlaneAlpha(CommandResultWriter& commandResults, - Display* display, Layer* layer, + Display& display, Layer* layer, const PlaneAlpha& planeAlpha) { DEBUG_LOG("%s", __FUNCTION__); @@ -1169,7 +1104,7 @@ void ComposerClient::executeLayerCommandSetLayerPlaneAlpha(CommandResultWriter& } void ComposerClient::executeLayerCommandSetLayerSidebandStream( - CommandResultWriter& commandResults, Display* display, Layer* layer, + CommandResultWriter& commandResults, Display& display, Layer* layer, const aidl::android::hardware::common::NativeHandle& handle) { DEBUG_LOG("%s", __FUNCTION__); @@ -1178,7 +1113,7 @@ void ComposerClient::executeLayerCommandSetLayerSidebandStream( auto releaser = mResources->createReleaser(/*isBuffer=*/false); auto error = mResources->getLayerSidebandStream( - display->getId(), layer->getId(), handle, &importedStream, + display.getId(), layer->getId(), handle, &importedStream, releaser.get()); if (error != HWC3::Error::None) { LOG_LAYER_COMMAND_ERROR(display, layer, error); @@ -1194,7 +1129,7 @@ void ComposerClient::executeLayerCommandSetLayerSidebandStream( } void ComposerClient::executeLayerCommandSetLayerSourceCrop(CommandResultWriter& commandResults, - Display* display, Layer* layer, + Display& display, Layer* layer, const common::FRect& sourceCrop) { DEBUG_LOG("%s", __FUNCTION__); @@ -1206,7 +1141,7 @@ void ComposerClient::executeLayerCommandSetLayerSourceCrop(CommandResultWriter& } void ComposerClient::executeLayerCommandSetLayerTransform(CommandResultWriter& commandResults, - Display* display, Layer* layer, + Display& display, Layer* layer, const ParcelableTransform& transform) { DEBUG_LOG("%s", __FUNCTION__); @@ -1218,7 +1153,7 @@ void ComposerClient::executeLayerCommandSetLayerTransform(CommandResultWriter& c } void ComposerClient::executeLayerCommandSetLayerVisibleRegion( - CommandResultWriter& commandResults, Display* display, Layer* layer, + CommandResultWriter& commandResults, Display& display, Layer* layer, const std::vector>& visibleRegion) { DEBUG_LOG("%s", __FUNCTION__); @@ -1230,7 +1165,7 @@ void ComposerClient::executeLayerCommandSetLayerVisibleRegion( } void ComposerClient::executeLayerCommandSetLayerZOrder(CommandResultWriter& commandResults, - Display* display, Layer* layer, + Display& display, Layer* layer, const ZOrder& zOrder) { DEBUG_LOG("%s", __FUNCTION__); @@ -1242,7 +1177,7 @@ void ComposerClient::executeLayerCommandSetLayerZOrder(CommandResultWriter& comm } void ComposerClient::executeLayerCommandSetLayerPerFrameMetadata( - CommandResultWriter& commandResults, Display* display, Layer* layer, + CommandResultWriter& commandResults, Display& display, Layer* layer, const std::vector>& perFrameMetadata) { DEBUG_LOG("%s", __FUNCTION__); @@ -1254,7 +1189,7 @@ void ComposerClient::executeLayerCommandSetLayerPerFrameMetadata( } void ComposerClient::executeLayerCommandSetLayerColorTransform( - CommandResultWriter& commandResults, Display* display, Layer* layer, + CommandResultWriter& commandResults, Display& display, Layer* layer, const std::vector& colorTransform) { DEBUG_LOG("%s", __FUNCTION__); @@ -1266,7 +1201,7 @@ void ComposerClient::executeLayerCommandSetLayerColorTransform( } void ComposerClient::executeLayerCommandSetLayerBrightness(CommandResultWriter& commandResults, - Display* display, Layer* layer, + Display& display, Layer* layer, const LayerBrightness& brightness) { DEBUG_LOG("%s", __FUNCTION__); @@ -1278,7 +1213,7 @@ void ComposerClient::executeLayerCommandSetLayerBrightness(CommandResultWriter& } void ComposerClient::executeLayerCommandSetLayerPerFrameMetadataBlobs( - CommandResultWriter& commandResults, Display* display, Layer* layer, + CommandResultWriter& commandResults, Display& display, Layer* layer, const std::vector>& perFrameMetadataBlob) { DEBUG_LOG("%s", __FUNCTION__); @@ -1289,13 +1224,15 @@ void ComposerClient::executeLayerCommandSetLayerPerFrameMetadataBlobs( } } -Display* ComposerClient::getDisplay(int64_t displayId) { +std::shared_ptr ComposerClient::getDisplay(int64_t displayId) { + std::unique_lock lock(mDisplaysMutex); + auto it = mDisplays.find(displayId); if (it == mDisplays.end()) { ALOGE("%s: no display:%" PRIu64, __FUNCTION__, displayId); return nullptr; } - return it->second.get(); + return it->second; } HWC3::Error ComposerClient::createDisplaysLocked() { @@ -1336,7 +1273,7 @@ HWC3::Error ComposerClient::createDisplayLocked( return HWC3::Error::NoResources; } - auto display = std::make_unique(mComposer, displayId); + auto display = std::make_shared(mComposer, displayId); if (display == nullptr) { ALOGE("%s failed to allocate display", __FUNCTION__); return HWC3::Error::NoResources; @@ -1431,21 +1368,20 @@ HWC3::Error ComposerClient::handleHotplug(bool connected, uint32_t id, static_cast(height), static_cast(dpiX), static_cast(dpiY), static_cast(refreshRate))}; { - std::unique_lock lock(mStateMutex); + std::unique_lock lock(mDisplaysMutex); createDisplayLocked(displayId, configId, configs); } - ALOGI("Connecting display:%" PRIu32 " w:%" PRIu32 " h:%" PRIu32 + ALOGI("Hotplug connecting display:%" PRIu32 " w:%" PRIu32 " h:%" PRIu32 " dpiX:%" PRIu32 " dpiY %" PRIu32 "fps %" PRIu32, id, width, height, dpiX, dpiY, refreshRate); mCallbacks->onHotplug(displayId, /*connected=*/true); } else { - ALOGI("Disconnecting display:%" PRIu64, displayId); + ALOGI("Hotplug disconnecting display:%" PRIu64, displayId); mCallbacks->onHotplug(displayId, /*connected=*/false); - Display* display = getDisplay(displayId); - if (display != nullptr) { - std::unique_lock lock(mStateMutex); + { + std::unique_lock lock(mDisplaysMutex); destroyDisplayLocked(displayId); } } diff --git a/system/hwc3/ComposerClient.h b/system/hwc3/ComposerClient.h index b301f2b6..75f9a36a 100644 --- a/system/hwc3/ComposerClient.h +++ b/system/hwc3/ComposerClient.h @@ -150,75 +150,75 @@ class ComposerClient : public BnComposerClient { void executeDisplayCommand(CommandResultWriter& commandResults, const DisplayCommand& displayCommand); - void executeLayerCommand(CommandResultWriter& commandResults, Display* display, + void executeLayerCommand(CommandResultWriter& commandResults, Display& display, const LayerCommand& layerCommand); - void executeDisplayCommandSetColorTransform(CommandResultWriter& commandResults, Display* display, + void executeDisplayCommandSetColorTransform(CommandResultWriter& commandResults, Display& display, const std::vector& matrix); - void executeDisplayCommandSetBrightness(CommandResultWriter& commandResults, Display* display, + void executeDisplayCommandSetBrightness(CommandResultWriter& commandResults, Display& display, const DisplayBrightness& brightness); - void executeDisplayCommandSetClientTarget(CommandResultWriter& commandResults, Display* display, + void executeDisplayCommandSetClientTarget(CommandResultWriter& commandResults, Display& display, const ClientTarget& command); - void executeDisplayCommandSetOutputBuffer(CommandResultWriter& commandResults, Display* display, + void executeDisplayCommandSetOutputBuffer(CommandResultWriter& commandResults, Display& display, const Buffer& buffer); void executeDisplayCommandValidateDisplay( - CommandResultWriter& commandResults, Display* display, + CommandResultWriter& commandResults, Display& display, const std::optional expectedPresentTime); void executeDisplayCommandAcceptDisplayChanges(CommandResultWriter& commandResults, - Display* display); + Display& display); void executeDisplayCommandPresentOrValidateDisplay( - CommandResultWriter& commandResults, Display* display, + CommandResultWriter& commandResults, Display& display, const std::optional expectedPresentTime); - void executeDisplayCommandPresentDisplay(CommandResultWriter& commandResults, Display* display); + void executeDisplayCommandPresentDisplay(CommandResultWriter& commandResults, Display& display); void executeLayerCommandSetLayerCursorPosition(CommandResultWriter& commandResults, - Display* display, Layer* layer, + Display& display, Layer* layer, const common::Point& cursorPosition); - void executeLayerCommandSetLayerBuffer(CommandResultWriter& commandResults, Display* display, + void executeLayerCommandSetLayerBuffer(CommandResultWriter& commandResults, Display& display, Layer* layer, const Buffer& buffer); void executeLayerCommandSetLayerSurfaceDamage( - CommandResultWriter& commandResults, Display* display, Layer* layer, + CommandResultWriter& commandResults, Display& display, Layer* layer, const std::vector>& damage); - void executeLayerCommandSetLayerBlendMode(CommandResultWriter& commandResults, Display* display, + void executeLayerCommandSetLayerBlendMode(CommandResultWriter& commandResults, Display& display, Layer* layer, const ParcelableBlendMode& blendMode); - void executeLayerCommandSetLayerColor(CommandResultWriter& commandResults, Display* display, + void executeLayerCommandSetLayerColor(CommandResultWriter& commandResults, Display& display, Layer* layer, const Color& color); - void executeLayerCommandSetLayerComposition(CommandResultWriter& commandResults, Display* display, + void executeLayerCommandSetLayerComposition(CommandResultWriter& commandResults, Display& display, Layer* layer, const ParcelableComposition& composition); - void executeLayerCommandSetLayerDataspace(CommandResultWriter& commandResults, Display* display, + void executeLayerCommandSetLayerDataspace(CommandResultWriter& commandResults, Display& display, Layer* layer, const ParcelableDataspace& dataspace); void executeLayerCommandSetLayerDisplayFrame(CommandResultWriter& commandResults, - Display* display, Layer* layer, + Display& display, Layer* layer, const common::Rect& rect); - void executeLayerCommandSetLayerPlaneAlpha(CommandResultWriter& commandResults, Display* display, + void executeLayerCommandSetLayerPlaneAlpha(CommandResultWriter& commandResults, Display& display, Layer* layer, const PlaneAlpha& planeAlpha); void executeLayerCommandSetLayerSidebandStream( - CommandResultWriter& commandResults, Display* display, Layer* layer, + CommandResultWriter& commandResults, Display& display, Layer* layer, const aidl::android::hardware::common::NativeHandle& sidebandStream); - void executeLayerCommandSetLayerSourceCrop(CommandResultWriter& commandResults, Display* display, + void executeLayerCommandSetLayerSourceCrop(CommandResultWriter& commandResults, Display& display, Layer* layer, const common::FRect& sourceCrop); - void executeLayerCommandSetLayerTransform(CommandResultWriter& commandResults, Display* display, + void executeLayerCommandSetLayerTransform(CommandResultWriter& commandResults, Display& display, Layer* layer, const ParcelableTransform& transform); void executeLayerCommandSetLayerVisibleRegion( - CommandResultWriter& commandResults, Display* display, Layer* layer, + CommandResultWriter& commandResults, Display& display, Layer* layer, const std::vector>& visibleRegion); - void executeLayerCommandSetLayerZOrder(CommandResultWriter& commandResults, Display* display, + void executeLayerCommandSetLayerZOrder(CommandResultWriter& commandResults, Display& display, Layer* layer, const ZOrder& zOrder); void executeLayerCommandSetLayerPerFrameMetadata( - CommandResultWriter& commandResults, Display* display, Layer* layer, + CommandResultWriter& commandResults, Display& display, Layer* layer, const std::vector>& perFrameMetadata); void executeLayerCommandSetLayerColorTransform(CommandResultWriter& commandResults, - Display* display, Layer* layer, + Display& display, Layer* layer, const std::vector& colorTransform); - void executeLayerCommandSetLayerBrightness(CommandResultWriter& commandResults, Display* display, + void executeLayerCommandSetLayerBrightness(CommandResultWriter& commandResults, Display& display, Layer* layer, const LayerBrightness& brightness); void executeLayerCommandSetLayerPerFrameMetadataBlobs( - CommandResultWriter& commandResults, Display* display, Layer* layer, + CommandResultWriter& commandResults, Display& display, Layer* layer, const std::vector>& perFrameMetadataBlob); // Returns the display with the given id or nullptr if not found. - Display* getDisplay(int64_t displayId); + std::shared_ptr getDisplay(int64_t displayId); // Finds the Cuttlefish/Goldfish specific configuration and initializes the // displays. @@ -240,9 +240,8 @@ class ComposerClient : public BnComposerClient { uint32_t dpiY, // uint32_t refreshRate); - std::mutex mStateMutex; - - std::map> mDisplays; + std::mutex mDisplaysMutex; + std::map> mDisplays; // The onHotplug(), onVsync(), etc callbacks registered by SurfaceFlinger. std::shared_ptr mCallbacks; -- cgit v1.2.3 From e72c97e1945b1de1385c17a351b2d2fdc00b61dc Mon Sep 17 00:00:00 2001 From: Jason Macnak Date: Thu, 30 Nov 2023 14:38:52 -0800 Subject: Enable thread safety analysis and fix some findings Note: removes thready safety analysis around mClient/mClientMutex because waitForClientDestroyedLocked() with the conditional return hits https://releases.llvm.org/3.5.0/tools/clang/docs/ThreadSafetyAnalysis.html#no-conditionally-held-locks Bug: b/248355957 Test: cvd start \ --display=width=720,height=1280 \ --display=widht=720,height=1280 Open Youtube on display 1 Open Camera on display 2 Test: cvd start --gpu_mode=gfxstream \ --display=width=720,height=1280 \ --display=widht=720,height=1280 Open Youtube on display 1 Open Camera on display 2 Test: vts -m VtsHalGraphicsComposer3_TargetTest Change-Id: I22563ba0b3a6deda5a2229deb606356c78567fd6 --- system/hwc3/Android.bp | 5 ++++- system/hwc3/Composer.h | 4 ++-- system/hwc3/ComposerClient.cpp | 19 +++++++++++-------- system/hwc3/ComposerClient.h | 13 +++++++------ 4 files changed, 24 insertions(+), 17 deletions(-) diff --git a/system/hwc3/Android.bp b/system/hwc3/Android.bp index 8abf442f..f53bc477 100644 --- a/system/hwc3/Android.bp +++ b/system/hwc3/Android.bp @@ -22,7 +22,6 @@ package { } cc_binary { - name: "android.hardware.graphics.composer3-service.ranchu", relative_install_path: "hw", @@ -90,6 +89,10 @@ cc_binary { "VsyncThread.cpp", ], + cflags: [ + "-Wthread-safety", + ], + vintf_fragments: ["hwc3.xml"], init_rc: ["hwc3.rc"], diff --git a/system/hwc3/Composer.h b/system/hwc3/Composer.h index f5641696..0f363cc5 100644 --- a/system/hwc3/Composer.h +++ b/system/hwc3/Composer.h @@ -18,7 +18,7 @@ #define ANDROID_HWC_COMPOSER_H #include -#include +#include #include @@ -46,7 +46,7 @@ class Composer : public BnComposer { void onClientDestroyed(); std::mutex mClientMutex; - std::weak_ptr mClient GUARDED_BY(mClientMutex); + std::weak_ptr mClient; std::condition_variable mClientDestroyedCondition; }; diff --git a/system/hwc3/ComposerClient.cpp b/system/hwc3/ComposerClient.cpp index 452cd874..7697f707 100644 --- a/system/hwc3/ComposerClient.cpp +++ b/system/hwc3/ComposerClient.cpp @@ -106,7 +106,7 @@ ComposerClient::ComposerClient() { DEBUG_LOG("%s", __FUNCTION__); } ComposerClient::~ComposerClient() { DEBUG_LOG("%s", __FUNCTION__); - std::unique_lock lock(mDisplaysMutex); + std::lock_guard lock(mDisplaysMutex); destroyDisplaysLocked(); @@ -120,7 +120,7 @@ HWC3::Error ComposerClient::init() { HWC3::Error error = HWC3::Error::None; - std::unique_lock lock(mDisplaysMutex); + std::lock_guard lock(mDisplaysMutex); mResources = std::make_unique(); if (!mResources) { @@ -465,14 +465,17 @@ ndk::ScopedAStatus ComposerClient::registerCallback( mCallbacks = callback; - for (auto& [_, display] : mDisplays) { - display->registerCallback(callback); + { + std::lock_guard lock(mDisplaysMutex); + for (auto& [_, display] : mDisplays) { + display->registerCallback(callback); + } } if (isFirstRegisterCallback) { std::vector displayIds; { - std::unique_lock lock(mDisplaysMutex); + std::lock_guard lock(mDisplaysMutex); for (auto& [displayId, _] : mDisplays) { displayIds.push_back(displayId); } @@ -1225,7 +1228,7 @@ void ComposerClient::executeLayerCommandSetLayerPerFrameMetadataBlobs( } std::shared_ptr ComposerClient::getDisplay(int64_t displayId) { - std::unique_lock lock(mDisplaysMutex); + std::lock_guard lock(mDisplaysMutex); auto it = mDisplays.find(displayId); if (it == mDisplays.end()) { @@ -1368,7 +1371,7 @@ HWC3::Error ComposerClient::handleHotplug(bool connected, uint32_t id, static_cast(height), static_cast(dpiX), static_cast(dpiY), static_cast(refreshRate))}; { - std::unique_lock lock(mDisplaysMutex); + std::lock_guard lock(mDisplaysMutex); createDisplayLocked(displayId, configId, configs); } @@ -1381,7 +1384,7 @@ HWC3::Error ComposerClient::handleHotplug(bool connected, uint32_t id, mCallbacks->onHotplug(displayId, /*connected=*/false); { - std::unique_lock lock(mDisplaysMutex); + std::lock_guard lock(mDisplaysMutex); destroyDisplayLocked(displayId); } } diff --git a/system/hwc3/ComposerClient.h b/system/hwc3/ComposerClient.h index 75f9a36a..b64499b0 100644 --- a/system/hwc3/ComposerClient.h +++ b/system/hwc3/ComposerClient.h @@ -18,7 +18,7 @@ #define ANDROID_HWC_COMPOSERCLIENT_H #include -#include +#include #include @@ -222,15 +222,16 @@ class ComposerClient : public BnComposerClient { // Finds the Cuttlefish/Goldfish specific configuration and initializes the // displays. - HWC3::Error createDisplaysLocked(); + HWC3::Error createDisplaysLocked() EXCLUSIVE_LOCKS_REQUIRED(mDisplaysMutex); // Creates a display with the given properties. HWC3::Error createDisplayLocked(int64_t displayId, int32_t activeConfigId, - const std::vector& configs); + const std::vector& configs) + EXCLUSIVE_LOCKS_REQUIRED(mDisplaysMutex); - HWC3::Error destroyDisplaysLocked(); + HWC3::Error destroyDisplaysLocked() EXCLUSIVE_LOCKS_REQUIRED(mDisplaysMutex); - HWC3::Error destroyDisplayLocked(int64_t displayId); + HWC3::Error destroyDisplayLocked(int64_t displayId) EXCLUSIVE_LOCKS_REQUIRED(mDisplaysMutex); HWC3::Error handleHotplug(bool connected, // uint32_t id, // @@ -241,7 +242,7 @@ class ComposerClient : public BnComposerClient { uint32_t refreshRate); std::mutex mDisplaysMutex; - std::map> mDisplays; + std::map> mDisplays GUARDED_BY(mDisplaysMutex); // The onHotplug(), onVsync(), etc callbacks registered by SurfaceFlinger. std::shared_ptr mCallbacks; -- cgit v1.2.3 From 6437903b7a4ced12307f59446ee0248a383a74f5 Mon Sep 17 00:00:00 2001 From: Bo Hu Date: Fri, 1 Dec 2023 15:25:46 -0800 Subject: avc decoder: avoid access iterator after erase from map Bug: 241232433 Change-Id: I081758794c5406e566eec33f42d97e88e8521f61 --- system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.cpp b/system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.cpp index 6c57922e..988a35cf 100644 --- a/system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.cpp +++ b/system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.cpp @@ -803,15 +803,15 @@ void C2GoldfishAvcDec::removePts(uint64_t pts) { if (!mOldPts2Index.empty()) { auto iter = mOldPts2Index.find(pts); if (iter != mOldPts2Index.end()) { - mOldPts2Index.erase(iter); index = iter->second; + mOldPts2Index.erase(iter); found = true; } } else { auto iter = mPts2Index.find(pts); if (iter != mPts2Index.end()) { - mPts2Index.erase(iter); index = iter->second; + mPts2Index.erase(iter); found = true; } } -- cgit v1.2.3 From 1c89a33efbe94f209cc42a086ba7da6f003a481a Mon Sep 17 00:00:00 2001 From: Bo Hu Date: Fri, 1 Dec 2023 15:29:22 -0800 Subject: hevc decoder: avoid access iterator after erase from map Bug: 241232433 Change-Id: Ib11fc6b8092450a32fa5b687bd0f16d7564f8152 --- system/codecs/c2/decoders/hevcdec/C2GoldfishHevcDec.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/codecs/c2/decoders/hevcdec/C2GoldfishHevcDec.cpp b/system/codecs/c2/decoders/hevcdec/C2GoldfishHevcDec.cpp index 13e9515d..adf6ce78 100644 --- a/system/codecs/c2/decoders/hevcdec/C2GoldfishHevcDec.cpp +++ b/system/codecs/c2/decoders/hevcdec/C2GoldfishHevcDec.cpp @@ -809,15 +809,15 @@ void C2GoldfishHevcDec::removePts(uint64_t pts) { if (!mOldPts2Index.empty()) { auto iter = mOldPts2Index.find(pts); if (iter != mOldPts2Index.end()) { - mOldPts2Index.erase(iter); index = iter->second; + mOldPts2Index.erase(iter); found = true; } } else { auto iter = mPts2Index.find(pts); if (iter != mPts2Index.end()) { - mPts2Index.erase(iter); index = iter->second; + mPts2Index.erase(iter); found = true; } } -- cgit v1.2.3