Reviewed-by: Jordan Justen <jordan.l.jus...@intel.com>
On Mon, Jan 21, 2013 at 2:16 PM, Paul Berry <stereotype...@gmail.com> wrote: > This patch series adds support for varying structs, which are a > required part of GLSL ES 3.00 and GLSL 1.50. > > I can see two principal ways to implement this feature: a "flattening" > approach, and a "packing" approach. In the "flattening" approach, the > linker replaces each varying struct with a set of varyings, one for > each field in the struct, and adjusts the shader code to refer to the > new set of varyings (this is what a programmer would likely try to do > when manually porting a shader that uses structs to a version of GLSL > that didn't support them). In the "packing" approach, we keep the > varying structs as single variables, and lay out their contents > contiguously in GPU memory (in much the same way that a CPU compiler > would handle an ordinary C struct). > > In principle, the "flattening" approach carries some potential > performance benefits, since it frees the linker to assign each struct > element a location that is properly aligned to its type. However, it > is much more difficult to implement, since it requires a lowering pass > to traverse the entire shader and adjust all references to the varying > structs, including function in/out parameters and whole structure > assignment. To make matters worse, there would be subtle interactions > between the linker and the lowering pass, since error checking would > have to be performed based on the un-lowered shaders, but the location > assignment would have to be applied to the lowered varyings. > > Because of these difficulties, I've used the "packing" approach in > this initial implementation--this allowed me to take advantage of the > existing lower_packed_varyings() function to pack and unpack varying > structs, so the code delta is fairly small. We can always switch to > the "flattening" approach if, in the future, we discover some programs > whose performance would be dramatically improved by it. > > Patch 1/6 eliminates the ambiguity in the ir_variable_mode enum > between "in/out" variables that are inputs/outputs of functions and > inputs/outputs of shaders. This makes possible patch 2/6, which > modifies opt_structure_splitting to leave varying structs alone (we > can't have it splitting varying structs, otherwise the linker won't be > able to find them). Patches 3/6 and 4/6 update the linker and > lower_packed_varyings, respectively, to handle varying structs, and > patch 5/6 disables transform feedback for varying structs (we haven't > yet heard from Khronos how this is supposed to work). Finally, patch > 6/6 enables the feature when the GLSL version is 1.50 or 3.00 ES. > > > [PATCH 1/6] glsl: Eliminate ambiguity between function ins/outs and shader > ins/outs > [PATCH 2/6] glsl: Disable structure splitting for shader ins/outs. > [PATCH 3/6] glsl: Generalize compute_packing_order for varying structs. > [PATCH 4/6] glsl: Update lower_packed_varyings to handle varying structs. > [PATCH 5/6] glsl: Disable transform feedback of varying structs. > [PATCH 6/6] glsl: Allow varying structs in GLSL ES 3.00 and GLSL 1.50. _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev