tree 9579be3c839aed1cfc458928462b6781ff3e5de4
parent d727be88d6d6ff15756e502a6e09979a04bd071f
author gaaclarke <30870216+gaaclarke@users.noreply.github.com> 1733165189 -0800
committer GitHub <noreply@github.com> 1733165189 -0800
gpgsig -----BEGIN PGP SIGNATURE-----
 
 wsFcBAABCAAQBQJnTgCFCRC1aQ7uu5UhlAAAabkQAArHe9o4NOVQICx949tlFL7L
 rSLOj4qFxGnlZMLLX2CP8hbWSXu1byofjKQKu1Fg3iZrVVTAwsjJqwEkg7/frr33
 bWDoEqp5DhcxWc0N83lCE3DaDJGgP5mZNxcBzLVShJoF6CEZBV4ghVvnyAik+eMw
 hmWmfk9UfGuezMHCclQHXIsjdorUM3S9sSwDEYY2j0ICDM4YzDN1NY7qSfxj3L4T
 2cRrSxTVuPsZ8TcLgW91u/wQqKyYTYMA5Ji96vQ8LbZtodUAidMHPEa5HLOKl4XG
 lC0rXQC1j8tjbPnIpl3iXfcd1o7JgEB4VwVeiwh3/rARqlFq35OEnn+MXNE+HqYq
 LIhYohJJ/R6i3oDAnhywixvNLGs2qFhcOE7QGwWkjCCARiP7SB/u3SCJeHPZG3xG
 yGC8fU5XNU+sgtL7x2HqDr6wUjvhui5kkDFdFTTHOXafOHdZHegBMopu45lhvcY6
 7CYkAcaEn1BQi6tFmnMFE7keWsyC8dSzzFvPTD/2OTBci1EmLkYOMBPCEK5kpAXP
 7sIPio6ed+rKGFLIBdb+jiMibJhoOqWqF2il1Rbfb/ckziN4zJmB6wmTlVf2wIh2
 guIHx7gUnSKNmt1lJYHgw6lNyPICu3NfabKg7RqHC0jEx4lURMger+2v0McbFvyu
 hbEHAm9CDMFRy/y1LYaa
 =Q0B6
 -----END PGP SIGNATURE-----
 

[impeller] makes UniformBindData 15% faster and adds unit test (#56844)

issue: https://github.com/flutter/flutter/issues/159177

The improvements come from using absl::flat_hash_map.

measurements with std vs absl (`host_profile_arm64`):
```
# Std
0.041124
0.0398002
0.0396546
0.0405552
0.0397742

# Absl
0.0353708
0.0336834
0.0338616
0.033050
0.0331976
```

Benchmark used
```c++
TEST(BufferBindingsGLESTest, BindUniformDataMicro) {
  BufferBindingsGLES bindings;
  absl::flat_hash_map<std::string, GLint> uniform_bindings;
  uniform_bindings["SHADERMETADATA.FOOBAR"] = 1;
  bindings.SetUniformBindings(std::move(uniform_bindings));
  std::shared_ptr<MockGLES> mock_gl = MockGLES::Init();
  MockAllocator allocator;
  Bindings vertex_bindings;

  ShaderMetadata shader_metadata = {
      .name = "shader_metadata",
      .members = {ShaderStructMemberMetadata{.type = ShaderType::kFloat,
                                             .name = "foobar",
                                             .offset = 0,
                                             .size = sizeof(float),
                                             .byte_length = sizeof(float)}}};
  std::shared_ptr<ReactorGLES> reactor;
  std::shared_ptr<Allocation> backing_store = std::make_shared<Allocation>();
  ASSERT_TRUE(backing_store->Truncate(Bytes{sizeof(float)}));
  DeviceBufferGLES device_buffer(DeviceBufferDescriptor{.size = sizeof(float)},
                                 reactor, backing_store);
  BufferView buffer_view(&device_buffer, Range(0, sizeof(float)));
  vertex_bindings.buffers.push_back(BufferAndUniformSlot{
      .slot =
          ShaderUniformSlot{
              .name = "foobar", .ext_res_0 = 0, .set = 0, .binding = 0},
      .view = BufferResource(&shader_metadata, buffer_view)});
  Bindings fragment_bindings;
  int32_t count = 5'000'000;
  auto start = std::chrono::high_resolution_clock::now();
  for (int32_t i = 0; i < count; ++i) {
    bindings.BindUniformData(mock_gl->GetProcTable(), allocator,
                             vertex_bindings, fragment_bindings);
    if (i % 100 == 0) {
      mock_gl->GetCapturedCalls();
    }
  }
  auto end = std::chrono::high_resolution_clock::now();
  auto duration =
      std::chrono::duration_cast<std::chrono::microseconds>(end - start)
          .count();
  std::cout << "Execution time: " << duration / static_cast<double>(count)
            << " microseconds" << std::endl;
}
```

This is one of our hottest symbols on the raster thread:

<img width="1528" alt="Screenshot 2024-11-27 at 2 27 54 PM"
src="https://github.com/user-attachments/assets/a9029d6f-ee96-4612-83f1-6b69f24e6ce8">

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide] and the [C++,
Objective-C, Java style guides].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I added new tests to check the change I am making or feature I am
adding, or the PR is [test-exempt]. See [testing the engine] for
instructions on writing and running engine tests.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I signed the [CLA].
- [x] All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/wiki/Tree-hygiene#overview
[Tree Hygiene]: https://github.com/flutter/flutter/wiki/Tree-hygiene
[test-exempt]:
https://github.com/flutter/flutter/wiki/Tree-hygiene#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo
[C++, Objective-C, Java style guides]:
https://github.com/flutter/engine/blob/main/CONTRIBUTING.md#style
[testing the engine]:
https://github.com/flutter/flutter/wiki/Testing-the-engine
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/wiki/Tree-hygiene#handling-breaking-changes
[Discord]: https://github.com/flutter/flutter/wiki/Chat