diff --git a/src/panfrost/bifrost/bifrost.h b/src/panfrost/bifrost/bifrost.h index 7638c5bd641..8da1efb54cc 100644 --- a/src/panfrost/bifrost/bifrost.h +++ b/src/panfrost/bifrost/bifrost.h @@ -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