)]}'
{
  "commit": "0bd5cac20cf47c89e1f5b0959588393ba4fbf950",
  "tree": "2649837ee553c14910e9f89af8ebaa59d593908b",
  "parents": [
    "8f214193940b2e7eda70746b7b42f96b0b4ce73b"
  ],
  "author": {
    "name": "Cody Northrop",
    "email": "cnorthrop@google.com",
    "time": "Fri Aug 06 17:56:58 2021 -0600"
  },
  "committer": {
    "name": "Angle LUCI CQ",
    "email": "angle-scoped@luci-project-accounts.iam.gserviceaccount.com",
    "time": "Tue Aug 10 20:53:39 2021 +0000"
  },
  "message": "Allow BufferSubData with persistently mapped buffers\n\nPer the GL_EXT_buffer_storage extension:\n\n    What commands are affected by the relaxed errors for persistently\n    mapped buffers?\n\n    RESOLVED: In GL 4.5 the following commands have the relaxed\n    language BufferSubData, ClearBufferSubData, CopyBufferSubData,\n    GetBufferSubData and InvalidateBufferSubData. Of these commands\n    the only ones that apply to ES 3.1 are BufferSubData and\n    CopyBufferSubData. However, if additional extensions add any of\n    the other commands and EXT_buffer_storage is supported, they\n    would have the same behavior in ES.\n\nTherefore we need to allow BufferSubData and CopyBufferSubData on\npersistently mapped buffers.\n\nCurrent we fail these scenarios in validation. This was detected when\nrunning Fortnite on Android using the game\u0027s GLES backend.\n\nAlso added two tests:\n - StorageCopyBufferSubDataMapped to recreate the exact Fortnite\n   scenario using glCopyBufferSubData.\n - StorageBufferSubDataMapped is a contrived case to cover\n   glBufferSubData\n\nTest: BufferStorageTestES3.StorageCopyBufferSubDataMapped/*\nTest: BufferStorageTestES3.StorageBufferSubDataMapped/*\nBug: b/180418810\nBug: angleproject:5658\nChange-Id: Ib678e84f367934656ec10f0f4ad0d35ac687f0b0\nReviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3078316\nReviewed-by: Jamie Madill \u003cjmadill@chromium.org\u003e\nReviewed-by: Tim Van Patten \u003ctimvp@google.com\u003e\nCommit-Queue: Cody Northrop \u003ccnorthrop@google.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "73a1651d0db4d7ac78787575cdfa3b885fb2e6a4",
      "old_mode": 33188,
      "old_path": "src/libANGLE/validationES2.cpp",
      "new_id": "9802a3385d5f042df8b643b9b452de29b41ba868",
      "new_mode": 33188,
      "new_path": "src/libANGLE/validationES2.cpp"
    },
    {
      "type": "modify",
      "old_id": "a41744a48bac533203a37d6977976b32888d7925",
      "old_mode": 33188,
      "old_path": "src/libANGLE/validationES3.cpp",
      "new_id": "f385ef623cc56658dc5f840ddd3f3c3bf9bf3e05",
      "new_mode": 33188,
      "new_path": "src/libANGLE/validationES3.cpp"
    },
    {
      "type": "modify",
      "old_id": "a4bd3562227ae89739104a6402504fb9eb13c5c1",
      "old_mode": 33188,
      "old_path": "src/tests/gl_tests/BufferDataTest.cpp",
      "new_id": "b3e70c797ace1fbcaf0002fe7d63e4b4ac418e97",
      "new_mode": 33188,
      "new_path": "src/tests/gl_tests/BufferDataTest.cpp"
    }
  ]
}
