nir: wire shading rate variables

v2: Fixup comment about bits in nir_intrinsics.py

v3: Use varying for primitive shading rate builtin (samuel)

v4: Reoder switch alphabetically
    Make divergence of frag_shading_rate an option

v5: Remove stage check for frag_shading_rate in divergence (Samuel)

v6: s/frag_shading_rate_per_subgroup/single_frag_shading_rate_per_subgroup/ (Jason)

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7795>
This commit is contained in:
Lionel Landwerlin
2020-10-20 10:41:00 +03:00
committed by Marge Bot
parent f86668f487
commit 1c9488e0d1
8 changed files with 27 additions and 1 deletions

View File

@@ -2247,6 +2247,8 @@ nir_intrinsic_from_system_value(gl_system_value val)
return nir_intrinsic_load_ray_geometry_index; return nir_intrinsic_load_ray_geometry_index;
case SYSTEM_VALUE_RAY_INSTANCE_CUSTOM_INDEX: case SYSTEM_VALUE_RAY_INSTANCE_CUSTOM_INDEX:
return nir_intrinsic_load_ray_instance_custom_index; return nir_intrinsic_load_ray_instance_custom_index;
case SYSTEM_VALUE_FRAG_SHADING_RATE:
return nir_intrinsic_load_frag_shading_rate;
default: default:
unreachable("system value does not directly correspond to intrinsic"); unreachable("system value does not directly correspond to intrinsic");
} }
@@ -2382,6 +2384,8 @@ nir_system_value_from_intrinsic(nir_intrinsic_op intrin)
return SYSTEM_VALUE_RAY_GEOMETRY_INDEX; return SYSTEM_VALUE_RAY_GEOMETRY_INDEX;
case nir_intrinsic_load_ray_instance_custom_index: case nir_intrinsic_load_ray_instance_custom_index:
return SYSTEM_VALUE_RAY_INSTANCE_CUSTOM_INDEX; return SYSTEM_VALUE_RAY_INSTANCE_CUSTOM_INDEX;
case nir_intrinsic_load_frag_shading_rate:
return SYSTEM_VALUE_FRAG_SHADING_RATE;
default: default:
unreachable("intrinsic doesn't produce a system value"); unreachable("intrinsic doesn't produce a system value");
} }

View File

@@ -3070,6 +3070,7 @@ typedef enum {
nir_divergence_single_patch_per_tcs_subgroup = (1 << 1), nir_divergence_single_patch_per_tcs_subgroup = (1 << 1),
nir_divergence_single_patch_per_tes_subgroup = (1 << 2), nir_divergence_single_patch_per_tes_subgroup = (1 << 2),
nir_divergence_view_index_uniform = (1 << 3), nir_divergence_view_index_uniform = (1 << 3),
nir_divergence_single_frag_shading_rate_per_subgroup = (1 << 4),
} nir_divergence_options; } nir_divergence_options;
typedef struct nir_shader_compiler_options { typedef struct nir_shader_compiler_options {

View File

@@ -136,6 +136,9 @@ visit_intrinsic(nir_shader *shader, nir_intrinsic_instr *instr)
break; break;
/* Intrinsics with divergence depending on shader stage and hardware */ /* Intrinsics with divergence depending on shader stage and hardware */
case nir_intrinsic_load_frag_shading_rate:
is_divergent = !(options & nir_divergence_single_frag_shading_rate_per_subgroup);
break;
case nir_intrinsic_load_input: case nir_intrinsic_load_input:
is_divergent = instr->src[0].ssa->divergent; is_divergent = instr->src[0].ssa->divergent;
if (stage == MESA_SHADER_FRAGMENT) if (stage == MESA_SHADER_FRAGMENT)

View File

@@ -465,6 +465,7 @@ gather_intrinsic_info(nir_intrinsic_instr *instr, nir_shader *shader,
case nir_intrinsic_load_draw_id: case nir_intrinsic_load_draw_id:
case nir_intrinsic_load_invocation_id: case nir_intrinsic_load_invocation_id:
case nir_intrinsic_load_frag_coord: case nir_intrinsic_load_frag_coord:
case nir_intrinsic_load_frag_shading_rate:
case nir_intrinsic_load_point_coord: case nir_intrinsic_load_point_coord:
case nir_intrinsic_load_line_coord: case nir_intrinsic_load_line_coord:
case nir_intrinsic_load_front_face: case nir_intrinsic_load_front_face:

View File

@@ -943,6 +943,15 @@ store("global", [1], [WRITE_MASK, ACCESS, ALIGN_MUL, ALIGN_OFFSET])
# src[] = { value, offset }. # src[] = { value, offset }.
store("scratch", [1], [ALIGN_MUL, ALIGN_OFFSET, WRITE_MASK]) store("scratch", [1], [ALIGN_MUL, ALIGN_OFFSET, WRITE_MASK])
# A bit field to implement SPIRV FragmentShadingRateKHR
# bit | name | description
# 0 | Vertical2Pixels | Fragment invocation covers 2 pixels vertically
# 1 | Vertical4Pixels | Fragment invocation covers 4 pixels vertically
# 2 | Horizontal2Pixels | Fragment invocation covers 2 pixels horizontally
# 3 | Horizontal4Pixels | Fragment invocation covers 4 pixels horizontally
intrinsic("load_frag_shading_rate", dest_comp=1, bit_sizes=[32],
flags=[CAN_ELIMINATE, CAN_REORDER])
# IR3-specific version of most SSBO intrinsics. The only different # IR3-specific version of most SSBO intrinsics. The only different
# compare to the originals is that they add an extra source to hold # compare to the originals is that they add an extra source to hold
# the dword-offset, which is needed by the backend code apart from # the dword-offset, which is needed by the backend code apart from

View File

@@ -113,6 +113,7 @@ block_check_for_allowed_instrs(nir_block *block, unsigned *count,
case nir_intrinsic_load_subgroup_id: case nir_intrinsic_load_subgroup_id:
case nir_intrinsic_load_subgroup_invocation: case nir_intrinsic_load_subgroup_invocation:
case nir_intrinsic_load_num_subgroups: case nir_intrinsic_load_num_subgroups:
case nir_intrinsic_load_frag_shading_rate:
if (!alu_ok) if (!alu_ok)
return false; return false;
break; break;

View File

@@ -304,6 +304,7 @@ gl_system_value_name(gl_system_value sysval)
ENUM(SYSTEM_VALUE_RAY_GEOMETRY_INDEX), ENUM(SYSTEM_VALUE_RAY_GEOMETRY_INDEX),
ENUM(SYSTEM_VALUE_GS_HEADER_IR3), ENUM(SYSTEM_VALUE_GS_HEADER_IR3),
ENUM(SYSTEM_VALUE_TCS_HEADER_IR3), ENUM(SYSTEM_VALUE_TCS_HEADER_IR3),
ENUM(SYSTEM_VALUE_FRAG_SHADING_RATE),
}; };
STATIC_ASSERT(ARRAY_SIZE(names) == SYSTEM_VALUE_MAX); STATIC_ASSERT(ARRAY_SIZE(names) == SYSTEM_VALUE_MAX);
return NAME(sysval); return NAME(sysval);

View File

@@ -288,7 +288,8 @@ typedef enum
VARYING_SLOT_BOUNDING_BOX1, /* Only appears as TCS output. */ VARYING_SLOT_BOUNDING_BOX1, /* Only appears as TCS output. */
VARYING_SLOT_VIEW_INDEX, VARYING_SLOT_VIEW_INDEX,
VARYING_SLOT_VIEWPORT_MASK, /* Does not appear in FS */ VARYING_SLOT_VIEWPORT_MASK, /* Does not appear in FS */
VARYING_SLOT_VAR0, /* First generic varying slot */ VARYING_SLOT_PRIMITIVE_SHADING_RATE = VARYING_SLOT_FACE, /* Does not appear in FS. */
VARYING_SLOT_VAR0 = 32, /* First generic varying slot */
/* the remaining are simply for the benefit of gl_varying_slot_name() /* the remaining are simply for the benefit of gl_varying_slot_name()
* and not to be construed as an upper bound: * and not to be construed as an upper bound:
*/ */
@@ -708,6 +709,11 @@ typedef enum
SYSTEM_VALUE_GS_HEADER_IR3, SYSTEM_VALUE_GS_HEADER_IR3,
SYSTEM_VALUE_TCS_HEADER_IR3, SYSTEM_VALUE_TCS_HEADER_IR3,
/**
* Fragment shading rate used for KHR_fragment_shading_rate (Vulkan).
*/
SYSTEM_VALUE_FRAG_SHADING_RATE,
SYSTEM_VALUE_MAX /**< Number of values */ SYSTEM_VALUE_MAX /**< Number of values */
} gl_system_value; } gl_system_value;