Use RGBA16F layers when wide color gamut rendering is on
Layers created using View.setLayerType() or Canvas.saveLayer() need
to be RGBA16F/scRGB-nl when within a window that requested wide color
gamut rendering.
Bug: 29940137
Test: CtsUiRenderingTestCases, CtsGraphicsTestCases, hwui_unit_tests
Change-Id: I42fd6355448c92041491a7109e3ac8a153d38bf9
diff --git a/libs/hwui/renderstate/OffscreenBufferPool.cpp b/libs/hwui/renderstate/OffscreenBufferPool.cpp
index a9bbb27..90b27c8 100644
--- a/libs/hwui/renderstate/OffscreenBufferPool.cpp
+++ b/libs/hwui/renderstate/OffscreenBufferPool.cpp
@@ -35,17 +35,19 @@
////////////////////////////////////////////////////////////////////////////////
OffscreenBuffer::OffscreenBuffer(RenderState& renderState, Caches& caches,
- uint32_t viewportWidth, uint32_t viewportHeight)
+ uint32_t viewportWidth, uint32_t viewportHeight, bool wideColorGamut)
: GpuMemoryTracker(GpuObjectType::OffscreenBuffer)
, renderState(renderState)
, viewportWidth(viewportWidth)
, viewportHeight(viewportHeight)
- , texture(caches) {
+ , texture(caches)
+ , wideColorGamut(wideColorGamut) {
uint32_t width = computeIdealDimension(viewportWidth);
uint32_t height = computeIdealDimension(viewportHeight);
ATRACE_FORMAT("Allocate %ux%u HW Layer", width, height);
caches.textureState().activateTexture(0);
- texture.resize(width, height, caches.rgbaInternalFormat(), GL_RGBA);
+ texture.resize(width, height,
+ wideColorGamut ? GL_RGBA16F : caches.rgbaInternalFormat(), GL_RGBA);
texture.blend = true;
texture.setWrap(GL_CLAMP_TO_EDGE);
// not setting filter on texture, since it's set when drawing, based on transform
@@ -127,7 +129,10 @@
int deltaInt = int(lhs.width) - int(rhs.width);
if (deltaInt != 0) return deltaInt;
- return int(lhs.height) - int(rhs.height);
+ deltaInt = int(lhs.height) - int(rhs.height);
+ if (deltaInt != 0) return deltaInt;
+
+ return int(lhs.wideColorGamut) - int(rhs.wideColorGamut);
}
void OffscreenBufferPool::clear() {
@@ -139,10 +144,10 @@
}
OffscreenBuffer* OffscreenBufferPool::get(RenderState& renderState,
- const uint32_t width, const uint32_t height) {
+ const uint32_t width, const uint32_t height, bool wideColorGamut) {
OffscreenBuffer* layer = nullptr;
- Entry entry(width, height);
+ Entry entry(width, height, wideColorGamut);
auto iter = mPool.find(entry);
if (iter != mPool.end()) {
@@ -154,7 +159,8 @@
layer->viewportHeight = height;
mSize -= layer->getSizeInBytes();
} else {
- layer = new OffscreenBuffer(renderState, Caches::getInstance(), width, height);
+ layer = new OffscreenBuffer(renderState, Caches::getInstance(),
+ width, height, wideColorGamut);
}
return layer;
@@ -174,7 +180,7 @@
return layer;
}
putOrDelete(layer);
- return get(renderState, width, height);
+ return get(renderState, width, height, layer->wideColorGamut);
}
void OffscreenBufferPool::dump() {