blob: 59eab58e2cf8da61b2ae7b8c7b108d7ed72359dd [file]
/*
* 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