Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Impeller] Add utility for type safe masks. #51361

Merged
merged 3 commits into from
Mar 12, 2024

Conversation

chinmaygarde
Copy link
Member

We use and recommend type safe enums. But when it comes to masks of those enums (TextureUsageMask, ColorWriteMask, etc.), these are all untyped and you can create one either from a scalar of the enums underlying type, or using ugly and error prone static casts. At the callee, there is no type checking and another error prone static cast.

This patch adds a type-safe mask type. This should allow for the migration of something like:

using TextureUsageMask = uint64_t;

with

using TextureUsageMask = Mask<TextureUsage>;

Subsequently, all static casts can be removed with full type checking throughout.

This doesn't migrate existing uses yet. That will come in a separate patch.

We use and recommend type safe enums. But when it comes to masks of those enums
(`TextureUsageMask`, `ColorWriteMask`, etc.), these are all untyped and you can
create one either from a scalar of the enums underlying type, or using ugly and
error prone static casts. At the callee, there is no type checking and another
error prone static cast.

This patch adds a typed safe mask type. This should allow for the migration of
something like:

```c++
using TextureUsageMask = uint64_t;
```

with

```c++
using TextureUsageMask = Mask<TextureUsage>;
```

Subsequently, all static casts can be removed with full type checking
throughout.

This doesn't migrate existing uses yet. That will come in a separate patch.
@chinmaygarde
Copy link
Member Author

Really find working with masks icky in our codebase. But didn't want to add this since a lot of this code can be removed post C++20. But not sure when this is going to happen.

Copy link
Member

@bdero bdero left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@chinmaygarde chinmaygarde added the autosubmit Merge PR when tree becomes green via auto submit App label Mar 12, 2024
@auto-submit auto-submit bot merged commit c2faf2a into flutter:main Mar 12, 2024
28 checks passed
@chinmaygarde chinmaygarde deleted the add_mask branch March 12, 2024 21:02
engine-flutter-autoroll added a commit to engine-flutter-autoroll/flutter that referenced this pull request Mar 12, 2024
chinmaygarde added a commit to chinmaygarde/flutter_engine that referenced this pull request Mar 12, 2024
auto-submit bot pushed a commit to flutter/flutter that referenced this pull request Mar 12, 2024
…145035)

flutter/engine@f1db33f...e25e977

2024-03-12 skia-flutter-autoroll@skia.org Roll Skia from 47baa55b4669 to 187488b64570 (1 revision) (flutter/engine#51362)
2024-03-12 chinmaygarde@google.com [Impeller] Add utility for type safe masks. (flutter/engine#51361)

If this roll has caused a breakage, revert this CL and stop the roller
using the controls here:
https://autoroll.skia.org/r/flutter-engine-flutter-autoroll
Please CC bdero@google.com,rmistry@google.com,zra@google.com on the revert to ensure that a human
is aware of the problem.

To file a bug in Flutter: https://github.com/flutter/flutter/issues/new/choose

To report a problem with the AutoRoller itself, please file a bug:
https://issues.skia.org/issues/new?component=1389291&template=1850622

Documentation for the AutoRoller is here:
https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
zijiehe-google-com pushed a commit to zijiehe-google-com/engine that referenced this pull request Mar 13, 2024
Uses the utility added in flutter#51361

I counted the removal of 58 static casts. There was one addition made to the original utility however. Vulkan HPP was promoting all enums to its own mask type. This in itself is problematic but we got away with it because there was no one else doing this kind of promotion. Till we added our own utility. To avoid polluting the namespace with methods that may cause ambiguity, enums that are masks must explicitly be marked as maskable with `IMPELLER_ENUM_IS_MASK` in the `impeller` namespace.

No change in functionality.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
autosubmit Merge PR when tree becomes green via auto submit App e: impeller
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants