Skip to content

Commit

Permalink
composer: Switch to IQtiComposer 3.0 based on IComposer 2.4
Browse files Browse the repository at this point in the history
Change-Id: I0914a7e064663f7ed10c562c5a3849bf633743a2
  • Loading branch information
naseer committed Mar 19, 2020
1 parent f4cb002 commit 8584a0f
Show file tree
Hide file tree
Showing 16 changed files with 250 additions and 105 deletions.
1 change: 1 addition & 0 deletions .clang-format
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,5 @@ ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 4
DerivePointerAlignment: false
PointerAlignment: Right
SortIncludes: false
#ReflowComments: false
5 changes: 2 additions & 3 deletions composer/Android.mk
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,11 @@ LOCAL_SHARED_LIBRARIES := libhistogram libbinder libhardware libutils lib
libsdmcore libqservice libqdutils libqdMetaData \
libdisplaydebug libsdmutils libgrallocutils libui \
libgpu_tonemapper libEGL libGLESv2 libGLESv3 \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
Expand Down
16 changes: 14 additions & 2 deletions composer/QtiComposer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ namespace qti {
namespace hardware {
namespace display {
namespace composer {
namespace V2_1 {
namespace V3_0 {
namespace implementation {

QtiComposerClient* QtiComposerClient::qti_composerclient_instance_ = nullptr;
Expand Down Expand Up @@ -124,6 +124,18 @@ Return<void> QtiComposer::createClient_2_3(createClient_2_3_cb _hidl_cb) {
return Void();
}

// Methods from ::android::hardware::graphics::composer::V2_4::IComposer follow.
Return<void> QtiComposer::createClient_2_4(createClient_2_4_cb _hidl_cb) {
sp<QtiComposerClient> composer_client = QtiComposerClient::CreateQtiComposerClientInstance();
if (!composer_client) {
_hidl_cb(composer_V2_4::Error::NO_RESOURCES, nullptr);
return Void();
}

_hidl_cb(composer_V2_4::Error::NONE, composer_client);
return Void();
}

QtiComposer *QtiComposer::initialize() {
auto error = HWCSession::GetInstance()->Init();
if (error) {
Expand All @@ -141,7 +153,7 @@ IQtiComposer* HIDL_FETCH_IQtiComposer(const char* /* name */) {
}

} // namespace implementation
} // namespace V2_1
} // namespace V3_0
} // namespace composer
} // namespace display
} // namespace hardware
Expand Down
12 changes: 8 additions & 4 deletions composer/QtiComposer.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,19 +35,20 @@

// TODO(user): recheck on this header inclusion
#include <hardware/hwcomposer2.h>
#include <vendor/qti/hardware/display/composer/2.1/IQtiComposer.h>
#include <log/log.h>
#include <vendor/qti/hardware/display/composer/3.0/IQtiComposer.h>

#include <unordered_set>

namespace vendor {
namespace qti {
namespace hardware {
namespace display {
namespace composer {
namespace V2_1 {
namespace V3_0 {
namespace implementation {

using ::vendor::qti::hardware::display::composer::V2_1::IQtiComposer;
using ::vendor::qti::hardware::display::composer::V3_0::IQtiComposer;

class QtiComposer : public IQtiComposer {
public:
Expand All @@ -61,6 +62,9 @@ class QtiComposer : public IQtiComposer {
// Methods from ::android::hardware::graphics::composer::V2_3::IComposer follow.
Return<void> createClient_2_3(createClient_2_3_cb _hidl_cb) override;

// Methods from ::android::hardware::graphics::composer::V2_4::IComposer follow.
Return<void> createClient_2_4(createClient_2_4_cb _hidl_cb) override;

// Methods from ::android::hidl::base::V1_0::IBase follow.

static QtiComposer *initialize();
Expand All @@ -72,7 +76,7 @@ class QtiComposer : public IQtiComposer {
extern "C" IQtiComposer* HIDL_FETCH_IQtiComposer(const char* name);

} // namespace implementation
} // namespace V2_1
} // namespace V3_0
} // namespace composer
} // namespace display
} // namespace hardware
Expand Down
134 changes: 103 additions & 31 deletions composer/QtiComposerClient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
*/

#include <vector>
#include <string>

#include "QtiComposerClient.h"

Expand All @@ -26,7 +27,7 @@ namespace qti {
namespace hardware {
namespace display {
namespace composer {
namespace V2_1 {
namespace V3_0 {
namespace implementation {

ComposerHandleImporter mHandleImporter;
Expand Down Expand Up @@ -118,21 +119,23 @@ QtiComposerClient::~QtiComposerClient() {
void QtiComposerClient::onHotplug(hwc2_callback_data_t callbackData, hwc2_display_t display,
int32_t connected) {
auto client = reinterpret_cast<QtiComposerClient*>(callbackData);
auto connect = static_cast<composer_V2_1::IComposerCallback::Connection>(connected);
if (connect == composer_V2_1::IComposerCallback::Connection::CONNECTED) {
auto connect = static_cast<composer_V2_4::IComposerCallback::Connection>(connected);
if (connect == composer_V2_4::IComposerCallback::Connection::CONNECTED) {
std::lock_guard<std::mutex> lock_d(client->mDisplayDataMutex);
client->mDisplayData.emplace(display, DisplayData(false));
}

auto ret = client->mCallback->onHotplug(display, connect);
auto ret = client->callback_->onHotplug(display, connect);
ALOGW_IF(!ret.isOk(), "failed to send onHotplug: %s. SF likely unavailable.",
ret.description().c_str());

if (connect == composer_V2_1::IComposerCallback::Connection::DISCONNECTED) {
if (connect == composer_V2_4::IComposerCallback::Connection::DISCONNECTED) {
// Trigger refresh to make sure disconnect event received/updated properly by SurfaceFlinger.
client->hwc_session_->Refresh(HWC_DISPLAY_PRIMARY);
// Wait for sufficient time to ensure sufficient resources are available to process connection.
usleep(UINT32(client->hwc_session_->GetVsyncPeriod(HWC_DISPLAY_PRIMARY)) * 2 / 1000);
uint32_t vsync_period;
client->hwc_session_->GetVsyncPeriod(HWC_DISPLAY_PRIMARY, &vsync_period);
usleep(vsync_period * 2 / 1000);

// Wait for the input command message queue to process before destroying the local display data.
std::lock_guard<std::mutex> lock(client->mCommandMutex);
Expand All @@ -143,15 +146,22 @@ void QtiComposerClient::onHotplug(hwc2_callback_data_t callbackData, hwc2_displa

void QtiComposerClient::onRefresh(hwc2_callback_data_t callbackData, hwc2_display_t display) {
auto client = reinterpret_cast<QtiComposerClient*>(callbackData);
auto ret = client->mCallback->onRefresh(display);
auto ret = client->callback_->onRefresh(display);
ALOGW_IF(!ret.isOk(), "failed to send onRefresh: %s. SF likely unavailable.",
ret.description().c_str());
}

void QtiComposerClient::onVsync(hwc2_callback_data_t callbackData, hwc2_display_t display,
int64_t timestamp) {
auto client = reinterpret_cast<QtiComposerClient*>(callbackData);
auto ret = client->mCallback->onVsync(display, timestamp);
android::hardware::Return<void> ret;
if (client->callback24_) {
uint32_t vsync_period;
client->hwc_session_->GetVsyncPeriod(display, &vsync_period);
ret = client->callback24_->onVsync_2_4(display, timestamp, vsync_period);
} else {
ret = client->callback_->onVsync(display, timestamp);
}
ALOGW_IF(!ret.isOk(), "failed to send onVsync: %s. SF likely unavailable.",
ret.description().c_str());
}
Expand Down Expand Up @@ -238,7 +248,7 @@ void QtiComposerClient::enableCallback(bool enable) {
// Methods from ::android::hardware::graphics::composer::V2_1::IComposerClient follow.
Return<void> QtiComposerClient::registerCallback(
const sp<composer_V2_1::IComposerCallback>& callback) {
mCallback = callback;
callback_ = callback;
enableCallback(callback != nullptr);
return Void();
}
Expand Down Expand Up @@ -361,8 +371,8 @@ Return<void> QtiComposerClient::getDisplayAttribute(uint64_t display, uint32_t c
composer_V2_1::IComposerClient::Attribute attribute,
getDisplayAttribute_cb _hidl_cb) {
int32_t value = 0;
auto error = hwc_session_->GetDisplayAttribute(display, config, static_cast<int32_t>(attribute),
&value);
auto error = hwc_session_->GetDisplayAttribute(
display, config, static_cast<composer_V2_4::IComposerClient::Attribute>(attribute), &value);

_hidl_cb(static_cast<Error>(error), value);
return Void();
Expand Down Expand Up @@ -915,25 +925,8 @@ Return<Error> QtiComposerClient::setColorMode_2_3(uint64_t display, common_V1_2:

Return<void> QtiComposerClient::getDisplayCapabilities(uint64_t display,
getDisplayCapabilities_cb _hidl_cb) {
hidl_vec<IComposerClient::DisplayCapability> capabilities;
uint32_t count = 0;
auto error = hwc_session_->GetDisplayCapabilities(display, &count, nullptr);
if (error != HWC2_ERROR_NONE) {
_hidl_cb(static_cast<Error>(error), capabilities);
return Void();
}

capabilities.resize(count);
error = hwc_session_->GetDisplayCapabilities(display, &count,
reinterpret_cast<std::underlying_type<IComposerClient::DisplayCapability>::type*>(
capabilities.data()));
if (error != HWC2_ERROR_NONE) {
capabilities = hidl_vec<IComposerClient::DisplayCapability>();
_hidl_cb(static_cast<Error>(error), capabilities);
return Void();
}

_hidl_cb(static_cast<Error>(error), capabilities);
// We only care about passing VTS for older composer versions
// Not returning any capabilities that are optional
return Void();
}

Expand Down Expand Up @@ -998,6 +991,85 @@ Return<Error> QtiComposerClient::setDisplayBrightness(uint64_t display, float br
return static_cast<Error>(error);
}

// Methods from ::android::hardware::graphics::composer::V2_4::IComposerClient follow.
Return<void> QtiComposerClient::registerCallback_2_4(
const sp<composer_V2_4::IComposerCallback> &callback) {
callback_ = sp<composer_V2_1::IComposerCallback>(callback.get());
callback24_ = callback;
enableCallback(callback != nullptr);
return Void();
}
Return<void> QtiComposerClient::getDisplayCapabilities_2_4(uint64_t display,
getDisplayCapabilities_2_4_cb _hidl_cb) {
hidl_vec<composer_V2_4::IComposerClient::DisplayCapability> capabilities;
auto error = hwc_session_->GetDisplayCapabilities(display, &capabilities);
_hidl_cb(static_cast<composer_V2_4::Error>(error), capabilities);
return Void();
}

Return<void> QtiComposerClient::getDisplayConnectionType(uint64_t display,
getDisplayConnectionType_cb _hidl_cb) {
HwcDisplayConnectionType type;
auto error = hwc_session_->GetDisplayConnectionType(display, &type);
_hidl_cb(static_cast<composer_V2_4::Error>(error), type);
return Void();
}

Return<void> QtiComposerClient::getDisplayAttribute_2_4(
uint64_t display, uint32_t config, composer_V2_4::IComposerClient::Attribute attribute,
getDisplayAttribute_2_4_cb _hidl_cb) {
int32_t value = 0;
auto error = hwc_session_->GetDisplayAttribute(display, config, attribute, &value);
_hidl_cb(static_cast<composer_V2_4::Error>(error), value);
return Void();
}

Return<void> QtiComposerClient::getDisplayVsyncPeriod(uint64_t display,
getDisplayVsyncPeriod_cb _hidl_cb) {
uint32_t vsync_period;
auto error = hwc_session_->GetVsyncPeriod(display, &vsync_period);
_hidl_cb(static_cast<composer_V2_4::Error>(error), vsync_period);
return Void();
}

Return<void> QtiComposerClient::setActiveConfigWithConstraints(
uint64_t display, uint32_t config,
const composer_V2_4::IComposerClient::VsyncPeriodChangeConstraints
&vsyncPeriodChangeConstraints,
setActiveConfigWithConstraints_cb _hidl_cb) {
auto error = hwc_session_->SetActiveConfig(display, config);
// TODO(user): implement properly
composer_V2_4::VsyncPeriodChangeTimeline timeline;
timeline.newVsyncAppliedTimeNanos = systemTime();
timeline.refreshRequired = false;
timeline.refreshTimeNanos = 0;
_hidl_cb(static_cast<composer_V2_4::Error>(error), timeline);
return Void();
}

Return<composer_V2_4::Error> QtiComposerClient::setAutoLowLatencyMode(uint64_t display, bool on) {
return composer_V2_4::Error::UNSUPPORTED;
}

Return<void> QtiComposerClient::getSupportedContentTypes(uint64_t display,
getSupportedContentTypes_cb _hidl_cb) {
hidl_vec<composer_V2_4::IComposerClient::ContentType> types = {};
_hidl_cb(composer_V2_4::Error::NONE, types);
return Void();
}

Return<composer_V2_4::Error> QtiComposerClient::setContentType(
uint64_t display, composer_V2_4::IComposerClient::ContentType type) {
return composer_V2_4::Error::UNSUPPORTED;
}

Return<void> QtiComposerClient::getLayerGenericMetadataKeys(
getLayerGenericMetadataKeys_cb _hidl_cb) {
hidl_vec<composer_V2_4::IComposerClient::LayerGenericMetadataKey> keys = {};
_hidl_cb(composer_V2_4::Error::NONE, keys);
return Void();
}

QtiComposerClient::CommandReader::CommandReader(QtiComposerClient& client)
: mClient(client), mWriter(client.mWriter) {
}
Expand Down Expand Up @@ -1899,7 +1971,7 @@ IQtiComposerClient* HIDL_FETCH_IQtiComposerClient(const char* /* name */) {
}

} // namespace implementation
} // namespace V2_1
} // namespace V3_0
} // namespace composer
} // namespace display
} // namespace hardware
Expand Down
36 changes: 32 additions & 4 deletions composer/QtiComposerClient.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,13 @@
#ifndef __QTICOMPOSERCLIENT_H__
#define __QTICOMPOSERCLIENT_H__

#include <vendor/qti/hardware/display/composer/2.1/IQtiComposerClient.h>
#include <vendor/qti/hardware/display/composer/3.0/IQtiComposerClient.h>
#include <hidl/MQDescriptor.h>
#include <hidl/Status.h>
#include <log/log.h>
#include <unordered_set>
#include <vector>
#include <string>

#include "hwc_session.h"
#include "QtiComposerCommandBuffer.h"
Expand All @@ -36,7 +37,7 @@ namespace qti {
namespace hardware {
namespace display {
namespace composer {
namespace V2_1 {
namespace V3_0 {
namespace implementation {

namespace common_V1_0 = ::android::hardware::graphics::common::V1_0;
Expand All @@ -46,6 +47,7 @@ namespace common_V1_2 = ::android::hardware::graphics::common::V1_2;
namespace composer_V2_1 = ::android::hardware::graphics::composer::V2_1;
namespace composer_V2_2 = ::android::hardware::graphics::composer::V2_2;
namespace composer_V2_3 = ::android::hardware::graphics::composer::V2_3;
namespace composer_V2_4 = ::android::hardware::graphics::composer::V2_4;

using PerFrameMetadataKey_V2 = composer_V2_2::IComposerClient::PerFrameMetadataKey;
using PerFrameMetadataKey = composer_V2_3::IComposerClient::PerFrameMetadataKey;
Expand Down Expand Up @@ -187,6 +189,31 @@ class QtiComposerClient : public IQtiComposerClient {
getDisplayBrightnessSupport_cb _hidl_cb) override;
Return<Error> setDisplayBrightness(uint64_t display, float brightness) override;

// Methods from ::android::hardware::graphics::composer::V2_4::IComposerClient follow.
Return<void> registerCallback_2_4(const sp<composer_V2_4::IComposerCallback> &callback) override;
Return<void> getDisplayCapabilities_2_4(uint64_t display,
getDisplayCapabilities_2_4_cb _hidl_cb) override;
Return<void> getDisplayConnectionType(uint64_t display,
getDisplayConnectionType_cb _hidl_cb) override;
Return<void> getDisplayAttribute_2_4(uint64_t display, uint32_t config,
composer_V2_4::IComposerClient::Attribute attribute,
getDisplayAttribute_2_4_cb _hidl_cb) override;

Return<void> getDisplayVsyncPeriod(uint64_t display, getDisplayVsyncPeriod_cb _hidl_cb) override;
Return<void> setActiveConfigWithConstraints(
uint64_t display, uint32_t config,
const composer_V2_4::IComposerClient::VsyncPeriodChangeConstraints
&vsyncPeriodChangeConstraints,
setActiveConfigWithConstraints_cb _hidl_cb) override;

Return<composer_V2_4::Error> setAutoLowLatencyMode(uint64_t display, bool on) override;

Return<void> getSupportedContentTypes(uint64_t display,
getSupportedContentTypes_cb _hidl_cb) override;
Return<composer_V2_4::Error> setContentType(
uint64_t display, composer_V2_4::IComposerClient::ContentType type) override;
Return<void> getLayerGenericMetadataKeys(getLayerGenericMetadataKeys_cb _hidl_cb) override;

// Methods for RegisterCallback
void enableCallback(bool enable);
static void onHotplug(hwc2_callback_data_t callbackData, hwc2_display_t display,
Expand Down Expand Up @@ -322,7 +349,8 @@ class QtiComposerClient : public IQtiComposerClient {
};

HWCSession *hwc_session_ = nullptr;
sp<composer_V2_1::IComposerCallback> mCallback;
sp<composer_V2_1::IComposerCallback> callback_ = nullptr;
sp<composer_V2_4::IComposerCallback> callback24_ = nullptr;
std::mutex mCommandMutex;
// 64KiB minus a small space for metadata such as read/write pointers */
static constexpr size_t kWriterInitialSize = 64 * 1024 / sizeof(uint32_t) - 16;
Expand All @@ -335,7 +363,7 @@ class QtiComposerClient : public IQtiComposerClient {
extern "C" IQtiComposerClient* HIDL_FETCH_IQtiComposerClient(const char* name);

} // namespace implementation
} // namespace V2_1
} // namespace V3_0
} // namespace composer
} // namespace display
} // namespace hardware
Expand Down
Loading

0 comments on commit 8584a0f

Please sign in to comment.