[Mesa-dev] llvmpipe lp_build_context
Jose Fonseca
jfonseca at vmware.com
Mon Jan 16 10:36:39 PST 2012
Hi Dave,
Thanks for looking at this.
The gist is there, but I'd prefer that the ambiguity of "ints encoded as floats" stayed contained inside lp_bld_tgsi_* and never bleeds into lp_bld_arith or other generic LLVM emiting helper functions. That is, when lp_bld_arith and other functions are called, the types should be sanitized and consistent with values, i.e, float typed lp_build_context with float values; integer typed lp_build_context with int values; etc.
Let's take TGSI_OPCODE_UADD for example. IMO, the clean way to do this is:
- Have an auxiliary function emit_fetch_int(), which wraps/bases upon emit_fetch() but bitcasts the results from float to an integer before returning.
I'm not sure what semantics were chosen for source absolute/negate modifiers -- if they are allowed and should be carried as integers then emit_fetch_int() must take the task of implementing it by itself (ie., 3 functions will be needed: e.g., emit_fetch_int, emit_fetch_float, emit_fetch_common, being absolute/negation done in the former 2, and the swizzling done in the later).
- Likewise, have an auxiliary function emit_store_int(), which wraps/bases upon emit_store(), but bitcasts the parameters from integer to floats before invoking. Again, saturation probably needs to be done separately (so that arithmetic is carried out integers and not floats).
- The opcode case clause should be responsible for emitting the appropriate float<->int bitcasts:
bool int_dst = FALSE;
[...]
case TGSI_OPCODE_UADD:
FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
src0 = emit_fetch_int( bld, inst, 0, chan_index );
^^^
src1 = emit_fetch_int( bld, inst, 1, chan_index );
^^^
dst0[chan_index] = lp_build_add(&bld->uint_bld, src0, src1);
^^^^^^^^
int_dst = TRUE; // this could be also stored tgsi_opcode_info
}
break;
[...]
"^^^^" marks the places that change vs TGSI_OPCODE_UADD.
Then the bottom of emit_instruction() should be changed:
if (info->num_dst) {
LLVMValueRef pred[NUM_CHANNELS];
emit_fetch_predicate( bld, inst, pred );
FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
if (int_dst) {
emit_store_int( bld, inst, 0, chan_index, pred[chan_index], dst0[chan_index]);
else {
emit_store( bld, inst, 0, chan_index, pred[chan_index], dst0[chan_index]);
}
}
}
And so on.
That is, lp_bld_arit.c functions such as lp_build_add() are be confident that passed the values and types are consistent, and all assertions to test that should be preserved.
I hope this makes sense.
Jose
----- Original Message -----
> Hi,
>
> So I've been playing a bit more with integers in gallivm, but I'm not
> 100% sure how the original design though about incorporating them.
>
> The lp_build_contexts seems to take a base type of a float and have
> some sort of int types associated it with it, should I add more to
> this struct for uints?
>
> In my current hacking around, I've created a new build context called
> uint_bld that goes alongside the base one, but I'm getting the
> feeling
> this isn't the correct direction.
>
> http://cgit.freedesktop.org/~airlied/mesa/log/?h=llvmpipe-int-work
>
> has my current attempt at getting the opcodes in place, mainly
> removing asserts and trying to add ints.
>
> Dave.
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
More information about the mesa-dev
mailing list