On Tue, 2009-07-28 at 16:32 +0100, José Fonseca wrote: > On Tue, 2009-07-28 at 08:21 -0700, Michel Dänzer wrote: > > On Tue, 2009-07-28 at 15:02 +0100, José Fonseca wrote: > > > On Mon, 2009-07-27 at 04:26 -0700, José Fonseca wrote: > > > > When pushing a new branch only the last commit message email gets sent, > > > > but there is one earlier patch submitted to the gallium-llvmpipe branch > > > > which I'd like to draw your attention to. > > > > > > > > The patch is attached -- it adds a new table describing pipe_formats in > > > > detail, automatically generated from a compact text file (.CSV) by a > > > > python script. > > > > > > > > Although pipe_format enum already has much of this information > > > > when I started drafting the LLVM IR code generation to unpack/pack a > > > > pixel using the format query functions p_format.h I soon stumbled into > > > > several problems: > > > > - swizzles are inconsistently used -- sometimes the swizzle describes > > > > which output vector channel goes in the source vector, sometimes it > > > > describes the opposite > > > > - depth stencil information is coded in the swizzle, instead of being > > > > coded as a new layout (which doesn't make any sense if o) > > > > - padding in the source vector is not properly respected in some cases > > > > - swizzles in integer format sometimes assume the source components > > > > start from the least significant bit, other times from the most > > > > significant bit > > > > > > > > The odd thing is that if one looks to an individual format, it looks OK. > > > > It is when you try to derive some rule that everything falls apart. > > > > > > > > Although some of the inconsistencies are straight forward to fix, there > > > > simply are not enough bits in an enum to store all this info > > > > conveniently with bitmask -- we'd have to resort to arithmetic > > > > operations instead. And even if we could, it would be a matter of time > > > > until some new format comes along and we need to devise a new way to > > > > encode it. It basically makes the goal of providing some sort of gallium > > > > binary compatibility impossible. > > > > > > > > A lookup table is way more flexible way to store this information, and > > > > can be just as fast to lookup, especially if one has the formats > > > > sequentially enumerated from 0, which I think we should do, once this > > > > code is complete enough to fully replace p_format.h's auxiliary > > > > functions. > > > > > > > > Note that the CSV was derived from p_format.h and still as > > > > inconsistencies for many of the formats. I hope to squash these soon by > > > > writing a small test suite with (packed, unpacked) pixel data pairs. > > > > > > > > I also hope to apply the same concept to automatically generate the > > > > functions the functions in u_tile.c, so that we don't have unsupported > > > > formats or bugs/typos lurking in that code, as often happens. > > > > > > > > Let me know if you disagree or have a better suggestion. > > > > > > I found one other problem in the way we use 4 x 8bit color formats: > > > sometimes we interpret them as arithmetically coded in an unsigned (e.g > > > src/gallium/auxiliary/util/u_tile.c when reading/writing > > > color/depth/stencil buffers), sometimes we interpret them (e.g. > > > src/gallium/auxiliary/translate/translate_generic.c when reading/writing > > > vertex buffers). And these actually mean different things on > > > little-endian architectures. > > > > > > I think the only viable option is to distinguish between these two kinds > > > in the cases where it is ambiguous, like > > > > > > PIPE_FORMAT_R8G8B8A8_UNORM /* a | ( b << 8) | (g << 8) | (r << 24) */ > > > PIPE_FORMAT_RGBA8_UNORM /* {r, g, b, a} */ > > > > > > Since there are legitimate uses in for both (color buffers, and vertex > > > buffers). > > > > > > Anybody has better ideas? > > > > I'm not sure I fully understand the distinction above, > > Probably too subtle. My idea was that arrays by definition have all the > same number of bits, so you can factor out the bitsize to last. We could > also have > > PIPE_FORMAT_R8_G8_B8_A8_UNORM > > or some prefix > > PIPE_FORMAT_R8G8B8A8_UNORM_ARRAY
The exact naming scheme isn't really important. What's important is that it defines a format unambiguously. > > but FWIW it would > > probably be nice to have both packed formats (where the components are > > defined via shifts/masks in a larger integer) and unpacked formats > > (where the components are treated as an array of integer/float types) > > explicitly. Then it might also be nice to have packed formats (and > > possibly unpacked ones with components larger than one byte; otherwise > > the machine byte order shouldn't matter) with non-native byte order. > > You mean formats like PIPE_FORMAT_R16G16_USCALED, i.e., "uint16_t r, g;" Yes, for example. > I don't think non native order in this case matters in practice, unless > you're tracing into persistent storage, or transmitting across the wire. Exactly, in cases like that it might help matching native and non-native formats. Maybe don't actually add all those from the beginning, but make sure the scheme is expressive enough to allow them to be added later on. -- Earthling Michel Dänzer | http://www.vmware.com Libre software enthusiast | Debian, X and DRI developer ------------------------------------------------------------------------------ Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day trial. Simplify your report design, integration and deployment - and focus on what you do best, core application coding. Discover what's new with Crystal Reports now. http://p.sf.net/sfu/bobj-july _______________________________________________ Mesa3d-dev mailing list Mesa3d-dev@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mesa3d-dev