[Mesa-dev] [PATCH 1/4] gallium/ttn: add support for texture offsets
Ilia Mirkin
imirkin at alum.mit.edu
Mon Apr 13 10:38:18 PDT 2015
On Mon, Apr 13, 2015 at 1:34 PM, Eric Anholt <eric at anholt.net> wrote:
> Rob Clark <robdclark at gmail.com> writes:
>
>> From: Rob Clark <robclark at freedesktop.org>
>>
>> Signed-off-by: Rob Clark <robclark at freedesktop.org>
>> ---
>> src/gallium/auxiliary/nir/tgsi_to_nir.c | 30 +++++++++++++++++++++++++++++-
>> 1 file changed, 29 insertions(+), 1 deletion(-)
>>
>> diff --git a/src/gallium/auxiliary/nir/tgsi_to_nir.c b/src/gallium/auxiliary/nir/tgsi_to_nir.c
>> index 9d988b06..c9f9e03 100644
>> --- a/src/gallium/auxiliary/nir/tgsi_to_nir.c
>> +++ b/src/gallium/auxiliary/nir/tgsi_to_nir.c
>> @@ -982,7 +982,7 @@ ttn_tex(struct ttn_compile *c, nir_alu_dest dest, nir_ssa_def **src)
>> struct tgsi_full_instruction *tgsi_inst = &c->token->FullInstruction;
>> nir_tex_instr *instr;
>> nir_texop op;
>> - unsigned num_srcs, samp = 1;
>> + unsigned num_srcs, samp = 1, i;
>>
>> switch (tgsi_inst->Instruction.Opcode) {
>> case TGSI_OPCODE_TEX:
>> @@ -1026,6 +1026,8 @@ ttn_tex(struct ttn_compile *c, nir_alu_dest dest, nir_ssa_def **src)
>> num_srcs++;
>> }
>>
>> + num_srcs += tgsi_inst->Texture.NumOffsets;
>> +
>> instr = nir_tex_instr_create(b->shader, num_srcs);
>> instr->op = op;
>>
>> @@ -1103,6 +1105,32 @@ ttn_tex(struct ttn_compile *c, nir_alu_dest dest, nir_ssa_def **src)
>> src_number++;
>> }
>>
>> + for (i = 0; i < tgsi_inst->Texture.NumOffsets; i++) {
>> + struct tgsi_texture_offset *tex_offset = &tgsi_inst->TexOffsets[i];
>> + /* since TexOffset ins't using tgsi_full_src_register we get to
>> + * do some extra gymnastics:
>> + */
>> + nir_alu_src src;
>> +
>> + memset(&src, 0, sizeof(src));
>> +
>> + src.src = ttn_src_for_file_and_index(c,
>> + tex_offset->File,
>> + tex_offset->Index,
>> + NULL);
>> +
>> + src.swizzle[0] = tex_offset->SwizzleX;
>> + src.swizzle[1] = tex_offset->SwizzleY;
>> + src.swizzle[2] = tex_offset->SwizzleZ;
>> + src.swizzle[3] = TGSI_SWIZZLE_W;
>> +
>> + nir_ssa_def *off = nir_fmov_alu(b, src, instr->coord_components);
>
> For a cubemap array, won't coord_components be 4, but you only want a
> 3-component value as the offset? I'm suspicious of this fixed SWIZZLE_W
> here. If you move the .src_type setting above this, you could use
> nir_tex_instr_src_size(instr, src_number) to get the right number of
> components.
When are offsets on cubemaps supported? The real question is what will
coord_components be for a 2darray -- if it's 2, then this is fine, if
it's 3, then it needs fixing.
-ilia
More information about the mesa-dev
mailing list