On Thu, Mar 11, 2021 at 5:58 PM Peter Stuge <peter@xxxxxxxx> wrote: > > Ilia Mirkin wrote: > > > > #define DRM_FORMAT_XRGB8888 fourcc_code('X', 'R', '2', '4') /* [31:0] > > > > x:R:G:B 8:8:8:8 little endian */ > > > > > > Okay, "[31:0] x:R:G:B 8:8:8:8" can certainly mean > > > [31:24]=x [23:16]=R [15:8]=G [7:0]=B, which when stored "little endian" > > > becomes B G R X in memory, for which your pix32 code is correct. > > > > > > That's the reverse *memory* layout of what the name says :) > > > > The definition of the formats is memory layout in little endian. > > To clarify, my new (hopefully correct?) understanding is this: > > XRGB8888 does *not* mean that address 0=X, 1=R, 2=G, 3=B, but that > the most significant byte in a packed XRGB8888 32-bit integer is X > and the least significant byte is B, and that this is the case both > on LE and BE machines. Not quite. XRGB8888 means that the memory layout should match a 32-bit integer, stored as LE, with the low bits being B, next bits being G, etc. This translates to byte 0 = B, byte 1 = G, etc. If you're on a BE system, and you're handed a XRGB8888 buffer, it still expects that byte 0 = B, etc (except as I outlined, some drivers which are from before these formats were a thing, sort of do their own thing). Thankfully this is equivalent to BGRX8888 (big-endian packing), so you can just munge the format. Not so with e.g. RGB565 though (since the components don't fall on byte boundaries). > I previously thought that XRGB8888 indicated the memory byte order of > components being X R G B regardless of machine endianess, but now > understand XRGB to mean the MSB..LSB order of component bytes within > the 32-bit integer, as seen by software, not the order of bytes in memory. There are about 100 conventions, and they all manage to be different from each other. Packed vs array. BE vs LE. If you're *not* confused, that should be a red flag. [...] > > I'm not sure why you guys were talking about BE in the first place, > > I was worried that the translation didn't consider endianess. The translation in gud_xrgb8888_to_color definitely seems suspect. There's also a gud_is_big_endian, but I'm guessing this applies to the downstream device rather than the host system. I didn't check if dev->mode_config.quirk_addfb_prefer_host_byte_order is set -- that setting dictates whether these formats are in host-byte-order (and AddFB2 is disabled, so buffers can only be specified with depth/bpp and ambiguous component orders) or in LE byte order (and userspace can use AddFB2 which gives allows precise formats for these buffers). Not 100% sure what something like Xorg's modesetting driver does, TBH. This is a very poorly-tested scenario. -ilia