Merge "Add setColor, setColorAlpha, and setColorDataspace to ASurfaceControl"
This commit is contained in:
@@ -231,6 +231,7 @@ LIBANDROID {
|
||||
ASurfaceTransaction_setBuffer; # introduced=29
|
||||
ASurfaceTransaction_setBufferAlpha; # introduced=29
|
||||
ASurfaceTransaction_setBufferTransparency; # introduced=29
|
||||
ASurfaceTransaction_setColor; # introduced=29
|
||||
ASurfaceTransaction_setDamageRegion; # introduced=29
|
||||
ASurfaceTransaction_setDesiredPresentTime; # introduced=29
|
||||
ASurfaceTransaction_setGeometry; # introduced=29
|
||||
|
||||
@@ -44,6 +44,76 @@ using Transaction = SurfaceComposerClient::Transaction;
|
||||
LOG_ALWAYS_FATAL_IF(!static_cast<const Rect&>(name).isValid(), \
|
||||
"invalid arg passed as " #name " argument");
|
||||
|
||||
static bool getWideColorSupport(const sp<SurfaceControl>& surfaceControl) {
|
||||
sp<SurfaceComposerClient> client = surfaceControl->getClient();
|
||||
sp<IBinder> display(client->getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain));
|
||||
|
||||
Vector<ui::ColorMode> colorModes;
|
||||
status_t err = client->getDisplayColorModes(display, &colorModes);
|
||||
if (err) {
|
||||
ALOGE("unable to get wide color support");
|
||||
return false;
|
||||
}
|
||||
|
||||
bool wideColorBoardConfig =
|
||||
getBool<ISurfaceFlingerConfigs,
|
||||
&ISurfaceFlingerConfigs::hasWideColorDisplay>(false);
|
||||
|
||||
for (android::ui::ColorMode colorMode : colorModes) {
|
||||
switch (colorMode) {
|
||||
case ui::ColorMode::DISPLAY_P3:
|
||||
case ui::ColorMode::ADOBE_RGB:
|
||||
case ui::ColorMode::DCI_P3:
|
||||
if (wideColorBoardConfig) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool getHdrSupport(const sp<SurfaceControl>& surfaceControl) {
|
||||
sp<SurfaceComposerClient> client = surfaceControl->getClient();
|
||||
sp<IBinder> display(client->getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain));
|
||||
|
||||
HdrCapabilities hdrCapabilities;
|
||||
status_t err = client->getHdrCapabilities(display, &hdrCapabilities);
|
||||
if (err) {
|
||||
ALOGE("unable to get hdr capabilities");
|
||||
return false;
|
||||
}
|
||||
|
||||
return !hdrCapabilities.getSupportedHdrTypes().empty();
|
||||
}
|
||||
|
||||
static bool isDataSpaceValid(const sp<SurfaceControl>& surfaceControl, ADataSpace dataSpace) {
|
||||
static_assert(static_cast<int>(ADATASPACE_UNKNOWN) == static_cast<int>(HAL_DATASPACE_UNKNOWN));
|
||||
static_assert(static_cast<int>(ADATASPACE_SCRGB_LINEAR) == static_cast<int>(HAL_DATASPACE_V0_SCRGB_LINEAR));
|
||||
static_assert(static_cast<int>(ADATASPACE_SRGB) == static_cast<int>(HAL_DATASPACE_V0_SRGB));
|
||||
static_assert(static_cast<int>(ADATASPACE_SCRGB) == static_cast<int>(HAL_DATASPACE_V0_SCRGB));
|
||||
static_assert(static_cast<int>(ADATASPACE_DISPLAY_P3) == static_cast<int>(HAL_DATASPACE_DISPLAY_P3));
|
||||
static_assert(static_cast<int>(ADATASPACE_BT2020_PQ) == static_cast<int>(HAL_DATASPACE_BT2020_PQ));
|
||||
|
||||
switch (static_cast<android_dataspace_t>(dataSpace)) {
|
||||
case HAL_DATASPACE_UNKNOWN:
|
||||
case HAL_DATASPACE_V0_SRGB:
|
||||
return true;
|
||||
// These data space need wide gamut support.
|
||||
case HAL_DATASPACE_V0_SCRGB_LINEAR:
|
||||
case HAL_DATASPACE_V0_SCRGB:
|
||||
case HAL_DATASPACE_DISPLAY_P3:
|
||||
return getWideColorSupport(surfaceControl);
|
||||
// These data space need HDR support.
|
||||
case HAL_DATASPACE_BT2020_PQ:
|
||||
return getHdrSupport(surfaceControl);
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
Transaction* ASurfaceTransaction_to_Transaction(ASurfaceTransaction* aSurfaceTransaction) {
|
||||
return reinterpret_cast<Transaction*>(aSurfaceTransaction);
|
||||
}
|
||||
@@ -431,3 +501,24 @@ void ASurfaceTransaction_setHdrMetadata_cta861_3(ASurfaceTransaction* aSurfaceTr
|
||||
|
||||
transaction->setHdrMetadata(surfaceControl, hdrMetadata);
|
||||
}
|
||||
|
||||
void ASurfaceTransaction_setColor(ASurfaceTransaction* aSurfaceTransaction,
|
||||
ASurfaceControl* aSurfaceControl,
|
||||
float r, float g, float b, float alpha,
|
||||
ADataSpace dataspace) {
|
||||
CHECK_NOT_NULL(aSurfaceTransaction);
|
||||
CHECK_NOT_NULL(aSurfaceControl);
|
||||
|
||||
sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
|
||||
LOG_ALWAYS_FATAL_IF(!isDataSpaceValid(surfaceControl, dataspace), "invalid dataspace");
|
||||
Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
|
||||
|
||||
half3 color;
|
||||
color.r = r;
|
||||
color.g = g;
|
||||
color.b = b;
|
||||
|
||||
transaction->setColor(surfaceControl, color)
|
||||
.setColorAlpha(surfaceControl, alpha)
|
||||
.setColorDataspace(surfaceControl, static_cast<ui::Dataspace>(dataspace));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user