diff options
Diffstat (limited to 'services/surfaceflinger/DisplayHardware/ComposerHal.cpp')
-rw-r--r-- | services/surfaceflinger/DisplayHardware/ComposerHal.cpp | 168 |
1 files changed, 142 insertions, 26 deletions
diff --git a/services/surfaceflinger/DisplayHardware/ComposerHal.cpp b/services/surfaceflinger/DisplayHardware/ComposerHal.cpp index caf0294a56..a3f1b52378 100644 --- a/services/surfaceflinger/DisplayHardware/ComposerHal.cpp +++ b/services/surfaceflinger/DisplayHardware/ComposerHal.cpp @@ -20,18 +20,18 @@ #undef LOG_TAG #define LOG_TAG "HwcComposer" -#define ATRACE_TAG ATRACE_TAG_GRAPHICS + +#include <log/log.h> + +#include <algorithm> +#include <cinttypes> #include "ComposerHal.h" #include <composer-command-buffer/2.2/ComposerCommandBuffer.h> +#include <gui/BufferQueue.h> #include <hidl/HidlTransportSupport.h> #include <hidl/HidlTransportUtils.h> -#include <log/log.h> -#include <utils/Trace.h> - -#include <algorithm> -#include <cinttypes> namespace android { @@ -117,7 +117,63 @@ Error unwrapRet(Return<Error>& ret) namespace impl { -Composer::Composer(const std::string& serviceName) : mWriter(kWriterInitialSize) { +#if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER +Composer::CommandWriter::CommandWriter(uint32_t initialMaxSize) + : CommandWriterBase(initialMaxSize) {} + +Composer::CommandWriter::~CommandWriter() +{ +} + +void Composer::CommandWriter::setLayerInfo(uint32_t type, uint32_t appId) +{ + constexpr uint16_t kSetLayerInfoLength = 2; + beginCommand(static_cast<V2_1::IComposerClient::Command>( + IVrComposerClient::VrCommand::SET_LAYER_INFO), + kSetLayerInfoLength); + write(type); + write(appId); + endCommand(); +} + +void Composer::CommandWriter::setClientTargetMetadata( + const IVrComposerClient::BufferMetadata& metadata) +{ + constexpr uint16_t kSetClientTargetMetadataLength = 7; + beginCommand(static_cast<V2_1::IComposerClient::Command>( + IVrComposerClient::VrCommand::SET_CLIENT_TARGET_METADATA), + kSetClientTargetMetadataLength); + writeBufferMetadata(metadata); + endCommand(); +} + +void Composer::CommandWriter::setLayerBufferMetadata( + const IVrComposerClient::BufferMetadata& metadata) +{ + constexpr uint16_t kSetLayerBufferMetadataLength = 7; + beginCommand(static_cast<V2_1::IComposerClient::Command>( + IVrComposerClient::VrCommand::SET_LAYER_BUFFER_METADATA), + kSetLayerBufferMetadataLength); + writeBufferMetadata(metadata); + endCommand(); +} + +void Composer::CommandWriter::writeBufferMetadata( + const IVrComposerClient::BufferMetadata& metadata) +{ + write(metadata.width); + write(metadata.height); + write(metadata.stride); + write(metadata.layerCount); + 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), + mIsUsingVrComposer(serviceName == std::string("vr")) +{ mComposer = V2_1::IComposer::getService(serviceName); if (mComposer == nullptr) { @@ -159,6 +215,15 @@ Composer::Composer(const std::string& serviceName) : mWriter(kWriterInitialSize) if (mClient == nullptr) { 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; @@ -197,6 +262,10 @@ void Composer::registerCallback(const sp<IComposerCallback>& callback) } } +bool Composer::isRemote() { + return mClient->isRemote(); +} + void Composer::resetCommands() { mWriter.reset(); } @@ -211,8 +280,9 @@ uint32_t Composer::getMaxVirtualDisplayCount() return unwrapRet(ret, 0); } -Error Composer::createVirtualDisplay(uint32_t width, uint32_t height, PixelFormat* format, - std::optional<Display>, Display* outDisplay) { +Error Composer::createVirtualDisplay(uint32_t width, uint32_t height, + PixelFormat* format, Display* outDisplay) +{ const uint32_t bufferSlotCount = 1; Error error = kDefaultError; if (mClient_2_2) { @@ -264,15 +334,15 @@ Error Composer::acceptDisplayChanges(Display display) Error Composer::createLayer(Display display, Layer* outLayer) { Error error = kDefaultError; - mClient->createLayer(display, kMaxLayerBufferCount, - [&](const auto& tmpError, const auto& tmpLayer) { - error = tmpError; - if (error != Error::NONE) { - return; - } + mClient->createLayer(display, BufferQueue::NUM_BUFFER_SLOTS, + [&](const auto& tmpError, const auto& tmpLayer) { + error = tmpError; + if (error != Error::NONE) { + return; + } - *outLayer = tmpLayer; - }); + *outLayer = tmpLayer; + }); return error; } @@ -491,7 +561,6 @@ Error Composer::getReleaseFences(Display display, Error Composer::presentDisplay(Display display, int* outPresentFence) { - ATRACE_NAME("HwcPresentDisplay"); mWriter.selectDisplay(display); mWriter.presentDisplay(); @@ -518,6 +587,20 @@ Error Composer::setClientTarget(Display display, uint32_t slot, { 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_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()) { handle = target->getNativeBuffer()->handle; @@ -586,7 +669,6 @@ Error Composer::setClientTargetSlotCount(Display display) Error Composer::validateDisplay(Display display, uint32_t* outNumTypes, uint32_t* outNumRequests) { - ATRACE_NAME("HwcValidateDisplay"); mWriter.selectDisplay(display); mWriter.validateDisplay(); @@ -602,14 +684,13 @@ Error Composer::validateDisplay(Display display, uint32_t* outNumTypes, Error Composer::presentOrValidateDisplay(Display display, uint32_t* outNumTypes, uint32_t* outNumRequests, int* outPresentFence, uint32_t* state) { - ATRACE_NAME("HwcPresentOrValidateDisplay"); - mWriter.selectDisplay(display); - mWriter.presentOrvalidateDisplay(); + mWriter.selectDisplay(display); + mWriter.presentOrvalidateDisplay(); - Error error = execute(); - if (error != Error::NONE) { - return error; - } + Error error = execute(); + if (error != Error::NONE) { + return error; + } mReader.takePresentOrValidateStage(display, state); @@ -639,6 +720,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_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()) { handle = buffer->getNativeBuffer()->handle; @@ -755,6 +850,27 @@ 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) +{ + if (mIsUsingVrComposer) { + mWriter.selectDisplay(display); + mWriter.selectLayer(layer); + mWriter.setLayerInfo(type, appId); + } + 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() { // prepare input command queue |