| /* | |
| * 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 |