)]}'
{
  "commit": "e26b384689b8f7ff1c98dd1da9935284516ad631",
  "tree": "7edd4b71b40e798e4cc303b7d96c88c5e0e0afec",
  "parents": [
    "710981c09ba17f22134671f7d8a6f372c7fb6baf"
  ],
  "author": {
    "name": "Brandon DeRosier",
    "email": "bdero@google.com",
    "time": "Wed Aug 05 23:22:24 2026 -0700"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Thu Aug 06 06:22:24 2026 +0000"
  },
  "message": "[Impeller] Validate GLES texture units against the combined limit (#189332)\n\nFixes #189331.\n\nThe GLES backend allocates fragment stage texture units after the vertex\nstage\u0027s, but validated the running unit index against the per-stage\nmaximum. On a driver reporting the minimum 16 fragment units (ANGLE on\nD3D11), a draw using all 16 fragment samplers plus a vertex stage\ntexture failed validation and the render pass aborted, crashing\nskinned-mesh rendering in Flutter GPU apps on Windows.\n\nTexture units are a combined resource in GL; the per-stage limits bound\nonly how many samplers one stage references. This validates the unit\nindex against the combined limit and the per-stage sampler count against\nthe per-stage limit. Adds unit tests for the previously rejected case\nand both overflow cases.\n\n## Pre-launch Checklist\n\n- [x] I read the [Contributor Guide] and followed the process outlined\nthere for submitting PRs.\n- [x] I read the [AI contribution guidelines] and understand my\nresponsibilities, or I am not using AI tools.\n- [x] I read the [Tree Hygiene] wiki page, which explains my\nresponsibilities.\n- [x] I read and followed the [Flutter Style Guide], including [Features\nwe expect every widget to implement].\n- [x] I signed the [CLA].\n- [x] I listed at least one issue that this PR fixes in the description\nabove.\n- [x] I updated/added relevant documentation (doc comments with `///`).\n- [x] I added new tests to check the change I am making, or this PR is\n[test-exempt].\n- [x] I followed the [breaking change policy] and added [Data Driven\nFixes] where supported.\n- [x] All existing and new tests are passing.",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "2055e5164edd79f4d7a97830cd25f11953a4fdd5",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/impeller/renderer/backend/gles/buffer_bindings_gles.cc",
      "new_id": "b5a6fad371a2a8ff4e11b83b99c5e39037672198",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/impeller/renderer/backend/gles/buffer_bindings_gles.cc"
    },
    {
      "type": "modify",
      "old_id": "12cef0328bc1b2ba6959a20423a9b49717621399",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/impeller/renderer/backend/gles/buffer_bindings_gles.h",
      "new_id": "c00b55e9c17bee46e842985300885e5ee83a714d",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/impeller/renderer/backend/gles/buffer_bindings_gles.h"
    },
    {
      "type": "modify",
      "old_id": "9bae5b1beb717a5bde37b5be1344a575772941e0",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/impeller/renderer/backend/gles/buffer_bindings_gles_unittests.cc",
      "new_id": "494fc8d72e7806356233a1ca92f7e9ebd01ddfea",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/impeller/renderer/backend/gles/buffer_bindings_gles_unittests.cc"
    },
    {
      "type": "modify",
      "old_id": "f4d48151f1537645e925476fc7b61a2b924886a8",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/impeller/renderer/backend/gles/test/mock_gles.cc",
      "new_id": "dbd70248c3940903a264c13a026a32339e9a94e5",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/impeller/renderer/backend/gles/test/mock_gles.cc"
    }
  ]
}
