nir: Add a new sample_pos_or_center system value
authorJason Ekstrand <jason@jlekstrand.net>
Thu, 2 Dec 2021 20:11:21 +0000 (14:11 -0600)
committerMarge Bot <emma+marge@anholt.net>
Fri, 17 Dec 2021 16:02:16 +0000 (16:02 +0000)
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14198>

src/compiler/nir/nir.c
src/compiler/nir/nir_divergence_analysis.c
src/compiler/nir/nir_gather_info.c
src/compiler/nir/nir_intrinsics.py
src/compiler/nir/nir_opt_peephole_select.c
src/compiler/shader_enums.h

index d02f3d2..b8ddf57 100644 (file)
@@ -2369,6 +2369,8 @@ nir_intrinsic_from_system_value(gl_system_value val)
       return nir_intrinsic_load_sample_id;
    case SYSTEM_VALUE_SAMPLE_POS:
       return nir_intrinsic_load_sample_pos;
+   case SYSTEM_VALUE_SAMPLE_POS_OR_CENTER:
+      return nir_intrinsic_load_sample_pos_or_center;
    case SYSTEM_VALUE_SAMPLE_MASK_IN:
       return nir_intrinsic_load_sample_mask_in;
    case SYSTEM_VALUE_LOCAL_INVOCATION_ID:
@@ -2500,6 +2502,8 @@ nir_system_value_from_intrinsic(nir_intrinsic_op intrin)
       return SYSTEM_VALUE_SAMPLE_ID;
    case nir_intrinsic_load_sample_pos:
       return SYSTEM_VALUE_SAMPLE_POS;
+   case nir_intrinsic_load_sample_pos_or_center:
+      return SYSTEM_VALUE_SAMPLE_POS_OR_CENTER;
    case nir_intrinsic_load_sample_mask_in:
       return SYSTEM_VALUE_SAMPLE_MASK_IN;
    case nir_intrinsic_load_local_invocation_id:
index 20bbd8f..58ed99e 100644 (file)
@@ -390,6 +390,7 @@ visit_intrinsic(nir_shader *shader, nir_intrinsic_instr *instr)
    case nir_intrinsic_load_line_coord:
    case nir_intrinsic_load_frag_coord:
    case nir_intrinsic_load_sample_pos:
+   case nir_intrinsic_load_sample_pos_or_center:
    case nir_intrinsic_load_vertex_id_zero_base:
    case nir_intrinsic_load_vertex_id:
    case nir_intrinsic_load_instance_id:
index bafc9a5..5463657 100644 (file)
@@ -629,6 +629,7 @@ gather_intrinsic_info(nir_intrinsic_instr *instr, nir_shader *shader,
    case nir_intrinsic_load_front_face:
    case nir_intrinsic_load_sample_id:
    case nir_intrinsic_load_sample_pos:
+   case nir_intrinsic_load_sample_pos_or_center:
    case nir_intrinsic_load_sample_mask_in:
    case nir_intrinsic_load_helper_invocation:
    case nir_intrinsic_load_tess_coord:
index 43ec044..ffc1c97 100644 (file)
@@ -738,6 +738,9 @@ system_value("sample_id", 1)
 # sample shading.  See the lower_helper_invocation option.
 system_value("sample_id_no_per_sample", 1)
 system_value("sample_pos", 2)
+# sample_pos_or_center is like sample_pos but does not imply per-sample
+# shading.  When per-sample dispatch is not enabled, it returns (0.5, 0.5).
+system_value("sample_pos_or_center", 2)
 system_value("sample_mask_in", 1)
 system_value("primitive_id", 1)
 system_value("invocation_id", 1)
index 9d7e4e4..fc0a32b 100644 (file)
@@ -128,6 +128,7 @@ block_check_for_allowed_instrs(nir_block *block, unsigned *count,
          case nir_intrinsic_load_layer_id:
          case nir_intrinsic_load_frag_coord:
          case nir_intrinsic_load_sample_pos:
+         case nir_intrinsic_load_sample_pos_or_center:
          case nir_intrinsic_load_sample_id:
          case nir_intrinsic_load_sample_mask_in:
          case nir_intrinsic_load_vertex_id_zero_base:
index a98d527..3519a58 100644 (file)
@@ -715,6 +715,7 @@ typedef enum
    SYSTEM_VALUE_FRONT_FACE,
    SYSTEM_VALUE_SAMPLE_ID,
    SYSTEM_VALUE_SAMPLE_POS,
+   SYSTEM_VALUE_SAMPLE_POS_OR_CENTER,
    SYSTEM_VALUE_SAMPLE_MASK_IN,
    SYSTEM_VALUE_HELPER_INVOCATION,
    SYSTEM_VALUE_COLOR0,