pan/bi: Add texture operator descriptor

Used to encode all the different texture modes.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7081>
This commit is contained in:
Alyssa Rosenzweig 2020-09-23 13:57:52 -04:00
parent d99df25d5d
commit dcce3feb79

View file

@ -402,4 +402,140 @@ static const struct bifrost_reg_ctrl_23 bifrost_reg_ctrl_lut[32] = {
[BIFROST_IDLE] = { BIFROST_OP_IDLE, BIFROST_OP_IDLE, true },
};
/* Texture operator descriptors in various states. Usually packed in the
* compiler and stored as a constant */
enum bifrost_index {
/* Both texture/sampler index immediate */
BIFROST_INDEX_IMMEDIATE_SHARED = 0,
/* Sampler index immediate, texture index from staging */
BIFROST_INDEX_IMMEDIATE_SAMPLER = 1,
/* Texture index immediate, sampler index from staging */
BIFROST_INDEX_IMMEDIATE_TEXTURE = 2,
/* Both indices from (separate) staging registers */
BIFROST_INDEX_REGISTER = 3,
};
enum bifrost_tex_op {
/* Given explicit derivatives, compute a gradient descriptor */
BIFROST_TEX_OP_GRDESC_DER = 4,
/* Given implicit derivatives (texture coordinates in a fragment
* shader), compute a gradient descriptor */
BIFROST_TEX_OP_GRDESC = 5,
/* Fetch a texel. Takes a staging register with LOD level / face index
* packed 16:16 */
BIFROST_TEX_OP_FETCH = 6,
/* Filtered texture */
BIFROST_TEX_OP_TEX = 7,
};
enum bifrost_lod_mode {
/* Takes two staging registers forming a 64-bit gradient descriptor
* (computed by a previous GRDESC or GRDESC_DER operation) */
BIFROST_LOD_MODE_GRDESC = 3,
/* Take a staging register with 8:8 fixed-point in bottom 16-bits
* specifying an explicit LOD */
BIFROST_LOD_MODE_EXPLICIT = 4,
/* Takes a staging register with bottom 16-bits as 8:8 fixed-point LOD
* bias and top 16-bit as 8:8 fixed-point lower bound (generally left
* zero), added and clamped to a computed LOD */
BIFROST_LOD_MODE_BIAS = 5,
/* Set LOD to zero */
BIFROST_LOD_MODE_ZERO = 6,
/* Compute LOD */
BIFROST_LOD_MODE_COMPUTE = 7,
};
enum bifrost_texture_format {
/* 16-bit floating point, with optional clamping */
BIFROST_TEXTURE_FORMAT_F16 = 0,
BIFROST_TEXTURE_FORMAT_F16_POS = 1,
BIFROST_TEXTURE_FORMAT_F16_PM1 = 2,
BIFROST_TEXTURE_FORMAT_F16_1 = 3,
/* 32-bit floating point, with optional clamping */
BIFROST_TEXTURE_FORMAT_F32 = 4,
BIFROST_TEXTURE_FORMAT_F32_POS = 5,
BIFROST_TEXTURE_FORMAT_F32_PM1 = 6,
BIFROST_TEXTURE_FORMAT_F32_1 = 7,
};
enum bifrost_texture_format_full {
/* Transclude bifrost_texture_format from above */
/* Integers, unclamped */
BIFROST_TEXTURE_FORMAT_U16 = 12,
BIFROST_TEXTURE_FORMAT_S16 = 13,
BIFROST_TEXTURE_FORMAT_U32 = 14,
BIFROST_TEXTURE_FORMAT_S32 = 15,
};
enum bifrost_texture_fetch {
/* Default texelFetch */
BIFROST_TEXTURE_FETCH_TEXEL = 1,
/* Deprecated, fetches 4x U32 of a U8 x 4 texture. Do not use. */
BIFROST_TEXTURE_FETCH_GATHER4_RGBA = 3,
/* Gathers */
BIFROST_TEXTURE_FETCH_GATHER4_R = 4,
BIFROST_TEXTURE_FETCH_GATHER4_G = 5,
BIFROST_TEXTURE_FETCH_GATHER4_B = 6,
BIFROST_TEXTURE_FETCH_GATHER4_A = 7
};
struct bifrost_texture_operation {
/* If immediate_indices is set:
* - immediate sampler index
* - index used as texture index
* Otherwise:
* - bifrost_single_index in lower 2 bits
* - 0x3 in upper 2 bits (single-texturing)
*/
unsigned sampler_index_or_mode : 4;
unsigned index : 7;
bool immediate_indices : 1;
enum bifrost_tex_op op : 3;
/* If set for TEX/FETCH, loads texel offsets and multisample index from
* a staging register containing offset_x:offset_y:offset_z:ms_index
* packed 8:8:8:8. Offsets must be in [-31, +31]. If set for
* GRDESC(_DER), disable LOD bias. */
bool offset_or_bias_disable : 1;
/* If set for TEX/FETCH, loads fp32 shadow comparison value from a
* staging register. Implies fetch_component = gather4_r. If set for
* GRDESC(_DER), disables LOD clamping. */
bool shadow_or_clamp_disable : 1;
/* If set, loads an uint32 array index from a staging register. */
bool array : 1;
/* Texture dimension, or 0 for a cubemap */
unsigned dimension : 2;
/* Method to compute LOD value */
enum bifrost_lod_mode lod_mode : 3;
/* Reserved */
unsigned zero : 1;
/* Register format for the result or for a FETCH, the
* bifrost_texture_fetch component specification */
enum bifrost_texture_format_full format_or_fetch : 4;
/* Write mask for the result */
unsigned mask : 4;
} __attribute__((packed));
#endif