• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2023 Valve Corporation
3  * SPDX-License-Identifier: MIT
4  */
5 
6 #include "compiler/nir/nir.h"
7 #include "compiler/nir/nir_builder.h"
8 #include "agx_nir.h"
9 
10 static bool
lower(nir_builder * b,nir_intrinsic_instr * intr,UNUSED void * data)11 lower(nir_builder *b, nir_intrinsic_instr *intr, UNUSED void *data)
12 {
13    if (intr->intrinsic != nir_intrinsic_store_output)
14       return false;
15 
16    nir_io_semantics sem = nir_intrinsic_io_semantics(intr);
17    if (sem.location != VARYING_SLOT_CLIP_DIST0)
18       return false;
19 
20    nir_instr *clone = nir_instr_clone(b->shader, &intr->instr);
21    nir_intrinsic_instr *lowered = nir_instr_as_intrinsic(clone);
22 
23    b->cursor = nir_after_instr(&intr->instr);
24    nir_builder_instr_insert(b, clone);
25 
26    nir_io_semantics new_sem = sem;
27    new_sem.no_varying = true;
28    nir_intrinsic_set_io_semantics(lowered, new_sem);
29 
30    sem.no_sysval_output = true;
31    nir_intrinsic_set_io_semantics(intr, sem);
32    return true;
33 }
34 
35 bool
agx_nir_lower_clip_distance(nir_shader * s)36 agx_nir_lower_clip_distance(nir_shader *s)
37 {
38    assert(s->info.outputs_written & VARYING_BIT_CLIP_DIST0);
39 
40    return nir_shader_intrinsics_pass(
41       s, lower, nir_metadata_block_index | nir_metadata_dominance, NULL);
42 }
43