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:

committed by
Marge Bot

parent
f86668f487
commit
1c9488e0d1
@@ -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");
|
||||||
}
|
}
|
||||||
|
@@ -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 {
|
||||||
|
@@ -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)
|
||||||
|
@@ -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:
|
||||||
|
@@ -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
|
||||||
|
@@ -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;
|
||||||
|
@@ -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);
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user