Remove isDataspaceValid
isDataspaceValid is problematic in that it prevents applications from being able to pass-through dataspaces they receive from other APIs, and it also assumes that the display's capabilities are the only things that are supported. Although it's recommended that applications stick to dataspaces that the display can handle, it's not strictly required. RenderEngine can handle more dataspaces than the display can, applying appropriate color conversion. Similarly this could be going to a virtual display instead, in which case the physical display's capabilities are not necessarily relevant. Bug: 149931223 Test: make Change-Id: I475f4e4dcbcdb4765670f6a8eb4cc047a9babb43
This commit is contained in:
parent
315a26781c
commit
2b2ba935f8
@ -44,70 +44,14 @@ 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();
|
||||
|
||||
const sp<IBinder> display = client->getInternalDisplayToken();
|
||||
if (display == nullptr) {
|
||||
ALOGE("unable to get wide color support for disconnected internal display");
|
||||
return false;
|
||||
}
|
||||
|
||||
bool isWideColorDisplay = false;
|
||||
status_t err = client->isWideColorDisplay(display, &isWideColorDisplay);
|
||||
if (err) {
|
||||
ALOGE("unable to get wide color support");
|
||||
return false;
|
||||
}
|
||||
return isWideColorDisplay;
|
||||
}
|
||||
|
||||
static bool getHdrSupport(const sp<SurfaceControl>& surfaceControl) {
|
||||
sp<SurfaceComposerClient> client = surfaceControl->getClient();
|
||||
|
||||
const sp<IBinder> display = client->getInternalDisplayToken();
|
||||
if (display == nullptr) {
|
||||
ALOGE("unable to get hdr capabilities for disconnected internal display");
|
||||
return false;
|
||||
}
|
||||
|
||||
ui::DynamicDisplayInfo info;
|
||||
if (status_t err = client->getDynamicDisplayInfo(display, &info); err != NO_ERROR) {
|
||||
ALOGE("unable to get hdr capabilities");
|
||||
return err;
|
||||
}
|
||||
|
||||
return !info.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:
|
||||
if (!getHdrSupport(surfaceControl)) {
|
||||
ALOGE("Invalid dataspace - device does not support hdr");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
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));
|
||||
|
||||
Transaction* ASurfaceTransaction_to_Transaction(ASurfaceTransaction* aSurfaceTransaction) {
|
||||
return reinterpret_cast<Transaction*>(aSurfaceTransaction);
|
||||
@ -580,10 +524,6 @@ void ASurfaceTransaction_setBufferDataSpace(ASurfaceTransaction* aSurfaceTransac
|
||||
CHECK_NOT_NULL(aSurfaceControl);
|
||||
|
||||
sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
|
||||
if (!isDataSpaceValid(surfaceControl, aDataSpace)) {
|
||||
ALOGE("Failed to set buffer dataspace - invalid dataspace");
|
||||
return;
|
||||
}
|
||||
Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
|
||||
transaction->setDataspace(surfaceControl, static_cast<ui::Dataspace>(aDataSpace));
|
||||
}
|
||||
@ -650,10 +590,6 @@ void ASurfaceTransaction_setColor(ASurfaceTransaction* aSurfaceTransaction,
|
||||
CHECK_NOT_NULL(aSurfaceControl);
|
||||
|
||||
sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
|
||||
if (!isDataSpaceValid(surfaceControl, dataspace)) {
|
||||
ALOGE("Failed to set buffer dataspace - invalid dataspace");
|
||||
return;
|
||||
}
|
||||
Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
|
||||
|
||||
half3 color;
|
||||
|
Loading…
x
Reference in New Issue
Block a user