nak: Add enums for sysvals and attributes

It's much nicer to have a canonical place for all these things to live
which gives them actual names.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24998>
This commit is contained in:
Faith Ekstrand
2023-10-02 17:46:01 -05:00
committed by Marge Bot
parent a4c1ec3892
commit d4d7f26151
2 changed files with 108 additions and 34 deletions

View File

@@ -221,7 +221,7 @@ static uint16_t
nak_attribute_attr_addr(gl_vert_attrib attrib)
{
assert(attrib >= VERT_ATTRIB_GENERIC0);
return 0x80 + (attrib - VERT_ATTRIB_GENERIC0) * 0x10;
return NAK_ATTR_GENERIC_START + (attrib - VERT_ATTRIB_GENERIC0) * 0x10;
}
static int
@@ -250,20 +250,20 @@ static uint16_t
nak_varying_attr_addr(gl_varying_slot slot)
{
if (slot >= VARYING_SLOT_PATCH0) {
return 0x020 + (slot - VARYING_SLOT_PATCH0) * 0x10;
return NAK_ATTR_PATCH_START + (slot - VARYING_SLOT_PATCH0) * 0x10;
} else if (slot >= VARYING_SLOT_VAR0) {
return 0x080 + (slot - VARYING_SLOT_VAR0) * 0x10;
return NAK_ATTR_GENERIC_START + (slot - VARYING_SLOT_VAR0) * 0x10;
} else {
switch (slot) {
case VARYING_SLOT_TESS_LEVEL_OUTER: return 0x000;
case VARYING_SLOT_TESS_LEVEL_INNER: return 0x010;
case VARYING_SLOT_PRIMITIVE_ID: return 0x060;
case VARYING_SLOT_LAYER: return 0x064;
case VARYING_SLOT_VIEWPORT: return 0x068;
case VARYING_SLOT_PSIZ: return 0x06c;
case VARYING_SLOT_POS: return 0x070;
case VARYING_SLOT_CLIP_DIST0: return 0x2c0;
case VARYING_SLOT_CLIP_DIST1: return 0x2d0;
case VARYING_SLOT_TESS_LEVEL_OUTER: return NAK_ATTR_TESS_LOD;
case VARYING_SLOT_TESS_LEVEL_INNER: return NAK_ATTR_TESS_INTERRIOR;
case VARYING_SLOT_PRIMITIVE_ID: return NAK_ATTR_PRIMITIVE_ID;
case VARYING_SLOT_LAYER: return NAK_ATTR_RT_ARRAY_INDEX;
case VARYING_SLOT_VIEWPORT: return NAK_ATTR_VIEWPORT_INDEX;
case VARYING_SLOT_PSIZ: return NAK_ATTR_POINT_SIZE;
case VARYING_SLOT_POS: return NAK_ATTR_POSITION;
case VARYING_SLOT_CLIP_DIST0: return NAK_ATTR_CLIP_CULL_DIST_0;
case VARYING_SLOT_CLIP_DIST1: return NAK_ATTR_CLIP_CULL_DIST_4;
default: unreachable("Invalid varying slot");
}
}
@@ -273,12 +273,12 @@ static uint16_t
nak_sysval_attr_addr(gl_system_value sysval)
{
switch (sysval) {
case SYSTEM_VALUE_FRAG_COORD: return 0x070;
case SYSTEM_VALUE_POINT_COORD: return 0x2e0;
case SYSTEM_VALUE_TESS_COORD: return 0x2f0;
case SYSTEM_VALUE_INSTANCE_ID: return 0x2f8;
case SYSTEM_VALUE_VERTEX_ID: return 0x2fc;
case SYSTEM_VALUE_FRONT_FACE: return 0x3fc;
case SYSTEM_VALUE_FRAG_COORD: return NAK_ATTR_POSITION;
case SYSTEM_VALUE_POINT_COORD: return NAK_ATTR_POINT_SPRITE;
case SYSTEM_VALUE_TESS_COORD: return NAK_ATTR_TESS_COORD;
case SYSTEM_VALUE_INSTANCE_ID: return NAK_ATTR_INSTANCE_ID;
case SYSTEM_VALUE_VERTEX_ID: return NAK_ATTR_VERTEX_ID;
case SYSTEM_VALUE_FRONT_FACE: return NAK_ATTR_FRONT_FACE;
default: unreachable("Invalid system value");
}
}
@@ -287,18 +287,18 @@ static uint8_t
nak_sysval_sysval_idx(gl_system_value sysval)
{
switch (sysval) {
case SYSTEM_VALUE_SUBGROUP_INVOCATION: return 0x00;
case SYSTEM_VALUE_VERTICES_IN: return 0x10;
case SYSTEM_VALUE_INVOCATION_ID: return 0x11;
case SYSTEM_VALUE_HELPER_INVOCATION: return 0x13;
case SYSTEM_VALUE_LOCAL_INVOCATION_INDEX: return 0x20;
case SYSTEM_VALUE_LOCAL_INVOCATION_ID: return 0x21;
case SYSTEM_VALUE_WORKGROUP_ID: return 0x25;
case SYSTEM_VALUE_SUBGROUP_EQ_MASK: return 0x38;
case SYSTEM_VALUE_SUBGROUP_LT_MASK: return 0x39;
case SYSTEM_VALUE_SUBGROUP_LE_MASK: return 0x3a;
case SYSTEM_VALUE_SUBGROUP_GT_MASK: return 0x3b;
case SYSTEM_VALUE_SUBGROUP_GE_MASK: return 0x3c;
case SYSTEM_VALUE_SUBGROUP_INVOCATION: return NAK_SV_LANE_ID;
case SYSTEM_VALUE_VERTICES_IN: return NAK_SV_VERTEX_COUNT;
case SYSTEM_VALUE_INVOCATION_ID: return NAK_SV_INVOCATION_ID;
case SYSTEM_VALUE_HELPER_INVOCATION: return NAK_SV_THREAD_KILL;
case SYSTEM_VALUE_LOCAL_INVOCATION_INDEX: return NAK_SV_COMBINED_TID;
case SYSTEM_VALUE_LOCAL_INVOCATION_ID: return NAK_SV_TID;
case SYSTEM_VALUE_WORKGROUP_ID: return NAK_SV_CTAID;
case SYSTEM_VALUE_SUBGROUP_EQ_MASK: return NAK_SV_LANEMASK_EQ;
case SYSTEM_VALUE_SUBGROUP_LT_MASK: return NAK_SV_LANEMASK_LT;
case SYSTEM_VALUE_SUBGROUP_LE_MASK: return NAK_SV_LANEMASK_LE;
case SYSTEM_VALUE_SUBGROUP_GT_MASK: return NAK_SV_LANEMASK_GT;
case SYSTEM_VALUE_SUBGROUP_GE_MASK: return NAK_SV_LANEMASK_GE;
default: unreachable("Invalid system value");
}
}
@@ -604,15 +604,13 @@ nak_nir_lower_system_value_instr(nir_builder *b, nir_instr *instr, void *data)
}
case nir_intrinsic_is_helper_invocation: {
const uint32_t idx =
nak_sysval_sysval_idx(SYSTEM_VALUE_HELPER_INVOCATION);
/* Unlike load_helper_invocation, this one isn't re-orderable */
val = nir_load_sysval_nv(b, 32, .base = idx);
val = nir_load_sysval_nv(b, 32, .base = NAK_SV_THREAD_KILL);
break;
}
case nir_intrinsic_shader_clock:
val = nir_load_sysval_nv(b, 64, .base = 0x50);
val = nir_load_sysval_nv(b, 64, .base = NAK_SV_CLOCK);
val = nir_unpack_64_2x32(b, val);
break;

View File

@@ -22,6 +22,82 @@ struct nak_compiler {
struct nir_shader_compiler_options nir_options;
};
enum PACKED nak_attr {
/* System values A */
NAK_ATTR_TESS_LOD_LEFT = 0x000,
NAK_ATTR_TESS_LOD_RIGHT = 0x004,
NAK_ATTR_TESS_LOD_BOTTOM = 0x008,
NAK_ATTR_TESS_LOD_TOP = 0x00c,
NAK_ATTR_TESS_LOD = NAK_ATTR_TESS_LOD_LEFT,
NAK_ATTR_TESS_INTERRIOR_U = 0x010,
NAK_ATTR_TESS_INTERRIOR_V = 0x014,
NAK_ATTR_TESS_INTERRIOR = NAK_ATTR_TESS_INTERRIOR_U,
/* Patch attributes */
NAK_ATTR_PATCH_START = 0x020,
/* System values B */
NAK_ATTR_PRIMITIVE_ID = 0x060,
NAK_ATTR_RT_ARRAY_INDEX = 0x064,
NAK_ATTR_VIEWPORT_INDEX = 0x068,
NAK_ATTR_POINT_SIZE = 0x06c,
NAK_ATTR_POSITION_X = 0x070,
NAK_ATTR_POSITION_Y = 0x074,
NAK_ATTR_POSITION_Z = 0x078,
NAK_ATTR_POSITION_W = 0x07c,
NAK_ATTR_POSITION = NAK_ATTR_POSITION_X,
/* Generic attributes */
NAK_ATTR_GENERIC_START = 0x080,
/* System values C */
NAK_ATTR_CLIP_CULL_DIST_0 = 0x2c0,
NAK_ATTR_CLIP_CULL_DIST_1 = 0x2c4,
NAK_ATTR_CLIP_CULL_DIST_2 = 0x2c8,
NAK_ATTR_CLIP_CULL_DIST_3 = 0x2cc,
NAK_ATTR_CLIP_CULL_DIST_4 = 0x2d0,
NAK_ATTR_CLIP_CULL_DIST_5 = 0x2d4,
NAK_ATTR_CLIP_CULL_DIST_6 = 0x2d8,
NAK_ATTR_CLIP_CULL_DIST_7 = 0x2dd,
NAK_ATTR_CLIP_CULL_DIST = NAK_ATTR_CLIP_CULL_DIST_0,
NAK_ATTR_POINT_SPRITE_S = 0x2e0,
NAK_ATTR_POINT_SPRITE_T = 0x2e4,
NAK_ATTR_POINT_SPRITE = NAK_ATTR_POINT_SPRITE_S,
NAK_ATTR_FOG_COORD = 0x2e8,
/* Reserved 0x2ec */
NAK_ATTR_TESS_COORD_X = 0x2f0,
NAK_ATTR_TESS_COORD_Y = 0x2f4,
NAK_ATTR_TESS_COORD = NAK_ATTR_TESS_COORD_X,
NAK_ATTR_INSTANCE_ID = 0x2f8,
NAK_ATTR_VERTEX_ID = 0x2fc,
/* Not in SPH */
NAK_ATTR_FRONT_FACE = 0x3fc,
};
enum PACKED nak_sv {
NAK_SV_LANE_ID = 0x00,
NAK_SV_VERTEX_COUNT = 0x10,
NAK_SV_INVOCATION_ID = 0x11,
NAK_SV_THREAD_KILL = 0x13,
NAK_SV_INVOCATION_INFO = 0x1d,
NAK_SV_COMBINED_TID = 0x20,
NAK_SV_TID_X = 0x21,
NAK_SV_TID_Y = 0x22,
NAK_SV_TID_Z = 0x23,
NAK_SV_TID = NAK_SV_TID_X,
NAK_SV_CTAID_X = 0x25,
NAK_SV_CTAID_Y = 0x26,
NAK_SV_CTAID_Z = 0x27,
NAK_SV_CTAID = NAK_SV_CTAID_X,
NAK_SV_LANEMASK_EQ = 0x38,
NAK_SV_LANEMASK_LT = 0x39,
NAK_SV_LANEMASK_LE = 0x3a,
NAK_SV_LANEMASK_GT = 0x3b,
NAK_SV_LANEMASK_GE = 0x3c,
NAK_SV_CLOCK = 0x50,
};
struct nvk_xfb_info
nak_xfb_from_nir(const struct nir_xfb_info *nir_xfb);