[Mesa-dev] [PATCH] glsl: xfb_stride applies to buffers, not block members

Nicolai Hähnle nhaehnle at gmail.com
Sun Jul 16 09:33:59 UTC 2017


On 07.07.2017 18:19, Juan A. Suarez Romero wrote:
> When we have an interface block like:
> 
> layout (xfb_buffer = 0, xfb_offset = 0) out Block {
>                               vec4 var1;
>      layout (xfb_stride = 48) vec4 var2;
>                               vec4 var3;
> };
> 
> According to ARB_enhanced_layouts spec:
> 
>     "The *xfb_stride* qualifier specifies how many bytes are consumed by
>      each captured vertex.  It applies to the transform feedback buffer
>      for that declaration, whether it is inherited or explicitly
>      declared. It can be applied to variables, blocks, block members, or
>      just the qualifier out. [ ...] While *xfb_stride* can be declared
>      multiple times for the same buffer, it is a compile-time or
>      link-time error to have different values specified for the stride
>      for the same buffer."
> 
> This means xfb_stride actually applies to the buffer, and not to the
> individual components.
> 
> In the above example, it means that var2 consumes 16 bytes, and var3 is
> at offset 32.
> 
> This has been confirmed also by John Kessenich, the main contact for the
> ARB_enhanced_layouts specs, and also because this commit fixes:
> 
> GL45.enhanced_layouts.xfb_block_member_stride
> 
> This commit is in practice a revert of 598790e8564 (glsl: apply
> xfb_stride to implicit offsets for ifc block members).

Thanks for taking care of this.

Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>


> ---
>   src/compiler/glsl/ast_to_hir.cpp | 5 ++---
>   1 file changed, 2 insertions(+), 3 deletions(-)
> 
> diff --git a/src/compiler/glsl/ast_to_hir.cpp b/src/compiler/glsl/ast_to_hir.cpp
> index c338ad7..3968657 100644
> --- a/src/compiler/glsl/ast_to_hir.cpp
> +++ b/src/compiler/glsl/ast_to_hir.cpp
> @@ -7372,14 +7372,13 @@ ast_process_struct_or_iface_block_members(exec_list *instructions,
>                                              qual->offset, &xfb_offset)) {
>                  fields[i].offset = xfb_offset;
>                  block_xfb_offset = fields[i].offset +
> -                  MAX2(xfb_stride, (int) (4 * field_type->component_slots()));
> +                  4 * field_type->component_slots();
>               }
>            } else {
>               if (layout && layout->flags.q.explicit_xfb_offset) {
>                  unsigned align = field_type->is_64bit() ? 8 : 4;
>                  fields[i].offset = glsl_align(block_xfb_offset, align);
> -               block_xfb_offset +=
> -                  MAX2(xfb_stride, (int) (4 * field_type->component_slots()));
> +               block_xfb_offset += 4 * field_type->component_slots();
>               }
>            }
>   
> 


-- 
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.


More information about the mesa-dev mailing list