)]}'
{
  "commit": "c33438626fbd307bdc7b158566c028d16355b1d7",
  "tree": "f8cef7f834cffa5e3cab15eaa1e2a4d6bb546c15",
  "parents": [
    "9198c8aba6ab6e07eadb327959129f9524d435c1"
  ],
  "author": {
    "name": "Laurenz Stampfl",
    "email": "47084093+LaurenzV@users.noreply.github.com",
    "time": "Fri Jul 24 07:56:58 2026 +0200"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Fri Jul 24 05:56:58 2026 +0000"
  },
  "message": "vello_hybrid: A complete rewrite of the core logic (#1759)\n\nAlso, I know the number of added/removed lines looks scary, but a\nsignificant part of this is just tests and also shuffling existing code\naround. 🙂 But obviously it\u0027s still a big PR! Initially, the plan was to\ntry to split it up, but after discussing with Alex we\u0027ve come to the\nconclusion that it makes more sense to deliver it as a whole \"package\".\n\n# Summary\nThis PR implements a major rewrite of Vello Hybrid. The WebGL and WGPU\nbackends as well as some core aspects of old Vello Hybrid (like how\npaints and filter are encoded remain mostly the same), but the core\nalgorithm for interpreting and scheduling scene commands has been\ncompletely reworked. More information on what motivates this change can\nbe found in an adjacent [Zulip\nthread](https://xi.zulipchat.com/#narrow/channel/197075-vello/topic/Removing.20coarse-rasterization.20based.20clipping/with/590142140)\nas well as in some render office hours transcripts, but to summarize it\nvery briefly:\n\nVello Hybrid is currently based on a so-called “coarse rasterization”\napproach, where render work is split up into wide tiles that can be\nrendered independently. One of the core motivations for doing so was to\nenable doing blending with bounded memory. However, as Vello Hybrid\nevolved, it turned out that the approach is not great, for two reasons.\nFirst, the CPU overhead for doing coarse rasterization is so big that it\nbasically diminishes any of the performance characteristics we would\nexpect from a GPU-based renderer. Secondly, coarse rasterization is\nfundamentally incompatible with filters, where the whole layer needs to\nbe rendered on its own first. This goes against the core idea of corse\nrasterization, where the viewport is split up and it is assumed that\neach wide tile can be rendered independently.\n\nBecause of the above,\n1. Vello Hybrid now basically has two separate paths, the old\ncoarse-rasterization based path and a new “fast strips path”, which\nattempts to regain the performance benefits for simple scenes without\nlayers.\n2. In order to support filters, we had to resort to _a lot_ of hacks to\nmake them work with coarse rasterization, especially to support them in\ncombination with layer clipping. The code is incredibly complex and hard\nto reason about, making it hard to maintain it. There are also a few\nopen issues with bugs. In addition, the current approach also makes it\nimpossible to support filter layers that extend over the root viewport;\ncurrently, any filter effect that isn\u0027t in the main viewport area is cut\noff.\n\nVello CPU was also plagued by similar problems, which we’ve fixed by\nrewriting it to use a simpler coarse rasterization approach (see #1701),\nin my opinion with great success!\n\nThis PR does the same, but for Vello Hybrid. Unlike Vello CPU, which\ndoes still need some form of coarse rasterization to work efficiently,\nfor Vello Hybrid we do not need this at all. Therefore, it\u0027s completely\nremoved. Instead, we just submit the \"soup of strips\" directly to the\nGPU and let it take care of the rest. From my testing, not only does it\nsolve our existing problems, but it also greatly improves performance of\nlayers, especially on low-tier devices, and makes the overall\narchitecture of Vello Hybrid more consistent, better tested, much easier\nto reason about and more memory-efficient for scenes with many filters.\n\n# Showcases\nI will try to add some showcases tomorrow.\n\n# Changes\n\nI will not dive into the real \"meat\" of this PR too much here, because\nI\u0027ve already extensively documented how it works in the code. But I will\nstill give a list of the overall changes, also give a suggested order\nfor reviewing this PR.\n\n## vello_common\n\nThanks to the preparatory PRs that have already been merged, the only\nchanges are updating some references to files in comments.\n\n## vello_sparse_shaders\n\nI\u0027ve renamed the shader files to make their naming a bit more\nconsistent. The blending logic has been extracted into a separate shader\nsince it\u0027s a completely independent stage now. I\u0027ve also added a new\n`copy` shader and repurposed the existing `clear_slots` shader. Other\nthan that, I also did some renaming of variables in the existing shaders\nto make them consistent. Apart from that, everythin should be the same.\n\n## vello_sparse_tests\n\nWith this PR, we can finally get rid of the scene constraints, as we can\ncompletely transparently handle scenes where the root is a blend target,\nall while still retaining the best speed benefits for both cases! Apart\nfrom that, I\u0027ve also added a bunch of new test cases to get more\ncoverage for the new code.\n\n## vello_hybrid\nStaring with the easier part, I\u0027ve deleted the old `schedule` module,\nsince it\u0027s replaced with a new algorithm. The fast rect path has been\nextracted into a new `rect` module and paint-handling into `paint`.\n\nThe new modules `blend` and `copy` are for GPU-side preparation of those\nstages. I\u0027ve also made changes to `filter`, but the core idea of how\nfilters are handled is the same, except that it\u0027s completely integrated\ninto the new layer-scheduling mechanism. As a consequence, we do not\npollute the image atlas for filters anymore! `scene` has been rewritten\nto use the new recording mechanism, and the new `target` module\nprovides. In `util`, I\u0027ve added a new abstraction to allow viewing\nnon-contiguous ranges of slices in a buffer as a single contiguous ones.\n\nAbove are the easy changes, but from then on things get more tricky, and\nI\u0027m unsure what the best way to review them is. 😄 I would probably start\nby reading the doc comments of all modules in `schedule` to get the\nbasic idea behind the new scheduling algorithm. Then, it probably makes\nsense to go bottom-up, by reviewing independent modules like `draw`\n(which should be familiar to already-existing code), `target`, followed\nby `allocate`, `execute` and `cursor`. Those basically form the building\nblocks of the new scheduling algorithm and can kind of be understood\nindependently. After that, I\u0027d recommend reading through `round`, which\nforms our representation of an independent set of render passes executed\nas a unit. And finally, the biggest part is in `schedule/mod.rs`, which\nties all of the other elements together to implement what we need.\n\n# Follow-ups\n\n- With this PR merged, coarse rasterization in `vello_common` is\nessentially dead code. However, I will wait until this PR is merged\nbefore actually deleting the module, as there are some other places that\nstill use `WideTile::WIDTH`, and I don’t want to make the diff larger\nthan it already is!\n\nThis PR was done with assistance of GPT 5.6 Sol, but it goes without\nsaying that I’ve heavily guided and thoroughly reviewed this\nimplementation, to make sure it’s robust and lives up to our standards.\nIt’s possible that a comment might have gotten lost here and there as\npart of moving code around, but I tried my best to find and fix those\nbefore opening this PR. I’ve also gone through a lot of iterations to\narrive at this point, so it’s possible there is some accidental or\nunnecessary complexity somewhere that I missed.",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "bf5baeaf16959786a6cde200cd72d2f84904483a",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_common/src/filter/gaussian_blur.rs",
      "new_id": "4c807d513194d6ba32d582f12b315b7fe9893ade",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_common/src/filter/gaussian_blur.rs"
    },
    {
      "type": "modify",
      "old_id": "9db3adf0be09eab0c9ccdf060d445acd703817a0",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_common/src/math.rs",
      "new_id": "7c98d68f14443036fe9e99756267ea27918a3e0c",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_common/src/math.rs"
    },
    {
      "type": "modify",
      "old_id": "2bb594b406777278a5daf0c77b5125203babc42c",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_common/src/record.rs",
      "new_id": "8a2f87977e0d02e534e7cffb6b85498df5948639",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_common/src/record.rs"
    },
    {
      "type": "modify",
      "old_id": "1ca8188f7bac255d9d4d1cffdc3d743d49b3b013",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_cpu/src/render.rs",
      "new_id": "486aec82446d8ed2dc1ba08c2f817f53129ac690",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_cpu/src/render.rs"
    },
    {
      "type": "modify",
      "old_id": "e990a9017797bf593d75e74f7854420ff64588bb",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_dev_macros/src/test.rs",
      "new_id": "8f433dbcd28d3eed87f88618ca3cd8e37aded457",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_dev_macros/src/test.rs"
    },
    {
      "type": "modify",
      "old_id": "596156eda73b6ef6f9f3095ac52c13a4e2e487eb",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_hybrid/README.md",
      "new_id": "f46e6ffaefab9a1dc9d471853d19bea05ac1d68a",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_hybrid/README.md"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "36141844368aa255db33e3c11277045751199695",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_hybrid/src/blend.rs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "14bce0cc10db3e968772d3350a679e19b96151c1",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_hybrid/src/copy.rs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "6fc5f9704ed489ae54d1630e1928e9744cbe2ac3",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_hybrid/src/draw.rs"
    },
    {
      "type": "modify",
      "old_id": "cd3f71299be8116eff49a894dff365afd065f8d3",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_hybrid/src/filter.rs",
      "new_id": "b53daceb09d40d31a750489948c6fc52599a70db",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_hybrid/src/filter.rs"
    },
    {
      "type": "modify",
      "old_id": "acbd9223f91d411b44bf615367caca0c808f7c86",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_hybrid/src/lib.rs",
      "new_id": "c7543629f6c9130171e5e36f4eb7a11685ddd4c6",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_hybrid/src/lib.rs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "4545aa2f00e9b774f8f9e464a8b76275bb281635",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_hybrid/src/paint.rs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "164e2d818886ef82db837b793928d65fbe16286d",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_hybrid/src/rect.rs"
    },
    {
      "type": "modify",
      "old_id": "f701b5ece7662b66c34b74764fafbe254571fc33",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_hybrid/src/render/common.rs",
      "new_id": "919315ee809f2c1af7c17306a27fa21f8ce2c104",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_hybrid/src/render/common.rs"
    },
    {
      "type": "modify",
      "old_id": "89a0bc20a6fecbb2ee4e7ca3feaa2e551bc831fb",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_hybrid/src/render/probe.rs",
      "new_id": "b1d608b731045c791d6ce661978216a72a74a062",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_hybrid/src/render/probe.rs"
    },
    {
      "type": "modify",
      "old_id": "dca93cef18438a6fac571efeaa2f817b1420e35b",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_hybrid/src/render/webgl.rs",
      "new_id": "d8536771f60bff032d1190d9941edcdab9b96319",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_hybrid/src/render/webgl.rs"
    },
    {
      "type": "modify",
      "old_id": "69110bc9f888b10dcd0a11a40f3c91fa429f7797",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_hybrid/src/render/wgpu.rs",
      "new_id": "9ca85f2333757a79fdd0f5ef1bd29c8037b8e890",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_hybrid/src/render/wgpu.rs"
    },
    {
      "type": "modify",
      "old_id": "adf0deb4e4ee1aa9382f293659d88d7a81ddbe9d",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_hybrid/src/resources.rs",
      "new_id": "d04e64f5588ada439312bd90d25cb210e96caf9f",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_hybrid/src/resources.rs"
    },
    {
      "type": "modify",
      "old_id": "f239bedad23d53cf9d429019439a01e824b1a8dd",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_hybrid/src/scene.rs",
      "new_id": "ae90916ea1957be05cb0ce980d7c7831d6d84311",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_hybrid/src/scene.rs"
    },
    {
      "type": "delete",
      "old_id": "df070f9155a7538a76bfbb638b02fc3b83d1b4ee",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_hybrid/src/schedule.rs",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "0f12df3981b152571ced6afd9b425e4c205d7ba1",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_hybrid/src/schedule/allocate.rs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "12e41318ab455b956d9c08365223780ea684a41e",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_hybrid/src/schedule/cursor.rs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "3f7cbec5476d1af2b4ff3baf8fe2b3710bf9ebe3",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_hybrid/src/schedule/execute.rs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "8d72ce13cedec841d69186eb504c45c9f8c2068c",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_hybrid/src/schedule/mod.rs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "610a3f99f35e81f07c0c785268f4e79ba2a272ac",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_hybrid/src/schedule/round.rs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "a3ecb54f8fc534fed4c5890072bcf6bfec731c48",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_hybrid/src/schedule/schedule_tests.rs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "1f4c14c2e8148bf81a756949d3159000545697b9",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_hybrid/src/schedule/test_support.rs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "eb163c6c98236f4bff3aa6ed3bb0dcf456c3d886",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_hybrid/src/target.rs"
    },
    {
      "type": "modify",
      "old_id": "d659e1184d1b75826fda7513baca9ec0ef046f6c",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_hybrid/src/util.rs",
      "new_id": "3c8a397a4a7e2b1e50d792304811781cb686119e",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_hybrid/src/util.rs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "3c6b6a5cb1433606bf149d4233c641e632507d63",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_sparse_shaders/shaders/blend.wgsl"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "7353225efcdae9ca4ab1e491cfb7c742c5386ec6",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_sparse_shaders/shaders/clear.wgsl"
    },
    {
      "type": "delete",
      "old_id": "84b53e4ef3fbb1ef8da4ed94af280ce3137fb5d1",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_sparse_shaders/shaders/clear_slots.wgsl",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "cca0ddc0bc5b1124e5c5b26983b39e91fe1ccd8e",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_sparse_shaders/shaders/copy.wgsl"
    },
    {
      "type": "rename",
      "old_id": "cd955b42c1819b4347517bcce3250d282588dae8",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_sparse_shaders/shaders/filters.wgsl",
      "new_id": "9a5c19d75962f2bbbea00a22de55fad3eeca75cc",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_sparse_shaders/shaders/filter.wgsl",
      "score": 60
    },
    {
      "type": "rename",
      "old_id": "e2ae04365739779098d7534526bf60057293523b",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_sparse_shaders/shaders/render_strips.wgsl",
      "new_id": "f3648ca342cbf2a72b4d660020adeefe02f71f90",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_sparse_shaders/shaders/render.wgsl",
      "score": 80
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "e55d7aa260ebd72e6e071f246136c351fe785b65",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_sparse_tests/snapshots/clip_clear_circle.png"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "ac3451d08ffa1b3af88bf6189ce3581838dac6db",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_sparse_tests/snapshots/compose_clear_empty_layer.png"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "ac3451d08ffa1b3af88bf6189ce3581838dac6db",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_sparse_tests/snapshots/compose_clear_empty_nested_layer.png"
    },
    {
      "type": "delete",
      "old_id": "6b224046abaf799212448b5b036739e867d10ecf",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_sparse_tests/snapshots/default_blending_only_empty_fast_batch.png",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "delete",
      "old_id": "f75925a9fa13f460104fa6e1fc7a75808ccb9131",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_sparse_tests/snapshots/default_blending_only_fast_around_opacity.png",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "delete",
      "old_id": "0c7405bc1b84772fe9a8fb4112e6f3385d961417",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_sparse_tests/snapshots/default_blending_only_fast_before_and_after_clip.png",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "delete",
      "old_id": "d6576abd255234be0010ef16bc86d39bb206db9b",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_sparse_tests/snapshots/default_blending_only_fast_before_clip.png",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "delete",
      "old_id": "e2afeaf41750e93696aaa31d82f0c6f0935631f4",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_sparse_tests/snapshots/default_blending_only_multiple_segments.png",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "delete",
      "old_id": "dc30e6bd5b06934df4f7a7e1ca3c054340a1d0b9",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_sparse_tests/snapshots/default_blending_only_nested_layers.png",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "a35dd4822ad8df7882146e19472582bef487e4ce",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_sparse_tests/snapshots/external_texture_atlas_interleaving.png"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "59999570d99d15a61d19d68415f484346a1066ee",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_sparse_tests/snapshots/external_texture_external_before_layer.png"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "59999570d99d15a61d19d68415f484346a1066ee",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_sparse_tests/snapshots/external_texture_layer_before_external.png"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "5187d608c495b47ee3b8be965b4cedf3e2806318",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_sparse_tests/snapshots/external_texture_layer_circle_orders.png"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "7483cc95b5fb8ccabd25f94102abaebb9328b389",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_sparse_tests/snapshots/hybrid_schedule_atlas_page_index_two.png"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "64872682749fa84930096259b94bf837ec82eae4",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_sparse_tests/snapshots/hybrid_schedule_atlas_page_one_reuse.png"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "fab85b38148498c50993cbc411b2c955896fa936",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_sparse_tests/snapshots/hybrid_schedule_blended_child_outside_clipped_parent.png"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "0896ec7ec2d492b4e52baa18d23d00744a69f247",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_sparse_tests/snapshots/hybrid_schedule_cropped_blend_preserves_child_source_offset.png"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "feafcae25d1aa6e73f65bc3b351c62af20881e80",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_sparse_tests/snapshots/hybrid_schedule_empty_destructive_child_in_shifted_filter.png"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "8a1520dc2dcfc49d1517fe8fc4dd7fa3914ecac7",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_sparse_tests/snapshots/hybrid_schedule_filter_atlas_page_one.png"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "6eec8a81d6e555ef5503acb5975f8382e0ad2369",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_sparse_tests/snapshots/hybrid_schedule_filter_batch_page_zero.png"
    },
    {
      "type": "modify",
      "old_id": "90137e75dbd51c07ac42e04052087c5cc0c48ef0",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_sparse_tests/tests/clip.rs",
      "new_id": "b24561e7495538f9b72e8d1e4a13d757f3d594d9",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_sparse_tests/tests/clip.rs"
    },
    {
      "type": "modify",
      "old_id": "1a628423ff3d6d4065f61de962384be42308b9d6",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_sparse_tests/tests/compose.rs",
      "new_id": "1b36a8e33732408a19b682d6faed0ca2dd9dd0f5",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_sparse_tests/tests/compose.rs"
    },
    {
      "type": "delete",
      "old_id": "729afd2e35a230f69c98e313c32012338b4ac86d",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_sparse_tests/tests/default_blending_only_fast_path.rs",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "modify",
      "old_id": "5db0e281b5ab853764da3d1c1bfdbd1046cb111f",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_sparse_tests/tests/external_texture.rs",
      "new_id": "0068e4b74fe3cb6088a70339d357d6582ffc18c9",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_sparse_tests/tests/external_texture.rs"
    },
    {
      "type": "modify",
      "old_id": "a206ffe00f864239932b869b29f408a9f36847b8",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_sparse_tests/tests/filter.rs",
      "new_id": "4871c5830bd9fe5c36c5c9129dd05d696e418369",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_sparse_tests/tests/filter.rs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "b79547a45552f47d1251f7c9a1520f1d9772c9a5",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_sparse_tests/tests/hybrid_schedule.rs"
    },
    {
      "type": "modify",
      "old_id": "1ad3b911182b3fab844e0c638ae1955840b27a02",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_sparse_tests/tests/image.rs",
      "new_id": "f59f1ae8438d2b28d4e9675916ad2c8028f4a8c8",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_sparse_tests/tests/image.rs"
    },
    {
      "type": "modify",
      "old_id": "22f8d8f93d59818cf490390bb8fec1f3f0e782d5",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_sparse_tests/tests/image_atlas.rs",
      "new_id": "2e4eb9920bfa7347317515056f3f986b1ff6f0b2",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_sparse_tests/tests/image_atlas.rs"
    },
    {
      "type": "modify",
      "old_id": "d91dad300f87a019ebdc3668781412a9b978b927",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_sparse_tests/tests/issues.rs",
      "new_id": "1ea54228614856ac67002ca333ab60e44ffb27e3",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_sparse_tests/tests/issues.rs"
    },
    {
      "type": "modify",
      "old_id": "abaf02780259e9d4c266de65a63eb567c8cb362b",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_sparse_tests/tests/mod.rs",
      "new_id": "fc9aabd2a958c04335ffebff98f8e273a2e0ca0d",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_sparse_tests/tests/mod.rs"
    },
    {
      "type": "modify",
      "old_id": "f7eef0696f72fdb3758402eaa2d0d31ad5124005",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_sparse_tests/tests/renderer.rs",
      "new_id": "d70607f9c42b5f1af7ddcdeb608d67e3dc34747c",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_sparse_tests/tests/renderer.rs"
    },
    {
      "type": "modify",
      "old_id": "7260750208bbe51bb2d98b51165d143aeb5f70c7",
      "old_mode": 33188,
      "old_path": "sparse_strips/vello_sparse_tests/tests/util.rs",
      "new_id": "ccd39efef1ca1b3aea9d2b4ae55c5543cb38a9c9",
      "new_mode": 33188,
      "new_path": "sparse_strips/vello_sparse_tests/tests/util.rs"
    }
  ]
}
