2513fbedca2b04376a3c3f668e0d7c97fd2e8b01
Implementation of #137341 This adds support for using references to any variable in a local scope inside the shader codebase. Example: ```cpp int a = 0; int &b = a; b++; /* a == 1 */ ``` Using `auto` is supported for reference definition as the type is not preserved by the copy paste procedure. Type checking is done by the C++ shader compilation or after the copy paste procedure during shader compilation. `auto` is still unsupported for other variable declarations. Reference to opaque types (`image`, `sampler`) are supported since they are never really assigned to a temp variable. This implements all safety feature related to the implementation being copy pasting the definition string. That is: - No `--`, `++` operators. - No function calls. - Array subscript index needs to be int constants or constant variable. The copy pasting does not replace member access: `auto &a = b; a.a = c;` becomes `b.a = c;` The copy pasting does not replace function calls: `auto &a = b; a = a();` becomes `b = a();` While limited, this already allows for nicer syntax (aliasing) for accessing SSBOs and the potential overhead of a copy semantic: ```cpp ViewMatrices matrices = drw_view_buf[0]; matrices.viewmat = float4x4(1); drw_view_buf[0] = matrices; ``` Can now be written as; ```cpp ViewMatrices &matrices = drw_view_buf[0]; matrices.viewmat = float4x4(1); ``` Which expands to; ```cpp drw_view_buf[0].viewmat = float4x4(1); ``` Note that the reference semantic is not carried through function call because arguments are transformed to `inout` in GLSL. `inout` has copy semantic but it is often implemented as reference by some implementations. Another important note is that this copy-pasting doesn't check if a symbol is a variable. It can match a typename. But given that our typenames have different capitalizations style this is unlikely to be an issue. If that issue arise, we can add a check for it. Rel #137446 Pull Request: https://projects.blender.org/blender/blender/pulls/138412
…
Blender
Blender is the free and open source 3D creation suite. It supports the entirety of the 3D pipeline—modeling, rigging, animation, simulation, rendering, compositing, motion tracking and video editing.
Project Pages
Development
License
Blender as a whole is licensed under the GNU General Public License, Version 3. Individual files may have a different but compatible license.
See blender.org/about/license for details.
Description
Languages
C++
78%
Python
14.9%
C
2.9%
GLSL
1.9%
CMake
1.2%
Other
0.9%
