Loading libs/renderengine/skia/Cache.cpp +31 −17 Original line number Original line Diff line number Diff line Loading @@ -37,10 +37,6 @@ const auto kScaleAndTranslate = mat4(0.7f, 0.f, 0.f, 0.f, 0.f, 0.7f, 0.f, 0.f, 0.f, 0.7f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f, 0.f, 0.f, 1.f, 0.f, 67.3f, 52.2f, 0.f, 1.f); 67.3f, 52.2f, 0.f, 1.f); const auto kScaleYOnly = mat4(1.f, 0.f, 0.f, 0.f, 0.f, 0.7f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f, 0.f, 0.f, 0.f, 1.f); // clang-format on // clang-format on // When setting layer.sourceDataspace, whether it matches the destination or not determines whether // When setting layer.sourceDataspace, whether it matches the destination or not determines whether // a color correction effect is added to the shader. // a color correction effect is added to the shader. Loading Loading @@ -188,35 +184,53 @@ static void drawBlurLayers(SkiaRenderEngine* renderengine, const DisplaySettings } } } } static void drawTextureScaleLayers(SkiaRenderEngine* renderengine, const DisplaySettings& display, // The unique feature of these layers is that the boundary is slightly smaller than the rounded // rect crop, so the rounded edges intersect that boundary and require a different clipping method. static void drawClippedLayers(SkiaRenderEngine* renderengine, const DisplaySettings& display, const std::shared_ptr<ExternalTexture>& dstTexture, const std::shared_ptr<ExternalTexture>& dstTexture, const std::shared_ptr<ExternalTexture>& srcTexture) { const std::shared_ptr<ExternalTexture>& srcTexture) { const Rect& displayRect = display.physicalDisplay; const Rect& displayRect = display.physicalDisplay; FloatRect rect(0, 0, displayRect.width(), displayRect.height()); FloatRect rect(0, 0, displayRect.width(), displayRect.height() - 20); // boundary is smaller // clang-format off const auto symmetric = mat4(0.9f, 0.f, 0.f, 0.f, 0.f, 0.9f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f, 8.8f, 8.1f, 0.f, 1.f); const auto asymmetric = mat4(0.9f, 0.f, 0.f, 0.f, 0.f, 0.7f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f, 8.8f, 8.1f, 0.f, 1.f); // clang-format on LayerSettings layer{ LayerSettings layer{ .geometry = .geometry = Geometry{ Geometry{ .boundaries = rect, .boundaries = rect, .roundedCornersCrop = rect, .roundedCornersRadius = 27, // larger than the 20 above. .positionTransform = kScaleAndTranslate, .roundedCornersCrop = .roundedCornersRadius = 300, FloatRect(0, 0, displayRect.width(), displayRect.height()), }, }, .source = PixelSource{.buffer = .source = PixelSource{.buffer = Buffer{ Buffer{ .buffer = srcTexture, .buffer = srcTexture, .isOpaque = 0, .maxLuminanceNits = 1000.f, .maxLuminanceNits = 1000.f, .textureTransform = kScaleYOnly, }}, }}, .sourceDataspace = kOtherDataSpace, .sourceDataspace = kOtherDataSpace, }; }; auto layers = std::vector<const LayerSettings*>{&layer}; auto layers = std::vector<const LayerSettings*>{&layer}; for (auto transform : {symmetric, asymmetric}) { layer.geometry.positionTransform = transform; // In real use, I saw alpha of 1.0 and 0.999, probably a mistake, but cache both shaders. for (float alpha : {0.5f, 1.f}) { for (float alpha : {0.5f, 1.f}) { layer.alpha = alpha, layer.alpha = alpha, renderengine->drawLayers(display, layers, dstTexture, kUseFrameBufferCache, renderengine->drawLayers(display, layers, dstTexture, kUseFrameBufferCache, base::unique_fd(), nullptr); base::unique_fd(), nullptr); } } } } } // // // The collection of shaders cached here were found by using perfetto to record shader compiles // The collection of shaders cached here were found by using perfetto to record shader compiles Loading Loading @@ -293,7 +307,7 @@ void Cache::primeShaderCache(SkiaRenderEngine* renderengine) { drawImageLayers(renderengine, display, dstTexture, externalTexture); drawImageLayers(renderengine, display, dstTexture, externalTexture); // Draw layers for b/185569240. // Draw layers for b/185569240. drawTextureScaleLayers(renderengine, display, dstTexture, externalTexture); drawClippedLayers(renderengine, display, dstTexture, externalTexture); const nsecs_t timeAfter = systemTime(); const nsecs_t timeAfter = systemTime(); const float compileTimeMs = static_cast<float>(timeAfter - timeBefore) / 1.0E6; const float compileTimeMs = static_cast<float>(timeAfter - timeBefore) / 1.0E6; Loading Loading
libs/renderengine/skia/Cache.cpp +31 −17 Original line number Original line Diff line number Diff line Loading @@ -37,10 +37,6 @@ const auto kScaleAndTranslate = mat4(0.7f, 0.f, 0.f, 0.f, 0.f, 0.7f, 0.f, 0.f, 0.f, 0.7f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f, 0.f, 0.f, 1.f, 0.f, 67.3f, 52.2f, 0.f, 1.f); 67.3f, 52.2f, 0.f, 1.f); const auto kScaleYOnly = mat4(1.f, 0.f, 0.f, 0.f, 0.f, 0.7f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f, 0.f, 0.f, 0.f, 1.f); // clang-format on // clang-format on // When setting layer.sourceDataspace, whether it matches the destination or not determines whether // When setting layer.sourceDataspace, whether it matches the destination or not determines whether // a color correction effect is added to the shader. // a color correction effect is added to the shader. Loading Loading @@ -188,35 +184,53 @@ static void drawBlurLayers(SkiaRenderEngine* renderengine, const DisplaySettings } } } } static void drawTextureScaleLayers(SkiaRenderEngine* renderengine, const DisplaySettings& display, // The unique feature of these layers is that the boundary is slightly smaller than the rounded // rect crop, so the rounded edges intersect that boundary and require a different clipping method. static void drawClippedLayers(SkiaRenderEngine* renderengine, const DisplaySettings& display, const std::shared_ptr<ExternalTexture>& dstTexture, const std::shared_ptr<ExternalTexture>& dstTexture, const std::shared_ptr<ExternalTexture>& srcTexture) { const std::shared_ptr<ExternalTexture>& srcTexture) { const Rect& displayRect = display.physicalDisplay; const Rect& displayRect = display.physicalDisplay; FloatRect rect(0, 0, displayRect.width(), displayRect.height()); FloatRect rect(0, 0, displayRect.width(), displayRect.height() - 20); // boundary is smaller // clang-format off const auto symmetric = mat4(0.9f, 0.f, 0.f, 0.f, 0.f, 0.9f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f, 8.8f, 8.1f, 0.f, 1.f); const auto asymmetric = mat4(0.9f, 0.f, 0.f, 0.f, 0.f, 0.7f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f, 8.8f, 8.1f, 0.f, 1.f); // clang-format on LayerSettings layer{ LayerSettings layer{ .geometry = .geometry = Geometry{ Geometry{ .boundaries = rect, .boundaries = rect, .roundedCornersCrop = rect, .roundedCornersRadius = 27, // larger than the 20 above. .positionTransform = kScaleAndTranslate, .roundedCornersCrop = .roundedCornersRadius = 300, FloatRect(0, 0, displayRect.width(), displayRect.height()), }, }, .source = PixelSource{.buffer = .source = PixelSource{.buffer = Buffer{ Buffer{ .buffer = srcTexture, .buffer = srcTexture, .isOpaque = 0, .maxLuminanceNits = 1000.f, .maxLuminanceNits = 1000.f, .textureTransform = kScaleYOnly, }}, }}, .sourceDataspace = kOtherDataSpace, .sourceDataspace = kOtherDataSpace, }; }; auto layers = std::vector<const LayerSettings*>{&layer}; auto layers = std::vector<const LayerSettings*>{&layer}; for (auto transform : {symmetric, asymmetric}) { layer.geometry.positionTransform = transform; // In real use, I saw alpha of 1.0 and 0.999, probably a mistake, but cache both shaders. for (float alpha : {0.5f, 1.f}) { for (float alpha : {0.5f, 1.f}) { layer.alpha = alpha, layer.alpha = alpha, renderengine->drawLayers(display, layers, dstTexture, kUseFrameBufferCache, renderengine->drawLayers(display, layers, dstTexture, kUseFrameBufferCache, base::unique_fd(), nullptr); base::unique_fd(), nullptr); } } } } } // // // The collection of shaders cached here were found by using perfetto to record shader compiles // The collection of shaders cached here were found by using perfetto to record shader compiles Loading Loading @@ -293,7 +307,7 @@ void Cache::primeShaderCache(SkiaRenderEngine* renderengine) { drawImageLayers(renderengine, display, dstTexture, externalTexture); drawImageLayers(renderengine, display, dstTexture, externalTexture); // Draw layers for b/185569240. // Draw layers for b/185569240. drawTextureScaleLayers(renderengine, display, dstTexture, externalTexture); drawClippedLayers(renderengine, display, dstTexture, externalTexture); const nsecs_t timeAfter = systemTime(); const nsecs_t timeAfter = systemTime(); const float compileTimeMs = static_cast<float>(timeAfter - timeBefore) / 1.0E6; const float compileTimeMs = static_cast<float>(timeAfter - timeBefore) / 1.0E6; Loading