diff --git a/src/compiler/nir/nir_lower_point_size.c b/src/compiler/nir/nir_lower_point_size.c index f10aa84ccde..b92cfcfb654 100644 --- a/src/compiler/nir/nir_lower_point_size.c +++ b/src/compiler/nir/nir_lower_point_size.c @@ -37,18 +37,26 @@ lower_point_size_intrin(nir_builder *b, nir_intrinsic_instr *intr, void *data) { float *minmax = (float *)data; - if (intr->intrinsic != nir_intrinsic_store_deref) - return false; + gl_varying_slot location = VARYING_SLOT_MAX; + nir_src *psiz_src; - nir_deref_instr *deref = nir_src_as_deref(intr->src[0]); - nir_variable *var = nir_deref_instr_get_variable(deref); - if (var->data.location != VARYING_SLOT_PSIZ) + if (intr->intrinsic == nir_intrinsic_store_deref) { + nir_deref_instr *deref = nir_src_as_deref(intr->src[0]); + nir_variable *var = nir_deref_instr_get_variable(deref); + location = var->data.location; + psiz_src = &intr->src[1]; + } else if (intr->intrinsic == nir_intrinsic_store_output) { + location = nir_intrinsic_io_semantics(intr).location; + psiz_src = &intr->src[0]; + } + + if (location != VARYING_SLOT_PSIZ) return false; b->cursor = nir_before_instr(&intr->instr); - assert(intr->src[1].ssa->num_components == 1); - nir_def *psiz = intr->src[1].ssa; + nir_def *psiz = psiz_src->ssa; + assert(psiz->num_components == 1); if (minmax[0] > 0.0f) psiz = nir_fmax(b, psiz, nir_imm_float(b, minmax[0])); @@ -56,7 +64,7 @@ lower_point_size_intrin(nir_builder *b, nir_intrinsic_instr *intr, void *data) if (minmax[1] > 0.0f) psiz = nir_fmin(b, psiz, nir_imm_float(b, minmax[1])); - nir_src_rewrite(&intr->src[1], psiz); + nir_src_rewrite(psiz_src, psiz); return true; }