On Wed, 2014-12-03 at 14:58 -0800, Jason Ekstrand wrote: > > > On Wed, Dec 3, 2014 at 2:52 PM, Ian Romanick <i...@freedesktop.org> > wrote: > On 12/01/2014 03:04 AM, Iago Toral Quiroga wrote: > > From: Jason Ekstrand <jason.ekstr...@intel.com> (...) > > > > > +enum mesa_array_format_datatype { > > + MESA_ARRAY_FORMAT_TYPE_UBYTE = 0x0, > > + MESA_ARRAY_FORMAT_TYPE_USHORT = 0x1, > > + MESA_ARRAY_FORMAT_TYPE_UINT = 0x2, > > + MESA_ARRAY_FORMAT_TYPE_BYTE = 0x4, > > + MESA_ARRAY_FORMAT_TYPE_SHORT = 0x5, > > + MESA_ARRAY_FORMAT_TYPE_INT = 0x6, > > + MESA_ARRAY_FORMAT_TYPE_HALF = 0xd, > > + MESA_ARRAY_FORMAT_TYPE_FLOAT = 0xe, > > +}; > > + > > +#define MESA_ARRAY_FORMAT_TYPE_IS_SIGNED 0x4 > > +#define MESA_ARRAY_FORMAT_TYPE_IS_FLOAT 0x8 > > +#define MESA_ARRAY_FORMAT_BIT 0x80000000 > > This... > > > + > > +typedef union { > > + struct { > > + enum mesa_array_format_datatype type:4; > > + bool normalized:1; > > + unsigned num_channels:3; > > + unsigned swizzle_x:3; > > + unsigned swizzle_y:3; > > + unsigned swizzle_z:3; > > + unsigned swizzle_w:3; > > + unsigned pad:11; > > + unsigned array_format_bit:1; /* Must always be 1 */ > > ...and this are not correct on big-endian. > > > Bah! I originally did this as a bitfield in a uint32_t and then > decided that the union was easier. Probably best to go back to the > bitfield...
Wouldn't it be enough to rewrite the 3 definitions like this?: #define MESA_ARRAY_FORMAT_BIT (_mesa_little_endian() ? 0x80000000 : 0x00000080) We can also go back to making mesa_array_format a plain uint32_t bitflied, but that change would also require to rework _mesa_format_convert and the GL -> mesa_(array)_format helper at least. Not that it can't be done of course, but I wonder if it is necessary. Iago > > > > + }; > > + uint32_t as_uint; > > +} mesa_array_format; > > + > > +static const mesa_array_format _mesa_array_format_none = {{ > > + MESA_ARRAY_FORMAT_TYPE_UBYTE, > > + 0, 0, 0, 0, 0, 0, 0, 0 > > +}}; > > + > > +static inline unsigned > > +_mesa_ilog2(unsigned x) > > +{ > > + uint8_t i; > > I'd either make this unsigned or uint_fast8_t... I'd bet that > it doesn't > make any difference. > > > + for (i = 1; i < 32; ++i) > > + if (x <= (1u << i)) > > + return i; > > + return 32; > > +} > > + > > +#define MESA_ARRAY_FORMAT_TYPE(SIZE, SIGNED, IS_FLOAT, > NORM) ( \ > > + ((_mesa_ilog2(SIZE)) & MESA_ARRAY_FORMAT_TYPE_SIZE_MASK) > | \ > > + (((SIGNED) << 2 ) & MESA_ARRAY_FORMAT_TYPE_IS_SIGNED) > | \ > > + (((IS_FLOAT) << 3 ) & MESA_ARRAY_FORMAT_TYPE_IS_FLOAT) > > + > > +static inline int > > +_mesa_array_format_datatype_size(enum > mesa_array_format_datatype type) > > +{ > > + return 1 << (type & 0x3); > > +} > > /** > > * Mesa texture/renderbuffer image formats. > > */ > > @@ -469,6 +525,12 @@ _mesa_get_format_block_size(mesa_format > format, GLuint *bw, GLuint *bh); > > extern void > > _mesa_get_format_swizzle(mesa_format format, uint8_t > swizzle_out[4]); > > > > +extern uint32_t > > +_mesa_format_to_array_format(mesa_format format); > > + > > +extern mesa_format > > +_mesa_format_from_array_format(uint32_t array_format); > > + > > extern GLboolean > > _mesa_is_format_compressed(mesa_format format); > > > > > > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev > > > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev