Nice, did you actually get it to work entirely on a big endian machine?
Bit fields aren't super portable, but this looks good enough. However, I think we should use the PIPE_ARCH_LITTLE_ENDIAN define from u_endian.h
Cheers, Nicolai On 20.03.2018 15:21, Bas Vermeulen wrote:
Using mesa OpenCL failed on a big endian PowerPC machine because si_vgt_param_key is using bitfields and a 32 bit int for an index into an array. Fix si_vgt_param_key to work correctly on both little endian and big endian machines. Signed-off-by: Bas Vermeulen <b...@daedalean.ai> --- src/gallium/drivers/radeonsi/si_pipe.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h index 2053dcb9fc..32dbdf6e2c 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.h +++ b/src/gallium/drivers/radeonsi/si_pipe.h @@ -385,6 +385,7 @@ struct si_shader_ctx_state { */ union si_vgt_param_key { struct { +#if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) unsigned prim:4; unsigned uses_instancing:1; unsigned multi_instances_smaller_than_primgroup:1; @@ -395,6 +396,18 @@ union si_vgt_param_key { unsigned tess_uses_prim_id:1; unsigned uses_gs:1; unsigned _pad:32 - SI_NUM_VGT_PARAM_KEY_BITS; +#else /* __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ */ + unsigned _pad:32 - SI_NUM_VGT_PARAM_KEY_BITS; + unsigned uses_gs:1; + unsigned tess_uses_prim_id:1; + unsigned uses_tess:1; + unsigned line_stipple_enabled:1; + unsigned count_from_stream_output:1; + unsigned primitive_restart:1; + unsigned multi_instances_smaller_than_primgroup:1; + unsigned uses_instancing:1; + unsigned prim:4; +#endif } u; uint32_t index; };
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev