|
|
|
@@ -26,10 +26,7 @@ |
|
|
|
|
|
|
|
struct lower_intrinsics_state { |
|
|
|
nir_shader *nir; |
|
|
|
union { |
|
|
|
struct brw_stage_prog_data *prog_data; |
|
|
|
struct brw_cs_prog_data *cs_prog_data; |
|
|
|
}; |
|
|
|
struct brw_cs_prog_data *prog_data; |
|
|
|
nir_function_impl *impl; |
|
|
|
bool progress; |
|
|
|
nir_builder builder; |
|
|
|
@@ -50,9 +47,9 @@ read_thread_local_id(struct lower_intrinsics_state *state) |
|
|
|
if (group_size <= 8) |
|
|
|
return nir_imm_int(b, 0); |
|
|
|
|
|
|
|
assert(state->cs_prog_data->thread_local_id_index >= 0); |
|
|
|
assert(state->prog_data->thread_local_id_index >= 0); |
|
|
|
state->cs_thread_id_used = true; |
|
|
|
const int id_index = state->cs_prog_data->thread_local_id_index; |
|
|
|
const int id_index = state->prog_data->thread_local_id_index; |
|
|
|
|
|
|
|
nir_intrinsic_instr *load = |
|
|
|
nir_intrinsic_instr_create(nir, nir_intrinsic_load_uniform); |
|
|
|
@@ -84,7 +81,6 @@ lower_cs_intrinsics_convert_block(struct lower_intrinsics_state *state, |
|
|
|
nir_ssa_def *sysval; |
|
|
|
switch (intrinsic->intrinsic) { |
|
|
|
case nir_intrinsic_load_local_invocation_index: { |
|
|
|
assert(nir->stage == MESA_SHADER_COMPUTE); |
|
|
|
/* We construct the local invocation index from: |
|
|
|
* |
|
|
|
* gl_LocalInvocationIndex = |
|
|
|
@@ -97,7 +93,6 @@ lower_cs_intrinsics_convert_block(struct lower_intrinsics_state *state, |
|
|
|
} |
|
|
|
|
|
|
|
case nir_intrinsic_load_local_invocation_id: { |
|
|
|
assert(nir->stage == MESA_SHADER_COMPUTE); |
|
|
|
/* We lower gl_LocalInvocationID from gl_LocalInvocationIndex based |
|
|
|
* on this formula: |
|
|
|
* |
|
|
|
@@ -156,11 +151,10 @@ lower_cs_intrinsics_convert_impl(struct lower_intrinsics_state *state) |
|
|
|
} |
|
|
|
|
|
|
|
bool |
|
|
|
brw_nir_lower_intrinsics(nir_shader *nir, struct brw_stage_prog_data *prog_data) |
|
|
|
brw_nir_lower_cs_intrinsics(nir_shader *nir, |
|
|
|
struct brw_cs_prog_data *prog_data) |
|
|
|
{ |
|
|
|
/* Currently we only lower intrinsics for compute shaders */ |
|
|
|
if (nir->stage != MESA_SHADER_COMPUTE) |
|
|
|
return false; |
|
|
|
assert(nir->stage == MESA_SHADER_COMPUTE); |
|
|
|
|
|
|
|
bool progress = false; |
|
|
|
struct lower_intrinsics_state state; |
|
|
|
@@ -179,8 +173,8 @@ brw_nir_lower_intrinsics(nir_shader *nir, struct brw_stage_prog_data *prog_data) |
|
|
|
progress |= state.progress; |
|
|
|
} while (state.progress); |
|
|
|
|
|
|
|
if (nir->stage == MESA_SHADER_COMPUTE && !state.cs_thread_id_used) |
|
|
|
state.cs_prog_data->thread_local_id_index = -1; |
|
|
|
if (!state.cs_thread_id_used) |
|
|
|
state.prog_data->thread_local_id_index = -1; |
|
|
|
|
|
|
|
return progress; |
|
|
|
} |