[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