diff options
| -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 51bf78afb5..93c738d231 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", "libperfetto_client_experimental", @@ -182,6 +190,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 580bde8624..e49b65ff07 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 0e5faf4058..4e461f9ff1 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", @@ -35,11 +37,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: [ @@ -47,8 +49,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: ["."], @@ -105,8 +109,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; |