summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandroid-build-team Robot <android-build-team-robot@google.com>2018-06-07 07:27:01 +0000
committerandroid-build-team Robot <android-build-team-robot@google.com>2018-06-07 07:27:01 +0000
commitfed9c5bacda4bc2b34468e0e72469fbbfb7dae97 (patch)
tree2d11e58ddae887616df176e8e46315825235331d
parent4c798c91fdc99b8b4a111fa6f7e569f3bfbecf25 (diff)
parentb46d5b2d82b021db41a72f4c3eb9250f8a839e04 (diff)
downloadnative-fed9c5bacda4bc2b34468e0e72469fbbfb7dae97.tar.gz
Snap for 4826885 from b46d5b2d82b021db41a72f4c3eb9250f8a839e04 to pi-release
Change-Id: I28d7d98dd2f98a088767c01007d0453ecebb8c7b
-rw-r--r--services/surfaceflinger/BufferLayer.cpp11
-rw-r--r--services/surfaceflinger/BufferLayer.h2
-rw-r--r--services/surfaceflinger/Layer.h2
-rw-r--r--services/surfaceflinger/RenderEngine/GLES20RenderEngine.cpp5
-rw-r--r--services/surfaceflinger/RenderEngine/ProgramCache.cpp38
-rw-r--r--services/surfaceflinger/RenderEngine/ProgramCache.h5
-rw-r--r--services/surfaceflinger/RenderEngine/RenderEngine.cpp11
-rw-r--r--services/surfaceflinger/RenderEngine/RenderEngine.h4
-rw-r--r--services/surfaceflinger/SurfaceFlinger.cpp11
9 files changed, 64 insertions, 25 deletions
diff --git a/services/surfaceflinger/BufferLayer.cpp b/services/surfaceflinger/BufferLayer.cpp
index 17ed9aa00c..fda7906744 100644
--- a/services/surfaceflinger/BufferLayer.cpp
+++ b/services/surfaceflinger/BufferLayer.cpp
@@ -815,6 +815,13 @@ bool BufferLayer::getOpacityForFormat(uint32_t format) {
return true;
}
+bool BufferLayer::isHdrY410() const {
+ // pixel format is HDR Y410 masquerading as RGBA_1010102
+ return (mCurrentDataSpace == ui::Dataspace::BT2020_ITU_PQ &&
+ mConsumer->getCurrentApi() == NATIVE_WINDOW_API_MEDIA &&
+ getBE().compositionInfo.mBuffer->getPixelFormat() == HAL_PIXEL_FORMAT_RGBA_1010102);
+}
+
void BufferLayer::drawWithOpenGL(const RenderArea& renderArea, bool useIdentityTransform) const {
ATRACE_CALL();
const State& s(getDrawingState());
@@ -868,9 +875,7 @@ void BufferLayer::drawWithOpenGL(const RenderArea& renderArea, bool useIdentityT
getColor());
engine.setSourceDataSpace(mCurrentDataSpace);
- if (mCurrentDataSpace == ui::Dataspace::BT2020_ITU_PQ &&
- mConsumer->getCurrentApi() == NATIVE_WINDOW_API_MEDIA &&
- getBE().compositionInfo.mBuffer->getPixelFormat() == HAL_PIXEL_FORMAT_RGBA_1010102) {
+ if (isHdrY410()) {
engine.setSourceY410BT2020(true);
}
diff --git a/services/surfaceflinger/BufferLayer.h b/services/surfaceflinger/BufferLayer.h
index 6b02f8c128..bf0ca69253 100644
--- a/services/surfaceflinger/BufferLayer.h
+++ b/services/surfaceflinger/BufferLayer.h
@@ -129,6 +129,8 @@ public:
bool isBufferLatched() const override { return mRefreshPending; }
void setDefaultBufferSize(uint32_t w, uint32_t h) override;
+ bool isHdrY410() const override;
+
void setPerFrameData(const sp<const DisplayDevice>& displayDevice) override;
bool isOpaque(const Layer::State& s) const override;
diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h
index ae80043a5d..34811fb152 100644
--- a/services/surfaceflinger/Layer.h
+++ b/services/surfaceflinger/Layer.h
@@ -378,6 +378,8 @@ protected:
public:
virtual void setDefaultBufferSize(uint32_t /*w*/, uint32_t /*h*/) {}
+ virtual bool isHdrY410() const { return false; }
+
void setGeometry(const sp<const DisplayDevice>& displayDevice, uint32_t z);
void forceClientComposition(int32_t hwcId);
bool getForceClientComposition(int32_t hwcId);
diff --git a/services/surfaceflinger/RenderEngine/GLES20RenderEngine.cpp b/services/surfaceflinger/RenderEngine/GLES20RenderEngine.cpp
index 90404fae6b..0048000847 100644
--- a/services/surfaceflinger/RenderEngine/GLES20RenderEngine.cpp
+++ b/services/surfaceflinger/RenderEngine/GLES20RenderEngine.cpp
@@ -112,7 +112,10 @@ namespace impl {
using ui::Dataspace;
GLES20RenderEngine::GLES20RenderEngine(uint32_t featureFlags)
- : mVpWidth(0), mVpHeight(0), mPlatformHasWideColor((featureFlags & WIDE_COLOR_SUPPORT) != 0) {
+ : RenderEngine(featureFlags),
+ mVpWidth(0),
+ mVpHeight(0),
+ mPlatformHasWideColor((featureFlags & WIDE_COLOR_SUPPORT) != 0) {
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &mMaxTextureSize);
glGetIntegerv(GL_MAX_VIEWPORT_DIMS, mMaxViewportDims);
diff --git a/services/surfaceflinger/RenderEngine/ProgramCache.cpp b/services/surfaceflinger/RenderEngine/ProgramCache.cpp
index 5b61db9fbd..796901a2bd 100644
--- a/services/surfaceflinger/RenderEngine/ProgramCache.cpp
+++ b/services/surfaceflinger/RenderEngine/ProgramCache.cpp
@@ -14,10 +14,13 @@
* limitations under the License.
*/
+#define ATRACE_TAG ATRACE_TAG_GRAPHICS
+
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
#include <utils/String8.h>
+#include <utils/Trace.h>
#include "Description.h"
#include "Program.h"
@@ -75,15 +78,11 @@ Formatter& dedent(Formatter& f) {
ANDROID_SINGLETON_STATIC_INSTANCE(ProgramCache)
-ProgramCache::ProgramCache() {
- // Until surfaceflinger has a dependable blob cache on the filesystem,
- // generate shaders on initialization so as to avoid jank.
- primeCache();
-}
+ProgramCache::ProgramCache() {}
ProgramCache::~ProgramCache() {}
-void ProgramCache::primeCache() {
+void ProgramCache::primeCache(bool hasWideColor) {
uint32_t shaderCount = 0;
uint32_t keyMask = Key::BLEND_MASK | Key::OPACITY_MASK | Key::ALPHA_MASK | Key::TEXTURE_MASK;
// Prime the cache for all combinations of the above masks,
@@ -104,6 +103,27 @@ void ProgramCache::primeCache() {
shaderCount++;
}
}
+
+ // Prime for sRGB->P3 conversion
+ if (hasWideColor) {
+ Key shaderKey;
+ shaderKey.set(Key::BLEND_MASK | Key::TEXTURE_MASK | Key::OUTPUT_TRANSFORM_MATRIX_MASK |
+ Key::INPUT_TF_MASK | Key::OUTPUT_TF_MASK,
+ Key::BLEND_PREMULT | Key::TEXTURE_EXT | Key::OUTPUT_TRANSFORM_MATRIX_ON |
+ Key::INPUT_TF_SRGB | Key::OUTPUT_TF_SRGB);
+ for (int i = 0; i < 4; i++) {
+ shaderKey.set(Key::OPACITY_MASK,
+ (i & 1) ? Key::OPACITY_OPAQUE : Key::OPACITY_TRANSLUCENT);
+ shaderKey.set(Key::ALPHA_MASK, (i & 2) ? Key::ALPHA_LT_ONE : Key::ALPHA_EQ_ONE);
+ Program* program = mCache.valueFor(shaderKey);
+ if (program == nullptr) {
+ program = generateProgram(shaderKey);
+ mCache.add(shaderKey, program);
+ shaderCount++;
+ }
+ }
+ }
+
nsecs_t timeAfter = systemTime();
float compileTimeMs = static_cast<float>(timeAfter - timeBefore) / 1.0E6;
ALOGD("shader cache generated - %u shaders in %f ms\n", shaderCount, compileTimeMs);
@@ -631,6 +651,8 @@ String8 ProgramCache::generateFragmentShader(const Key& needs) {
}
Program* ProgramCache::generateProgram(const Key& needs) {
+ ATRACE_CALL();
+
// vertex shader
String8 vs = generateVertexShader(needs);
@@ -654,8 +676,8 @@ void ProgramCache::useProgram(const Description& description) {
mCache.add(needs, program);
time += systemTime();
- // ALOGD(">>> generated new program: needs=%08X, time=%u ms (%d programs)",
- // needs.mNeeds, uint32_t(ns2ms(time)), mCache.size());
+ ALOGV(">>> generated new program: needs=%08X, time=%u ms (%zu programs)", needs.mKey,
+ uint32_t(ns2ms(time)), mCache.size());
}
// here we have a suitable program for this description
diff --git a/services/surfaceflinger/RenderEngine/ProgramCache.h b/services/surfaceflinger/RenderEngine/ProgramCache.h
index 864bc3f618..983e7baf02 100644
--- a/services/surfaceflinger/RenderEngine/ProgramCache.h
+++ b/services/surfaceflinger/RenderEngine/ProgramCache.h
@@ -160,13 +160,14 @@ public:
ProgramCache();
~ProgramCache();
+ // Generate shaders to populate the cache
+ void primeCache(bool hasWideColor);
+
// useProgram lookup a suitable program in the cache or generates one
// if none can be found.
void useProgram(const Description& description);
private:
- // Generate shaders to populate the cache
- void primeCache();
// compute a cache Key from a Description
static Key computeKey(const Description& description);
// Generate EOTF based from Key.
diff --git a/services/surfaceflinger/RenderEngine/RenderEngine.cpp b/services/surfaceflinger/RenderEngine/RenderEngine.cpp
index c2233f9b59..d745770bb7 100644
--- a/services/surfaceflinger/RenderEngine/RenderEngine.cpp
+++ b/services/surfaceflinger/RenderEngine/RenderEngine.cpp
@@ -150,8 +150,11 @@ bool RenderEngine::overrideUseContextPriorityFromConfig(bool useContextPriority)
}
}
-RenderEngine::RenderEngine()
- : mEGLDisplay(EGL_NO_DISPLAY), mEGLConfig(nullptr), mEGLContext(EGL_NO_CONTEXT) {}
+RenderEngine::RenderEngine(uint32_t featureFlags)
+ : mEGLDisplay(EGL_NO_DISPLAY),
+ mEGLConfig(nullptr),
+ mEGLContext(EGL_NO_CONTEXT),
+ mFeatureFlags(featureFlags) {}
RenderEngine::~RenderEngine() {
eglMakeCurrent(mEGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
@@ -588,9 +591,7 @@ EGLConfig RenderEngine::chooseEglConfig(EGLDisplay display, int format, bool log
}
void RenderEngine::primeCache() const {
- // Getting the ProgramCache instance causes it to prime its shader cache,
- // which is performed in its constructor
- ProgramCache::getInstance();
+ ProgramCache::getInstance().primeCache(mFeatureFlags & WIDE_COLOR_SUPPORT);
}
// ---------------------------------------------------------------------------
diff --git a/services/surfaceflinger/RenderEngine/RenderEngine.h b/services/surfaceflinger/RenderEngine/RenderEngine.h
index a14acaa68d..1196216cbf 100644
--- a/services/surfaceflinger/RenderEngine/RenderEngine.h
+++ b/services/surfaceflinger/RenderEngine/RenderEngine.h
@@ -172,7 +172,9 @@ class RenderEngine : public RE::RenderEngine {
static bool overrideUseContextPriorityFromConfig(bool useContextPriority);
protected:
- RenderEngine();
+ RenderEngine(uint32_t featureFlags);
+
+ const uint32_t mFeatureFlags;
public:
virtual ~RenderEngine() = 0;
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index cdd9c1804f..87baf8c8a8 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -2031,13 +2031,14 @@ void SurfaceFlinger::setUpHWComposer() {
"display %zd: %d", displayId, result);
}
for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) {
- if ((layer->getDataSpace() == Dataspace::BT2020_PQ ||
- layer->getDataSpace() == Dataspace::BT2020_ITU_PQ) &&
+ if (layer->isHdrY410()) {
+ layer->forceClientComposition(hwcId);
+ } else if ((layer->getDataSpace() == Dataspace::BT2020_PQ ||
+ layer->getDataSpace() == Dataspace::BT2020_ITU_PQ) &&
!displayDevice->hasHDR10Support()) {
layer->forceClientComposition(hwcId);
- }
- if ((layer->getDataSpace() == Dataspace::BT2020_HLG ||
- layer->getDataSpace() == Dataspace::BT2020_ITU_HLG) &&
+ } else if ((layer->getDataSpace() == Dataspace::BT2020_HLG ||
+ layer->getDataSpace() == Dataspace::BT2020_ITU_HLG) &&
!displayDevice->hasHLGSupport()) {
layer->forceClientComposition(hwcId);
}