diff options
| -rw-r--r-- | libs/renderengine/Android.bp | 1 | ||||
| -rw-r--r-- | libs/renderengine/gl/GLESRenderEngine.cpp | 2 | ||||
| -rw-r--r-- | libs/renderengine/gl/GLESRenderEngine.h | 2 | ||||
| -rw-r--r-- | libs/renderengine/include/renderengine/RenderEngine.h | 2 | ||||
| -rw-r--r-- | libs/renderengine/include/renderengine/mock/RenderEngine.h | 2 | ||||
| -rw-r--r-- | libs/renderengine/skia/Cache.cpp | 146 | ||||
| -rw-r--r-- | libs/renderengine/skia/Cache.h | 31 | ||||
| -rw-r--r-- | libs/renderengine/skia/SkiaGLRenderEngine.cpp | 5 | ||||
| -rw-r--r-- | libs/renderengine/skia/SkiaGLRenderEngine.h | 1 | ||||
| -rw-r--r-- | libs/renderengine/skia/SkiaRenderEngine.h | 4 | ||||
| -rw-r--r-- | libs/renderengine/threaded/RenderEngineThreaded.cpp | 2 | ||||
| -rw-r--r-- | libs/renderengine/threaded/RenderEngineThreaded.h | 2 |
12 files changed, 192 insertions, 8 deletions
diff --git a/libs/renderengine/Android.bp b/libs/renderengine/Android.bp index eb3b434935..026b19a75a 100644 --- a/libs/renderengine/Android.bp +++ b/libs/renderengine/Android.bp @@ -84,6 +84,7 @@ filegroup { name: "librenderengine_skia_sources", srcs: [ "skia/AutoBackendTexture.cpp", + "skia/Cache.cpp", "skia/ColorSpaces.cpp", "skia/SkiaRenderEngine.cpp", "skia/SkiaGLRenderEngine.cpp", diff --git a/libs/renderengine/gl/GLESRenderEngine.cpp b/libs/renderengine/gl/GLESRenderEngine.cpp index 2b09c15f95..a2963a7c33 100644 --- a/libs/renderengine/gl/GLESRenderEngine.cpp +++ b/libs/renderengine/gl/GLESRenderEngine.cpp @@ -515,7 +515,7 @@ Framebuffer* GLESRenderEngine::getFramebufferForDrawing() { return mDrawingBuffer.get(); } -void GLESRenderEngine::primeCache() const { +void GLESRenderEngine::primeCache() { ProgramCache::getInstance().primeCache(mInProtectedContext ? mProtectedEGLContext : mEGLContext, mUseColorManagement, mPrecacheToneMapperShaderOnly); } diff --git a/libs/renderengine/gl/GLESRenderEngine.h b/libs/renderengine/gl/GLESRenderEngine.h index 7496b74ba5..06a17220f1 100644 --- a/libs/renderengine/gl/GLESRenderEngine.h +++ b/libs/renderengine/gl/GLESRenderEngine.h @@ -57,7 +57,7 @@ public: EGLSurface protectedStub); ~GLESRenderEngine() override EXCLUDES(mRenderingMutex); - void primeCache() const override; + void primeCache() override; void genTextures(size_t count, uint32_t* names) override; void deleteTextures(size_t count, uint32_t const* names) override; void cacheExternalTextureBuffer(const sp<GraphicBuffer>& buffer) EXCLUDES(mRenderingMutex); diff --git a/libs/renderengine/include/renderengine/RenderEngine.h b/libs/renderengine/include/renderengine/RenderEngine.h index ddae34a26e..7c51f1bb20 100644 --- a/libs/renderengine/include/renderengine/RenderEngine.h +++ b/libs/renderengine/include/renderengine/RenderEngine.h @@ -97,7 +97,7 @@ public: // This interface, while still in use until a suitable replacement is built, // should be considered deprecated, minus some methods which still may be // used to support legacy behavior. - virtual void primeCache() const = 0; + virtual void primeCache() = 0; // dump the extension strings. always call the base class. virtual void dump(std::string& result) = 0; diff --git a/libs/renderengine/include/renderengine/mock/RenderEngine.h b/libs/renderengine/include/renderengine/mock/RenderEngine.h index 895ba3fe85..5f75b81c9a 100644 --- a/libs/renderengine/include/renderengine/mock/RenderEngine.h +++ b/libs/renderengine/include/renderengine/mock/RenderEngine.h @@ -35,7 +35,7 @@ public: RenderEngine(); ~RenderEngine() override; - MOCK_CONST_METHOD0(primeCache, void()); + MOCK_METHOD0(primeCache, void()); MOCK_METHOD1(dump, void(std::string&)); MOCK_METHOD2(genTextures, void(size_t, uint32_t*)); MOCK_METHOD2(deleteTextures, void(size_t, uint32_t const*)); diff --git a/libs/renderengine/skia/Cache.cpp b/libs/renderengine/skia/Cache.cpp new file mode 100644 index 0000000000..4fdae74a5a --- /dev/null +++ b/libs/renderengine/skia/Cache.cpp @@ -0,0 +1,146 @@ +/* + * Copyright 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Cache.h" +#include "AutoBackendTexture.h" +#include "SkiaRenderEngine.h" +#include "android-base/unique_fd.h" +#include "renderengine/DisplaySettings.h" +#include "renderengine/LayerSettings.h" +#include "ui/GraphicBuffer.h" +#include "ui/GraphicTypes.h" +#include "ui/PixelFormat.h" +#include "ui/Rect.h" +#include "utils/Timers.h" + +namespace android::renderengine::skia { + +static void drawShadowLayer(SkiaRenderEngine* renderengine, const DisplaySettings& display, + sp<GraphicBuffer> dstBuffer) { + // Somewhat arbitrary dimensions, but on screen and slightly shorter, based + // on actual use. + FloatRect rect(0, 0, display.physicalDisplay.width(), display.physicalDisplay.height() - 30); + LayerSettings layer{ + .geometry = + Geometry{ + .boundaries = rect, + .roundedCornersCrop = rect, + }, + .shadow = + ShadowSettings{ + .ambientColor = vec4(0, 0, 0, 0.00935997f), + .spotColor = vec4(0, 0, 0, 0.0455841f), + .lightPos = vec3(370.508f, -1527.03f, 1650.f), + .lightRadius = 2200.0f, + .length = 0.955342f, + }, + }; + + auto layers = std::vector<const LayerSettings*>{&layer}; + // The identity matrix will generate the fast shaders, and the second matrix + // (based on one seen while going from dialer to the home screen) will + // generate the slower (more general case) version. If we also need a + // slow version without color correction, we should use this matrix with + // display.outputDataspace set to SRGB. + for (const mat4 transform : { mat4(), mat4(0.728872f, 0.f, 0.f, 0.f, + 0.f, 0.727627f, 0.f, 0.f, + 0.f, 0.f, 1.f, 0.f, + 167.355743f, 1852.257812f, 0.f, 1.f) }) { + layer.geometry.positionTransform = transform; + renderengine->drawLayers(display, layers, dstBuffer, false /* useFrameBufferCache*/, + base::unique_fd(), nullptr); + } +} + +static void drawImageLayers(SkiaRenderEngine* renderengine, const DisplaySettings& display, + sp<GraphicBuffer> dstBuffer, sp<GraphicBuffer> srcBuffer) { + const Rect& displayRect = display.physicalDisplay; + FloatRect rect(0, 0, displayRect.width(), displayRect.height()); + LayerSettings layer{ + .geometry = + Geometry{ + .boundaries = rect, + // This matrix is based on actual data seen when opening the dialer. + // What seems to be important in matching the actual use cases are: + // - it is not identity + // - the layer will be drawn (not clipped out etc) + .positionTransform = mat4(.19f, .0f, .0f, .0f, + .0f, .19f, .0f, .0f, + .0f, .0f, 1.f, .0f, + 169.f, 1527.f, .0f, 1.f), + .roundedCornersCrop = rect, + }, + .source = PixelSource{.buffer = + Buffer{ + .buffer = srcBuffer, + .maxMasteringLuminance = 1000.f, + .maxContentLuminance = 1000.f, + }}, + }; + + // Test both drawRect and drawRRect + auto layers = std::vector<const LayerSettings*>{&layer}; + for (float roundedCornersRadius : {0.0f, 500.f}) { + layer.geometry.roundedCornersRadius = roundedCornersRadius; + // No need to check UNKNOWN, which is treated as SRGB. + for (auto dataspace : {ui::Dataspace::SRGB, ui::Dataspace::DISPLAY_P3}) { + layer.sourceDataspace = dataspace; + for (bool isOpaque : {true, false}) { + layer.source.buffer.isOpaque = isOpaque; + for (auto alpha : {half(.23999f), half(1.0f)}) { + layer.alpha = alpha; + renderengine->drawLayers(display, layers, dstBuffer, + false /* useFrameBufferCache*/, base::unique_fd(), + nullptr); + } + } + } + } +} + +void Cache::primeShaderCache(SkiaRenderEngine* renderengine) { + const nsecs_t timeBefore = systemTime(); + // The dimensions should not matter, so long as we draw inside them. + const Rect displayRect(0, 0, 1080, 2340); + DisplaySettings display{ + .physicalDisplay = displayRect, + .clip = displayRect, + .maxLuminance = 500, + .outputDataspace = ui::Dataspace::DISPLAY_P3, + }; + + const int64_t usage = GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE; + + sp<GraphicBuffer> dstBuffer = + new GraphicBuffer(displayRect.width(), displayRect.height(), PIXEL_FORMAT_RGBA_8888, 1, + usage, "primeShaderCache_dst"); + // This buffer will be the source for the call to drawImageLayers. Draw + // something to it as a placeholder for what an app draws. We should draw + // something, but the details are not important. We only need one version of + // the shadow's SkSL, so draw it here, giving us both a placeholder image + // and a chance to compile the shadow's SkSL. + sp<GraphicBuffer> srcBuffer = + new GraphicBuffer(displayRect.width(), displayRect.height(), PIXEL_FORMAT_RGBA_8888, 1, + usage, "drawImageLayer_src"); + drawShadowLayer(renderengine, display, srcBuffer); + + drawImageLayers(renderengine, display, dstBuffer, srcBuffer); + const nsecs_t timeAfter = systemTime(); + const float compileTimeMs = static_cast<float>(timeAfter - timeBefore) / 1.0E6; + ALOGD("shader cache generated in %f ms\n", compileTimeMs); +} + +} // namespace android::renderengine::skia diff --git a/libs/renderengine/skia/Cache.h b/libs/renderengine/skia/Cache.h new file mode 100644 index 0000000000..437571e616 --- /dev/null +++ b/libs/renderengine/skia/Cache.h @@ -0,0 +1,31 @@ +/* + * Copyright 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +namespace android::renderengine::skia { + +class SkiaRenderEngine; + +class Cache { +public: + static void primeShaderCache(SkiaRenderEngine*); + +private: + Cache() = default; +}; + +} // namespace android::renderengine::skia diff --git a/libs/renderengine/skia/SkiaGLRenderEngine.cpp b/libs/renderengine/skia/SkiaGLRenderEngine.cpp index 91b163eda8..66efb093e6 100644 --- a/libs/renderengine/skia/SkiaGLRenderEngine.cpp +++ b/libs/renderengine/skia/SkiaGLRenderEngine.cpp @@ -40,6 +40,7 @@ #include <ui/DebugUtils.h> #include <ui/GraphicBuffer.h> #include <utils/Trace.h> +#include "Cache.h" #include <cmath> #include <cstdint> @@ -224,6 +225,10 @@ std::unique_ptr<SkiaGLRenderEngine> SkiaGLRenderEngine::create( return engine; } +void SkiaGLRenderEngine::primeCache() { + Cache::primeShaderCache(this); +} + EGLConfig SkiaGLRenderEngine::chooseEglConfig(EGLDisplay display, int format, bool logConfig) { status_t err; EGLConfig config; diff --git a/libs/renderengine/skia/SkiaGLRenderEngine.h b/libs/renderengine/skia/SkiaGLRenderEngine.h index 1c3a633c1c..15d834db21 100644 --- a/libs/renderengine/skia/SkiaGLRenderEngine.h +++ b/libs/renderengine/skia/SkiaGLRenderEngine.h @@ -50,6 +50,7 @@ public: EGLSurface protectedPlaceholder); ~SkiaGLRenderEngine() override EXCLUDES(mRenderingMutex); + void primeCache() override; void cacheExternalTextureBuffer(const sp<GraphicBuffer>& buffer) override; void unbindExternalTextureBuffer(uint64_t bufferId) override; status_t drawLayers(const DisplaySettings& display, diff --git a/libs/renderengine/skia/SkiaRenderEngine.h b/libs/renderengine/skia/SkiaRenderEngine.h index 79a1040b78..f4037257ee 100644 --- a/libs/renderengine/skia/SkiaRenderEngine.h +++ b/libs/renderengine/skia/SkiaRenderEngine.h @@ -39,7 +39,7 @@ public: SkiaRenderEngine(RenderEngineType type) : RenderEngine(type) {} ~SkiaRenderEngine() override {} - virtual void primeCache() const override{}; + virtual void primeCache() override{}; virtual void genTextures(size_t /*count*/, uint32_t* /*names*/) override{}; virtual void deleteTextures(size_t /*count*/, uint32_t const* /*names*/) override{}; virtual void cacheExternalTextureBuffer(const sp<GraphicBuffer>& /*buffer*/){}; @@ -64,4 +64,4 @@ public: } // namespace renderengine } // namespace android -#endif /* SF_GLESRENDERENGINE_H_ */
\ No newline at end of file +#endif /* SF_GLESRENDERENGINE_H_ */ diff --git a/libs/renderengine/threaded/RenderEngineThreaded.cpp b/libs/renderengine/threaded/RenderEngineThreaded.cpp index 7c7d165c04..6a91c7c3a3 100644 --- a/libs/renderengine/threaded/RenderEngineThreaded.cpp +++ b/libs/renderengine/threaded/RenderEngineThreaded.cpp @@ -86,7 +86,7 @@ void RenderEngineThreaded::threadMain(CreateInstanceFactory factory) NO_THREAD_S } } -void RenderEngineThreaded::primeCache() const { +void RenderEngineThreaded::primeCache() { std::promise<void> resultPromise; std::future<void> resultFuture = resultPromise.get_future(); { diff --git a/libs/renderengine/threaded/RenderEngineThreaded.h b/libs/renderengine/threaded/RenderEngineThreaded.h index d362e176d3..df0551df12 100644 --- a/libs/renderengine/threaded/RenderEngineThreaded.h +++ b/libs/renderengine/threaded/RenderEngineThreaded.h @@ -42,7 +42,7 @@ public: RenderEngineThreaded(CreateInstanceFactory factory, RenderEngineType type); ~RenderEngineThreaded() override; - void primeCache() const override; + void primeCache() override; void dump(std::string& result) override; |