nir: drop support for using load_alpha_ref_float
[mesa.git] / src / compiler / nir / nir_lower_alpha_test.c
index bd433b8ec66c99ec5131da26ec96a34c341511bf..a13de554445f36bce797e0718f1931443de8202d 100644 (file)
 
 void
 nir_lower_alpha_test(nir_shader *shader, enum compare_func func,
-                     bool alpha_to_one)
+                     bool alpha_to_one,
+                     const gl_state_index16 *alpha_ref_state_tokens)
 {
-   assert(shader->stage == MESA_SHADER_FRAGMENT);
+   assert(alpha_ref_state_tokens);
+   assert(shader->info.stage == MESA_SHADER_FRAGMENT);
 
    nir_foreach_function(function, shader) {
       nir_function_impl *impl = function->impl;
@@ -55,8 +57,8 @@ nir_lower_alpha_test(nir_shader *shader, enum compare_func func,
                nir_variable *out = NULL;
 
                switch (intr->intrinsic) {
-               case nir_intrinsic_store_var:
-                  out = intr->variables[0]->var;
+               case nir_intrinsic_store_deref:
+                  out = nir_deref_instr_get_variable(nir_src_as_deref(intr->src[0]));
                   break;
                case nir_intrinsic_store_output:
                   /* already had i/o lowered.. lookup the matching output var: */
@@ -85,14 +87,27 @@ nir_lower_alpha_test(nir_shader *shader, enum compare_func func,
                nir_ssa_def *alpha;
                if (alpha_to_one) {
                   alpha = nir_imm_float(&b, 1.0);
+               } else if (intr->intrinsic == nir_intrinsic_store_deref) {
+                  alpha = nir_channel(&b, nir_ssa_for_src(&b, intr->src[1], 4),
+                                      3);
                } else {
                   alpha = nir_channel(&b, nir_ssa_for_src(&b, intr->src[0], 4),
                                       3);
                }
 
+               nir_variable *var = nir_variable_create(shader,
+                                                       nir_var_uniform,
+                                                       glsl_float_type(),
+                                                       "gl_AlphaRefMESA");
+               var->num_state_slots = 1;
+               var->state_slots = ralloc_array(var, nir_state_slot, 1);
+               memcpy(var->state_slots[0].tokens,
+                      alpha_ref_state_tokens,
+                      sizeof(var->state_slots[0].tokens));
+               nir_ssa_def *alpha_ref = nir_load_var(&b, var);
+
                nir_ssa_def *condition =
-                  nir_compare_func(&b, func,
-                                   alpha, nir_load_alpha_ref_float(&b));
+                  nir_compare_func(&b, func, alpha, alpha_ref);
 
                nir_intrinsic_instr *discard =
                   nir_intrinsic_instr_create(b.shader,