[Mesa-dev] [PATCH] glsl/linker: validate attribute aliasing before optimizations
Tapani Pälli
tapani.palli at intel.com
Mon Oct 29 10:12:20 UTC 2018
On 10/27/18 1:32 AM, Timothy Arceri wrote:
> On Fri, Oct 12, 2018, at 5:04 AM, Tapani Pälli wrote:
>> Patch does a 'dry run' of assign_attribute_or_color_locations before
>> optimizations to catch cases where we have aliasing of unused attributes
>> which is forbidden by the GLSL ES 3.x specifications.
>>
>> We need to run this pass before unused attributes may be removed and with
>> attribute binding information from program, therefore we re-use existing
>> pass in linker rather than attempt to write another one.
>>
>> This fixes WebGL2 test 'gl-bindAttribLocation-aliasing-inactive' and
>> Piglit test 'gles-3.0-attribute-aliasing'.
>>
>> Signed-off-by: Tapani Pälli <tapani.palli at intel.com>
>> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=106833
>> ---
>> src/compiler/glsl/linker.cpp | 31 ++++++++++++++++++++++++++++---
>> 1 file changed, 28 insertions(+), 3 deletions(-)
>>
>> diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp
>> index 2f4c8860547..905d4b3cbed 100644
>> --- a/src/compiler/glsl/linker.cpp
>> +++ b/src/compiler/glsl/linker.cpp
>> @@ -2709,7 +2709,8 @@ static bool
>> assign_attribute_or_color_locations(void *mem_ctx,
>> gl_shader_program *prog,
>> struct gl_constants *constants,
>> - unsigned target_index)
>> + unsigned target_index,
>> + bool do_assignment)
>> {
>> /* Maximum number of generic locations. This corresponds to either the
>> * maximum number of draw buffers or the maximum number of generic
>> @@ -3072,6 +3073,9 @@ assign_attribute_or_color_locations(void *mem_ctx,
>> num_attr++;
>> }
>>
>> + if (!do_assignment)
>> + return true;
>> +
>> if (target_index == MESA_SHADER_VERTEX) {
>> unsigned total_attribs_size =
>> util_bitcount(used_locations &
>> SAFE_MASK_FROM_INDEX(max_index)) +
>> @@ -4780,12 +4784,12 @@ link_varyings_and_uniforms(unsigned first,
>> unsigned last,
>> }
>>
>> if (!assign_attribute_or_color_locations(mem_ctx, prog, &ctx->Const,
>> - MESA_SHADER_VERTEX)) {
>> + MESA_SHADER_VERTEX, true)) {
>> return false;
>> }
>>
>> if (!assign_attribute_or_color_locations(mem_ctx, prog, &ctx->Const,
>> - MESA_SHADER_FRAGMENT)) {
>> + MESA_SHADER_FRAGMENT, true)) {
>> return false;
>> }
>>
>> @@ -5162,6 +5166,27 @@ link_shaders(struct gl_context *ctx, struct
>> gl_shader_program *prog)
>> lower_tess_level(prog->_LinkedShaders[i]);
>> }
>>
>> + /* Section 13.46 (Vertex Attribute Aliasing) of the OpenGL ES 3.2
>> + * specification says:
>> + *
>> + * "In general, the behavior of GLSL ES should not depend on
>> compiler
>> + * optimizations which might be implementation-dependent. Name
>> matching
>> + * rules in most languages, including C++ from which GLSL ES
>> is derived,
>> + * are based on declarations rather than use.
>> + *
>> + * RESOLUTION: The existence of aliasing is determined by
>> declarations
>> + * present after preprocessing."
>> + *
>> + * Because of this rule, we do a 'dry-run' of attribute
>> assignment for
>> + * vertex shader inputs here.
>> + */
>> + if (i == MESA_SHADER_VERTEX) {
>
> Can we please add a GLES check to the if above so we can skip this for desktop GL.
>
> Its a little unfortunate we need this patch but splitting assign_attribute_or_color_locations() in two would get messy so with the above change.
>
> Reviewed-by: Timothy Arceri <tarceri at itsqueeze.com>
Sure, I'll add a GLES check. Thanks for the review!
>
>> + if (!assign_attribute_or_color_locations(mem_ctx, prog, &ctx-
>>> Const,
>> + MESA_SHADER_VERTEX,
>> false)) {
>> + goto done;
>> + }
>> + }
>> +
>> /* Call opts before lowering const arrays to uniforms so we can
>> const
>> * propagate any elements accessed directly.
>> */
>> --
>> 2.17.1
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list