diff options
| author | 2019-08-19 09:11:33 -0700 | |
|---|---|---|
| committer | 2019-09-03 11:54:31 -0700 | |
| commit | 94e91f62bb251bc08864e1aa5f0e9e30908ba35d (patch) | |
| tree | f507731c293eeba9fc208939db172095947faf8b | |
| parent | becd6bd4b68cc6594e2fe149da8de705a648b199 (diff) | |
Rev up vr_hwc to composer@2.3
Fix for issue: "[GSI XR] VrFlinger doesn't work on GSI/MTP845."
The flow that causes the issue is:
SurfaceFlinger gets an hotplug event and adds a display id of the
internal display (For instance, display id of 19260371107735809). This
display id gets added to the HWComposer through the hotplug event.
When updateVrFlinger() is eventually called in SurfaceFlinger, a new
HWComposer is created which has no display ids being tracked in
HWComposer. Another hotplug event starts from vr_hwc.cpp, which has a
display id of 0. SurfaceFlinger receives this hot plug event so
SurfaceFlinger has an display ids of [19260371107735809, 0]. HWComposer
only has display id 0.
Next processDisplayChangesLocked() is called in SurfaceFlinger and a new
FramebufferSurface is created with display id 19260371107735809.
In the FramebufferSurface it tries to call getActiveConfig() in
HWComposer with the display id of 19260371107735809, which HWComposer
does not know about. This results in a crash.
The display id is created from the edid data and display port.
The fix is to have the vr_hwc return the same edid data and display port
as the internal display. This will make the display id originating
from vr_hwc be the same as the internal display id. SurfaceFlinger
will now only have the display id of 19260371107735809, since it does not
overwrite the same display id on the hotplug events. HWComposer will only
have display id of 19260371107735809. The SurfaceFlinger and HwComposer
display ids match the code works correctly now.
This is accomplished by creating a version 2.0 of the vr_composer_client
and having vr_hwc inherit from version 2.3 instead of version 2.1 of the
composer hal. These changes are required to be able to pass through the
edid data. The display port and edid data is retrieved by vr_hwc via the
display_client.
The other required changes needed for this to work is:
ag/9215156
ag/9226524
Bug: 137325030
Bug: 138938154
Bug: 137448042
Test: manual - ran through modified unit test to make sure the edid data
was returned on the MTP 845.
Change-Id: I1c54e6cfda348260cf1013d6dca0dda58acb3b3c
| -rw-r--r-- | libs/vr/libdisplay/display_client.cpp | 4 | ||||
| -rw-r--r-- | libs/vr/libdisplay/include/private/dvr/display_client.h | 1 | ||||
| -rw-r--r-- | libs/vr/libdisplay/include/private/dvr/display_protocol.h | 3 | ||||
| -rw-r--r-- | libs/vr/libvrflinger/Android.bp | 2 | ||||
| -rw-r--r-- | libs/vr/libvrflinger/display_service.cpp | 13 | ||||
| -rw-r--r-- | libs/vr/libvrflinger/display_service.h | 2 | ||||
| -rw-r--r-- | services/surfaceflinger/Android.bp | 21 | ||||
| -rw-r--r-- | services/surfaceflinger/CompositionEngine/Android.bp | 2 | ||||
| -rw-r--r-- | services/surfaceflinger/DisplayHardware/ComposerHal.cpp | 44 | ||||
| -rw-r--r-- | services/surfaceflinger/DisplayHardware/ComposerHal.h | 16 | ||||
| -rw-r--r-- | services/vr/hardware_composer/Android.bp | 16 | ||||
| -rw-r--r-- | services/vr/hardware_composer/impl/vr_composer_client.cpp | 22 | ||||
| -rw-r--r-- | services/vr/hardware_composer/impl/vr_composer_client.h | 15 | ||||
| -rw-r--r-- | services/vr/hardware_composer/impl/vr_hwc.cpp | 296 | ||||
| -rw-r--r-- | services/vr/hardware_composer/impl/vr_hwc.h | 173 |
15 files changed, 456 insertions, 174 deletions
diff --git a/libs/vr/libdisplay/display_client.cpp b/libs/vr/libdisplay/display_client.cpp index f67e258cee..62856dfbf8 100644 --- a/libs/vr/libdisplay/display_client.cpp +++ b/libs/vr/libdisplay/display_client.cpp @@ -178,6 +178,10 @@ Status<std::string> DisplayClient::GetConfigurationData( return status; } +Status<uint8_t> DisplayClient::GetDisplayIdentificationPort() { + return InvokeRemoteMethod<DisplayProtocol::GetDisplayIdentificationPort>(); +} + Status<std::unique_ptr<Surface>> DisplayClient::CreateSurface( const SurfaceAttributes& attributes) { int error; diff --git a/libs/vr/libdisplay/include/private/dvr/display_client.h b/libs/vr/libdisplay/include/private/dvr/display_client.h index f8f5b3ddb3..81546ac5c2 100644 --- a/libs/vr/libdisplay/include/private/dvr/display_client.h +++ b/libs/vr/libdisplay/include/private/dvr/display_client.h @@ -72,6 +72,7 @@ class DisplayClient : public pdx::ClientBase<DisplayClient> { public: pdx::Status<Metrics> GetDisplayMetrics(); pdx::Status<std::string> GetConfigurationData(ConfigFileType config_type); + pdx::Status<uint8_t> GetDisplayIdentificationPort(); pdx::Status<std::unique_ptr<IonBuffer>> SetupGlobalBuffer( DvrGlobalBufferKey key, size_t size, uint64_t usage); pdx::Status<void> DeleteGlobalBuffer(DvrGlobalBufferKey key); diff --git a/libs/vr/libdisplay/include/private/dvr/display_protocol.h b/libs/vr/libdisplay/include/private/dvr/display_protocol.h index 861dc6c2a0..9f4cc4afcc 100644 --- a/libs/vr/libdisplay/include/private/dvr/display_protocol.h +++ b/libs/vr/libdisplay/include/private/dvr/display_protocol.h @@ -211,6 +211,7 @@ struct DisplayProtocol { kOpGetSurfaceInfo, kOpCreateQueue, kOpSetAttributes, + kOpGetDisplayIdentificationPort, }; // Aliases. @@ -221,6 +222,8 @@ struct DisplayProtocol { PDX_REMOTE_METHOD(GetMetrics, kOpGetMetrics, Metrics(Void)); PDX_REMOTE_METHOD(GetConfigurationData, kOpGetConfigurationData, std::string(ConfigFileType config_type)); + PDX_REMOTE_METHOD(GetDisplayIdentificationPort, + kOpGetDisplayIdentificationPort, uint8_t(Void)); PDX_REMOTE_METHOD(SetupGlobalBuffer, kOpSetupGlobalBuffer, LocalNativeBufferHandle(DvrGlobalBufferKey key, size_t size, uint64_t usage)); diff --git a/libs/vr/libvrflinger/Android.bp b/libs/vr/libvrflinger/Android.bp index 282935307c..444167227c 100644 --- a/libs/vr/libvrflinger/Android.bp +++ b/libs/vr/libvrflinger/Android.bp @@ -35,7 +35,7 @@ staticLibraries = [ ] sharedLibraries = [ - "android.frameworks.vr.composer@1.0", + "android.frameworks.vr.composer@2.0", "android.hardware.graphics.allocator@2.0", "android.hardware.graphics.composer@2.1", "android.hardware.graphics.composer@2.2", diff --git a/libs/vr/libvrflinger/display_service.cpp b/libs/vr/libvrflinger/display_service.cpp index 8980a92776..5a9360c2ae 100644 --- a/libs/vr/libvrflinger/display_service.cpp +++ b/libs/vr/libvrflinger/display_service.cpp @@ -47,7 +47,8 @@ DisplayService::DisplayService(Hwc2::Composer* hidl, uint8_t port; const auto error = hidl->getDisplayIdentificationData( - primary_display_id, &port, &display_identification_data_); + primary_display_id, &display_identification_port_, + &display_identification_data_); if (error != android::hardware::graphics::composer::V2_1::Error::NONE) { if (error != android::hardware::graphics::composer::V2_1::Error::UNSUPPORTED) { @@ -151,6 +152,11 @@ Status<void> DisplayService::HandleMessage(pdx::Message& message) { *this, &DisplayService::OnGetConfigurationData, message); return {}; + case DisplayProtocol::GetDisplayIdentificationPort::Opcode: + DispatchRemoteMethod<DisplayProtocol::GetDisplayIdentificationPort>( + *this, &DisplayService::OnGetDisplayIdentificationPort, message); + return {}; + case DisplayProtocol::CreateSurface::Opcode: DispatchRemoteMethod<DisplayProtocol::CreateSurface>( *this, &DisplayService::OnCreateSurface, message); @@ -238,6 +244,11 @@ pdx::Status<std::string> DisplayService::OnGetConfigurationData( return std::move(data); } +pdx::Status<uint8_t> DisplayService::OnGetDisplayIdentificationPort( + pdx::Message& /*message*/) { + return display_identification_port_; +} + // Creates a new DisplaySurface and associates it with this channel. This may // only be done once per channel. Status<display::SurfaceInfo> DisplayService::OnCreateSurface( diff --git a/libs/vr/libvrflinger/display_service.h b/libs/vr/libvrflinger/display_service.h index d45a61fad7..06ba566d32 100644 --- a/libs/vr/libvrflinger/display_service.h +++ b/libs/vr/libvrflinger/display_service.h @@ -82,6 +82,7 @@ class DisplayService : public pdx::ServiceBase<DisplayService> { pdx::Status<display::Metrics> OnGetMetrics(pdx::Message& message); pdx::Status<std::string> OnGetConfigurationData( pdx::Message& message, display::ConfigFileType config_type); + pdx::Status<uint8_t> OnGetDisplayIdentificationPort(pdx::Message& message); pdx::Status<display::SurfaceInfo> OnCreateSurface( pdx::Message& message, const display::SurfaceAttributes& attributes); pdx::Status<BorrowedNativeBufferHandle> OnSetupGlobalBuffer( @@ -121,6 +122,7 @@ class DisplayService : public pdx::ServiceBase<DisplayService> { void operator=(const DisplayService&) = delete; DisplayIdentificationData display_identification_data_; + uint8_t display_identification_port_; }; } // namespace dvr diff --git a/services/surfaceflinger/Android.bp b/services/surfaceflinger/Android.bp index afb9cec4cc..97b7697485 100644 --- a/services/surfaceflinger/Android.bp +++ b/services/surfaceflinger/Android.bp @@ -19,7 +19,7 @@ cc_defaults { "-DEGL_EGLEXT_PROTOTYPES", ], shared_libs: [ - "android.frameworks.vr.composer@1.0", + "android.frameworks.vr.composer@2.0", "android.hardware.configstore-utils", "android.hardware.configstore@1.0", "android.hardware.configstore@1.1", @@ -58,6 +58,14 @@ cc_defaults { "libutils", "libSurfaceFlingerProp", ], + // VrComposer is not used when building surfaceflinger for vendors + target: { + vendor: { + exclude_shared_libs: [ + "android.frameworks.vr.composer@2.0", + ], + }, + }, static_libs: [ "libcompositionengine", "librenderengine", @@ -177,6 +185,17 @@ cc_library_shared { // can be easily replaced. "SurfaceFlingerFactory.cpp", ], + cflags: [ + "-DUSE_VR_COMPOSER=1", + ], + // VrComposer is not used when building surfaceflinger for vendors + target: { + vendor: { + cflags: [ + "-DUSE_VR_COMPOSER=0", + ], + }, + }, logtags: ["EventLog/EventLogTags.logtags"], } diff --git a/services/surfaceflinger/CompositionEngine/Android.bp b/services/surfaceflinger/CompositionEngine/Android.bp index ae6bdbce60..d2e95d05a1 100644 --- a/services/surfaceflinger/CompositionEngine/Android.bp +++ b/services/surfaceflinger/CompositionEngine/Android.bp @@ -5,7 +5,7 @@ cc_defaults { "-DLOG_TAG=\"CompositionEngine\"", ], shared_libs: [ - "android.frameworks.vr.composer@1.0", + "android.frameworks.vr.composer@2.0", "android.hardware.graphics.allocator@2.0", "android.hardware.graphics.composer@2.1", "android.hardware.graphics.composer@2.2", diff --git a/services/surfaceflinger/DisplayHardware/ComposerHal.cpp b/services/surfaceflinger/DisplayHardware/ComposerHal.cpp index 7f47a2ecd4..e53d09949c 100644 --- a/services/surfaceflinger/DisplayHardware/ComposerHal.cpp +++ b/services/surfaceflinger/DisplayHardware/ComposerHal.cpp @@ -110,6 +110,7 @@ Error unwrapRet(Return<Error>& ret) namespace impl { +#if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER Composer::CommandWriter::CommandWriter(uint32_t initialMaxSize) : CommandWriterBase(initialMaxSize) {} @@ -160,6 +161,7 @@ void Composer::CommandWriter::writeBufferMetadata( writeSigned(static_cast<int32_t>(metadata.format)); write64(metadata.usage); } +#endif // defined(USE_VR_COMPOSER) && USE_VR_COMPOSER Composer::Composer(const std::string& serviceName) : mWriter(kWriterInitialSize), @@ -198,12 +200,14 @@ Composer::Composer(const std::string& serviceName) LOG_ALWAYS_FATAL("failed to create composer client"); } +#if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER if (mIsUsingVrComposer) { sp<IVrComposerClient> vrClient = IVrComposerClient::castFrom(mClient); if (vrClient == nullptr) { LOG_ALWAYS_FATAL("failed to create vr composer client"); } } +#endif // defined(USE_VR_COMPOSER) && USE_VR_COMPOSER } Composer::~Composer() = default; @@ -565,17 +569,20 @@ Error Composer::setClientTarget(Display display, uint32_t slot, const std::vector<IComposerClient::Rect>& damage) { mWriter.selectDisplay(display); + +#if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER if (mIsUsingVrComposer && target.get()) { IVrComposerClient::BufferMetadata metadata = { - .width = target->getWidth(), - .height = target->getHeight(), - .stride = target->getStride(), - .layerCount = target->getLayerCount(), - .format = static_cast<types::V1_0::PixelFormat>(target->getPixelFormat()), - .usage = target->getUsage(), + .width = target->getWidth(), + .height = target->getHeight(), + .stride = target->getStride(), + .layerCount = target->getLayerCount(), + .format = static_cast<types::V1_2::PixelFormat>(target->getPixelFormat()), + .usage = target->getUsage(), }; mWriter.setClientTargetMetadata(metadata); } +#endif // defined(USE_VR_COMPOSER) && USE_VR_COMPOSER const native_handle_t* handle = nullptr; if (target.get()) { @@ -695,17 +702,20 @@ Error Composer::setLayerBuffer(Display display, Layer layer, { mWriter.selectDisplay(display); mWriter.selectLayer(layer); + +#if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER if (mIsUsingVrComposer && buffer.get()) { IVrComposerClient::BufferMetadata metadata = { - .width = buffer->getWidth(), - .height = buffer->getHeight(), - .stride = buffer->getStride(), - .layerCount = buffer->getLayerCount(), - .format = static_cast<types::V1_0::PixelFormat>(buffer->getPixelFormat()), - .usage = buffer->getUsage(), + .width = buffer->getWidth(), + .height = buffer->getHeight(), + .stride = buffer->getStride(), + .layerCount = buffer->getLayerCount(), + .format = static_cast<types::V1_2::PixelFormat>(buffer->getPixelFormat()), + .usage = buffer->getUsage(), }; mWriter.setLayerBufferMetadata(metadata); } +#endif // defined(USE_VR_COMPOSER) && USE_VR_COMPOSER const native_handle_t* handle = nullptr; if (buffer.get()) { @@ -823,6 +833,7 @@ Error Composer::setLayerZOrder(Display display, Layer layer, uint32_t z) return Error::NONE; } +#if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER Error Composer::setLayerInfo(Display display, Layer layer, uint32_t type, uint32_t appId) { @@ -833,6 +844,15 @@ Error Composer::setLayerInfo(Display display, Layer layer, uint32_t type, } return Error::NONE; } +#else +Error Composer::setLayerInfo(Display display, Layer layer, uint32_t, uint32_t) { + if (mIsUsingVrComposer) { + mWriter.selectDisplay(display); + mWriter.selectLayer(layer); + } + return Error::NONE; +} +#endif // defined(USE_VR_COMPOSER) && USE_VR_COMPOSER Error Composer::execute() { diff --git a/services/surfaceflinger/DisplayHardware/ComposerHal.h b/services/surfaceflinger/DisplayHardware/ComposerHal.h index c4e952b8d9..9f6cac22b7 100644 --- a/services/surfaceflinger/DisplayHardware/ComposerHal.h +++ b/services/surfaceflinger/DisplayHardware/ComposerHal.h @@ -23,7 +23,9 @@ #include <utility> #include <vector> -#include <android/frameworks/vr/composer/1.0/IVrComposerClient.h> +#if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER +#include <android/frameworks/vr/composer/2.0/IVrComposerClient.h> +#endif // defined(USE_VR_COMPOSER) && USE_VR_COMPOSER #include <android/hardware/graphics/common/1.1/types.h> #include <android/hardware/graphics/composer/2.3/IComposer.h> #include <android/hardware/graphics/composer/2.3/IComposerClient.h> @@ -38,7 +40,9 @@ namespace android { namespace Hwc2 { -using frameworks::vr::composer::V1_0::IVrComposerClient; +#if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER +using frameworks::vr::composer::V2_0::IVrComposerClient; +#endif // defined(USE_VR_COMPOSER) && USE_VR_COMPOSER namespace types = hardware::graphics::common; @@ -418,6 +422,7 @@ public: Error setDisplayBrightness(Display display, float brightness) override; private: +#if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER class CommandWriter : public CommandWriterBase { public: explicit CommandWriter(uint32_t initialMaxSize); @@ -433,6 +438,13 @@ private: void writeBufferMetadata( const IVrComposerClient::BufferMetadata& metadata); }; +#else + class CommandWriter : public CommandWriterBase { + public: + explicit CommandWriter(uint32_t initialMaxSize) : CommandWriterBase(initialMaxSize) {} + ~CommandWriter() override {} + }; +#endif // defined(USE_VR_COMPOSER) && USE_VR_COMPOSER // Many public functions above simply write a command into the command // queue to batch the calls. validateDisplay and presentDisplay will call diff --git a/services/vr/hardware_composer/Android.bp b/services/vr/hardware_composer/Android.bp index bc7cc1c409..2cfeda3760 100644 --- a/services/vr/hardware_composer/Android.bp +++ b/services/vr/hardware_composer/Android.bp @@ -12,8 +12,10 @@ cc_library_shared { ], shared_libs: [ - "android.frameworks.vr.composer@1.0", + "android.frameworks.vr.composer@2.0", "android.hardware.graphics.composer@2.1", + "android.hardware.graphics.composer@2.2", + "android.hardware.graphics.composer@2.3", "android.hardware.graphics.composer@2.1-resources", "android.hardware.graphics.mapper@2.0", "android.hardware.graphics.mapper@3.0", @@ -34,11 +36,11 @@ cc_library_shared { header_libs: [ "android.hardware.graphics.composer@2.1-command-buffer", - "android.hardware.graphics.composer@2.1-hal", + "android.hardware.graphics.composer@2.3-hal", ], export_header_lib_headers: [ - "android.hardware.graphics.composer@2.1-hal", + "android.hardware.graphics.composer@2.3-hal", ], export_static_lib_headers: [ @@ -46,8 +48,10 @@ cc_library_shared { ], export_shared_lib_headers: [ - "android.frameworks.vr.composer@1.0", + "android.frameworks.vr.composer@2.0", "android.hardware.graphics.composer@2.1", + "android.hardware.graphics.composer@2.2", + "android.hardware.graphics.composer@2.3", ], export_include_dirs: ["."], @@ -104,8 +108,8 @@ cc_binary { "libvr_hwc-binder", ], shared_libs: [ - "android.frameworks.vr.composer@1.0", - "android.hardware.graphics.composer@2.1", + "android.frameworks.vr.composer@2.0", + "android.hardware.graphics.composer@2.3", "libbase", "libbinder", "liblog", diff --git a/services/vr/hardware_composer/impl/vr_composer_client.cpp b/services/vr/hardware_composer/impl/vr_composer_client.cpp index 786d5fac98..36f6b32e3f 100644 --- a/services/vr/hardware_composer/impl/vr_composer_client.cpp +++ b/services/vr/hardware_composer/impl/vr_composer_client.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ -#include <android/frameworks/vr/composer/1.0/IVrComposerClient.h> +#include <android/frameworks/vr/composer/2.0/IVrComposerClient.h> #include <hardware/gralloc.h> #include <hardware/gralloc1.h> #include <log/log.h> @@ -27,8 +27,7 @@ namespace android { namespace dvr { -using android::hardware::graphics::common::V1_0::PixelFormat; -using android::frameworks::vr::composer::V1_0::IVrComposerClient; +using android::frameworks::vr::composer::V2_0::IVrComposerClient; VrComposerClient::VrComposerClient(dvr::VrHwc& hal) : ComposerClient(&hal), mVrHal(hal) { @@ -51,7 +50,8 @@ VrComposerClient::VrCommandEngine::VrCommandEngine(VrComposerClient& client) VrComposerClient::VrCommandEngine::~VrCommandEngine() {} bool VrComposerClient::VrCommandEngine::executeCommand( - IComposerClient::Command command, uint16_t length) { + hardware::graphics::composer::V2_1::IComposerClient::Command command, + uint16_t length) { IVrComposerClient::VrCommand vrCommand = static_cast<IVrComposerClient::VrCommand>(command); switch (vrCommand) { @@ -107,12 +107,14 @@ bool VrComposerClient::VrCommandEngine::executeSetLayerBufferMetadata( IVrComposerClient::BufferMetadata VrComposerClient::VrCommandEngine::readBufferMetadata() { IVrComposerClient::BufferMetadata metadata = { - .width = read(), - .height = read(), - .stride = read(), - .layerCount = read(), - .format = static_cast<PixelFormat>(readSigned()), - .usage = read64(), + .width = read(), + .height = read(), + .stride = read(), + .layerCount = read(), + .format = + static_cast<android::hardware::graphics::common::V1_2::PixelFormat>( + readSigned()), + .usage = read64(), }; return metadata; } diff --git a/services/vr/hardware_composer/impl/vr_composer_client.h b/services/vr/hardware_composer/impl/vr_composer_client.h index 0b7ce5e665..1b2b5f4f56 100644 --- a/services/vr/hardware_composer/impl/vr_composer_client.h +++ b/services/vr/hardware_composer/impl/vr_composer_client.h @@ -17,10 +17,12 @@ #ifndef ANDROID_DVR_HARDWARE_COMPOSER_IMPL_VR_COMPOSER_CLIENT_H #define ANDROID_DVR_HARDWARE_COMPOSER_IMPL_VR_COMPOSER_CLIENT_H -#include <android/frameworks/vr/composer/1.0/IVrComposerClient.h> -#include <composer-command-buffer/2.1/ComposerCommandBuffer.h> +#include <android/frameworks/vr/composer/2.0/IVrComposerClient.h> +#include <composer-command-buffer/2.3/ComposerCommandBuffer.h> #include <composer-hal/2.1/ComposerClient.h> #include <composer-hal/2.1/ComposerCommandEngine.h> +#include <composer-hal/2.2/ComposerClient.h> +#include <composer-hal/2.3/ComposerClient.h> namespace android { namespace dvr { @@ -28,8 +30,8 @@ namespace dvr { class VrHwc; using hardware::graphics::composer::V2_1::hal::ComposerCommandEngine; -using hardware::graphics::composer::V2_1::hal::ComposerHal; -using hardware::graphics::composer::V2_1::hal::detail::ComposerClientImpl; +using hardware::graphics::composer::V2_3::hal::ComposerHal; +using hardware::graphics::composer::V2_3::hal::detail::ComposerClientImpl; using ComposerClient = ComposerClientImpl<IVrComposerClient, ComposerHal>; @@ -44,8 +46,9 @@ class VrComposerClient : public ComposerClient { explicit VrCommandEngine(VrComposerClient& client); ~VrCommandEngine() override; - bool executeCommand(IComposerClient::Command command, - uint16_t length) override; + bool executeCommand( + hardware::graphics::composer::V2_1::IComposerClient::Command command, + uint16_t length) override; private: bool executeSetLayerInfo(uint16_t length); diff --git a/services/vr/hardware_composer/impl/vr_hwc.cpp b/services/vr/hardware_composer/impl/vr_hwc.cpp index 7323277248..e530b16b1b 100644 --- a/services/vr/hardware_composer/impl/vr_hwc.cpp +++ b/services/vr/hardware_composer/impl/vr_hwc.cpp @@ -27,7 +27,7 @@ #include "vr_composer_client.h" using namespace android::hardware::graphics::common::V1_0; -using namespace android::hardware::graphics::composer::V2_1; +using namespace android::hardware::graphics::composer::V2_3; using android::base::StringPrintf; using android::hardware::hidl_handle; @@ -36,12 +36,12 @@ using android::hardware::hidl_vec; using android::hardware::Return; using android::hardware::Void; +namespace types = android::hardware::graphics::common; + namespace android { namespace dvr { namespace { -using android::hardware::graphics::common::V1_0::PixelFormat; - const Display kDefaultDisplayId = 1; const Config kDefaultConfigId = 1; @@ -269,7 +269,8 @@ void VrHwc::registerEventCallback(EventCallback* callback) { // onHotplug() call, so it's important to release mutex_ here. lock.unlock(); event_callback_->onHotplug(kDefaultDisplayId, - IComposerCallback::Connection::CONNECTED); + hardware::graphics::composer::V2_1:: + IComposerCallback::Connection::CONNECTED); lock.lock(); UpdateVsyncCallbackEnabledLocked(); } @@ -282,15 +283,6 @@ void VrHwc::unregisterEventCallback() { uint32_t VrHwc::getMaxVirtualDisplayCount() { return 1; } -Error VrHwc::createVirtualDisplay(uint32_t width, uint32_t height, - PixelFormat* format, Display* outDisplay) { - *format = PixelFormat::RGBA_8888; - *outDisplay = display_count_; - displays_[display_count_].reset(new HwcDisplay(width, height)); - display_count_++; - return Error::NONE; -} - Error VrHwc::destroyVirtualDisplay(Display display) { std::lock_guard<std::mutex> guard(mutex_); if (display == kDefaultDisplayId || displays_.erase(display) == 0) @@ -332,24 +324,6 @@ Error VrHwc::getActiveConfig(Display display, Config* outConfig) { return Error::NONE; } -Error VrHwc::getClientTargetSupport(Display display, uint32_t /* width */, - uint32_t /* height */, - PixelFormat /* format */, - Dataspace /* dataspace */) { - std::lock_guard<std::mutex> guard(mutex_); - if (!FindDisplay(display)) - return Error::BAD_DISPLAY; - - return Error::NONE; -} - -Error VrHwc::getColorModes(Display /* display */, - hidl_vec<ColorMode>* outModes) { - std::vector<ColorMode> color_modes(1, ColorMode::NATIVE); - *outModes = hidl_vec<ColorMode>(color_modes); - return Error::NONE; -} - Error VrHwc::getDisplayAttribute(Display display, Config config, IComposerClient::Attribute attribute, int32_t* outValue) { @@ -441,17 +415,6 @@ Error VrHwc::getDozeSupport(Display display, bool* outSupport) { return Error::NONE; } -Error VrHwc::getHdrCapabilities(Display /* display */, - hidl_vec<Hdr>* /* outTypes */, - float* outMaxLuminance, - float* outMaxAverageLuminance, - float* outMinLuminance) { - *outMaxLuminance = 0; - *outMaxAverageLuminance = 0; - *outMinLuminance = 0; - return Error::NONE; -} - Error VrHwc::setActiveConfig(Display display, Config config) { std::lock_guard<std::mutex> guard(mutex_); auto display_ptr = FindDisplay(display); @@ -464,47 +427,6 @@ Error VrHwc::setActiveConfig(Display display, Config config) { return Error::NONE; } -Error VrHwc::setColorMode(Display display, ColorMode mode) { - std::lock_guard<std::mutex> guard(mutex_); - auto display_ptr = FindDisplay(display); - if (!display_ptr) - return Error::BAD_DISPLAY; - - if (mode < ColorMode::NATIVE || mode > ColorMode::DISPLAY_P3) - return Error::BAD_PARAMETER; - - display_ptr->set_color_mode(mode); - return Error::NONE; -} - -Error VrHwc::setPowerMode(Display display, IComposerClient::PowerMode mode) { - bool dozeSupported = false; - - Error dozeSupportError = getDozeSupport(display, &dozeSupported); - - if (dozeSupportError != Error::NONE) - return dozeSupportError; - - std::lock_guard<std::mutex> guard(mutex_); - auto display_ptr = FindDisplay(display); - if (!display_ptr) - return Error::BAD_DISPLAY; - - if (mode < IComposerClient::PowerMode::OFF || - mode > IComposerClient::PowerMode::DOZE_SUSPEND) { - return Error::BAD_PARAMETER; - } - - if (!dozeSupported && - (mode == IComposerClient::PowerMode::DOZE || - mode == IComposerClient::PowerMode::DOZE_SUSPEND)) { - return Error::UNSUPPORTED; - } - - display_ptr->set_power_mode(mode); - return Error::NONE; -} - Error VrHwc::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) { std::lock_guard<std::mutex> guard(mutex_); auto display_ptr = FindDisplay(display); @@ -956,6 +878,23 @@ Return<void> VrHwc::createClient(createClient_cb hidl_cb) { return Void(); } +Return<void> VrHwc::createClient_2_3(IComposer::createClient_2_3_cb hidl_cb) { + std::lock_guard<std::mutex> guard(mutex_); + + Error status = Error::NONE; + sp<VrComposerClient> client; + if (!client_.promote().get()) { + client = new VrComposerClient(*this); + } else { + ALOGE("Already have a client"); + status = Error::NO_RESOURCES; + } + + client_ = client; + hidl_cb(status, client); + return Void(); +} + void VrHwc::ForceDisplaysRefresh() { std::lock_guard<std::mutex> guard(mutex_); if (event_callback_ != nullptr) { @@ -1044,5 +983,196 @@ void VrHwc::VsyncCallback::SetEventCallback(EventCallback* callback) { callback_ = callback; } +// composer::V2_2::ComposerHal +Error VrHwc::setReadbackBuffer(Display display, + const native_handle_t* bufferHandle, + android::base::unique_fd fenceFd) { + return Error::NONE; +} + +Error VrHwc::getReadbackBufferFence(Display display, + android::base::unique_fd* outFenceFd) { + return Error::NONE; +} + +Error VrHwc::createVirtualDisplay_2_2(uint32_t width, uint32_t height, + types::V1_1::PixelFormat* format, + Display* outDisplay) { + *format = types::V1_1::PixelFormat::RGBA_8888; + *outDisplay = display_count_; + displays_[display_count_].reset(new HwcDisplay(width, height)); + display_count_++; + return Error::NONE; +} + +Error VrHwc::setPowerMode_2_2(Display display, + IComposerClient::PowerMode mode) { + bool dozeSupported = false; + + Error dozeSupportError = getDozeSupport(display, &dozeSupported); + + if (dozeSupportError != Error::NONE) + return dozeSupportError; + + std::lock_guard<std::mutex> guard(mutex_); + auto display_ptr = FindDisplay(display); + if (!display_ptr) + return Error::BAD_DISPLAY; + + if (mode < IComposerClient::PowerMode::OFF || + mode > IComposerClient::PowerMode::DOZE_SUSPEND) { + return Error::BAD_PARAMETER; + } + + if (!dozeSupported && (mode == IComposerClient::PowerMode::DOZE || + mode == IComposerClient::PowerMode::DOZE_SUSPEND)) { + return Error::UNSUPPORTED; + } + + display_ptr->set_power_mode(mode); + return Error::NONE; +} + +Error VrHwc::setLayerFloatColor(Display display, Layer layer, + IComposerClient::FloatColor color) { + return Error::NONE; +} + +Error VrHwc::getRenderIntents(Display display, types::V1_1::ColorMode mode, + std::vector<RenderIntent>* outIntents) { + return Error::NONE; +} + +std::array<float, 16> VrHwc::getDataspaceSaturationMatrix( + types::V1_1::Dataspace dataspace) { + return {}; +} + +// composer::V2_3::ComposerHal +Error VrHwc::getHdrCapabilities_2_3(Display /*display*/, + hidl_vec<Hdr>* /*outTypes*/, + float* outMaxLuminance, + float* outMaxAverageLuminance, + float* outMinLuminance) { + *outMaxLuminance = 0; + *outMaxAverageLuminance = 0; + *outMinLuminance = 0; + return Error::NONE; +} + +Error VrHwc::setLayerPerFrameMetadata_2_3( + Display display, Layer layer, + const std::vector<IComposerClient::PerFrameMetadata>& metadata) { + return Error::NONE; +} + +Error VrHwc::getPerFrameMetadataKeys_2_3( + Display display, + std::vector<IComposerClient::PerFrameMetadataKey>* outKeys) { + return Error::NONE; +} + +Error VrHwc::setColorMode_2_3(Display display, ColorMode mode, + RenderIntent intent) { + std::lock_guard<std::mutex> guard(mutex_); + auto display_ptr = FindDisplay(display); + if (!display_ptr) + return Error::BAD_DISPLAY; + + if (mode < ColorMode::NATIVE || mode > ColorMode::DISPLAY_P3) + return Error::BAD_PARAMETER; + + display_ptr->set_color_mode(mode); + return Error::NONE; +} + +Error VrHwc::getRenderIntents_2_3(Display display, ColorMode mode, + std::vector<RenderIntent>* outIntents) { + return Error::NONE; +} + +Error VrHwc::getColorModes_2_3(Display display, hidl_vec<ColorMode>* outModes) { + return Error::NONE; +} + +Error VrHwc::getClientTargetSupport_2_3(Display display, uint32_t width, + uint32_t height, PixelFormat format, + Dataspace dataspace) { + return Error::NONE; +} + +Error VrHwc::getReadbackBufferAttributes_2_3(Display display, + PixelFormat* outFormat, + Dataspace* outDataspace) { + return Error::NONE; +} + +Error VrHwc::getDisplayIdentificationData(Display display, uint8_t* outPort, + std::vector<uint8_t>* outData) { + int error = 0; + auto display_client = display::DisplayClient::Create(&error); + if (!display_client) { + ALOGE("Could not connect to display service : %s(%d)", strerror(error), + error); + return Error::BAD_CONFIG; + } + auto edid_data = display_client->GetConfigurationData( + display::ConfigFileType::kDeviceEdid); + auto display_identification_port = + display_client->GetDisplayIdentificationPort(); + *outPort = display_identification_port.get(); + + std::copy(edid_data.get().begin(), edid_data.get().end(), + std::back_inserter(*outData)); + return Error::NONE; +} + +Error VrHwc::setLayerColorTransform(Display display, Layer layer, + const float* matrix) { + return Error::NONE; +} + +Error VrHwc::getDisplayedContentSamplingAttributes( + Display display, PixelFormat& format, Dataspace& dataspace, + hidl_bitfield<IComposerClient::FormatColorComponent>& componentMask) { + return Error::NONE; +} + +Error VrHwc::setDisplayedContentSamplingEnabled( + Display display, IComposerClient::DisplayedContentSampling enable, + hidl_bitfield<IComposerClient::FormatColorComponent> componentMask, + uint64_t maxFrames) { + return Error::NONE; +} + +Error VrHwc::getDisplayedContentSample(Display display, uint64_t maxFrames, + uint64_t timestamp, uint64_t& frameCount, + hidl_vec<uint64_t>& sampleComponent0, + hidl_vec<uint64_t>& sampleComponent1, + hidl_vec<uint64_t>& sampleComponent2, + hidl_vec<uint64_t>& sampleComponent3) { + return Error::NONE; +} + +Error VrHwc::getDisplayCapabilities( + Display display, + std::vector<IComposerClient::DisplayCapability>* outCapabilities) { + return Error::NONE; +} + +Error VrHwc::setLayerPerFrameMetadataBlobs( + Display display, Layer layer, + std::vector<IComposerClient::PerFrameMetadataBlob>& blobs) { + return Error::NONE; +} + +Error VrHwc::getDisplayBrightnessSupport(Display display, bool* outSupport) { + return Error::NONE; +} + +Error VrHwc::setDisplayBrightness(Display display, float brightness) { + return Error::NONE; +} + } // namespace dvr } // namespace android diff --git a/services/vr/hardware_composer/impl/vr_hwc.h b/services/vr/hardware_composer/impl/vr_hwc.h index 15358c57bb..3e3a6307fa 100644 --- a/services/vr/hardware_composer/impl/vr_hwc.h +++ b/services/vr/hardware_composer/impl/vr_hwc.h @@ -17,9 +17,9 @@ #define ANDROID_DVR_HARDWARE_COMPOSER_IMPL_VR_HWC_H #include <android-base/unique_fd.h> -#include <android/frameworks/vr/composer/1.0/IVrComposerClient.h> -#include <android/hardware/graphics/composer/2.1/IComposer.h> -#include <composer-hal/2.1/ComposerHal.h> +#include <android/frameworks/vr/composer/2.0/IVrComposerClient.h> +#include <android/hardware/graphics/composer/2.3/IComposer.h> +#include <composer-hal/2.3/ComposerHal.h> #include <private/dvr/vsync_service.h> #include <ui/Fence.h> #include <ui/GraphicBuffer.h> @@ -28,15 +28,21 @@ #include <mutex> #include <unordered_map> -using namespace android::frameworks::vr::composer::V1_0; +using namespace android::frameworks::vr::composer::V2_0; using namespace android::hardware::graphics::common::V1_0; -using namespace android::hardware::graphics::composer::V2_1; +using namespace android::hardware::graphics::composer::V2_3; +using android::hardware::hidl_bitfield; using android::hardware::hidl_handle; using android::hardware::hidl_string; using android::hardware::hidl_vec; using android::hardware::Return; using android::hardware::Void; +using android::hardware::graphics::composer::V2_1::Config; +using android::hardware::graphics::composer::V2_1::Display; +using android::hardware::graphics::composer::V2_1::Error; +using android::hardware::graphics::composer::V2_1::Layer; +using android::hardware::graphics::composer::V2_3::IComposerClient; namespace android { @@ -46,16 +52,23 @@ namespace dvr { class VrComposerClient; -using android::hardware::graphics::common::V1_0::PixelFormat; -using android::hardware::graphics::composer::V2_1::hal::ComposerHal; +using android::hardware::graphics::composer::V2_3::hal::ComposerHal; + +namespace types = android::hardware::graphics::common; + +using types::V1_1::RenderIntent; +using types::V1_2::ColorMode; +using types::V1_2::Dataspace; +using types::V1_2::Hdr; +using types::V1_2::PixelFormat; class ComposerView { public: struct ComposerLayer { - using Recti = hardware::graphics::composer::V2_1::IComposerClient::Rect; - using Rectf = hardware::graphics::composer::V2_1::IComposerClient::FRect; + using Recti = hardware::graphics::composer::V2_3::IComposerClient::Rect; + using Rectf = hardware::graphics::composer::V2_3::IComposerClient::FRect; using BlendMode = - hardware::graphics::composer::V2_1::IComposerClient::BlendMode; + hardware::graphics::composer::V2_3::IComposerClient::BlendMode; Layer id; sp<GraphicBuffer> buffer; @@ -111,7 +124,7 @@ class ComposerView { struct HwcLayer { using Composition = - hardware::graphics::composer::V2_1::IComposerClient::Composition; + hardware::graphics::composer::V2_3::IComposerClient::Composition; explicit HwcLayer(Layer new_id) { info.id = new_id; } @@ -205,90 +218,148 @@ class VrHwc : public IComposer, public ComposerHal, public ComposerView { Display display, Layer layer, const IVrComposerClient::BufferMetadata& metadata); - // ComposerHal + // composer::V2_1::ComposerHal bool hasCapability(hwc2_capability_t capability) override; std::string dumpDebugInfo() override { return {}; } - void registerEventCallback(EventCallback* callback) override; + + void registerEventCallback(ComposerHal::EventCallback* callback) override; void unregisterEventCallback() override; uint32_t getMaxVirtualDisplayCount() override; - Error createVirtualDisplay(uint32_t width, uint32_t height, - PixelFormat* format, Display* outDisplay) override; Error destroyVirtualDisplay(Display display) override; Error createLayer(Display display, Layer* outLayer) override; Error destroyLayer(Display display, Layer layer) override; Error getActiveConfig(Display display, Config* outConfig) override; - Error getClientTargetSupport(Display display, - uint32_t width, uint32_t height, - PixelFormat format, Dataspace dataspace) override; - Error getColorModes(Display display, hidl_vec<ColorMode>* outModes) override; Error getDisplayAttribute(Display display, Config config, - IComposerClient::Attribute attribute, int32_t* outValue) override; + IComposerClient::Attribute attribute, + int32_t* outValue) override; Error getDisplayConfigs(Display display, hidl_vec<Config>* outConfigs) override; Error getDisplayName(Display display, hidl_string* outName) override; Error getDisplayType(Display display, - IComposerClient::DisplayType* outType) override; + IComposerClient::DisplayType* outType) override; Error getDozeSupport(Display display, bool* outSupport) override; - Error getHdrCapabilities(Display display, hidl_vec<Hdr>* outTypes, - float* outMaxLuminance, float* outMaxAverageLuminance, - float* outMinLuminance) override; Error setActiveConfig(Display display, Config config) override; - Error setColorMode(Display display, ColorMode mode) override; - Error setPowerMode(Display display, IComposerClient::PowerMode mode) override; Error setVsyncEnabled(Display display, IComposerClient::Vsync enabled) override; Error setColorTransform(Display display, const float* matrix, - int32_t hint) override; + int32_t hint) override; Error setClientTarget(Display display, buffer_handle_t target, - int32_t acquireFence, int32_t dataspace, - const std::vector<hwc_rect_t>& damage) override; + int32_t acquireFence, int32_t dataspace, + const std::vector<hwc_rect_t>& damage) override; Error setOutputBuffer(Display display, buffer_handle_t buffer, - int32_t releaseFence) override; - Error validateDisplay(Display display, - std::vector<Layer>* outChangedLayers, - std::vector<IComposerClient::Composition>* outCompositionTypes, - uint32_t* outDisplayRequestMask, - std::vector<Layer>* outRequestedLayers, - std::vector<uint32_t>* outRequestMasks) override; + int32_t releaseFence) override; + Error validateDisplay( + Display display, std::vector<Layer>* outChangedLayers, + std::vector<IComposerClient::Composition>* outCompositionTypes, + uint32_t* outDisplayRequestMask, std::vector<Layer>* outRequestedLayers, + std::vector<uint32_t>* outRequestMasks) override; Error acceptDisplayChanges(Display display) override; Error presentDisplay(Display display, int32_t* outPresentFence, - std::vector<Layer>* outLayers, - std::vector<int32_t>* outReleaseFences) override; + std::vector<Layer>* outLayers, + std::vector<int32_t>* outReleaseFences) override; - Error setLayerCursorPosition(Display display, Layer layer, - int32_t x, int32_t y) override; - Error setLayerBuffer(Display display, Layer layer, - buffer_handle_t buffer, int32_t acquireFence) override; + Error setLayerCursorPosition(Display display, Layer layer, int32_t x, + int32_t y) override; + Error setLayerBuffer(Display display, Layer layer, buffer_handle_t buffer, + int32_t acquireFence) override; Error setLayerSurfaceDamage(Display display, Layer layer, - const std::vector<hwc_rect_t>& damage) override; + const std::vector<hwc_rect_t>& damage) override; Error setLayerBlendMode(Display display, Layer layer, int32_t mode) override; Error setLayerColor(Display display, Layer layer, - IComposerClient::Color color) override; + IComposerClient::Color color) override; Error setLayerCompositionType(Display display, Layer layer, - int32_t type) override; + int32_t type) override; Error setLayerDataspace(Display display, Layer layer, - int32_t dataspace) override; + int32_t dataspace) override; Error setLayerDisplayFrame(Display display, Layer layer, - const hwc_rect_t& frame) override; + const hwc_rect_t& frame) override; Error setLayerPlaneAlpha(Display display, Layer layer, float alpha) override; Error setLayerSidebandStream(Display display, Layer layer, - buffer_handle_t stream) override; + buffer_handle_t stream) override; Error setLayerSourceCrop(Display display, Layer layer, - const hwc_frect_t& crop) override; + const hwc_frect_t& crop) override; Error setLayerTransform(Display display, Layer layer, - int32_t transform) override; + int32_t transform) override; Error setLayerVisibleRegion(Display display, Layer layer, - const std::vector<hwc_rect_t>& visible) override; + const std::vector<hwc_rect_t>& visible) override; Error setLayerZOrder(Display display, Layer layer, uint32_t z) override; + // composer::V2_2::ComposerHal + Error setReadbackBuffer(Display display, const native_handle_t* bufferHandle, + android::base::unique_fd fenceFd) override; + Error getReadbackBufferFence(Display display, + android::base::unique_fd* outFenceFd) override; + Error createVirtualDisplay_2_2(uint32_t width, uint32_t height, + types::V1_1::PixelFormat* format, + Display* outDisplay) override; + Error setPowerMode_2_2(Display display, + IComposerClient::PowerMode mode) override; + Error setLayerFloatColor(Display display, Layer layer, + IComposerClient::FloatColor color) override; + Error getRenderIntents(Display display, types::V1_1::ColorMode mode, + std::vector<RenderIntent>* outIntents) override; + std::array<float, 16> getDataspaceSaturationMatrix( + types::V1_1::Dataspace dataspace) override; + + // composer::V2_3::ComposerHal + Error getHdrCapabilities_2_3(Display display, hidl_vec<Hdr>* outTypes, + float* outMaxLuminance, + float* outMaxAverageLuminance, + float* outMinLuminance) override; + Error setLayerPerFrameMetadata_2_3( + Display display, Layer layer, + const std::vector<IComposerClient::PerFrameMetadata>& metadata) override; + Error getPerFrameMetadataKeys_2_3( + Display display, + std::vector<IComposerClient::PerFrameMetadataKey>* outKeys) override; + Error setColorMode_2_3(Display display, ColorMode mode, + RenderIntent intent) override; + Error getRenderIntents_2_3(Display display, ColorMode mode, + std::vector<RenderIntent>* outIntents) override; + Error getColorModes_2_3(Display display, + hidl_vec<ColorMode>* outModes) override; + Error getClientTargetSupport_2_3(Display display, uint32_t width, + uint32_t height, PixelFormat format, + Dataspace dataspace) override; + Error getReadbackBufferAttributes_2_3(Display display, PixelFormat* outFormat, + Dataspace* outDataspace) override; + Error getDisplayIdentificationData(Display display, uint8_t* outPort, + std::vector<uint8_t>* outData) override; + Error setLayerColorTransform(Display display, Layer layer, + const float* matrix) override; + Error getDisplayedContentSamplingAttributes( + Display display, PixelFormat& format, Dataspace& dataspace, + hidl_bitfield<IComposerClient::FormatColorComponent>& componentMask) + override; + Error setDisplayedContentSamplingEnabled( + Display display, IComposerClient::DisplayedContentSampling enable, + hidl_bitfield<IComposerClient::FormatColorComponent> componentMask, + uint64_t maxFrames) override; + Error getDisplayedContentSample( + Display display, uint64_t maxFrames, uint64_t timestamp, + uint64_t& frameCount, hidl_vec<uint64_t>& sampleComponent0, + hidl_vec<uint64_t>& sampleComponent1, + hidl_vec<uint64_t>& sampleComponent2, + hidl_vec<uint64_t>& sampleComponent3) override; + Error getDisplayCapabilities(Display display, + std::vector<IComposerClient::DisplayCapability>* + outCapabilities) override; + Error setLayerPerFrameMetadataBlobs( + Display display, Layer layer, + std::vector<IComposerClient::PerFrameMetadataBlob>& blobs) override; + Error getDisplayBrightnessSupport(Display display, bool* outSupport) override; + Error setDisplayBrightness(Display display, float brightness) override; + // IComposer: Return<void> getCapabilities(getCapabilities_cb hidl_cb) override; Return<void> dumpDebugInfo(dumpDebugInfo_cb hidl_cb) override; Return<void> createClient(createClient_cb hidl_cb) override; + Return<void> createClient_2_3( + IComposer::createClient_2_3_cb hidl_cb) override; // ComposerView: void ForceDisplaysRefresh() override; |