*/
#include "util/u_format.h"
#include "vc4_qir.h"
-#include "glsl/nir/nir_builder.h"
+#include "compiler/nir/nir_builder.h"
#include "vc4_context.h"
static bool
nir_intrinsic_instr_create(b->shader,
nir_intrinsic_load_input);
load->num_components = 1;
- load->const_index[0] = VC4_NIR_TLB_COLOR_READ_INPUT + sample;
+ nir_intrinsic_set_base(load, VC4_NIR_TLB_COLOR_READ_INPUT + sample);
load->src[0] = nir_src_for_ssa(nir_imm_int(b, 0));
- nir_ssa_dest_init(&load->instr, &load->dest, 1, NULL);
+ nir_ssa_dest_init(&load->instr, &load->dest, 1, 32, NULL);
nir_builder_instr_insert(b, &load->instr);
return &load->dest.ssa;
}
return nir_imm_float(b, 1.0);
}
case PIPE_BLENDFACTOR_CONST_COLOR:
- return vc4_nir_get_state_uniform(b, QUNIFORM_BLEND_CONST_COLOR_X + channel);
+ return nir_load_system_value(b,
+ nir_intrinsic_load_blend_const_color_r_float +
+ channel,
+ 0);
case PIPE_BLENDFACTOR_CONST_ALPHA:
- return vc4_nir_get_state_uniform(b, QUNIFORM_BLEND_CONST_COLOR_W);
+ return nir_load_blend_const_color_a_float(b);
case PIPE_BLENDFACTOR_ZERO:
return nir_imm_float(b, 0.0);
case PIPE_BLENDFACTOR_INV_SRC_COLOR:
return nir_fsub(b, nir_imm_float(b, 1.0), dst[channel]);
case PIPE_BLENDFACTOR_INV_CONST_COLOR:
return nir_fsub(b, nir_imm_float(b, 1.0),
- vc4_nir_get_state_uniform(b, QUNIFORM_BLEND_CONST_COLOR_X + channel));
+ nir_load_system_value(b,
+ nir_intrinsic_load_blend_const_color_r_float +
+ channel,
+ 0));
case PIPE_BLENDFACTOR_INV_CONST_ALPHA:
return nir_fsub(b, nir_imm_float(b, 1.0),
- vc4_nir_get_state_uniform(b, QUNIFORM_BLEND_CONST_COLOR_W));
+ nir_load_blend_const_color_a_float(b));
default:
case PIPE_BLENDFACTOR_SRC1_COLOR:
nir_imm_int(b, ~0),
a_chan);
case PIPE_BLENDFACTOR_CONST_COLOR:
- return vc4_nir_get_state_uniform(b, QUNIFORM_BLEND_CONST_COLOR_RGBA);
+ return nir_load_blend_const_color_rgba8888_unorm(b);
case PIPE_BLENDFACTOR_CONST_ALPHA:
- return vc4_nir_get_state_uniform(b, QUNIFORM_BLEND_CONST_COLOR_AAAA);
+ return nir_load_blend_const_color_aaaa8888_unorm(b);
case PIPE_BLENDFACTOR_ZERO:
return nir_imm_int(b, 0);
case PIPE_BLENDFACTOR_INV_SRC_COLOR:
case PIPE_BLENDFACTOR_INV_DST_COLOR:
return nir_inot(b, dst);
case PIPE_BLENDFACTOR_INV_CONST_COLOR:
- return nir_inot(b, vc4_nir_get_state_uniform(b, QUNIFORM_BLEND_CONST_COLOR_RGBA));
+ return nir_inot(b,
+ nir_load_blend_const_color_rgba8888_unorm(b));
case PIPE_BLENDFACTOR_INV_CONST_ALPHA:
- return nir_inot(b, vc4_nir_get_state_uniform(b, QUNIFORM_BLEND_CONST_COLOR_AAAA));
+ return nir_inot(b,
+ nir_load_blend_const_color_aaaa8888_unorm(b));
default:
case PIPE_BLENDFACTOR_SRC1_COLOR:
if (!c->fs_key->alpha_test)
return;
- nir_ssa_def *alpha_ref =
- vc4_nir_get_state_uniform(b, QUNIFORM_ALPHA_REF);
nir_ssa_def *condition =
vc4_nir_pipe_compare_func(b, c->fs_key->alpha_test_func,
- alpha, alpha_ref);
+ alpha,
+ nir_load_alpha_ref_float(b));
nir_intrinsic_instr *discard =
nir_intrinsic_instr_create(b->shader,
discard->num_components = 1;
discard->src[0] = nir_src_for_ssa(nir_inot(b, condition));
nir_builder_instr_insert(b, &discard->instr);
+ c->s->info.fs.uses_discard = true;
}
static nir_ssa_def *
nir_intrinsic_instr *intr =
nir_intrinsic_instr_create(c->s, nir_intrinsic_store_output);
intr->num_components = 1;
- intr->const_index[0] = sample_mask->data.driver_location;
+ nir_intrinsic_set_base(intr, sample_mask->data.driver_location);
intr->src[0] = nir_src_for_ssa(val);
intr->src[1] = nir_src_for_ssa(nir_imm_int(b, 0));
{
nir_ssa_def *frag_color = intr->src[0].ssa;
- if (c->fs_key->sample_coverage) {
- nir_intrinsic_instr *load =
- nir_intrinsic_instr_create(b->shader,
- nir_intrinsic_load_sample_mask_in);
- load->num_components = 1;
- nir_ssa_dest_init(&load->instr, &load->dest, 1, NULL);
- nir_builder_instr_insert(b, &load->instr);
-
- nir_ssa_def *bitmask = &load->dest.ssa;
-
- vc4_nir_store_sample_mask(c, b, bitmask);
- } else if (c->fs_key->sample_alpha_to_coverage) {
+ if (c->fs_key->sample_alpha_to_coverage) {
nir_ssa_def *a = nir_channel(b, frag_color, 3);
/* XXX: We should do a nice dither based on the fragment
* coordinate, instead.
*/
nir_ssa_def *num_samples = nir_imm_float(b, VC4_MAX_SAMPLES);
- nir_ssa_def *num_bits = nir_f2i(b, nir_fmul(b, a, num_samples));
+ nir_ssa_def *num_bits = nir_f2i32(b, nir_fmul(b, a, num_samples));
nir_ssa_def *bitmask = nir_isub(b,
nir_ishl(b,
nir_imm_int(b, 1),
}
static bool
-vc4_nir_lower_blend_block(nir_block *block, void *state)
+vc4_nir_lower_blend_block(nir_block *block, struct vc4_compile *c)
{
- struct vc4_compile *c = state;
-
- nir_foreach_instr_safe(block, instr) {
+ nir_foreach_instr_safe(instr, block) {
if (instr->type != nir_instr_type_intrinsic)
continue;
nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr);
nir_variable *output_var = NULL;
nir_foreach_variable(var, &c->s->outputs) {
- if (var->data.driver_location == intr->const_index[0]) {
+ if (var->data.driver_location ==
+ nir_intrinsic_base(intr)) {
output_var = var;
break;
}
}
void
-vc4_nir_lower_blend(struct vc4_compile *c)
+vc4_nir_lower_blend(nir_shader *s, struct vc4_compile *c)
{
- nir_foreach_overload(c->s, overload) {
- if (overload->impl) {
- nir_foreach_block(overload->impl,
- vc4_nir_lower_blend_block, c);
+ nir_foreach_function(function, s) {
+ if (function->impl) {
+ nir_foreach_block(block, function->impl) {
+ vc4_nir_lower_blend_block(block, c);
+ }
- nir_metadata_preserve(overload->impl,
+ nir_metadata_preserve(function->impl,
nir_metadata_block_index |
nir_metadata_dominance);
}
}
+
+ /* If we didn't do alpha-to-coverage on the output color, we still
+ * need to pass glSampleMask() through.
+ */
+ if (c->fs_key->sample_coverage && !c->fs_key->sample_alpha_to_coverage) {
+ nir_function_impl *impl = nir_shader_get_entrypoint(s);
+ nir_builder b;
+ nir_builder_init(&b, impl);
+ b.cursor = nir_after_block(nir_impl_last_block(impl));
+
+ vc4_nir_store_sample_mask(c, &b, nir_load_sample_mask_in(&b));
+ }
}