[Mesa-dev] [PATCH v4 (part2) 29/59] nir: Implement __intrinsic_store_ssbo

Connor Abbott cwabbott0 at gmail.com
Wed Aug 5 12:17:54 PDT 2015


On Wed, Aug 5, 2015 at 1:30 AM, Iago Toral Quiroga <itoral at igalia.com> wrote:
> ---
>  src/glsl/nir/glsl_to_nir.cpp  | 36 ++++++++++++++++++++++++++++++++++++
>  src/glsl/nir/nir_intrinsics.h | 12 ++++++------
>  2 files changed, 42 insertions(+), 6 deletions(-)
>
> diff --git a/src/glsl/nir/glsl_to_nir.cpp b/src/glsl/nir/glsl_to_nir.cpp
> index 642affd..cbec2df 100644
> --- a/src/glsl/nir/glsl_to_nir.cpp
> +++ b/src/glsl/nir/glsl_to_nir.cpp
> @@ -641,6 +641,8 @@ nir_visitor::visit(ir_call *ir)
>           op = nir_intrinsic_image_atomic_comp_swap;
>        } else if (strcmp(ir->callee_name(), "__intrinsic_memory_barrier") == 0) {
>           op = nir_intrinsic_memory_barrier;
> +      } else if (strcmp(ir->callee_name(), "__intrinsic_store_ssbo") == 0) {
> +         op = nir_intrinsic_store_ssbo;
>        } else {
>           unreachable("not reached");
>        }
> @@ -730,6 +732,40 @@ nir_visitor::visit(ir_call *ir)
>        }
>        case nir_intrinsic_memory_barrier:
>           break;
> +      case nir_intrinsic_store_ssbo: {
> +         exec_node *param = ir->actual_parameters.get_head();
> +         ir_rvalue *block = ((ir_instruction *)param)->as_rvalue();
> +
> +         param = param->get_next();
> +         ir_rvalue *offset = ((ir_instruction *)param)->as_rvalue();
> +
> +         param = param->get_next();
> +         ir_rvalue *val = ((ir_instruction *)param)->as_rvalue();
> +
> +         param = param->get_next();
> +         ir_constant *write_mask = ((ir_instruction *)param)->as_constant();
> +         assert(write_mask);
> +
> +         /* Check if we need the indirect version */
> +         ir_constant *const_offset = offset->as_constant();
> +         if (!const_offset) {
> +            op = nir_intrinsic_store_ssbo_indirect;
> +            ralloc_free(instr);
> +            instr = nir_intrinsic_instr_create(shader, op);
> +            instr->src[2] = evaluate_rvalue(offset);
> +            instr->const_index[0] = 0;
> +         } else {
> +            instr->const_index[0] = const_offset->value.u[0];
> +         }
> +
> +         instr->const_index[1] = write_mask->value.u[0];
> +
> +         instr->src[0] = evaluate_rvalue(val);
> +         instr->num_components = val->type->vector_elements;
> +
> +         instr->src[1] = evaluate_rvalue(block);
> +         break;
> +      }
>        default:
>           unreachable("not reached");
>        }
> diff --git a/src/glsl/nir/nir_intrinsics.h b/src/glsl/nir/nir_intrinsics.h
> index f264f55..83eeecd 100644
> --- a/src/glsl/nir/nir_intrinsics.h
> +++ b/src/glsl/nir/nir_intrinsics.h
> @@ -176,12 +176,12 @@ LOAD(input, 0, NIR_INTRINSIC_CAN_ELIMINATE | NIR_INTRINSIC_CAN_REORDER)
>   * offset.
>   */
>
> -#define STORE(name, num_indices, flags) \
> -   INTRINSIC(store_##name, 1, ARR(0), false, 0, 0, num_indices, flags) \
> -   INTRINSIC(store_##name##_indirect, 2, ARR(0, 1), false, 0, 0, \
> +#define STORE(name, extra_srcs, num_indices, flags) \
> +   INTRINSIC(store_##name, extra_srcs, ARR(0, 1), false, 0, 0, num_indices, flags) \
> +   INTRINSIC(store_##name##_indirect, extra_srcs + 1, ARR(0, 1, 1), false, 0, 0, \
>               num_indices, flags) \
>
> -STORE(output, 1, 0)
> -/* STORE(ssbo, 2, 0) */
> +STORE(output, 1, 2, 0)
> +STORE(ssbo, 2, 2, 0)

I don't think outputs should have any extra sources, since they only
take a constant index, plus possibly an indirect source that's already
covered by the STORE macro. SSBO stores should only have one extra
source for the block index. Also, we should update the comment above
to explain this similarly to the paragraph above the loads.

>
> -LAST_INTRINSIC(store_output_indirect)
> +LAST_INTRINSIC(store_ssbo_indirect)
> --
> 1.9.1
>
> _______________________________________________
> 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