diff options
author | Shan Huang <shanh@google.com> | 2021-08-18 00:56:08 +0000 |
---|---|---|
committer | Shan Huang <shanh@google.com> | 2021-08-19 18:50:25 +0000 |
commit | a1f7a71c2df15cef04e79f6c20f126e81b49c839 (patch) | |
tree | 07e82830ee9bd88d6def3a109c3834e6a027172c | |
parent | f1eb5cc17a0ee4bdeaafedc43b9e97f56faac389 (diff) |
Move boot color sysprop parsing to after loading zips.
Otherwise the sysprops would not be loaded yet and accessing them would
return empty strings.
Though unlikely, this is not 100% safe because boot color sysprops
are not guaranteed to be loaded by the time zips are loaded. A TODO
here is to understand boot steps and their timing implications so
that we can fully avoid the race condition.
Bug: 190093578
Test: adb shell setprop persist.bootanim.color(1-4), then reboot phone.
Change-Id: I603da080b1732a436a10dbaca6f2be9f158124dc
-rw-r--r-- | cmds/bootanimation/BootAnimation.cpp | 47 | ||||
-rw-r--r-- | cmds/bootanimation/BootAnimation.h | 1 |
2 files changed, 26 insertions, 22 deletions
diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp index fa94e6a4ace6..98e447cf996f 100644 --- a/cmds/bootanimation/BootAnimation.cpp +++ b/cmds/bootanimation/BootAnimation.cpp @@ -729,22 +729,6 @@ void BootAnimation::initShaders() { glVertexAttribPointer(uvLocation, 2, GL_FLOAT, GL_FALSE, 0, quadUVs); glEnableVertexAttribArray(uvLocation); - if (dynamicColoringEnabled) { - glUseProgram(mImageShader); - SLOGI("[BootAnimation] Dynamically coloring boot animation."); - for (int i = 0; i < DYNAMIC_COLOR_COUNT; i++) { - float *startColor = mAnimation->startColors[i]; - float *endColor = mAnimation->endColors[i]; - glUniform4f(glGetUniformLocation(mImageShader, - (U_START_COLOR_PREFIX + std::to_string(i)).c_str()), - startColor[0], startColor[1], startColor[2], 1 /* alpha */); - glUniform4f(glGetUniformLocation(mImageShader, - (U_END_COLOR_PREFIX + std::to_string(i)).c_str()), - endColor[0], endColor[1], endColor[2], 1 /* alpha */); - } - mImageColorProgressLocation = glGetUniformLocation(mImageShader, U_COLOR_PROGRESS); - } - // Initialize text shader. mTextShader = linkShader(vertexShader, textFragmentShader); positionLocation = glGetAttribLocation(mTextShader, A_POSITION); @@ -1180,12 +1164,6 @@ bool BootAnimation::parseAnimationDesc(Animation& animation) { s = ++endl; } - for (int i = 0; i < DYNAMIC_COLOR_COUNT; i++) { - parseColorDecimalString( - android::base::GetProperty("persist.bootanim.color" + std::to_string(i + 1), ""), - animation.endColors[i], animation.startColors[i]); - } - return true; } @@ -1362,6 +1340,10 @@ bool BootAnimation::movie() { mTimeCheckThread->run("BootAnimation::TimeCheckThread", PRIORITY_NORMAL); } + if (mAnimation != nullptr && mAnimation->dynamicColoringEnabled) { + initDynamicColors(); + } + playAnimation(*mAnimation); if (mTimeCheckThread != nullptr) { @@ -1415,6 +1397,27 @@ void BootAnimation::drawTexturedQuad(float xStart, float yStart, float width, fl sizeof(quadPositions) / sizeof(quadPositions[0]) / 2); } +void BootAnimation::initDynamicColors() { + for (int i = 0; i < DYNAMIC_COLOR_COUNT; i++) { + parseColorDecimalString( + android::base::GetProperty("persist.bootanim.color" + std::to_string(i + 1), ""), + mAnimation->endColors[i], mAnimation->startColors[i]); + } + glUseProgram(mImageShader); + SLOGI("[BootAnimation] Dynamically coloring boot animation."); + for (int i = 0; i < DYNAMIC_COLOR_COUNT; i++) { + float *startColor = mAnimation->startColors[i]; + float *endColor = mAnimation->endColors[i]; + glUniform4f(glGetUniformLocation(mImageShader, + (U_START_COLOR_PREFIX + std::to_string(i)).c_str()), + startColor[0], startColor[1], startColor[2], 1 /* alpha */); + glUniform4f(glGetUniformLocation(mImageShader, + (U_END_COLOR_PREFIX + std::to_string(i)).c_str()), + endColor[0], endColor[1], endColor[2], 1 /* alpha */); + } + mImageColorProgressLocation = glGetUniformLocation(mImageShader, U_COLOR_PROGRESS); +} + bool BootAnimation::playAnimation(const Animation& animation) { const size_t pcount = animation.parts.size(); nsecs_t frameDuration = s2ns(1) / animation.fps; diff --git a/cmds/bootanimation/BootAnimation.h b/cmds/bootanimation/BootAnimation.h index 8bb3256543f4..0e29621f0326 100644 --- a/cmds/bootanimation/BootAnimation.h +++ b/cmds/bootanimation/BootAnimation.h @@ -204,6 +204,7 @@ private: void checkExit(); void handleViewport(nsecs_t timestep); + void initDynamicColors(); sp<SurfaceComposerClient> mSession; AssetManager mAssets; |