PIPE_SHADER_CAP_MAX_INSTRUCTIONS) > 0) {
NIR_PASS_V(nir, nir_lower_io, nir_var_uniform, type_size,
(nir_lower_io_options)0);
- NIR_PASS_V(nir, st_nir_lower_uniforms_to_ubo);
+ NIR_PASS_V(nir, st_nir_lower_uniforms_to_ubo, prog->Parameters);
}
if (screen->get_param(screen, PIPE_CAP_NIR_SAMPLERS_AS_DEREF))
void st_nir_lower_builtin(struct nir_shader *shader);
void st_nir_lower_tex_src_plane(struct nir_shader *shader, unsigned free_slots,
unsigned lower_2plane, unsigned lower_3plane);
-bool st_nir_lower_uniforms_to_ubo(struct nir_shader *shader);
+bool st_nir_lower_uniforms_to_ubo(struct nir_shader *shader,
+ const struct gl_program_parameter_list *params);
void st_finalize_nir(struct st_context *st, struct gl_program *prog,
struct gl_shader_program *shader_program,
#include "nir_builder.h"
#include "st_nir.h"
+#include "program/prog_parameter.h"
+
static bool
-lower_instr(nir_intrinsic_instr *instr, nir_builder *b)
+lower_instr(nir_intrinsic_instr *instr, nir_builder *b,
+ const struct gl_program_parameter_list *params)
{
b->cursor = nir_before_instr(&instr->instr);
}
if (instr->intrinsic == nir_intrinsic_load_uniform) {
+ unsigned pvo = params->ParameterValueOffset[nir_intrinsic_base(instr)];
+
nir_ssa_def *ubo_idx = nir_imm_int(b, 0);
nir_ssa_def *ubo_offset =
- nir_imul(b, nir_imm_int(b, 16),
- nir_iadd(b, nir_imm_int(b, nir_intrinsic_base(instr)),
+ nir_iadd(b, nir_imm_int(b, 4 * pvo),
+ nir_imul(b, nir_imm_int(b, 4),
nir_ssa_for_src(b, instr->src[0], 1)));
nir_intrinsic_instr *load =
}
bool
-st_nir_lower_uniforms_to_ubo(nir_shader *shader)
+st_nir_lower_uniforms_to_ubo(nir_shader *shader,
+ const struct gl_program_parameter_list *params)
{
bool progress = false;
nir_foreach_instr_safe(instr, block) {
if (instr->type == nir_instr_type_intrinsic)
progress |= lower_instr(nir_instr_as_intrinsic(instr),
- &builder);
+ &builder, params);
}
}