On 14.09.2011 09:36, Jose Fonseca wrote:
> ---- Original Message -----
>>> On the contrary, I think that putting norm and scaled/int in the
>>> same sack is talking apples and oranges...   Normalization, like
>>> fixed-point integers, affects the interpretation of the 32bit
>>> integer in memory, namely the scale factor that it should be
>>> multiplied. Whereas  the only difference between _SSCALED and
>>> _SINT is the final data type (int vs float) -- the value is
>>> exactly the same (modulo rounding errors).
>>>
>>> The pure vs non-pure integer is really a "policy" flag, which means
>>> please do not implicetly convert this to a float at any point of
>>> the vertex pipeline. And I believe that policy flags should be
>>> outside enum pipe_format.
>> While I'm tending to agree with you Jose, the other thing that we
>> haven't discussed yet is that we need to add new pack/unpack
>> interfaces to u_format for all these types anyways to get a integer
>> clean path (no float converts in the pipeline), increasing the size
>> of
>> the u_format_table anyways. With separate types we could overload the
>> float pack/unpack. ones most likely.
> I'm not sure where u_format's code is used in hardware pipe drivers nowadays, 
> but for software rendering in general and state trakcer software fallback of 
> blits in particular, we could never just overload the float unpack/pack 
> entry-points, as they would corrupt 32bit integers higher/smaller than +/- 1 
> << 24.  I think we'd need pack/unpack functions that accept/return colors in 
> 32bit integers instead of floats, or another type big enough.

The pack/unpack/fetch functions of (pure) integer formats wouldn't deal
with floats at all, all they'd do is sign/zero extension (so, the float
array argument would become void and the function would do the "right
thing" automatically).

OpenGL functions like ReadPixels don't allow RGBA_INTEGER format
together with float types, or blits between SINT-FLOAT, SINT-UINT, etc.
anyway ...

> So either we add (un)pack_rgba_uint32 and (un)pack_rgba_sint32 entry-points 
> for those integer formats (and it only needs to be added for the int 
> formats), or a simply add a new xxx_double entrypoint if we think that they 
> will never be used in a critical path.

Converting everything to doubles would be kind of overkill (and
potentially slow), and the 6 uint/sint function pointers would probably
remain NULL (or useless) for more than half of the formats.

> It's similar to what's currently done for (un)pack_z_32unorm and 
> (u)pack_s_8uscaled -- 32unorm can loose precision when converted to float (no 
> biggie for colors but inadimissible for depth values) and 8uscaled is much 
> smaller/faster to use than float, so u_format has these special entry-points, 
> but they are defined only on depthstencil formats. 
>
>
> I think that software renderers texture sampling code too, will need to be 
> rewritten substantially, to allow the sampling of integers using integer 
> intermediates.   Draw module interpolation code too, will need to use double 
> intermediates to interpolate integer attributes when clipping, etc.   All this

Integer attributes are not interpolated. They must be declared as flat.

>  needs to happen, _regardless_ you choose to pass the "pure integer" policy 
> in pipe_format enum, or elsewhere.  The fact is that integer values must not 
> be converted to float intermediates in such case -- while our current code 
> often assumes that float is general enough for everything.
>
>
> Honestly, with LLVM code generation things are substantially easier, because 
> once basic code generation is in place, we can code generate integer 
> expressions just as easily as float ones.  So I think that for each module 
> that needs updating, we should weight our options: is this code performance 
> sensitive, and if so would it be better served with LLVM code generation?  If 
> it's not performance sensitive, we should simply bump the C code from floats 
> to doubles.  Ditto, if LLVM is a better fit, so that the C version can still 
> be used as a reference / debugging-friendlier version than LLVM JIT code.  
> Otherwise, we'll have to resort to CPP templates, to generate the 
> float/uint/sint C versions.
>
>
> At any rate, I believe that a lot of this does not usually apply to hardware 
> pipe drivers. I think it might be wiser to get the hardware paths done first, 
> given the hardware should do the right thing in most if not all cases, and 
> then start getting the software paths in shape.
>
>
> Jose
> _______________________________________________
> 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

Reply via email to