diff options
author | Timothy Arceri <[email protected]> | 2016-03-10 11:51:48 +1100 |
---|---|---|
committer | Timothy Arceri <[email protected]> | 2016-03-31 12:50:49 +1100 |
commit | 598790e8564280b8f3f105c0ff6de9fff4d45e30 (patch) | |
tree | 01a69eadb001d7a59fa8537fc18ad192bbb88724 | |
parent | 04a72e6e57ea97db2023bec50a10f2106f5d5b24 (diff) |
glsl: apply xfb_stride to implicit offsets for ifc block members
When we have an interface block like:
layout (xfb_buffer = 0, xfb_offset = 0) out Block {
vec4 var1;
layout (xfb_stride = 32) vec4 var2;
vec4 var3;
};
We take into account the stride of var2 when calculating the offset
for var3.
Reviewed-by: Dave Airlie <[email protected]>
-rw-r--r-- | src/compiler/glsl/ast_to_hir.cpp | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/src/compiler/glsl/ast_to_hir.cpp b/src/compiler/glsl/ast_to_hir.cpp index 4fd2fd8ff05..a0312319161 100644 --- a/src/compiler/glsl/ast_to_hir.cpp +++ b/src/compiler/glsl/ast_to_hir.cpp @@ -54,6 +54,7 @@ #include "ast.h" #include "compiler/glsl_types.h" #include "program/hash_table.h" +#include "main/macros.h" #include "main/shaderobj.h" #include "ir.h" #include "ir_builder.h" @@ -6711,13 +6712,14 @@ 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 + - 4 * field_type->component_slots(); + MAX2(xfb_stride, (int) (4 * field_type->component_slots())); } } else { if (layout && layout->flags.q.explicit_xfb_offset) { unsigned align = field_type->is_double() ? 8 : 4; fields[i].offset = glsl_align(block_xfb_offset, align); - block_xfb_offset += 4 * field_type->component_slots(); + block_xfb_offset += + MAX2(xfb_stride, (int) (4 * field_type->component_slots())); } } |