summaryrefslogtreecommitdiff
path: root/services/surfaceflinger/DisplayHardware/ComposerHal.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'services/surfaceflinger/DisplayHardware/ComposerHal.cpp')
-rw-r--r--services/surfaceflinger/DisplayHardware/ComposerHal.cpp168
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