glsl/linker: Fix xfb with explicit locations and 64bit types
1) Per GL_ARB_enhanced_layouts if explicit location is set for varying, each struct member, array element and matrix row will take separate location. With GL_ARB_gpu_shader_fp64/GL_ARB_gpu_shader_int64 they may take two locations. Examples: | layout(location=0) dvec3[2] a; | layout(location=4) vec2[4] b; | | | | | 32b 32b 32b 32b | 32b 32b 32b 32b | | 0 X X Y Y | 4 X Y 0 0 | | 1 Z Z 0 0 | 5 X Y 0 0 | | 2 X X Y Y | 6 X Y 0 0 | | 3 Z Z 0 0 | 7 X Y 0 0 | Previously it wasn't taken into account. 2) Captured double-precision variables should be aligned to 8 bytes per GL_ARB_gpu_shader_fp64: "If any variable captured in transform feedback has double-precision components, the practical requirements for defined behavior are: ... (c) each double-precision variable captured must be aligned to a multiple of eight bytes relative to the beginning of a vertex." v2: fix `output_size` calculations ( Andrii Simiklit <andrii.simiklit@globallogic.com> ) Closes: https://gitlab.freedesktop.org/mesa/mesa/issues/1667 Reviewed-by: Tapani Pälli <tapani.palli@intel.com> Signed-off-by: Danylo Piliaiev <danylo.piliaiev@globallogic.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/2333>
This commit is contained in:

committed by
Marge Bot

parent
c432cb672a
commit
67e33db4a6
@@ -77,10 +77,16 @@ struct tfeedback_candidate
|
||||
const glsl_type *type;
|
||||
|
||||
/**
|
||||
* Offset within the toplevel variable where this varying occurs (counted
|
||||
* in multiples of the size of a float).
|
||||
* Offset within the toplevel variable where this varying occurs.
|
||||
* Counted in floats.
|
||||
*/
|
||||
unsigned offset;
|
||||
unsigned struct_offset_floats;
|
||||
|
||||
/**
|
||||
* Offset within the xfb with respect to alignment requirements.
|
||||
* Counted in floats.
|
||||
*/
|
||||
unsigned xfb_offset_floats;
|
||||
};
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user