[Mesa-dev] [PATCH] nir: add support for 4 constant offsets in tg4
Karol Herbst
kherbst at redhat.com
Fri Mar 30 19:40:47 UTC 2018
On Fri, Mar 30, 2018 at 9:35 PM, Eric Anholt <eric at anholt.net> wrote:
> Karol Herbst <kherbst at redhat.com> writes:
>
>> Nvidia hardware can do that natively so there is no need to lower that to four
>> TG4s instructions.
>>
>> Signed-off-by: Karol Herbst <kherbst at redhat.com>
>> ---
>> src/compiler/glsl/glsl_to_nir.cpp | 25 ++++++++++++++++++-------
>> src/compiler/nir/nir.h | 9 ++++++++-
>> src/compiler/nir/nir_print.c | 9 +++++++++
>> 3 files changed, 35 insertions(+), 8 deletions(-)
>>
>> diff --git a/src/compiler/glsl/glsl_to_nir.cpp b/src/compiler/glsl/glsl_to_nir.cpp
>> index c4a6d52a5b2..4ea5f1616a7 100644
>> --- a/src/compiler/glsl/glsl_to_nir.cpp
>> +++ b/src/compiler/glsl/glsl_to_nir.cpp
>> @@ -2042,7 +2042,9 @@ nir_visitor::visit(ir_texture *ir)
>> num_srcs++;
>> if (ir->shadow_comparator != NULL)
>> num_srcs++;
>> - if (ir->offset != NULL)
>> + if (ir->offset != NULL && ir->offset->type->is_array())
>> + num_srcs += ir->offset->type->array_size();
>> + else if (ir->offset != NULL)
>> num_srcs++;
>>
>> nir_tex_instr *instr = nir_tex_instr_create(this->shader, num_srcs);
>> @@ -2097,12 +2099,21 @@ nir_visitor::visit(ir_texture *ir)
>>
>> if (ir->offset != NULL) {
>> /* we don't support multiple offsets yet */
>> - assert(ir->offset->type->is_vector() || ir->offset->type->is_scalar());
>> -
>> - instr->src[src_number].src =
>> - nir_src_for_ssa(evaluate_rvalue(ir->offset));
>> - instr->src[src_number].src_type = nir_tex_src_offset;
>> - src_number++;
>> + if (ir->offset->type->is_vector() || ir->offset->type->is_scalar()) {
>> + instr->src[src_number].src =
>> + nir_src_for_ssa(evaluate_rvalue(ir->offset));
>> + instr->src[src_number].src_type = nir_tex_src_offset;
>> + src_number++;
>> + } else if (ir->offset->type->is_array()) {
>> + for (int i = 0; i < ir->offset->type->array_size(); i++) {
>> + instr->src[src_number].src =
>> + nir_src_for_ssa(evaluate_rvalue(ir->offset->as_constant()->get_array_element(i)->as_rvalue()));
>> + instr->src[src_number].src_type = (nir_tex_src_type)(nir_tex_src_offset + i);
>> + src_number++;
>> + }
>> + } else {
>> + assert(false);
>
> Maybe just do assert(ir->offset->type->is_array()) in the previous block
> instead of the extra else. And optionally pull
> ir->offset->as_constant() out to a temporary for nicer column wrapping.
> Other than that, this seems good.
>
well the thing is, it only works with constants within the array. If
you have non constant values the code wouldn't assert on that. But I
will try to think about something nice there.
> Reviewed-by: Eric Anholt <eric at anholt.net>
>
> If I'm reading my specs right, I'll be able to use this on vc6, too.
More information about the mesa-dev
mailing list