Tim Maffett 2bd9ecbb73
Adds Impellerc flatbuffer format versioning. (#175470)
Fixes #172899

This PR adds a format_version number to the root table of the 3 flat
buffer formats that impellerc creates; runtime stages, shader bundles
and shader archives.
It also adds a 'format_version' key to the root table of the shader
bundle json format for completeness (Though it could be argued that the
json format does not require this, I feel it may still be useful there).

This allows for format compatibility checks with future versions of the
table as @chinmaygarde expressed concerns about in #168294 and
@jonahwilliams mentions in #166944 .
The current code only checks for compatibility with the current version,
but this mechanism allows for backwards compatibility in the future and
not handling flat buffers with formats with new version number.
The big win here is that format_version numbers allow us to abort
parsing anything that we may not understand that could possible cause
problems, corruptions or crashes. The changes are simple and
straightforward and I feel they lay a reasonable foundation for version
handling for any future changes.

The version numbers themselves are defined within the
`runtime_stage_types.fbs`, `shader_bundle.fbs` and `shader_archive.fbs`
where I feel they should be as they can directly be incremented if any
changes to the flat buffer format are made. Mechanisms for handling of
backwards compatibility in the future should be straightforward to make
in the corresponding c++ code allowing for the continued support of
older (lower) version numbers if so desired.

This addresses #172899 and the other concerns mentioned in the
issues/pr's mentioned above.

I plan on including my tests for exclusion of non-matching versions -
Existing test verify that the version checking confirms matching
versions. I wanted to get this out there for discussion before spending
more time on this in case this approach is rejected outright.
   
I have a companion PR which adds FragmentProgram.fromBytes() to the
engine (c++ and canvaskit/wasm). I wanted to separate the impellerc
output versioning into it's own (this) PR.

  
## 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], including [Features
we expect every widget to implement].
- [X] I signed the [CLA].
- [X] I listed at least one issue that this PR fixes in the description
above.
- [X] I updated/added relevant documentation (doc comments with `///`).
- [FORTHCOMING] I added new tests to check the change I am making, or
this PR is [test-exempt].
- [X] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [X] All existing and new tests are passing.

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: gaaclarke <30870216+gaaclarke@users.noreply.github.com>
Co-authored-by: Aaron Clarke <aaclarke@google.com>
2025-12-02 21:57:29 +00:00
..

Flutter Engine

Setting up the Engine development environment

See here