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

Reply via email to