nir: add lowering for gl_HelperInvocation
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 <robdclark@gmail.com>
This commit is contained in:
@@ -2006,6 +2006,20 @@ typedef struct nir_shader_compiler_options {
|
|||||||
*/
|
*/
|
||||||
bool lower_base_vertex;
|
bool lower_base_vertex;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If enabled, gl_HelperInvocation will be lowered as:
|
||||||
|
*
|
||||||
|
* !((1 << sample_id) & sample_mask_in))
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* Note: See also issue #22 in ARB_shader_image_load_store
|
||||||
|
*/
|
||||||
|
bool lower_helper_invocation;
|
||||||
|
|
||||||
bool lower_cs_local_index_from_id;
|
bool lower_cs_local_index_from_id;
|
||||||
|
|
||||||
bool lower_device_index_to_zero;
|
bool lower_device_index_to_zero;
|
||||||
|
@@ -424,6 +424,9 @@ system_value("instance_id", 1)
|
|||||||
system_value("base_instance", 1)
|
system_value("base_instance", 1)
|
||||||
system_value("draw_id", 1)
|
system_value("draw_id", 1)
|
||||||
system_value("sample_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_pos", 2)
|
||||||
system_value("sample_mask_in", 1)
|
system_value("sample_mask_in", 1)
|
||||||
system_value("primitive_id", 1)
|
system_value("primitive_id", 1)
|
||||||
|
@@ -144,6 +144,23 @@ convert_block(nir_block *block, nir_builder *b)
|
|||||||
nir_load_first_vertex(b));
|
nir_load_first_vertex(b));
|
||||||
break;
|
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:
|
case SYSTEM_VALUE_INSTANCE_INDEX:
|
||||||
sysval = nir_iadd(b,
|
sysval = nir_iadd(b,
|
||||||
nir_load_instance_id(b),
|
nir_load_instance_id(b),
|
||||||
|
@@ -2445,6 +2445,7 @@ emit_intrinsic(struct ir3_context *ctx, nir_intrinsic_instr *intr)
|
|||||||
dst[0] = ctx->instance_id;
|
dst[0] = ctx->instance_id;
|
||||||
break;
|
break;
|
||||||
case nir_intrinsic_load_sample_id:
|
case nir_intrinsic_load_sample_id:
|
||||||
|
case nir_intrinsic_load_sample_id_no_per_sample:
|
||||||
if (!ctx->samp_id) {
|
if (!ctx->samp_id) {
|
||||||
ctx->samp_id = create_input(b, 0);
|
ctx->samp_id = create_input(b, 0);
|
||||||
ctx->samp_id->regs[0]->flags |= IR3_REG_HALF;
|
ctx->samp_id->regs[0]->flags |= IR3_REG_HALF;
|
||||||
|
@@ -52,6 +52,7 @@ static const nir_shader_compiler_options options = {
|
|||||||
.lower_extract_byte = true,
|
.lower_extract_byte = true,
|
||||||
.lower_extract_word = true,
|
.lower_extract_word = true,
|
||||||
.lower_all_io_to_temps = true,
|
.lower_all_io_to_temps = true,
|
||||||
|
.lower_helper_invocation = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct nir_shader *
|
struct nir_shader *
|
||||||
|
Reference in New Issue
Block a user