On 06/19/2018 08:24 AM, Rob Clark wrote: > v2: reword comment about lower_helper_invocations to be more clear > that it might not work on all hardware > v3: add special variant of load_sample_id which does not imply per- > sample shading > > Signed-off-by: Rob Clark <robdcl...@gmail.com> > --- > Yeah, new intrinsic name is a bit funny sounding, but I couldn't > think of anything better. > > src/compiler/nir/nir.h | 12 ++++++++++++ > src/compiler/nir/nir_intrinsics.py | 3 +++ > src/compiler/nir/nir_lower_system_values.c | 17 +++++++++++++++++ > .../drivers/freedreno/ir3/ir3_compiler_nir.c | 1 + > src/gallium/drivers/freedreno/ir3/ir3_nir.c | 1 + > 5 files changed, 34 insertions(+) > > diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h > index 2d620454796..cb9a4af64cf 100644 > --- a/src/compiler/nir/nir.h > +++ b/src/compiler/nir/nir.h > @@ -1981,6 +1981,18 @@ typedef struct nir_shader_compiler_options { > */ > bool lower_base_vertex; > > + /** > + * If enabled, gl_HelperInvocation will be lowered as: > + * > + * !((1 << sample_id) & sample_mask_in))
I recently encountered something related to this. Issue #22 of the GL_ARB_shader_image_load_store spec suggests using (gl_SampleMaskIn[0] == 0) to detect a helper invocation. There's a note that implementations that support > 32 samples will also need to check gl_SampleMaskIn[1]. Did you try that? It should generate less code. See also piglit commit c89439fcaba7259b25d090df43a6bf2aac6483d7. > + * > + * This depends on some possibly hw implementation details, which may > + * not be true for all hw. In particular that the FS is only executed > + * for covered samples or for helper invocations. So, do not blindly > + * enable this option. > + */ > + bool lower_helper_invocation; > + > bool lower_cs_local_index_from_id; > > bool lower_device_index_to_zero; > diff --git a/src/compiler/nir/nir_intrinsics.py > b/src/compiler/nir/nir_intrinsics.py > index 484b2d4fd68..5523243a564 100644 > --- a/src/compiler/nir/nir_intrinsics.py > +++ b/src/compiler/nir/nir_intrinsics.py > @@ -422,6 +422,9 @@ system_value("instance_id", 1) > system_value("base_instance", 1) > system_value("draw_id", 1) > system_value("sample_id", 1) > +# sample_id_no_per_sample is like sample_id but does not imply per- > +# sample shading. See the lower_helper_invocation option. > +system_value("sample_id_no_per_sample", 1) > system_value("sample_pos", 2) > system_value("sample_mask_in", 1) > system_value("primitive_id", 1) > diff --git a/src/compiler/nir/nir_lower_system_values.c > b/src/compiler/nir/nir_lower_system_values.c > index 487da042620..8c5fdbb1f54 100644 > --- a/src/compiler/nir/nir_lower_system_values.c > +++ b/src/compiler/nir/nir_lower_system_values.c > @@ -136,6 +136,23 @@ convert_block(nir_block *block, nir_builder *b) > nir_load_first_vertex(b)); > break; > > + case SYSTEM_VALUE_HELPER_INVOCATION: > + if (b->shader->options->lower_helper_invocation) { > + nir_ssa_def *tmp; > + > + tmp = nir_ishl(b, > + nir_imm_int(b, 1), > + nir_load_sample_id_no_per_sample(b)); > + > + tmp = nir_iand(b, > + nir_load_sample_mask_in(b), > + tmp); > + > + sysval = nir_inot(b, nir_i2b(b, tmp)); > + } > + > + break; > + > case SYSTEM_VALUE_INSTANCE_INDEX: > sysval = nir_iadd(b, > nir_load_instance_id(b), > diff --git a/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c > b/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c > index ed87eff9976..9cad7c6e559 100644 > --- a/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c > +++ b/src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c > @@ -2360,6 +2360,7 @@ emit_intrinsic(struct ir3_context *ctx, > nir_intrinsic_instr *intr) > dst[0] = ctx->instance_id; > break; > case nir_intrinsic_load_sample_id: > + case nir_intrinsic_load_sample_id_no_per_sample: > if (!ctx->samp_id) { > ctx->samp_id = create_input(b, 0); > ctx->samp_id->regs[0]->flags |= IR3_REG_HALF; > diff --git a/src/gallium/drivers/freedreno/ir3/ir3_nir.c > b/src/gallium/drivers/freedreno/ir3/ir3_nir.c > index 9ada3889eb9..e665fb933b9 100644 > --- a/src/gallium/drivers/freedreno/ir3/ir3_nir.c > +++ b/src/gallium/drivers/freedreno/ir3/ir3_nir.c > @@ -52,6 +52,7 @@ static const nir_shader_compiler_options options = { > .lower_extract_byte = true, > .lower_extract_word = true, > .lower_all_io_to_temps = true, > + .lower_helper_invocation = true, > }; > > struct nir_shader * > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev