On Sat, Jan 18, 2014 at 12:45 AM, Mark Mueller <markkmuel...@gmail.com> wrote: > > > > On Fri, Jan 17, 2014 at 1:24 PM, Marek Olšák <mar...@gmail.com> wrote: >> >> Incorrect. You have to manually check if the pack and unpack functions >> access the components using bitwise operations or arrays. >> >> Consider char pix[]. The array formats use arrays for accessing, for >> example: >> >> char *p = &pix[(y*width+x)*4]; >> p[0] = r; >> p[1] = g; >> p[2] = b; >> p[3] = a; >> >> Packed formats use bitwise operators for accessing, for example: >> >> uint32_t *p = &pix[(y*width+x)*4]; >> *p = r | (g << 8) | (b << 16) | (a << 24); > > > Hang on, that's precisely what I did and when I tallied up the results from
I thought you hadn't. Nevermind then. > the manual inspection, the rule I provided below fit. For example, in > format_pack.c, any pack_ubyte function that does not use a PACK_COLOR_ macro > is either 32 bits per component, or an odd number of components with 8 or 16 > bits: MESA_FORMAT_R_UNORM8, MESA_FORMAT_RGB_UNORM8. I admit that I messed > one, which is 16 bit floats - those are arrays too. > > >> >> >> >> It's okay to have both RGBA8 array and packed formats. For example, >> Gallium has these array formats: >> PIPE_FORMAT_R8G8B8A8_UNORM >> PIPE_FORMAT_B8G8R8A8_UNORM >> PIPE_FORMAT_A8R8G8B8_UNORM >> PIPE_FORMAT_A8B8G8R8_UNORM >> >> And it defines these packed formats by using the array formats >> according to the CPU architecture: >> >> #if defined(PIPE_ARCH_LITTLE_ENDIAN) >> #define PIPE_FORMAT_RGBA8888_UNORM PIPE_FORMAT_R8G8B8A8_UNORM >> #define PIPE_FORMAT_BGRA8888_UNORM PIPE_FORMAT_B8G8R8A8_UNORM >> #define PIPE_FORMAT_ARGB8888_UNORM PIPE_FORMAT_A8R8G8B8_UNORM >> #define PIPE_FORMAT_ABGR8888_UNORM PIPE_FORMAT_A8B8G8R8_UNORM >> #elif defined(PIPE_ARCH_BIG_ENDIAN) >> #define PIPE_FORMAT_ABGR8888_UNORM PIPE_FORMAT_R8G8B8A8_UNORM >> #define PIPE_FORMAT_ARGB8888_UNORM PIPE_FORMAT_B8G8R8A8_UNORM >> #define PIPE_FORMAT_BGRA8888_UNORM PIPE_FORMAT_A8R8G8B8_UNORM >> #define PIPE_FORMAT_RGBA8888_UNORM PIPE_FORMAT_A8B8G8R8_UNORM >> #endif >> >> This way, Gallium has all the possible RGBA8 array formats and also >> the possible RGBA8 packed formats, so we can use whatever we want. > > > The MESA_FORMATs are used to literally tag the application's Internal > formats such that the driver can better know the application's intention > (admittedly I'm also looking beyond _mesa_choose_tex_format, but that is for > another time). The Array Type formats were proposed to indicate that the > component order is independent of endianess, whereas Packed Type component > orders _do_ depend on endianess. Acknowledging these Types is an attempt to > eradicate the confusion. I have no input about mixing types within Gallium, > but within Mesa my preference is to adhere to that distinction. I find > Francisco's method to be less confusing then Gallium's (not just because of > the helpful comment). Here it is with P Type formats: > > /* > * Define endian-invariant aliases for some mesa formats that are > * defined in terms of their channel layout from LSB to MSB in a > * 32-bit word. The actual byte offsets matter here because the user > * is allowed to bit-cast one format into another and get predictable > * results. > */ > #ifdef MESA_BIG_ENDIAN > # define MESA_FORMAT_RGBA_8 MESA_FORMAT_A8B8G8R8_UNORM > # define MESA_FORMAT_RG_16 MESA_FORMAT_G16R16_UNORM > # define MESA_FORMAT_RG_8 MESA_FORMAT_G8R8_UNORM > # define MESA_FORMAT_SIGNED_RGBA_8 MESA_FORMAT_A8B8G8R8_SNORM > # define MESA_FORMAT_SIGNED_RG_16 MESA_FORMAT_G16R16_SNORM > # define MESA_FORMAT_SIGNED_RG_8 MESA_FORMAT_G8R8_SNORM > #else > # define MESA_FORMAT_RGBA_8 MESA_FORMAT_R8G8B8A8_UNORM > # define MESA_FORMAT_RG_16 MESA_FORMAT_R16G16_UNORM > # define MESA_FORMAT_RG_8 MESA_FORMAT_R8G8_UNORM > # define MESA_FORMAT_SIGNED_RGBA_8 MESA_FORMAT_R8G8B8A8_SNORM > # define MESA_FORMAT_SIGNED_RG_16 MESA_FORMAT_R16G16_SNORM > # define MESA_FORMAT_SIGNED_RG_8 MESA_FORMAT_R8G8_SNORM > #endif I'm not sure what you're trying to say here. It looks the same as gallium, except that it's the other way around (array formats defined using packed formats). Marek _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev