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