summaryrefslogtreecommitdiff
path: root/services/surfaceflinger/SurfaceFlinger.cpp
diff options
context:
space:
mode:
authorYichi Chen <yichichen@google.com>2019-06-28 14:58:27 +0800
committerYichi Chen <yichichen@google.com>2019-07-04 08:41:18 +0800
commitda901bfc4f15723f0a7567ecd09742fd166df2f0 (patch)
tree398f9450270c04716ad841464f4b2dd6b8772b93 /services/surfaceflinger/SurfaceFlinger.cpp
parent57e206513f87b5af6b0a32ca6e9f245cd5b78040 (diff)
SF: enable device-specific dataspace for color space agnostic surfaces
To reduce the DPU loading in color conversion, we enable device-specific dataspace for color space agnostic surfaces. Since the type of surfaces usually provide gray-level surfaces to users, it can be acceptable to ignore the color conversion on them. Bug: 134783740 Bug: 135140940 Test: Check ScreenDecorOverlays in expected dataspace Test: Play HDR video on B1 and C2 and check dataspace Change-Id: I7b11e11d2015eb5c8dfdc372e2c7ffcb40a2ac1d
Diffstat (limited to 'services/surfaceflinger/SurfaceFlinger.cpp')
-rw-r--r--services/surfaceflinger/SurfaceFlinger.cpp14
1 files changed, 11 insertions, 3 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 459cd0af89..6d9dc97c5a 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -311,6 +311,9 @@ SurfaceFlinger::SurfaceFlinger(Factory& factory) : SurfaceFlinger(factory, SkipI
wideColorGamutCompositionPixelFormat =
static_cast<ui::PixelFormat>(wcg_composition_pixel_format(ui::PixelFormat::RGBA_8888));
+ mColorSpaceAgnosticDataspace =
+ static_cast<ui::Dataspace>(color_space_agnostic_dataspace(Dataspace::UNKNOWN));
+
useContextPriority = use_context_priority(true);
auto tmpPrimaryDisplayOrientation = primary_display_orientation(
@@ -1879,7 +1882,14 @@ void SurfaceFlinger::calculateWorkingSet() {
RenderIntent renderIntent;
pickColorMode(displayDevice, &colorMode, &targetDataspace, &renderIntent);
display->setColorMode(colorMode, targetDataspace, renderIntent);
+
+ if (isHdrColorMode(colorMode)) {
+ targetDataspace = Dataspace::UNKNOWN;
+ } else if (mColorSpaceAgnosticDataspace != Dataspace::UNKNOWN) {
+ targetDataspace = mColorSpaceAgnosticDataspace;
+ }
}
+
for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) {
if (layer->isHdrY410()) {
layer->forceClientComposition(displayDevice);
@@ -1906,9 +1916,7 @@ void SurfaceFlinger::calculateWorkingSet() {
const auto& displayState = display->getState();
layer->setPerFrameData(displayDevice, displayState.transform, displayState.viewport,
- displayDevice->getSupportedPerFrameMetadata(),
- isHdrColorMode(displayState.colorMode) ? Dataspace::UNKNOWN
- : targetDataspace);
+ displayDevice->getSupportedPerFrameMetadata(), targetDataspace);
}
}