diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2018-06-07 07:27:01 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2018-06-07 07:27:01 +0000 |
commit | fed9c5bacda4bc2b34468e0e72469fbbfb7dae97 (patch) | |
tree | 2d11e58ddae887616df176e8e46315825235331d | |
parent | 4c798c91fdc99b8b4a111fa6f7e569f3bfbecf25 (diff) | |
parent | b46d5b2d82b021db41a72f4c3eb9250f8a839e04 (diff) | |
download | native-fed9c5bacda4bc2b34468e0e72469fbbfb7dae97.tar.gz |
Snap for 4826885 from b46d5b2d82b021db41a72f4c3eb9250f8a839e04 to pi-release
Change-Id: I28d7d98dd2f98a088767c01007d0453ecebb8c7b
-rw-r--r-- | services/surfaceflinger/BufferLayer.cpp | 11 | ||||
-rw-r--r-- | services/surfaceflinger/BufferLayer.h | 2 | ||||
-rw-r--r-- | services/surfaceflinger/Layer.h | 2 | ||||
-rw-r--r-- | services/surfaceflinger/RenderEngine/GLES20RenderEngine.cpp | 5 | ||||
-rw-r--r-- | services/surfaceflinger/RenderEngine/ProgramCache.cpp | 38 | ||||
-rw-r--r-- | services/surfaceflinger/RenderEngine/ProgramCache.h | 5 | ||||
-rw-r--r-- | services/surfaceflinger/RenderEngine/RenderEngine.cpp | 11 | ||||
-rw-r--r-- | services/surfaceflinger/RenderEngine/RenderEngine.h | 4 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 11 |
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); } |