| /* |
| * Copyright 2026 Google LLC |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| #include "tests/graphite/sparse_strips/TileTestCases.h" |
| |
| #include "src/gpu/graphite/sparse_strips/Polyline.h" |
| #include "src/gpu/graphite/sparse_strips/Tiler.h" |
| |
| namespace skgpu::graphite { |
| |
| namespace TileTestCases { |
| |
| TileTestCase::TileTestCase(const char* name, |
| std::initializer_list<Line> unscaledLines, |
| std::initializer_list<Tile> expectedTiles, |
| float scale) |
| : fName(name), fExpected(expectedTiles) { |
| fLines.reserve(unscaledLines.size()); |
| for (const auto& line : unscaledLines) { |
| fLines.push_back({{line.p0.fX * scale, line.p0.fY * scale}, |
| {line.p1.fX * scale, line.p1.fY * scale}}); |
| } |
| } |
| |
| std::vector<TileTestCase> Get(float scale, uint16_t viewportDim) { |
| // TODO (thomsmit): update this when constants are moved into header |
| static constexpr uint32_t T = IntersectionBits::T; |
| static constexpr uint32_t B = IntersectionBits::B; |
| static constexpr uint32_t L = IntersectionBits::L; |
| static constexpr uint32_t R = IntersectionBits::R; |
| static constexpr uint32_t W = IntersectionBits::W; |
| |
| const float unscaledDim = static_cast<float>(viewportDim); |
| |
| return {{"CulledLines", |
| { |
| {{1.0f, -7.0f}, {3.0f, -1.0f}}, |
| {{1.0f, -11.0f}, {3.0f, -1.0f}}, |
| {{unscaledDim + 1.0f, 50.0f}, {unscaledDim + 3.0f, 70.0f}}, |
| {{1.0f, unscaledDim + 1.0f}, {3.0f, unscaledDim + 7.0f}}, |
| {{1.0f, unscaledDim + 1.0f}, {3.0f, unscaledDim + 13.0f}}, |
| }, |
| {}, |
| scale}, |
| {"SlopedLineCrossingTop", |
| { |
| {{-2.0f, -3.0f}, {2.0f, 1.0f}}, |
| {{6.0f, -1.0f}, {5.0f, 2.0f}}, |
| {{9.0f, -10.0f}, {10.0f, 3.0f}}, |
| {{2.0f, 1.0f}, {-2.0f, -3.0f}}, |
| }, |
| { |
| Tile(0, 0, 0, W | T), |
| Tile(1, 0, 1, W | T), |
| Tile(2, 0, 2, W | T), |
| Tile(0, 0, 3, W | T), |
| }, |
| scale}, |
| {"SlopedLineCrossingBot", |
| { |
| {{5.0f, unscaledDim + 3.0f}, {6.0f, unscaledDim - 2.0f}}, |
| {{10.0f, unscaledDim + 1.0f}, {9.0f, unscaledDim - 1.0f}}, |
| {{2.0f, unscaledDim - 2.0f}, {3.0f, unscaledDim + 3.0f}}, |
| }, |
| { |
| Tile(1, 24, 0, B), |
| Tile(2, 24, 1, B), |
| Tile(0, 24, 2, B), |
| }, |
| scale}, |
| {"SlopedLineCrossingTopMultiTile", |
| { |
| {{1.0f, -5.0f}, {6.0f, 7.0f}}, |
| {{2.5f, -10.0f}, {3.5f, 6.0f}}, |
| }, |
| { |
| Tile(0, 0, 0, W | T | R), |
| Tile(1, 0, 0, L | B), |
| Tile(1, 1, 0, W | T), |
| Tile(0, 0, 1, W | T | B), |
| Tile(0, 1, 1, W | T), |
| }, |
| scale}, |
| {"SlopedLineCrossingBotMultiTile", |
| { |
| {{12.0f, unscaledDim + 10.0f}, {2.0f, 94.0f}}, |
| {{1.5f, unscaledDim + 5.0f}, {3.5f, 94.0f}}, |
| }, |
| { |
| Tile(0, 23, 0, B), |
| Tile(0, 24, 0, W | T | R), |
| Tile(1, 24, 0, B | L), |
| Tile(0, 23, 1, B), |
| Tile(0, 24, 1, W | T | B), |
| }, |
| scale}, |
| {"SlopedLineCrossingRight", |
| { |
| {{97.0f, 1.0f}, {unscaledDim + 1.0f, 2.0f}}, |
| {{93.0f, 1.0f}, {unscaledDim + 5.0f, 2.0f}}, |
| }, |
| { |
| Tile(24, 0, 0, R), |
| Tile(23, 0, 1, R), |
| Tile(24, 0, 1, R | L), |
| }, |
| scale}, |
| {"SlopedLineCrossingLeft", |
| { |
| {{-5.0f, 1.0f}, {1.0f, 2.0f}}, |
| {{-5.0f, 1.0f}, {5.0f, 2.0f}}, |
| {{-5.0f, 1.0f}, {13.0f, 9.0f}}, |
| }, |
| { |
| Tile(0, 0, 0, L), |
| Tile(0, 0, 1, L | R), |
| Tile(1, 0, 1, L), |
| Tile(0, 0, 2, L | B), |
| Tile(0, 1, 2, W | R | T), |
| Tile(1, 1, 2, R | L), |
| Tile(2, 1, 2, L | B), |
| Tile(2, 2, 2, W | R | T), |
| Tile(3, 2, 2, L), |
| }, |
| scale}, |
| {"HorizontalLineAboveViewport", {{{10.0f, -5.0f}, {90.0f, -5.0f}}}, {}, scale}, |
| {"HorizontalLineBelowViewport", |
| {{{10.0f, unscaledDim + 5.0f}, {90.0f, unscaledDim + 5.0f}}}, |
| {}, |
| scale}, |
| {"HorizontalLineCrossingLeftViewport", |
| {{{-10.0f, 10.0f}, {10.0f, 10.0f}}}, |
| { |
| Tile(0, 2, 0, L | R), |
| Tile(1, 2, 0, L | R), |
| Tile(2, 2, 0, L), |
| }, |
| scale}, |
| {"HorizontalLineCrossingRightViewport", |
| {{{unscaledDim - 5.0f, 10.0f}, {unscaledDim + 5.0f, 10.0f}}}, |
| {Tile(23, 2, 0, R), Tile(24, 2, 0, L | R)}, |
| scale}, |
| {"VerticalLinesOutsideViewport", |
| { |
| {{1.0f, -5.0f}, {1.0f, -1.0f}}, |
| {{1.0f, unscaledDim + 1.0f}, {1.0f, unscaledDim + 5.0f}}, |
| }, |
| {}, |
| scale}, |
| {"VerticalLineCrossingTopViewport", |
| { |
| {{1.0f, -7.0f}, {1.0f, 3.0f}}, |
| {{1.0f, -7.0f}, {1.0f, 7.0f}}, |
| {{1.0f, -7.0f}, {1.0f, 8.0f}}, |
| }, |
| { |
| Tile(0, 0, 0, W | T), |
| Tile(0, 0, 1, W | B | T), |
| Tile(0, 1, 1, W | T), |
| Tile(0, 0, 2, W | B | T), |
| Tile(0, 1, 2, W | T), |
| }, |
| scale}, |
| {"VerticalLineCrossingBotViewport", |
| { |
| {{1.0f, unscaledDim - 1.0f}, {1.0f, unscaledDim + 5.0f}}, |
| {{1.0f, unscaledDim - 5.0f}, {1.0f, unscaledDim + 5.0f}}, |
| }, |
| { |
| Tile(0, 24, 0, B), |
| Tile(0, 23, 1, B), |
| Tile(0, 24, 1, W | T | B), |
| }, |
| scale}, |
| {"ClipTopLeftCorner", |
| {{{-1.0f, 2.0f}, {2.0f, -1.0f}}}, |
| {Tile(0, 0, 0, W | L | T)}, |
| scale}, |
| {"ClipBottomRightCorner", |
| {{{unscaledDim + 1.0f, unscaledDim - 2.0f}, {unscaledDim - 2.0f, unscaledDim + 1.0f}}}, |
| {Tile(24, 24, 0, R | B)}, |
| scale}, |
| {"HorizontalLineLeftToRightThreeTile", |
| {{{1.5f, 1.0f}, {8.5f, 1.0f}}}, |
| { |
| Tile(0, 0, 0, R), |
| Tile(1, 0, 0, R | L), |
| Tile(2, 0, 0, L), |
| }, |
| scale}, |
| {"HorizontalLineRightToLeftThreeTile", |
| {{{8.5f, 1.0f}, {1.5f, 1.0f}}}, |
| { |
| Tile(0, 0, 0, R), |
| Tile(1, 0, 0, R | L), |
| Tile(2, 0, 0, L), |
| }, |
| scale}, |
| {"HorizontalLineMultiTile", |
| {{{1.5f, 1.0f}, {12.5f, 1.0f}}}, |
| { |
| Tile(0, 0, 0, R), |
| Tile(1, 0, 0, R | L), |
| Tile(2, 0, 0, R | L), |
| Tile(3, 0, 0, L), |
| }, |
| scale}, |
| {"VerticalLineDownThreeTile", |
| {{{1.0f, 1.5f}, {1.0f, 8.5f}}}, |
| { |
| Tile(0, 0, 0, B), |
| Tile(0, 1, 0, W | T | B), |
| Tile(0, 2, 0, W | T), |
| }, |
| scale}, |
| {"VerticalLineDownMultiTile", |
| {{{1.0f, 1.0f}, {1.0f, 13.0f}}}, |
| { |
| Tile(0, 0, 0, B), |
| Tile(0, 1, 0, W | T | B), |
| Tile(0, 2, 0, W | T | B), |
| Tile(0, 3, 0, W | T), |
| }, |
| scale}, |
| {"VerticalLineUpThreeTile", |
| {{{1.0f, 13.0f}, {1.0f, 1.0f}}}, |
| { |
| Tile(0, 0, 0, B), |
| Tile(0, 1, 0, W | T | B), |
| Tile(0, 2, 0, W | T | B), |
| Tile(0, 3, 0, W | T), |
| }, |
| scale}, |
| {"VerticalLineUpMultiTile", |
| {{{1.0f, 8.5f}, {1.0f, 1.5f}}}, |
| { |
| Tile(0, 0, 0, B), |
| Tile(0, 1, 0, W | T | B), |
| Tile(0, 2, 0, W | T), |
| }, |
| scale}, |
| {"VerticalLineTouchingBot", |
| {{{1.0f, 1.0f}, {1.0f, 8.0f}}}, |
| { |
| Tile(0, 0, 0, B), |
| Tile(0, 1, 0, W | T), |
| }, |
| scale}, |
| {"VerticalLineTouchingTop", |
| {{{1.0f, 0.0f}, {1.0f, 7.0f}}}, |
| { |
| Tile(0, 0, 0, W | B), |
| Tile(0, 1, 0, W | T), |
| }, |
| scale}, |
| {"VerticalLineTouchingLeft", |
| {{{4.0f, 0.0f}, {4.0f, 7.0f}}}, |
| { |
| Tile(1, 0, 0, W | B), |
| Tile(1, 1, 0, W | T), |
| }, |
| scale}, |
| {"TopLeftToBottomRight", |
| {{{1.0f, 1.0f}, {11.0f, 9.0f}}}, |
| { |
| Tile(0, 0, 0, R), |
| Tile(1, 0, 0, L | B), |
| Tile(1, 1, 0, W | R | T), |
| Tile(2, 1, 0, L | B), |
| Tile(2, 2, 0, W | T), |
| }, |
| scale}, |
| {"BottomRightToTopLeft", |
| {{{11.0f, 9.0f}, {1.0f, 1.0f}}}, |
| { |
| Tile(0, 0, 0, R), |
| Tile(1, 0, 0, L | B), |
| Tile(1, 1, 0, W | R | T), |
| Tile(2, 1, 0, L | B), |
| Tile(2, 2, 0, W | T), |
| }, |
| scale}, |
| {"BottomLeftToTopRight", |
| {{{2.0f, 11.0f}, {14.0f, 6.0f}}}, |
| { |
| Tile(2, 1, 0, R | B), |
| Tile(3, 1, 0, L), |
| Tile(0, 2, 0, R), |
| Tile(1, 2, 0, R | L), |
| Tile(2, 2, 0, W | L | T), |
| }, |
| scale}, |
| {"TopRightToBottomLeft", |
| {{{14.0f, 6.0f}, {2.0f, 11.0f}}}, |
| { |
| Tile(2, 1, 0, R | B), |
| Tile(3, 1, 0, L), |
| Tile(0, 2, 0, R), |
| Tile(1, 2, 0, R | L), |
| Tile(2, 2, 0, W | L | T), |
| }, |
| scale}, |
| {"TwoLinesInSingleTile", |
| { |
| {{1.0f, 3.0f}, {3.0f, 3.0f}}, |
| {{3.0f, 3.0f}, {0.0f, 1.0f}}, |
| }, |
| { |
| Tile(0, 0, 0, 0), |
| Tile(0, 0, 1, 0), |
| }, |
| scale}, |
| {"DiagonalCrossCorner", |
| {{{3.0f, 5.0f}, {5.0f, 3.0f}}}, |
| { |
| Tile(1, 0, 0, L), |
| Tile(0, 1, 0, R), |
| Tile(1, 1, 0, W | L | T), |
| }, |
| scale}, |
| {"DiagonalCrossCornerTwo", |
| {{{7.9f, 7.9f}, {0.1f, 0.1f}}}, |
| { |
| Tile(0, 0, 0, R), |
| Tile(1, 0, 0, L), |
| Tile(1, 1, 0, W | T), |
| }, |
| scale}, |
| {"DiagonalDownSlopeTiles", |
| {{{5.0f, 5.0f}, {9.0f, 9.0f}}}, |
| { |
| Tile(1, 1, 0, R), |
| Tile(2, 1, 0, L), |
| Tile(2, 2, 0, W | T), |
| }, |
| scale}, |
| {"DiagonalUpSlopeTiles", |
| {{{5.0f, 9.0f}, {9.0f, 5.0f}}}, |
| { |
| Tile(1, 1, 0, R | B), |
| Tile(2, 1, 0, L), |
| Tile(1, 2, 0, W | T), |
| }, |
| scale}, |
| {"DiagonalDownOneTile", |
| {{{0.0f, 0.0f}, {4.0f, 4.0f}}}, |
| { |
| Tile(0, 0, 0, W | R), |
| Tile(1, 0, 0, L), |
| }, |
| scale}, |
| {"DiagonalUpOneTile", |
| {{{0.0f, 4.0f}, {4.0f, 0.0f}}}, |
| { |
| Tile(0, 0, 0, R), |
| Tile(1, 0, 0, W | L), |
| }, |
| scale}, |
| {"DiagonalDownTwoTile", |
| {{{0.0f, 0.0f}, {8.0f, 8.0f}}}, |
| { |
| Tile(0, 0, 0, W | R), |
| Tile(1, 0, 0, L), |
| Tile(1, 1, 0, W | R | T), |
| Tile(2, 1, 0, L), |
| }, |
| scale}, |
| {"DiagonalUpTwoTile", |
| {{{0.0f, 8.0f}, {8.0f, 0.0f}}}, |
| { |
| Tile(1, 0, 0, R | L), |
| Tile(2, 0, 0, W | L), |
| Tile(0, 1, 0, R), |
| Tile(1, 1, 0, W | L | T), |
| }, |
| scale}, |
| {"SlopedEndingRight", |
| {{{1.0f, 1.0f}, {8.0f, 2.0f}}}, |
| { |
| Tile(0, 0, 0, R), |
| Tile(1, 0, 0, R | L), |
| Tile(2, 0, 0, L), |
| }, |
| scale}, |
| {"SlopedTouchingTop", |
| {{{0.0f, 8.0f}, {4.0f, 0.0f}}}, |
| { |
| Tile(0, 0, 0, R | B), |
| Tile(1, 0, 0, W | L), |
| Tile(0, 1, 0, W | T), |
| }, |
| scale}, |
| {"SlopedTouchingBot", |
| {{{0.0f, 0.0f}, {4.0f, 8.0f}}}, |
| { |
| Tile(0, 0, 0, W | B), |
| Tile(0, 1, 0, W | R | T), |
| Tile(1, 1, 0, L), |
| }, |
| scale}, |
| {"SlopedDownThree", |
| {{{1.0f, 1.0f}, {5.0f, 11.0f}}}, |
| { |
| Tile(0, 0, 0, B), |
| Tile(0, 1, 0, W | T | B), |
| Tile(0, 2, 0, W | T | R), |
| Tile(1, 2, 0, L), |
| }, |
| scale}, |
| {"SameTile", {{{1.0f, 1.0f}, {3.0f, 3.0f}}}, {Tile(0, 0, 0, 0)}, scale}, |
| {"SameTileLeft", {{{0.0f, 1.0f}, {3.0f, 1.0f}}}, {Tile(0, 0, 0, 0)}, scale}, |
| {"SameTileTop", {{{1.0f, 0.0f}, {1.0f, 3.0f}}}, {Tile(0, 0, 0, W)}, scale}, |
| {"SameTileRight", |
| {{{1.0f, 1.0f}, {4.0f, 1.0f}}}, |
| { |
| Tile(0, 0, 0, R), |
| Tile(1, 0, 0, L), |
| }, |
| scale}, |
| {"SameTileBottom", |
| { |
| {{1.0f, 1.0f}, {1.0f, 4.0f}}, |
| {{1.0f, 1.0f}, {2.0f, 4.0f}}, |
| }, |
| { |
| Tile(0, 0, 0, 0), |
| Tile(0, 0, 1, 0), |
| }, |
| scale}, |
| {"SameTileTopLeft", |
| { |
| {{0.0f, 1.0f}, {1.0f, 0.0f}}, |
| {{0.0f, 0.0001f}, {0.0001f, 0.0f}}, |
| }, |
| { |
| Tile(0, 0, 0, W), |
| Tile(0, 0, 1, W), |
| }, |
| scale}, |
| {"ExactRightEdgeCoincidence", |
| {{{4.0f, 1.0f}, {4.0f, 3.0f}}}, |
| {Tile(1, 0, 0, 0)}, |
| scale}, |
| {"ExactBottomEdgeCoincidence", {{{1.0f, 4.0f}, {3.0f, 4.0f}}}, {}, scale}, |
| {"Tricky Precision", |
| {{{0.000000, 15.856406}, {8.000000, 2.000000}}}, |
| {Tile(1, 0, 0, B | R), |
| Tile(2, 0, 0, L), |
| Tile(1, 1, 0, W | T | B), |
| Tile(0, 2, 0, B | R), |
| Tile(1, 2, 0, W | T | L), |
| Tile(0, 3, 0, W | T)}, |
| scale}, |
| {"BackwardsDiagonal", |
| {{{8.0f, 8.0f}, {0.0f, 0.0f}}}, |
| { |
| Tile(0, 0, 0, W | R), |
| Tile(1, 0, 0, L), |
| Tile(1, 1, 0, W | T | R), |
| Tile(2, 1, 0, L), |
| }, |
| scale}, |
| {"PointLineInside", {{{2.0f, 2.0f}, {2.0f, 2.0f}}}, {}, scale}, |
| {"PointLineOnCorner", {{{4.0f, 4.0f}, {4.0f, 4.0f}}}, {}, scale}, |
| {"NearVerticalGrazing", |
| {{{3.999f, 0.0f}, {3.998f, 8.0f}}}, |
| { |
| Tile(0, 0, 0, W | B), |
| Tile(0, 1, 0, W | T), |
| }, |
| scale}, |
| {"HighSlopeNeedle", |
| {{{2.0f, -100.0f}, {2.01f, 11.0f}}}, |
| {Tile(0, 0, 0, W | T | B), Tile(0, 1, 0, W | T | B), Tile(0, 2, 0, W | T)}, |
| scale}, |
| {"NearParallelHorizontal", |
| {{{-5.0f, 2.0f}, {15.0f, 2.0001f}}}, |
| {Tile(0, 0, 0, L | R), |
| {Tile(1, 0, 0, L | R)}, |
| {Tile(2, 0, 0, L | R)}, |
| {Tile(3, 0, 0, L)}}, |
| scale}}; |
| } |
| |
| } // namespace TileTestCases |
| |
| } // namespace skgpu::graphite |