[Mesa-dev] TGSI declarations missing type info
Jose Fonseca
jfonseca at vmware.com
Mon Nov 14 02:37:18 PST 2011
----- Original Message -----
>
>
> ----- Original Message -----
> > On 13.11.2011 17:32, Christoph Bumiller wrote:
> > > On 13.11.2011 17:10, Marek Olšák wrote:
> > >> I am guessing there is no type info because TGSI shaders are
> > >> allowed
> > >> to use uint, sint, and float instructions on the same register
> > >> without
> > >> type conversions (it would be possible to generate such usage
> > >> with
> > >> GL_ARB_shader_bit_enconding, also GL_NV_gpu_program4 has
> > >> typeless
> > >> registers too). I think GLSL has types because it's a typed
> > >> language,
> > >> not because it's needed for the underlying implementation. Do
> > >> all
> > >> drivers need such info or is it just llvmpipe that would make
> > >> use
> > >> of
> > >> it?
> > > If you don't have typed values in your backend IR and the
> > > hardware
> > > doesn't have dedicated integer and float registers, you don't
> > > need
> > > type
> > > info.
> > >
> > > With llvm you have both typed values and, for x86, different
> > > registers
> > > for integers and floats, so it seems it would be very helpful not
> > > to
> > > destroy all that information (gallium's favourite thing to do)
> > > before
> > > passing shaders to the driver.
> >
> > Actually never mind, I just realized TEMPs are all stored in memory
> > in
> > llvmpipe, so you can just load into a value of the appropriate
> > type,
> > as
> > determined by the instruction.
> >
> > For example, in lp_bld_tgsi_soa.c, emit_fetch, FILE_TEMPORARY case
> > you have:
> >
> > " cast temps_array pointer to float* " -- just do the same with int
> > or
> > whatever type your require and you should be fine.
>
>
> Having type info in TGSI registers is useless for llvm/llvmpipe,
> spite what initial appearances may be.
>
> Imagine indirect addressing on this hypothetical world with typed
> TGSI declarations:
>
> DCL_float TEMP[0]
> DCL_int TEMP[1]
> DCL_float TEMP[2]
> DCL_int TEMP[3]
> DCL_float TEMP[4]
> DCL_int TEMP[5]
>
> MOV OUT[0], TEMP[ADDR[0]]
>
> What LLVM type would one declare the TEMP array with? 4 x floats? 4 x
> int32s? 128bit integers? an union of all these?
>
> Answer is: it doesn't matter, provided the type has 128bits.
>
>
> And with LLVM's bitcast operator, unions are totally unnecessary. As
> long as the temporary array is declared with a data type with the
> same bitwidth, one can always do for floats:
>
> %0 = load <...> (...)
> %1 = bitcast <4 x float> (%0)
>
> or for doubles:
>
> %0 = load <...> (...)
> %1 = bitcast <2 x double> (%0)
>
> or for ints:
>
> %0 = load <...> (...)
> %1 = bitcast <4 x int32> (%0)
>
> LLVM optimization passes should remove all this redundant bitcasts
> quite easily.
>
>
>
> The only place where integer/float/double knowledge would be
> necessary for TGSI translation would be for fragment shader
> interpolation. But given that so far interpolation is only defined
> for floats, there's no need.
>
>
> And I've looked at DX10 tokenized shaders, and the paradigm there too
> seems to be typed operations on typeless registers.
>
>
> So, AFAICT, typed TGSI registers only creates more headaches for zero
> benefit.
>
> Typed operations on typed registers seems to fit what drivers needs
> just fine.
Typo. I meant, typed operations on _typeless_ registers seems to fit what drivers needs
just fine.
Jose
More information about the mesa-dev
mailing list