#include "anv_nir.h"
-struct lower_push_constants_state {
- nir_shader *shader;
- bool is_scalar;
-};
-
-static bool
-lower_push_constants_block(nir_block *block, void *void_state)
+void
+anv_nir_lower_push_constants(nir_shader *shader)
{
- struct lower_push_constants_state *state = void_state;
-
- nir_foreach_instr(block, instr) {
- if (instr->type != nir_instr_type_intrinsic)
+ nir_foreach_function(function, shader) {
+ if (!function->impl)
continue;
- nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr);
+ nir_foreach_block(block, function->impl) {
+ nir_foreach_instr(instr, block) {
+ if (instr->type != nir_instr_type_intrinsic)
+ continue;
- /* TODO: Handle indirect push constants */
- if (intrin->intrinsic != nir_intrinsic_load_push_constant)
- continue;
+ nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr);
- /* This wont work for vec4 stages. */
- assert(state->is_scalar);
+ /* TODO: Handle indirect push constants */
+ if (intrin->intrinsic != nir_intrinsic_load_push_constant)
+ continue;
- assert(intrin->const_index[0] % 4 == 0);
- assert(intrin->const_index[1] == 128);
-
- /* We just turn them into uniform loads with the appropreate offset */
- intrin->intrinsic = nir_intrinsic_load_uniform;
+ /* We just turn them into uniform loads */
+ intrin->intrinsic = nir_intrinsic_load_uniform;
+ }
+ }
}
-
- return true;
-}
-
-void
-anv_nir_lower_push_constants(nir_shader *shader, bool is_scalar)
-{
- struct lower_push_constants_state state = {
- .shader = shader,
- .is_scalar = is_scalar,
- };
-
- nir_foreach_function(shader, function) {
- if (function->impl)
- nir_foreach_block(function->impl, lower_push_constants_block, &state);
- }
-
- assert(shader->num_uniforms % 4 == 0);
- if (is_scalar)
- shader->num_uniforms /= 4;
- else
- shader->num_uniforms = DIV_ROUND_UP(shader->num_uniforms, 16);
}