if (!screen->get_param(screen, PIPE_CAP_NIR_COMPACT_ARRAYS))
options->LowerCombinedClipCullDistance = true;
- options->LowerBufferInterfaceBlocks = true;
+ bool prefer_nir = PIPE_SHADER_IR_NIR ==
+ screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_PREFERRED_IR);
+
+ /* NIR can do the lowering on our behalf and we'll get better results
+ * because it can actually optimize SSBO access.
+ */
+ options->LowerBufferInterfaceBlocks = !prefer_nir;
}
c->MaxUserAssignableUniformLocations =
st_nir_opts(nir, is_scalar);
+ NIR_PASS_V(nir, gl_nir_lower_buffers, shader_program);
+ /* Do a round of constant folding to clean up address calculations */
+ NIR_PASS_V(nir, nir_opt_constant_folding);
+
if (lower_64bit) {
bool lowered_64bit_ops = false;
bool progress = false;