On Wed, Aug 5, 2015 at 1:30 AM, Iago Toral Quiroga <ito...@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@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to