diff options
| author | Tim Foley <tfoleyNV@users.noreply.github.com> | 2020-05-01 08:53:11 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-05-01 08:53:11 -0700 |
| commit | c697fe50db0a74d76c6922ee24eb1f8d87def5f8 (patch) | |
| tree | 9d64da94bf0c6a0dfa02ec25bb2d32ab2d163adf /source/core | |
| parent | bd8562c69a79480c5556f15783648060f01ca00b (diff) | |
Improve GLSL coverage of boolean binary ops (#1335)
* Improve GLSL coverage of boolean binary ops
This change ensures that the `&&`, `||`, `&`, `|`, and `^` apply correctly to vectors of `bool` values when targetting GLSL.
Most of the changes are in the GLSL emit path, where the IR instructions for these operators are bottlenecked through a small set of helper routines to cover the different cases. In general:
* The vector variants of the operations are implemented by casting to `uint` vectors, performing bitwise ops, then casting back
* The scalar variants are handled by conveting the bitwise operations to their equivalent logical operator (the one interesting case there is bitwise `^` where the equivalent logical operation on `bool` is `!=`)
This change makes it clear that our IR really shouldn't have distinct opcodes for logical vs. bitwise and/or/xor, and instead should just have a single family of operations where the behavior differs based on the type of the operand. That is already *de facto* the way things work (a user can always write `&`, `|` and `^` and expect them to work on `bool` and vectors of `bool`), so that the GLSL output path has to deal with the overlap. Having two sets of IR ops here actually makes for more code instead of less.
* Fixups: review feedback and test ! operator
Diffstat (limited to 'source/core')
0 files changed, 0 insertions, 0 deletions
