Loading libs/renderengine/skia/Cache.cpp +57 −30 Original line number Diff line number Diff line Loading @@ -28,7 +28,10 @@ namespace android::renderengine::skia { static void drawShadowLayer(SkiaRenderEngine* renderengine, const DisplaySettings& display, // Warming shader cache, not framebuffer cache. constexpr bool kUseFrameBufferCache = false; static void drawShadowLayers(SkiaRenderEngine* renderengine, const DisplaySettings& display, sp<GraphicBuffer> dstBuffer) { // Somewhat arbitrary dimensions, but on screen and slightly shorter, based // on actual use. Loading @@ -39,6 +42,7 @@ static void drawShadowLayer(SkiaRenderEngine* renderengine, const DisplaySetting .boundaries = rect, .roundedCornersCrop = rect, }, // drawShadow ignores alpha .shadow = ShadowSettings{ .ambientColor = vec4(0, 0, 0, 0.00935997f), Loading @@ -61,9 +65,8 @@ static void drawShadowLayer(SkiaRenderEngine* renderengine, const DisplaySetting 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*/, renderengine->drawLayers(display, layers, dstBuffer, kUseFrameBufferCache, base::unique_fd(), nullptr); renderengine->assertShadersCompiled(identity ? 1 : 2); identity = false; } } Loading @@ -76,14 +79,6 @@ static void drawImageLayers(SkiaRenderEngine* renderengine, const DisplaySetting .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 = Loading @@ -94,9 +89,22 @@ static void drawImageLayers(SkiaRenderEngine* renderengine, const DisplaySetting }}, }; // This matrix is based on actual data seen when opening the dialer. // translate and scale creates new shaders when combined with rounded corners // clang-format off auto scale_and_translate = mat4(.19f, .0f, .0f, .0f, .0f, .19f, .0f, .0f, .0f, .0f, 1.f, .0f, 169.f, 1527.f, .0f, 1.f); // clang-format on // Test both drawRect and drawRRect auto layers = std::vector<const LayerSettings*>{&layer}; for (float roundedCornersRadius : {0.0f, 500.f}) { for (auto transform : {mat4(), scale_and_translate}) { layer.geometry.positionTransform = transform; // fractional corner radius creates a shader that is used during home button swipe for (float roundedCornersRadius : {0.0f, 0.05f, 500.f}) { // roundedCornersCrop is always set, but it is this radius that triggers the behavior layer.geometry.roundedCornersRadius = roundedCornersRadius; // No need to check UNKNOWN, which is treated as SRGB. for (auto dataspace : {ui::Dataspace::SRGB, ui::Dataspace::DISPLAY_P3}) { Loading @@ -105,15 +113,35 @@ static void drawImageLayers(SkiaRenderEngine* renderengine, const DisplaySetting 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); renderengine->assertShadersCompiled(1); renderengine->drawLayers(display, layers, dstBuffer, kUseFrameBufferCache, base::unique_fd(), nullptr); } } } } } } static void drawSolidLayers(SkiaRenderEngine* renderengine, const DisplaySettings& display, sp<GraphicBuffer> dstBuffer) { const Rect& displayRect = display.physicalDisplay; FloatRect rect(0, 0, displayRect.width(), displayRect.height()); LayerSettings layer{ .geometry = Geometry{ .boundaries = rect, }, .alpha = 1, .source = PixelSource{ .solidColor = half3(0.1f, 0.2f, 0.3f), }, }; auto layers = std::vector<const LayerSettings*>{&layer}; renderengine->drawLayers(display, layers, dstBuffer, kUseFrameBufferCache, base::unique_fd(), nullptr); } void Cache::primeShaderCache(SkiaRenderEngine* renderengine) { const nsecs_t timeBefore = systemTime(); Loading @@ -133,14 +161,13 @@ void Cache::primeShaderCache(SkiaRenderEngine* renderengine) { 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. // something, but the details are not important. Make use of the shadow layer drawing step // to populate it. sp<GraphicBuffer> srcBuffer = new GraphicBuffer(displayRect.width(), displayRect.height(), PIXEL_FORMAT_RGBA_8888, 1, usage, "drawImageLayer_src"); drawShadowLayer(renderengine, display, srcBuffer); drawSolidLayers(renderengine, display, dstBuffer); drawShadowLayers(renderengine, display, srcBuffer); drawImageLayers(renderengine, display, dstBuffer, srcBuffer); const nsecs_t timeAfter = systemTime(); const float compileTimeMs = static_cast<float>(timeAfter - timeBefore) / 1.0E6; Loading Loading
libs/renderengine/skia/Cache.cpp +57 −30 Original line number Diff line number Diff line Loading @@ -28,7 +28,10 @@ namespace android::renderengine::skia { static void drawShadowLayer(SkiaRenderEngine* renderengine, const DisplaySettings& display, // Warming shader cache, not framebuffer cache. constexpr bool kUseFrameBufferCache = false; static void drawShadowLayers(SkiaRenderEngine* renderengine, const DisplaySettings& display, sp<GraphicBuffer> dstBuffer) { // Somewhat arbitrary dimensions, but on screen and slightly shorter, based // on actual use. Loading @@ -39,6 +42,7 @@ static void drawShadowLayer(SkiaRenderEngine* renderengine, const DisplaySetting .boundaries = rect, .roundedCornersCrop = rect, }, // drawShadow ignores alpha .shadow = ShadowSettings{ .ambientColor = vec4(0, 0, 0, 0.00935997f), Loading @@ -61,9 +65,8 @@ static void drawShadowLayer(SkiaRenderEngine* renderengine, const DisplaySetting 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*/, renderengine->drawLayers(display, layers, dstBuffer, kUseFrameBufferCache, base::unique_fd(), nullptr); renderengine->assertShadersCompiled(identity ? 1 : 2); identity = false; } } Loading @@ -76,14 +79,6 @@ static void drawImageLayers(SkiaRenderEngine* renderengine, const DisplaySetting .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 = Loading @@ -94,9 +89,22 @@ static void drawImageLayers(SkiaRenderEngine* renderengine, const DisplaySetting }}, }; // This matrix is based on actual data seen when opening the dialer. // translate and scale creates new shaders when combined with rounded corners // clang-format off auto scale_and_translate = mat4(.19f, .0f, .0f, .0f, .0f, .19f, .0f, .0f, .0f, .0f, 1.f, .0f, 169.f, 1527.f, .0f, 1.f); // clang-format on // Test both drawRect and drawRRect auto layers = std::vector<const LayerSettings*>{&layer}; for (float roundedCornersRadius : {0.0f, 500.f}) { for (auto transform : {mat4(), scale_and_translate}) { layer.geometry.positionTransform = transform; // fractional corner radius creates a shader that is used during home button swipe for (float roundedCornersRadius : {0.0f, 0.05f, 500.f}) { // roundedCornersCrop is always set, but it is this radius that triggers the behavior layer.geometry.roundedCornersRadius = roundedCornersRadius; // No need to check UNKNOWN, which is treated as SRGB. for (auto dataspace : {ui::Dataspace::SRGB, ui::Dataspace::DISPLAY_P3}) { Loading @@ -105,15 +113,35 @@ static void drawImageLayers(SkiaRenderEngine* renderengine, const DisplaySetting 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); renderengine->assertShadersCompiled(1); renderengine->drawLayers(display, layers, dstBuffer, kUseFrameBufferCache, base::unique_fd(), nullptr); } } } } } } static void drawSolidLayers(SkiaRenderEngine* renderengine, const DisplaySettings& display, sp<GraphicBuffer> dstBuffer) { const Rect& displayRect = display.physicalDisplay; FloatRect rect(0, 0, displayRect.width(), displayRect.height()); LayerSettings layer{ .geometry = Geometry{ .boundaries = rect, }, .alpha = 1, .source = PixelSource{ .solidColor = half3(0.1f, 0.2f, 0.3f), }, }; auto layers = std::vector<const LayerSettings*>{&layer}; renderengine->drawLayers(display, layers, dstBuffer, kUseFrameBufferCache, base::unique_fd(), nullptr); } void Cache::primeShaderCache(SkiaRenderEngine* renderengine) { const nsecs_t timeBefore = systemTime(); Loading @@ -133,14 +161,13 @@ void Cache::primeShaderCache(SkiaRenderEngine* renderengine) { 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. // something, but the details are not important. Make use of the shadow layer drawing step // to populate it. sp<GraphicBuffer> srcBuffer = new GraphicBuffer(displayRect.width(), displayRect.height(), PIXEL_FORMAT_RGBA_8888, 1, usage, "drawImageLayer_src"); drawShadowLayer(renderengine, display, srcBuffer); drawSolidLayers(renderengine, display, dstBuffer); drawShadowLayers(renderengine, display, srcBuffer); drawImageLayers(renderengine, display, dstBuffer, srcBuffer); const nsecs_t timeAfter = systemTime(); const float compileTimeMs = static_cast<float>(timeAfter - timeBefore) / 1.0E6; Loading