[libre-riscv-dev] evaluation of bit-witdh scoreboards

Jacob Lifshay programmerjake at gmail.com
Mon Dec 17 05:55:53 GMT 2018


I missed multiplications in the pseudo-code, adding:

On Sun, Dec 16, 2018, 18:46 Jacob Lifshay <programmerjake at gmail.com wrote:

> On Sun, Dec 16, 2018, 17:51 Luke Kenneth Casson Leighton <lkcl at lkcl.net
> wrote:
>
>> Jacob whats requirements of pixel conversion op, whats it look like as c
>> pseudocode. Also texture op, roughly. Mainly, whats inputs and outputs.
>>
>> Need to assess.
>>
>
> assume there is a 12-bit unsigned type: uint12_t
>
> float clamp(float v, float minv, float maxv)
> {
>     return fmax(fmin(v, maxv), minv);
> }
>
> uint12_t float_to_u12(float v)
> {
>
v *= 0xFFF;

>     return (uint12_t)round(clamp(v, 0x0, 0xFFF));
> }
>
> const uint8_t encode_sRGB_lut[1 << 12] = {...};
> const float decode_sRGB_lut[1 << 8] = {...};
>
> float decode_sRGB_channel(uint8_t v)
> {
>     return decode_sRGB_lut[v];
> }
>
> uint8_t encode_sRGB_channel(float v)
> {
>     return encode_sRGB_lut[float_to_u12(v)];
> }
>
> uint8_t encode_u8_channel(float v)
> {
>
v *= 0xFF;

>     return (uint8_t)round(clamp(v, 0, 0xFF));
> }
>
> float decode_u8_channel(uint8_t v)
> {
>     return (float)v / 0xFF;
> }
>
> // common read from color buffer
> f32x4 decode_sRGB(u8x4 v)
> {
>     return (f32x4){
>         decode_sRGB_channel(v[0]),
>         decode_sRGB_channel(v[1]),
>         decode_sRGB_channel(v[2]),
>         decode_u8_channel(v[3])
>     };
> }
>
> // common read from color buffer
> f32x4 decode_u8(u8x4 v)
> {
>     return (f32x4){
>         decode_u8_channel(v[0]),
>         decode_u8_channel(v[1]),
>         decode_u8_channel(v[2]),
>         decode_u8_channel(v[3])
>     };
> }
>
> // common write to color buffer
> u8x4 encode_sRGB(f32x4 v)
> {
>     return (u8x4){
>         encode_sRGB_channel(v[0]),
>         encode_sRGB_channel(v[1]),
>         encode_sRGB_channel(v[2]),
>         encode_u8_channel(v[3])
>     };
> }
>
> // common write to color buffer
> u8x4 encode_u8(f32x4 v)
> {
>     return (u8x4){
>         encode_u8_channel(v[0]),
>         encode_u8_channel(v[1]),
>         encode_u8_channel(v[2]),
>         encode_u8_channel(v[3])
>     };
> }
>
> The simplest texture read operations are basically several decode_sRGB or
> decode_u8 calls then interpolation
>
> Since we're processing several pixels simultaneously, we need to vectorize
> by an additional factor of 4*N
>
> Jacob
>
>>


More information about the libre-riscv-dev mailing list