1*61046927SAndroid Build Coastguard Worker /* Author(s): 2*61046927SAndroid Build Coastguard Worker * Connor Abbott 3*61046927SAndroid Build Coastguard Worker * Alyssa Rosenzweig 4*61046927SAndroid Build Coastguard Worker * 5*61046927SAndroid Build Coastguard Worker * Copyright (c) 2013 Connor Abbott ([email protected]) 6*61046927SAndroid Build Coastguard Worker * Copyright (c) 2018 Alyssa Rosenzweig ([email protected]) 7*61046927SAndroid Build Coastguard Worker * Copyright (C) 2019-2020 Collabora, Ltd. 8*61046927SAndroid Build Coastguard Worker * 9*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a copy 10*61046927SAndroid Build Coastguard Worker * of this software and associated documentation files (the "Software"), to deal 11*61046927SAndroid Build Coastguard Worker * in the Software without restriction, including without limitation the rights 12*61046927SAndroid Build Coastguard Worker * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13*61046927SAndroid Build Coastguard Worker * copies of the Software, and to permit persons to whom the Software is 14*61046927SAndroid Build Coastguard Worker * furnished to do so, subject to the following conditions: 15*61046927SAndroid Build Coastguard Worker * 16*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be included in 17*61046927SAndroid Build Coastguard Worker * all copies or substantial portions of the Software. 18*61046927SAndroid Build Coastguard Worker * 19*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20*61046927SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22*61046927SAndroid Build Coastguard Worker * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23*61046927SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24*61046927SAndroid Build Coastguard Worker * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 25*61046927SAndroid Build Coastguard Worker * THE SOFTWARE. 26*61046927SAndroid Build Coastguard Worker */ 27*61046927SAndroid Build Coastguard Worker 28*61046927SAndroid Build Coastguard Worker #ifndef __midgard_h__ 29*61046927SAndroid Build Coastguard Worker #define __midgard_h__ 30*61046927SAndroid Build Coastguard Worker 31*61046927SAndroid Build Coastguard Worker #include <stdbool.h> 32*61046927SAndroid Build Coastguard Worker #include <stdint.h> 33*61046927SAndroid Build Coastguard Worker 34*61046927SAndroid Build Coastguard Worker #define MIDGARD_DBG_SHADERS 0x0002 35*61046927SAndroid Build Coastguard Worker #define MIDGARD_DBG_SHADERDB 0x0004 36*61046927SAndroid Build Coastguard Worker #define MIDGARD_DBG_INORDER 0x0008 37*61046927SAndroid Build Coastguard Worker #define MIDGARD_DBG_VERBOSE 0x0010 38*61046927SAndroid Build Coastguard Worker #define MIDGARD_DBG_INTERNAL 0x0020 39*61046927SAndroid Build Coastguard Worker 40*61046927SAndroid Build Coastguard Worker extern int midgard_debug; 41*61046927SAndroid Build Coastguard Worker 42*61046927SAndroid Build Coastguard Worker typedef enum { 43*61046927SAndroid Build Coastguard Worker midgard_word_type_alu, 44*61046927SAndroid Build Coastguard Worker midgard_word_type_load_store, 45*61046927SAndroid Build Coastguard Worker midgard_word_type_texture 46*61046927SAndroid Build Coastguard Worker } midgard_word_type; 47*61046927SAndroid Build Coastguard Worker 48*61046927SAndroid Build Coastguard Worker typedef enum { 49*61046927SAndroid Build Coastguard Worker midgard_alu_vmul, 50*61046927SAndroid Build Coastguard Worker midgard_alu_sadd, 51*61046927SAndroid Build Coastguard Worker midgard_alu_smul, 52*61046927SAndroid Build Coastguard Worker midgard_alu_vadd, 53*61046927SAndroid Build Coastguard Worker midgard_alu_lut 54*61046927SAndroid Build Coastguard Worker } midgard_alu; 55*61046927SAndroid Build Coastguard Worker 56*61046927SAndroid Build Coastguard Worker enum { 57*61046927SAndroid Build Coastguard Worker TAG_INVALID = 0x0, 58*61046927SAndroid Build Coastguard Worker TAG_BREAK = 0x1, 59*61046927SAndroid Build Coastguard Worker TAG_TEXTURE_4_VTX = 0x2, 60*61046927SAndroid Build Coastguard Worker TAG_TEXTURE_4 = 0x3, 61*61046927SAndroid Build Coastguard Worker TAG_TEXTURE_4_BARRIER = 0x4, 62*61046927SAndroid Build Coastguard Worker TAG_LOAD_STORE_4 = 0x5, 63*61046927SAndroid Build Coastguard Worker TAG_UNKNOWN_1 = 0x6, 64*61046927SAndroid Build Coastguard Worker TAG_UNKNOWN_2 = 0x7, 65*61046927SAndroid Build Coastguard Worker TAG_ALU_4 = 0x8, 66*61046927SAndroid Build Coastguard Worker TAG_ALU_8 = 0x9, 67*61046927SAndroid Build Coastguard Worker TAG_ALU_12 = 0xA, 68*61046927SAndroid Build Coastguard Worker TAG_ALU_16 = 0xB, 69*61046927SAndroid Build Coastguard Worker TAG_ALU_4_WRITEOUT = 0xC, 70*61046927SAndroid Build Coastguard Worker TAG_ALU_8_WRITEOUT = 0xD, 71*61046927SAndroid Build Coastguard Worker TAG_ALU_12_WRITEOUT = 0xE, 72*61046927SAndroid Build Coastguard Worker TAG_ALU_16_WRITEOUT = 0xF 73*61046927SAndroid Build Coastguard Worker }; 74*61046927SAndroid Build Coastguard Worker 75*61046927SAndroid Build Coastguard Worker /* 76*61046927SAndroid Build Coastguard Worker * ALU words 77*61046927SAndroid Build Coastguard Worker */ 78*61046927SAndroid Build Coastguard Worker 79*61046927SAndroid Build Coastguard Worker typedef enum { 80*61046927SAndroid Build Coastguard Worker midgard_alu_op_fadd = 0x10, /* round to even */ 81*61046927SAndroid Build Coastguard Worker midgard_alu_op_fadd_rtz = 0x11, 82*61046927SAndroid Build Coastguard Worker midgard_alu_op_fadd_rtn = 0x12, 83*61046927SAndroid Build Coastguard Worker midgard_alu_op_fadd_rtp = 0x13, 84*61046927SAndroid Build Coastguard Worker midgard_alu_op_fmul = 0x14, /* round to even */ 85*61046927SAndroid Build Coastguard Worker midgard_alu_op_fmul_rtz = 0x15, 86*61046927SAndroid Build Coastguard Worker midgard_alu_op_fmul_rtn = 0x16, 87*61046927SAndroid Build Coastguard Worker midgard_alu_op_fmul_rtp = 0x17, 88*61046927SAndroid Build Coastguard Worker 89*61046927SAndroid Build Coastguard Worker midgard_alu_op_fmin = 0x28, /* if an operand is NaN, propagate the other */ 90*61046927SAndroid Build Coastguard Worker midgard_alu_op_fmin_nan = 0x29, /* if an operand is NaN, propagate it */ 91*61046927SAndroid Build Coastguard Worker midgard_alu_op_fabsmin = 0x2A, /* min(abs(a,b)) */ 92*61046927SAndroid Build Coastguard Worker midgard_alu_op_fabsmin_nan = 0x2B, /* min_nan(abs(a,b)) */ 93*61046927SAndroid Build Coastguard Worker midgard_alu_op_fmax = 0x2C, /* if an operand is NaN, propagate the other */ 94*61046927SAndroid Build Coastguard Worker midgard_alu_op_fmax_nan = 0x2D, /* if an operand is NaN, propagate it */ 95*61046927SAndroid Build Coastguard Worker midgard_alu_op_fabsmax = 0x2E, /* max(abs(a,b)) */ 96*61046927SAndroid Build Coastguard Worker midgard_alu_op_fabsmax_nan = 0x2F, /* max_nan(abs(a,b)) */ 97*61046927SAndroid Build Coastguard Worker 98*61046927SAndroid Build Coastguard Worker midgard_alu_op_fmov = 0x30, /* fmov_rte */ 99*61046927SAndroid Build Coastguard Worker midgard_alu_op_fmov_rtz = 0x31, 100*61046927SAndroid Build Coastguard Worker midgard_alu_op_fmov_rtn = 0x32, 101*61046927SAndroid Build Coastguard Worker midgard_alu_op_fmov_rtp = 0x33, 102*61046927SAndroid Build Coastguard Worker midgard_alu_op_froundeven = 0x34, 103*61046927SAndroid Build Coastguard Worker midgard_alu_op_ftrunc = 0x35, 104*61046927SAndroid Build Coastguard Worker midgard_alu_op_ffloor = 0x36, 105*61046927SAndroid Build Coastguard Worker midgard_alu_op_fceil = 0x37, 106*61046927SAndroid Build Coastguard Worker midgard_alu_op_ffma = 0x38, /* rte */ 107*61046927SAndroid Build Coastguard Worker midgard_alu_op_ffma_rtz = 0x39, 108*61046927SAndroid Build Coastguard Worker midgard_alu_op_ffma_rtn = 0x3A, 109*61046927SAndroid Build Coastguard Worker midgard_alu_op_ffma_rtp = 0x3B, 110*61046927SAndroid Build Coastguard Worker midgard_alu_op_fdot3 = 0x3C, 111*61046927SAndroid Build Coastguard Worker midgard_alu_op_fdot3r = 0x3D, 112*61046927SAndroid Build Coastguard Worker midgard_alu_op_fdot4 = 0x3E, 113*61046927SAndroid Build Coastguard Worker midgard_alu_op_freduce = 0x3F, 114*61046927SAndroid Build Coastguard Worker 115*61046927SAndroid Build Coastguard Worker midgard_alu_op_iadd = 0x40, 116*61046927SAndroid Build Coastguard Worker midgard_alu_op_ishladd = 0x41, /* (a<<1) + b */ 117*61046927SAndroid Build Coastguard Worker midgard_alu_op_isub = 0x46, 118*61046927SAndroid Build Coastguard Worker midgard_alu_op_ishlsub = 0x47, /* (a<<1) - b */ 119*61046927SAndroid Build Coastguard Worker midgard_alu_op_iaddsat = 0x48, 120*61046927SAndroid Build Coastguard Worker midgard_alu_op_uaddsat = 0x49, 121*61046927SAndroid Build Coastguard Worker midgard_alu_op_isubsat = 0x4E, 122*61046927SAndroid Build Coastguard Worker midgard_alu_op_usubsat = 0x4F, 123*61046927SAndroid Build Coastguard Worker 124*61046927SAndroid Build Coastguard Worker midgard_alu_op_imul = 0x58, 125*61046927SAndroid Build Coastguard Worker /* Multiplies two ints and stores the result in the next larger datasize. */ 126*61046927SAndroid Build Coastguard Worker midgard_alu_op_iwmul = 0x59, /* sint * sint = sint */ 127*61046927SAndroid Build Coastguard Worker midgard_alu_op_uwmul = 0x5A, /* uint * uint = uint */ 128*61046927SAndroid Build Coastguard Worker midgard_alu_op_iuwmul = 0x5B, /* sint * uint = sint */ 129*61046927SAndroid Build Coastguard Worker 130*61046927SAndroid Build Coastguard Worker midgard_alu_op_imin = 0x60, 131*61046927SAndroid Build Coastguard Worker midgard_alu_op_umin = 0x61, 132*61046927SAndroid Build Coastguard Worker midgard_alu_op_imax = 0x62, 133*61046927SAndroid Build Coastguard Worker midgard_alu_op_umax = 0x63, 134*61046927SAndroid Build Coastguard Worker midgard_alu_op_iavg = 0x64, 135*61046927SAndroid Build Coastguard Worker midgard_alu_op_uavg = 0x65, 136*61046927SAndroid Build Coastguard Worker midgard_alu_op_iravg = 0x66, 137*61046927SAndroid Build Coastguard Worker midgard_alu_op_uravg = 0x67, 138*61046927SAndroid Build Coastguard Worker midgard_alu_op_iasr = 0x68, 139*61046927SAndroid Build Coastguard Worker midgard_alu_op_ilsr = 0x69, 140*61046927SAndroid Build Coastguard Worker midgard_alu_op_ishlsat = 0x6C, 141*61046927SAndroid Build Coastguard Worker midgard_alu_op_ushlsat = 0x6D, 142*61046927SAndroid Build Coastguard Worker midgard_alu_op_ishl = 0x6E, 143*61046927SAndroid Build Coastguard Worker 144*61046927SAndroid Build Coastguard Worker midgard_alu_op_iand = 0x70, 145*61046927SAndroid Build Coastguard Worker midgard_alu_op_ior = 0x71, 146*61046927SAndroid Build Coastguard Worker midgard_alu_op_inand = 0x72, /* ~(a & b), for inot let a = b */ 147*61046927SAndroid Build Coastguard Worker midgard_alu_op_inor = 0x73, /* ~(a | b) */ 148*61046927SAndroid Build Coastguard Worker midgard_alu_op_iandnot = 0x74, /* (a & ~b), used for not/b2f */ 149*61046927SAndroid Build Coastguard Worker midgard_alu_op_iornot = 0x75, /* (a | ~b) */ 150*61046927SAndroid Build Coastguard Worker midgard_alu_op_ixor = 0x76, 151*61046927SAndroid Build Coastguard Worker midgard_alu_op_inxor = 0x77, /* ~(a ^ b) */ 152*61046927SAndroid Build Coastguard Worker midgard_alu_op_iclz = 0x78, /* Number of zeroes on left */ 153*61046927SAndroid Build Coastguard Worker midgard_alu_op_ipopcnt = 0x7A, /* Population count */ 154*61046927SAndroid Build Coastguard Worker midgard_alu_op_imov = 0x7B, 155*61046927SAndroid Build Coastguard Worker midgard_alu_op_iabsdiff = 0x7C, 156*61046927SAndroid Build Coastguard Worker midgard_alu_op_uabsdiff = 0x7D, 157*61046927SAndroid Build Coastguard Worker midgard_alu_op_ichoose = 158*61046927SAndroid Build Coastguard Worker 0x7E, /* vector, component number - dupe for shuffle() */ 159*61046927SAndroid Build Coastguard Worker 160*61046927SAndroid Build Coastguard Worker midgard_alu_op_feq = 0x80, 161*61046927SAndroid Build Coastguard Worker midgard_alu_op_fne = 0x81, 162*61046927SAndroid Build Coastguard Worker midgard_alu_op_flt = 0x82, 163*61046927SAndroid Build Coastguard Worker midgard_alu_op_fle = 0x83, 164*61046927SAndroid Build Coastguard Worker midgard_alu_op_fball_eq = 0x88, 165*61046927SAndroid Build Coastguard Worker midgard_alu_op_fball_neq = 0x89, 166*61046927SAndroid Build Coastguard Worker midgard_alu_op_fball_lt = 0x8A, /* all(lessThan(.., ..)) */ 167*61046927SAndroid Build Coastguard Worker midgard_alu_op_fball_lte = 0x8B, /* all(lessThanEqual(.., ..)) */ 168*61046927SAndroid Build Coastguard Worker 169*61046927SAndroid Build Coastguard Worker midgard_alu_op_fbany_eq = 0x90, 170*61046927SAndroid Build Coastguard Worker midgard_alu_op_fbany_neq = 0x91, 171*61046927SAndroid Build Coastguard Worker midgard_alu_op_fbany_lt = 0x92, /* any(lessThan(.., ..)) */ 172*61046927SAndroid Build Coastguard Worker midgard_alu_op_fbany_lte = 0x93, /* any(lessThanEqual(.., ..)) */ 173*61046927SAndroid Build Coastguard Worker 174*61046927SAndroid Build Coastguard Worker midgard_alu_op_f2i_rte = 0x98, 175*61046927SAndroid Build Coastguard Worker midgard_alu_op_f2i_rtz = 0x99, 176*61046927SAndroid Build Coastguard Worker midgard_alu_op_f2i_rtn = 0x9A, 177*61046927SAndroid Build Coastguard Worker midgard_alu_op_f2i_rtp = 0x9B, 178*61046927SAndroid Build Coastguard Worker midgard_alu_op_f2u_rte = 0x9C, 179*61046927SAndroid Build Coastguard Worker midgard_alu_op_f2u_rtz = 0x9D, 180*61046927SAndroid Build Coastguard Worker midgard_alu_op_f2u_rtn = 0x9E, 181*61046927SAndroid Build Coastguard Worker midgard_alu_op_f2u_rtp = 0x9F, 182*61046927SAndroid Build Coastguard Worker 183*61046927SAndroid Build Coastguard Worker midgard_alu_op_ieq = 0xA0, 184*61046927SAndroid Build Coastguard Worker midgard_alu_op_ine = 0xA1, 185*61046927SAndroid Build Coastguard Worker midgard_alu_op_ult = 0xA2, 186*61046927SAndroid Build Coastguard Worker midgard_alu_op_ule = 0xA3, 187*61046927SAndroid Build Coastguard Worker midgard_alu_op_ilt = 0xA4, 188*61046927SAndroid Build Coastguard Worker midgard_alu_op_ile = 0xA5, 189*61046927SAndroid Build Coastguard Worker midgard_alu_op_iball_eq = 0xA8, 190*61046927SAndroid Build Coastguard Worker midgard_alu_op_iball_neq = 0xA9, 191*61046927SAndroid Build Coastguard Worker midgard_alu_op_uball_lt = 0xAA, 192*61046927SAndroid Build Coastguard Worker midgard_alu_op_uball_lte = 0xAB, 193*61046927SAndroid Build Coastguard Worker midgard_alu_op_iball_lt = 0xAC, 194*61046927SAndroid Build Coastguard Worker midgard_alu_op_iball_lte = 0xAD, 195*61046927SAndroid Build Coastguard Worker 196*61046927SAndroid Build Coastguard Worker midgard_alu_op_ibany_eq = 0xB0, 197*61046927SAndroid Build Coastguard Worker midgard_alu_op_ibany_neq = 0xB1, 198*61046927SAndroid Build Coastguard Worker midgard_alu_op_ubany_lt = 0xB2, 199*61046927SAndroid Build Coastguard Worker midgard_alu_op_ubany_lte = 0xB3, 200*61046927SAndroid Build Coastguard Worker midgard_alu_op_ibany_lt = 0xB4, /* any(lessThan(.., ..)) */ 201*61046927SAndroid Build Coastguard Worker midgard_alu_op_ibany_lte = 0xB5, /* any(lessThanEqual(.., ..)) */ 202*61046927SAndroid Build Coastguard Worker midgard_alu_op_i2f_rte = 0xB8, 203*61046927SAndroid Build Coastguard Worker midgard_alu_op_i2f_rtz = 0xB9, 204*61046927SAndroid Build Coastguard Worker midgard_alu_op_i2f_rtn = 0xBA, 205*61046927SAndroid Build Coastguard Worker midgard_alu_op_i2f_rtp = 0xBB, 206*61046927SAndroid Build Coastguard Worker midgard_alu_op_u2f_rte = 0xBC, 207*61046927SAndroid Build Coastguard Worker midgard_alu_op_u2f_rtz = 0xBD, 208*61046927SAndroid Build Coastguard Worker midgard_alu_op_u2f_rtn = 0xBE, 209*61046927SAndroid Build Coastguard Worker midgard_alu_op_u2f_rtp = 0xBF, 210*61046927SAndroid Build Coastguard Worker 211*61046927SAndroid Build Coastguard Worker /* All csel* instructions use as a condition the output of the previous 212*61046927SAndroid Build Coastguard Worker * vector or scalar unit, thus it must run on the second pipeline stage 213*61046927SAndroid Build Coastguard Worker * and be scheduled to the same bundle as the opcode that it uses as a 214*61046927SAndroid Build Coastguard Worker * condition. */ 215*61046927SAndroid Build Coastguard Worker midgard_alu_op_icsel_v = 0xC0, 216*61046927SAndroid Build Coastguard Worker midgard_alu_op_icsel = 0xC1, 217*61046927SAndroid Build Coastguard Worker midgard_alu_op_fcsel_v = 0xC4, 218*61046927SAndroid Build Coastguard Worker midgard_alu_op_fcsel = 0xC5, 219*61046927SAndroid Build Coastguard Worker midgard_alu_op_froundaway = 0xC6, /* round to nearest away */ 220*61046927SAndroid Build Coastguard Worker 221*61046927SAndroid Build Coastguard Worker midgard_alu_op_fatan2_pt2 = 0xE8, 222*61046927SAndroid Build Coastguard Worker midgard_alu_op_fpow_pt1 = 0xEC, 223*61046927SAndroid Build Coastguard Worker midgard_alu_op_fpown_pt1 = 0xED, 224*61046927SAndroid Build Coastguard Worker midgard_alu_op_fpowr_pt1 = 0xEE, 225*61046927SAndroid Build Coastguard Worker 226*61046927SAndroid Build Coastguard Worker midgard_alu_op_frcp = 0xF0, 227*61046927SAndroid Build Coastguard Worker midgard_alu_op_frsqrt = 0xF2, 228*61046927SAndroid Build Coastguard Worker midgard_alu_op_fsqrt = 0xF3, 229*61046927SAndroid Build Coastguard Worker midgard_alu_op_fexp2 = 0xF4, 230*61046927SAndroid Build Coastguard Worker midgard_alu_op_flog2 = 0xF5, 231*61046927SAndroid Build Coastguard Worker midgard_alu_op_fsinpi = 0xF6, /* sin(pi * x) */ 232*61046927SAndroid Build Coastguard Worker midgard_alu_op_fcospi = 0xF7, /* cos(pi * x) */ 233*61046927SAndroid Build Coastguard Worker midgard_alu_op_fatan2_pt1 = 0xF9, 234*61046927SAndroid Build Coastguard Worker } midgard_alu_op; 235*61046927SAndroid Build Coastguard Worker 236*61046927SAndroid Build Coastguard Worker typedef enum { 237*61046927SAndroid Build Coastguard Worker midgard_outmod_none = 0, 238*61046927SAndroid Build Coastguard Worker midgard_outmod_clamp_0_inf = 1, /* max(x, 0.0), NaNs become +0.0 */ 239*61046927SAndroid Build Coastguard Worker midgard_outmod_clamp_m1_1 = 2, /* clamp(x, -1.0, 1.0), NaNs become -1.0 */ 240*61046927SAndroid Build Coastguard Worker midgard_outmod_clamp_0_1 = 3 /* clamp(x, 0.0, 1.0), NaNs become +0.0 */ 241*61046927SAndroid Build Coastguard Worker } midgard_outmod_float; 242*61046927SAndroid Build Coastguard Worker 243*61046927SAndroid Build Coastguard Worker /* These are applied to the resulting value that's going to be stored in the 244*61046927SAndroid Build Coastguard Worker * dest reg. This should be set to midgard_outmod_keeplo when shrink_mode is 245*61046927SAndroid Build Coastguard Worker * midgard_shrink_mode_none. */ 246*61046927SAndroid Build Coastguard Worker typedef enum { 247*61046927SAndroid Build Coastguard Worker midgard_outmod_ssat = 0, 248*61046927SAndroid Build Coastguard Worker midgard_outmod_usat = 1, 249*61046927SAndroid Build Coastguard Worker midgard_outmod_keeplo = 2, /* Keep low half */ 250*61046927SAndroid Build Coastguard Worker midgard_outmod_keephi = 3, /* Keep high half */ 251*61046927SAndroid Build Coastguard Worker } midgard_outmod_int; 252*61046927SAndroid Build Coastguard Worker 253*61046927SAndroid Build Coastguard Worker typedef enum { 254*61046927SAndroid Build Coastguard Worker midgard_reg_mode_8 = 0, 255*61046927SAndroid Build Coastguard Worker midgard_reg_mode_16 = 1, 256*61046927SAndroid Build Coastguard Worker midgard_reg_mode_32 = 2, 257*61046927SAndroid Build Coastguard Worker midgard_reg_mode_64 = 3 258*61046927SAndroid Build Coastguard Worker } midgard_reg_mode; 259*61046927SAndroid Build Coastguard Worker 260*61046927SAndroid Build Coastguard Worker typedef enum { 261*61046927SAndroid Build Coastguard Worker midgard_shrink_mode_lower = 0, 262*61046927SAndroid Build Coastguard Worker midgard_shrink_mode_upper = 1, 263*61046927SAndroid Build Coastguard Worker midgard_shrink_mode_none = 2 264*61046927SAndroid Build Coastguard Worker } midgard_shrink_mode; 265*61046927SAndroid Build Coastguard Worker 266*61046927SAndroid Build Coastguard Worker /* Only used if midgard_src_expand_mode is set to one of midgard_src_expand_*. */ 267*61046927SAndroid Build Coastguard Worker typedef enum { 268*61046927SAndroid Build Coastguard Worker midgard_int_sign_extend = 0, 269*61046927SAndroid Build Coastguard Worker midgard_int_zero_extend = 1, 270*61046927SAndroid Build Coastguard Worker midgard_int_replicate = 2, 271*61046927SAndroid Build Coastguard Worker midgard_int_left_shift = 3 272*61046927SAndroid Build Coastguard Worker } midgard_int_mod; 273*61046927SAndroid Build Coastguard Worker 274*61046927SAndroid Build Coastguard Worker /* Unlike midgard_int_mod, fload modifiers are applied after the expansion 275*61046927SAndroid Build Coastguard Worker * happens, so they don't depend on midgard_src_expand_mode. */ 276*61046927SAndroid Build Coastguard Worker #define MIDGARD_FLOAT_MOD_ABS (1 << 0) 277*61046927SAndroid Build Coastguard Worker #define MIDGARD_FLOAT_MOD_NEG (1 << 1) 278*61046927SAndroid Build Coastguard Worker 279*61046927SAndroid Build Coastguard Worker /* The expand options depend on both midgard_int_mod and midgard_reg_mode. For 280*61046927SAndroid Build Coastguard Worker * example, a vec4 with midgard_int_sign_extend and midgard_src_expand_low is 281*61046927SAndroid Build Coastguard Worker * treated as a vec8 and each 16-bit element from the low 64-bits is then sign 282*61046927SAndroid Build Coastguard Worker * extended, resulting in a vec4 where each 32-bit element corresponds to a 283*61046927SAndroid Build Coastguard Worker * 16-bit element from the low 64-bits of the input vector. */ 284*61046927SAndroid Build Coastguard Worker typedef enum { 285*61046927SAndroid Build Coastguard Worker midgard_src_passthrough = 0, 286*61046927SAndroid Build Coastguard Worker midgard_src_rep_low = 1, /* replicate lower 64 bits to higher 64 bits */ 287*61046927SAndroid Build Coastguard Worker midgard_src_rep_high = 2, /* replicate higher 64 bits to lower 64 bits */ 288*61046927SAndroid Build Coastguard Worker midgard_src_swap = 3, /* swap lower 64 bits with higher 64 bits */ 289*61046927SAndroid Build Coastguard Worker midgard_src_expand_low = 4, /* expand low 64 bits */ 290*61046927SAndroid Build Coastguard Worker midgard_src_expand_high = 5, /* expand high 64 bits */ 291*61046927SAndroid Build Coastguard Worker midgard_src_expand_low_swap = 6, /* expand low 64 bits, then swap */ 292*61046927SAndroid Build Coastguard Worker midgard_src_expand_high_swap = 7, /* expand high 64 bits, then swap */ 293*61046927SAndroid Build Coastguard Worker } midgard_src_expand_mode; 294*61046927SAndroid Build Coastguard Worker 295*61046927SAndroid Build Coastguard Worker #define INPUT_EXPANDS(a) \ 296*61046927SAndroid Build Coastguard Worker (a >= midgard_src_expand_low && a <= midgard_src_expand_high_swap) 297*61046927SAndroid Build Coastguard Worker 298*61046927SAndroid Build Coastguard Worker #define INPUT_SWAPS(a) \ 299*61046927SAndroid Build Coastguard Worker (a == midgard_src_swap || a >= midgard_src_expand_low_swap) 300*61046927SAndroid Build Coastguard Worker 301*61046927SAndroid Build Coastguard Worker typedef struct __attribute__((__packed__)) { 302*61046927SAndroid Build Coastguard Worker /* Either midgard_int_mod or from midgard_float_mod_*, depending on the 303*61046927SAndroid Build Coastguard Worker * type of op */ 304*61046927SAndroid Build Coastguard Worker unsigned mod : 2; 305*61046927SAndroid Build Coastguard Worker midgard_src_expand_mode expand_mode : 3; 306*61046927SAndroid Build Coastguard Worker unsigned swizzle : 8; 307*61046927SAndroid Build Coastguard Worker } midgard_vector_alu_src; 308*61046927SAndroid Build Coastguard Worker 309*61046927SAndroid Build Coastguard Worker typedef struct __attribute__((__packed__)) { 310*61046927SAndroid Build Coastguard Worker midgard_alu_op op : 8; 311*61046927SAndroid Build Coastguard Worker midgard_reg_mode reg_mode : 2; 312*61046927SAndroid Build Coastguard Worker unsigned src1 : 13; 313*61046927SAndroid Build Coastguard Worker unsigned src2 : 13; 314*61046927SAndroid Build Coastguard Worker midgard_shrink_mode shrink_mode : 2; 315*61046927SAndroid Build Coastguard Worker unsigned outmod : 2; 316*61046927SAndroid Build Coastguard Worker unsigned mask : 8; 317*61046927SAndroid Build Coastguard Worker } midgard_vector_alu; 318*61046927SAndroid Build Coastguard Worker 319*61046927SAndroid Build Coastguard Worker typedef struct __attribute__((__packed__)) { 320*61046927SAndroid Build Coastguard Worker unsigned mod : 2; 321*61046927SAndroid Build Coastguard Worker bool full : 1; /* 0 = 16-bit, 1 = 32-bit */ 322*61046927SAndroid Build Coastguard Worker unsigned component : 3; 323*61046927SAndroid Build Coastguard Worker } midgard_scalar_alu_src; 324*61046927SAndroid Build Coastguard Worker 325*61046927SAndroid Build Coastguard Worker typedef struct __attribute__((__packed__)) { 326*61046927SAndroid Build Coastguard Worker midgard_alu_op op : 8; 327*61046927SAndroid Build Coastguard Worker unsigned src1 : 6; 328*61046927SAndroid Build Coastguard Worker /* last 5 bits are used when src2 is an immediate */ 329*61046927SAndroid Build Coastguard Worker unsigned src2 : 11; 330*61046927SAndroid Build Coastguard Worker unsigned reserved : 1; 331*61046927SAndroid Build Coastguard Worker unsigned outmod : 2; 332*61046927SAndroid Build Coastguard Worker bool output_full : 1; 333*61046927SAndroid Build Coastguard Worker unsigned output_component : 3; 334*61046927SAndroid Build Coastguard Worker } midgard_scalar_alu; 335*61046927SAndroid Build Coastguard Worker 336*61046927SAndroid Build Coastguard Worker typedef struct __attribute__((__packed__)) { 337*61046927SAndroid Build Coastguard Worker unsigned src1_reg : 5; 338*61046927SAndroid Build Coastguard Worker unsigned src2_reg : 5; 339*61046927SAndroid Build Coastguard Worker unsigned out_reg : 5; 340*61046927SAndroid Build Coastguard Worker bool src2_imm : 1; 341*61046927SAndroid Build Coastguard Worker } midgard_reg_info; 342*61046927SAndroid Build Coastguard Worker 343*61046927SAndroid Build Coastguard Worker /* In addition to conditional branches and jumps (unconditional branches), 344*61046927SAndroid Build Coastguard Worker * Midgard implements a bit of fixed function functionality used in fragment 345*61046927SAndroid Build Coastguard Worker * shaders via specially crafted branches. These have special branch opcodes, 346*61046927SAndroid Build Coastguard Worker * which perform a fixed-function operation and/or use the results of a 347*61046927SAndroid Build Coastguard Worker * fixed-function operation as the branch condition. */ 348*61046927SAndroid Build Coastguard Worker 349*61046927SAndroid Build Coastguard Worker typedef enum { 350*61046927SAndroid Build Coastguard Worker /* Regular branches */ 351*61046927SAndroid Build Coastguard Worker midgard_jmp_writeout_op_branch_uncond = 1, 352*61046927SAndroid Build Coastguard Worker midgard_jmp_writeout_op_branch_cond = 2, 353*61046927SAndroid Build Coastguard Worker 354*61046927SAndroid Build Coastguard Worker /* In a fragment shader, execute a discard_if instruction, with the 355*61046927SAndroid Build Coastguard Worker * corresponding condition code. Terminates the shader, so generally 356*61046927SAndroid Build Coastguard Worker * set the branch target to out of the shader */ 357*61046927SAndroid Build Coastguard Worker midgard_jmp_writeout_op_discard = 4, 358*61046927SAndroid Build Coastguard Worker 359*61046927SAndroid Build Coastguard Worker /* Branch if the tilebuffer is not yet ready. At the beginning of a 360*61046927SAndroid Build Coastguard Worker * fragment shader that reads from the tile buffer, for instance via 361*61046927SAndroid Build Coastguard Worker * ARM_shader_framebuffer_fetch or EXT_pixel_local_storage, this branch 362*61046927SAndroid Build Coastguard Worker * operation should be used as a loop. An instruction like 363*61046927SAndroid Build Coastguard Worker * "br.tilebuffer.always -1" does the trick, corresponding to 364*61046927SAndroid Build Coastguard Worker * "while(!is_tilebuffer_ready) */ 365*61046927SAndroid Build Coastguard Worker midgard_jmp_writeout_op_tilebuffer_pending = 6, 366*61046927SAndroid Build Coastguard Worker 367*61046927SAndroid Build Coastguard Worker /* In a fragment shader, try to write out the value pushed to r0 to the 368*61046927SAndroid Build Coastguard Worker * tilebuffer, subject to state in r1.z and r1.w. If this 369*61046927SAndroid Build Coastguard Worker * succeeds, the shader terminates. If it fails, it branches to the 370*61046927SAndroid Build Coastguard Worker * specified branch target. Generally, this should be used in a loop to 371*61046927SAndroid Build Coastguard Worker * itself, acting as "do { write(r0); } while(!write_successful);" */ 372*61046927SAndroid Build Coastguard Worker midgard_jmp_writeout_op_writeout = 7, 373*61046927SAndroid Build Coastguard Worker } midgard_jmp_writeout_op; 374*61046927SAndroid Build Coastguard Worker 375*61046927SAndroid Build Coastguard Worker typedef enum { 376*61046927SAndroid Build Coastguard Worker midgard_condition_write0 = 0, 377*61046927SAndroid Build Coastguard Worker 378*61046927SAndroid Build Coastguard Worker /* These condition codes denote a conditional branch on FALSE and on 379*61046927SAndroid Build Coastguard Worker * TRUE respectively */ 380*61046927SAndroid Build Coastguard Worker midgard_condition_false = 1, 381*61046927SAndroid Build Coastguard Worker midgard_condition_true = 2, 382*61046927SAndroid Build Coastguard Worker 383*61046927SAndroid Build Coastguard Worker /* This condition code always branches. For a pure branch, the 384*61046927SAndroid Build Coastguard Worker * unconditional branch coding should be used instead, but for 385*61046927SAndroid Build Coastguard Worker * fixed-function branch opcodes, this is still useful */ 386*61046927SAndroid Build Coastguard Worker midgard_condition_always = 3, 387*61046927SAndroid Build Coastguard Worker } midgard_condition; 388*61046927SAndroid Build Coastguard Worker 389*61046927SAndroid Build Coastguard Worker enum midgard_call_mode { 390*61046927SAndroid Build Coastguard Worker midgard_call_mode_default = 1, 391*61046927SAndroid Build Coastguard Worker midgard_call_mode_call = 2, 392*61046927SAndroid Build Coastguard Worker midgard_call_mode_return = 3 393*61046927SAndroid Build Coastguard Worker }; 394*61046927SAndroid Build Coastguard Worker 395*61046927SAndroid Build Coastguard Worker typedef struct __attribute__((__packed__)) { 396*61046927SAndroid Build Coastguard Worker midgard_jmp_writeout_op op : 3; /* == branch_uncond */ 397*61046927SAndroid Build Coastguard Worker unsigned dest_tag : 4; /* tag of branch destination */ 398*61046927SAndroid Build Coastguard Worker enum midgard_call_mode call_mode : 2; 399*61046927SAndroid Build Coastguard Worker int offset : 7; 400*61046927SAndroid Build Coastguard Worker } midgard_branch_uncond; 401*61046927SAndroid Build Coastguard Worker 402*61046927SAndroid Build Coastguard Worker typedef struct __attribute__((__packed__)) { 403*61046927SAndroid Build Coastguard Worker midgard_jmp_writeout_op op : 3; /* == branch_cond */ 404*61046927SAndroid Build Coastguard Worker unsigned dest_tag : 4; /* tag of branch destination */ 405*61046927SAndroid Build Coastguard Worker int offset : 7; 406*61046927SAndroid Build Coastguard Worker midgard_condition cond : 2; 407*61046927SAndroid Build Coastguard Worker } midgard_branch_cond; 408*61046927SAndroid Build Coastguard Worker 409*61046927SAndroid Build Coastguard Worker typedef struct __attribute__((__packed__)) { 410*61046927SAndroid Build Coastguard Worker midgard_jmp_writeout_op op : 3; /* == branch_cond */ 411*61046927SAndroid Build Coastguard Worker unsigned dest_tag : 4; /* tag of branch destination */ 412*61046927SAndroid Build Coastguard Worker enum midgard_call_mode call_mode : 2; 413*61046927SAndroid Build Coastguard Worker signed offset : 23; 414*61046927SAndroid Build Coastguard Worker 415*61046927SAndroid Build Coastguard Worker /* Extended branches permit inputting up to 4 conditions loaded into 416*61046927SAndroid Build Coastguard Worker * r31 (two in r31.w and two in r31.x). In the most general case, we 417*61046927SAndroid Build Coastguard Worker * specify a function f(A, B, C, D) mapping 4 1-bit conditions to a 418*61046927SAndroid Build Coastguard Worker * single 1-bit branch criteria. Note that the domain of f has 2^(2^4) 419*61046927SAndroid Build Coastguard Worker * elements, each mapping to 1-bit of output, so we can trivially 420*61046927SAndroid Build Coastguard Worker * construct a Godel numbering of f as a (2^4)=16-bit integer. This 421*61046927SAndroid Build Coastguard Worker * 16-bit integer serves as a lookup table to compute f, subject to 422*61046927SAndroid Build Coastguard Worker * some swaps for ordering. 423*61046927SAndroid Build Coastguard Worker * 424*61046927SAndroid Build Coastguard Worker * Interesting, the standard 2-bit condition codes are also a LUT with 425*61046927SAndroid Build Coastguard Worker * the same format (2^1-bit), but it's usually easier to use enums. */ 426*61046927SAndroid Build Coastguard Worker 427*61046927SAndroid Build Coastguard Worker unsigned cond : 16; 428*61046927SAndroid Build Coastguard Worker } midgard_branch_extended; 429*61046927SAndroid Build Coastguard Worker 430*61046927SAndroid Build Coastguard Worker typedef struct __attribute__((__packed__)) { 431*61046927SAndroid Build Coastguard Worker midgard_jmp_writeout_op op : 3; /* == writeout */ 432*61046927SAndroid Build Coastguard Worker unsigned unknown : 13; 433*61046927SAndroid Build Coastguard Worker } midgard_writeout; 434*61046927SAndroid Build Coastguard Worker 435*61046927SAndroid Build Coastguard Worker /* 436*61046927SAndroid Build Coastguard Worker * Load/store words 437*61046927SAndroid Build Coastguard Worker */ 438*61046927SAndroid Build Coastguard Worker 439*61046927SAndroid Build Coastguard Worker typedef enum { 440*61046927SAndroid Build Coastguard Worker midgard_op_ld_st_noop = 0x03, 441*61046927SAndroid Build Coastguard Worker 442*61046927SAndroid Build Coastguard Worker /* Unpacks a colour from a native format to <format> */ 443*61046927SAndroid Build Coastguard Worker midgard_op_unpack_colour_f32 = 0x04, 444*61046927SAndroid Build Coastguard Worker midgard_op_unpack_colour_f16 = 0x05, 445*61046927SAndroid Build Coastguard Worker midgard_op_unpack_colour_u32 = 0x06, 446*61046927SAndroid Build Coastguard Worker midgard_op_unpack_colour_s32 = 0x07, 447*61046927SAndroid Build Coastguard Worker 448*61046927SAndroid Build Coastguard Worker /* Packs a colour from <format> to a native format */ 449*61046927SAndroid Build Coastguard Worker midgard_op_pack_colour_f32 = 0x08, 450*61046927SAndroid Build Coastguard Worker midgard_op_pack_colour_f16 = 0x09, 451*61046927SAndroid Build Coastguard Worker midgard_op_pack_colour_u32 = 0x0A, 452*61046927SAndroid Build Coastguard Worker midgard_op_pack_colour_s32 = 0x0B, 453*61046927SAndroid Build Coastguard Worker 454*61046927SAndroid Build Coastguard Worker /* Computes the effective address of a mem address expression */ 455*61046927SAndroid Build Coastguard Worker midgard_op_lea = 0x0C, 456*61046927SAndroid Build Coastguard Worker 457*61046927SAndroid Build Coastguard Worker /* Converts image coordinates into mem address */ 458*61046927SAndroid Build Coastguard Worker midgard_op_lea_image = 0x0D, 459*61046927SAndroid Build Coastguard Worker 460*61046927SAndroid Build Coastguard Worker /* Unclear why this is on the L/S unit, but moves fp32 cube map 461*61046927SAndroid Build Coastguard Worker * coordinates in r27 to its cube map texture coordinate destination 462*61046927SAndroid Build Coastguard Worker * (e.g r29). */ 463*61046927SAndroid Build Coastguard Worker 464*61046927SAndroid Build Coastguard Worker midgard_op_ld_cubemap_coords = 0x0E, 465*61046927SAndroid Build Coastguard Worker 466*61046927SAndroid Build Coastguard Worker /* A mov between registers that the ldst pipeline can access */ 467*61046927SAndroid Build Coastguard Worker midgard_op_ldst_mov = 0x10, 468*61046927SAndroid Build Coastguard Worker 469*61046927SAndroid Build Coastguard Worker /* The L/S unit can do perspective division a clock faster than the ALU 470*61046927SAndroid Build Coastguard Worker * if you're lucky. Put the vec4 in r27, and call with 0x24 as the 471*61046927SAndroid Build Coastguard Worker * unknown state; the output will be <x/w, y/w, z/w, 1>. Replace w with 472*61046927SAndroid Build Coastguard Worker * z for the z version */ 473*61046927SAndroid Build Coastguard Worker midgard_op_ldst_perspective_div_y = 0x11, 474*61046927SAndroid Build Coastguard Worker midgard_op_ldst_perspective_div_z = 0x12, 475*61046927SAndroid Build Coastguard Worker midgard_op_ldst_perspective_div_w = 0x13, 476*61046927SAndroid Build Coastguard Worker 477*61046927SAndroid Build Coastguard Worker /* val in r27.y, address embedded, outputs result to argument. Invert val for 478*61046927SAndroid Build Coastguard Worker sub. Let val = +-1 for inc/dec. */ 479*61046927SAndroid Build Coastguard Worker midgard_op_atomic_add = 0x40, 480*61046927SAndroid Build Coastguard Worker midgard_op_atomic_add64 = 0x41, 481*61046927SAndroid Build Coastguard Worker midgard_op_atomic_add_be = 0x42, 482*61046927SAndroid Build Coastguard Worker midgard_op_atomic_add64_be = 0x43, 483*61046927SAndroid Build Coastguard Worker 484*61046927SAndroid Build Coastguard Worker midgard_op_atomic_and = 0x44, 485*61046927SAndroid Build Coastguard Worker midgard_op_atomic_and64 = 0x45, 486*61046927SAndroid Build Coastguard Worker midgard_op_atomic_and_be = 0x46, 487*61046927SAndroid Build Coastguard Worker midgard_op_atomic_and64_be = 0x47, 488*61046927SAndroid Build Coastguard Worker midgard_op_atomic_or = 0x48, 489*61046927SAndroid Build Coastguard Worker midgard_op_atomic_or64 = 0x49, 490*61046927SAndroid Build Coastguard Worker midgard_op_atomic_or_be = 0x4A, 491*61046927SAndroid Build Coastguard Worker midgard_op_atomic_or64_be = 0x4B, 492*61046927SAndroid Build Coastguard Worker midgard_op_atomic_xor = 0x4C, 493*61046927SAndroid Build Coastguard Worker midgard_op_atomic_xor64 = 0x4D, 494*61046927SAndroid Build Coastguard Worker midgard_op_atomic_xor_be = 0x4E, 495*61046927SAndroid Build Coastguard Worker midgard_op_atomic_xor64_be = 0x4F, 496*61046927SAndroid Build Coastguard Worker 497*61046927SAndroid Build Coastguard Worker midgard_op_atomic_imin = 0x50, 498*61046927SAndroid Build Coastguard Worker midgard_op_atomic_imin64 = 0x51, 499*61046927SAndroid Build Coastguard Worker midgard_op_atomic_imin_be = 0x52, 500*61046927SAndroid Build Coastguard Worker midgard_op_atomic_imin64_be = 0x53, 501*61046927SAndroid Build Coastguard Worker midgard_op_atomic_umin = 0x54, 502*61046927SAndroid Build Coastguard Worker midgard_op_atomic_umin64 = 0x55, 503*61046927SAndroid Build Coastguard Worker midgard_op_atomic_umin_be = 0x56, 504*61046927SAndroid Build Coastguard Worker midgard_op_atomic_umin64_be = 0x57, 505*61046927SAndroid Build Coastguard Worker midgard_op_atomic_imax = 0x58, 506*61046927SAndroid Build Coastguard Worker midgard_op_atomic_imax64 = 0x59, 507*61046927SAndroid Build Coastguard Worker midgard_op_atomic_imax_be = 0x5A, 508*61046927SAndroid Build Coastguard Worker midgard_op_atomic_imax64_be = 0x5B, 509*61046927SAndroid Build Coastguard Worker midgard_op_atomic_umax = 0x5C, 510*61046927SAndroid Build Coastguard Worker midgard_op_atomic_umax64 = 0x5D, 511*61046927SAndroid Build Coastguard Worker midgard_op_atomic_umax_be = 0x5E, 512*61046927SAndroid Build Coastguard Worker midgard_op_atomic_umax64_be = 0x5F, 513*61046927SAndroid Build Coastguard Worker 514*61046927SAndroid Build Coastguard Worker midgard_op_atomic_xchg = 0x60, 515*61046927SAndroid Build Coastguard Worker midgard_op_atomic_xchg64 = 0x61, 516*61046927SAndroid Build Coastguard Worker midgard_op_atomic_xchg_be = 0x62, 517*61046927SAndroid Build Coastguard Worker midgard_op_atomic_xchg64_be = 0x63, 518*61046927SAndroid Build Coastguard Worker 519*61046927SAndroid Build Coastguard Worker midgard_op_atomic_cmpxchg = 0x64, 520*61046927SAndroid Build Coastguard Worker midgard_op_atomic_cmpxchg64 = 0x65, 521*61046927SAndroid Build Coastguard Worker midgard_op_atomic_cmpxchg_be = 0x66, 522*61046927SAndroid Build Coastguard Worker midgard_op_atomic_cmpxchg64_be = 0x67, 523*61046927SAndroid Build Coastguard Worker 524*61046927SAndroid Build Coastguard Worker /* Used for compute shader's __global arguments, __local 525*61046927SAndroid Build Coastguard Worker * variables (or for register spilling) */ 526*61046927SAndroid Build Coastguard Worker 527*61046927SAndroid Build Coastguard Worker midgard_op_ld_u8 = 0x80, /* zero extends */ 528*61046927SAndroid Build Coastguard Worker midgard_op_ld_i8 = 0x81, /* sign extends */ 529*61046927SAndroid Build Coastguard Worker midgard_op_ld_u16 = 0x84, /* zero extends */ 530*61046927SAndroid Build Coastguard Worker midgard_op_ld_i16 = 0x85, /* sign extends */ 531*61046927SAndroid Build Coastguard Worker midgard_op_ld_u16_be = 0x86, /* zero extends, big endian */ 532*61046927SAndroid Build Coastguard Worker midgard_op_ld_i16_be = 0x87, /* sign extends, big endian */ 533*61046927SAndroid Build Coastguard Worker midgard_op_ld_32 = 0x88, /* short2, int, float */ 534*61046927SAndroid Build Coastguard Worker midgard_op_ld_32_bswap2 = 0x89, /* 16-bit big endian vector */ 535*61046927SAndroid Build Coastguard Worker midgard_op_ld_32_bswap4 = 0x8A, /* 32-bit big endian scalar */ 536*61046927SAndroid Build Coastguard Worker midgard_op_ld_64 = 0x8C, /* int2, float2, long */ 537*61046927SAndroid Build Coastguard Worker midgard_op_ld_64_bswap2 = 0x8D, /* 16-bit big endian vector */ 538*61046927SAndroid Build Coastguard Worker midgard_op_ld_64_bswap4 = 0x8E, /* 32-bit big endian vector */ 539*61046927SAndroid Build Coastguard Worker midgard_op_ld_64_bswap8 = 0x8F, /* 64-bit big endian scalar */ 540*61046927SAndroid Build Coastguard Worker midgard_op_ld_128 = 0x90, /* float4, long2 */ 541*61046927SAndroid Build Coastguard Worker midgard_op_ld_128_bswap2 = 0x91, /* 16-bit big endian vector */ 542*61046927SAndroid Build Coastguard Worker midgard_op_ld_128_bswap4 = 0x92, /* 32-bit big endian vector */ 543*61046927SAndroid Build Coastguard Worker midgard_op_ld_128_bswap8 = 0x93, /* 64-bit big endian vector */ 544*61046927SAndroid Build Coastguard Worker 545*61046927SAndroid Build Coastguard Worker midgard_op_ld_attr_32 = 0x94, 546*61046927SAndroid Build Coastguard Worker midgard_op_ld_attr_16 = 0x95, 547*61046927SAndroid Build Coastguard Worker midgard_op_ld_attr_32u = 0x96, 548*61046927SAndroid Build Coastguard Worker midgard_op_ld_attr_32i = 0x97, 549*61046927SAndroid Build Coastguard Worker midgard_op_ld_vary_32 = 0x98, 550*61046927SAndroid Build Coastguard Worker midgard_op_ld_vary_16 = 0x99, 551*61046927SAndroid Build Coastguard Worker midgard_op_ld_vary_32u = 0x9A, 552*61046927SAndroid Build Coastguard Worker midgard_op_ld_vary_32i = 0x9B, 553*61046927SAndroid Build Coastguard Worker 554*61046927SAndroid Build Coastguard Worker /* This instruction behaves differently depending if the gpu is a v4 555*61046927SAndroid Build Coastguard Worker * or a newer gpu. The main difference hinges on which values of the 556*61046927SAndroid Build Coastguard Worker * second argument are valid for each gpu. 557*61046927SAndroid Build Coastguard Worker * TODO: properly document and decode each possible value for the 558*61046927SAndroid Build Coastguard Worker * second argument. */ 559*61046927SAndroid Build Coastguard Worker midgard_op_ld_special_32f = 0x9C, 560*61046927SAndroid Build Coastguard Worker midgard_op_ld_special_16f = 0x9D, 561*61046927SAndroid Build Coastguard Worker midgard_op_ld_special_32u = 0x9E, 562*61046927SAndroid Build Coastguard Worker midgard_op_ld_special_32i = 0x9F, 563*61046927SAndroid Build Coastguard Worker 564*61046927SAndroid Build Coastguard Worker /* The distinction between these ops is the alignment 565*61046927SAndroid Build Coastguard Worker * requirement / accompanying shift. Thus, the offset to 566*61046927SAndroid Build Coastguard Worker * ld_ubo_128 is in 16-byte units and can load 128-bit. The 567*61046927SAndroid Build Coastguard Worker * offset to ld_ubo_64 is in 8-byte units; ld_ubo_32 in 4-byte 568*61046927SAndroid Build Coastguard Worker * units. */ 569*61046927SAndroid Build Coastguard Worker midgard_op_ld_ubo_u8 = 0xA0, /* theoretical */ 570*61046927SAndroid Build Coastguard Worker midgard_op_ld_ubo_i8 = 0xA1, /* theoretical */ 571*61046927SAndroid Build Coastguard Worker midgard_op_ld_ubo_u16 = 0xA4, /* theoretical */ 572*61046927SAndroid Build Coastguard Worker midgard_op_ld_ubo_i16 = 0xA5, /* theoretical */ 573*61046927SAndroid Build Coastguard Worker midgard_op_ld_ubo_u16_be = 0xA6, /* theoretical */ 574*61046927SAndroid Build Coastguard Worker midgard_op_ld_ubo_i16_be = 0xA7, /* theoretical */ 575*61046927SAndroid Build Coastguard Worker midgard_op_ld_ubo_32 = 0xA8, 576*61046927SAndroid Build Coastguard Worker midgard_op_ld_ubo_32_bswap2 = 0xA9, 577*61046927SAndroid Build Coastguard Worker midgard_op_ld_ubo_32_bswap4 = 0xAA, 578*61046927SAndroid Build Coastguard Worker midgard_op_ld_ubo_64 = 0xAC, 579*61046927SAndroid Build Coastguard Worker midgard_op_ld_ubo_64_bswap2 = 0xAD, 580*61046927SAndroid Build Coastguard Worker midgard_op_ld_ubo_64_bswap4 = 0xAE, 581*61046927SAndroid Build Coastguard Worker midgard_op_ld_ubo_64_bswap8 = 0xAF, 582*61046927SAndroid Build Coastguard Worker midgard_op_ld_ubo_128 = 0xB0, 583*61046927SAndroid Build Coastguard Worker midgard_op_ld_ubo_128_bswap2 = 0xB1, 584*61046927SAndroid Build Coastguard Worker midgard_op_ld_ubo_128_bswap4 = 0xB2, 585*61046927SAndroid Build Coastguard Worker midgard_op_ld_ubo_128_bswap8 = 0xB3, 586*61046927SAndroid Build Coastguard Worker 587*61046927SAndroid Build Coastguard Worker midgard_op_ld_image_32f = 0xB4, 588*61046927SAndroid Build Coastguard Worker midgard_op_ld_image_16f = 0xB5, 589*61046927SAndroid Build Coastguard Worker midgard_op_ld_image_32u = 0xB6, 590*61046927SAndroid Build Coastguard Worker midgard_op_ld_image_32i = 0xB7, 591*61046927SAndroid Build Coastguard Worker 592*61046927SAndroid Build Coastguard Worker /* Only works on v5 or newer. 593*61046927SAndroid Build Coastguard Worker * Older cards must use ld_special with tilebuffer selectors. */ 594*61046927SAndroid Build Coastguard Worker midgard_op_ld_tilebuffer_32f = 0xB8, 595*61046927SAndroid Build Coastguard Worker midgard_op_ld_tilebuffer_16f = 0xB9, 596*61046927SAndroid Build Coastguard Worker midgard_op_ld_tilebuffer_raw = 0xBA, 597*61046927SAndroid Build Coastguard Worker 598*61046927SAndroid Build Coastguard Worker midgard_op_st_u8 = 0xC0, /* zero extends */ 599*61046927SAndroid Build Coastguard Worker midgard_op_st_i8 = 0xC1, /* sign extends */ 600*61046927SAndroid Build Coastguard Worker midgard_op_st_u16 = 0xC4, /* zero extends */ 601*61046927SAndroid Build Coastguard Worker midgard_op_st_i16 = 0xC5, /* sign extends */ 602*61046927SAndroid Build Coastguard Worker midgard_op_st_u16_be = 0xC6, /* zero extends, big endian */ 603*61046927SAndroid Build Coastguard Worker midgard_op_st_i16_be = 0xC7, /* sign extends, big endian */ 604*61046927SAndroid Build Coastguard Worker midgard_op_st_32 = 0xC8, /* short2, int, float */ 605*61046927SAndroid Build Coastguard Worker midgard_op_st_32_bswap2 = 0xC9, /* 16-bit big endian vector */ 606*61046927SAndroid Build Coastguard Worker midgard_op_st_32_bswap4 = 0xCA, /* 32-bit big endian scalar */ 607*61046927SAndroid Build Coastguard Worker midgard_op_st_64 = 0xCC, /* int2, float2, long */ 608*61046927SAndroid Build Coastguard Worker midgard_op_st_64_bswap2 = 0xCD, /* 16-bit big endian vector */ 609*61046927SAndroid Build Coastguard Worker midgard_op_st_64_bswap4 = 0xCE, /* 32-bit big endian vector */ 610*61046927SAndroid Build Coastguard Worker midgard_op_st_64_bswap8 = 0xCF, /* 64-bit big endian scalar */ 611*61046927SAndroid Build Coastguard Worker midgard_op_st_128 = 0xD0, /* float4, long2 */ 612*61046927SAndroid Build Coastguard Worker midgard_op_st_128_bswap2 = 0xD1, /* 16-bit big endian vector */ 613*61046927SAndroid Build Coastguard Worker midgard_op_st_128_bswap4 = 0xD2, /* 32-bit big endian vector */ 614*61046927SAndroid Build Coastguard Worker midgard_op_st_128_bswap8 = 0xD3, /* 64-bit big endian vector */ 615*61046927SAndroid Build Coastguard Worker 616*61046927SAndroid Build Coastguard Worker midgard_op_st_vary_32 = 0xD4, 617*61046927SAndroid Build Coastguard Worker midgard_op_st_vary_16 = 0xD5, 618*61046927SAndroid Build Coastguard Worker midgard_op_st_vary_32u = 0xD6, 619*61046927SAndroid Build Coastguard Worker midgard_op_st_vary_32i = 0xD7, 620*61046927SAndroid Build Coastguard Worker 621*61046927SAndroid Build Coastguard Worker /* Value to st in r27, location r26.w as short2 */ 622*61046927SAndroid Build Coastguard Worker midgard_op_st_image_32f = 0xD8, 623*61046927SAndroid Build Coastguard Worker midgard_op_st_image_16f = 0xD9, 624*61046927SAndroid Build Coastguard Worker midgard_op_st_image_32u = 0xDA, 625*61046927SAndroid Build Coastguard Worker midgard_op_st_image_32i = 0xDB, 626*61046927SAndroid Build Coastguard Worker 627*61046927SAndroid Build Coastguard Worker midgard_op_st_special_32f = 0xDC, 628*61046927SAndroid Build Coastguard Worker midgard_op_st_special_16f = 0xDD, 629*61046927SAndroid Build Coastguard Worker midgard_op_st_special_32u = 0xDE, 630*61046927SAndroid Build Coastguard Worker midgard_op_st_special_32i = 0xDF, 631*61046927SAndroid Build Coastguard Worker 632*61046927SAndroid Build Coastguard Worker /* Only works on v5 or newer. 633*61046927SAndroid Build Coastguard Worker * Older cards must use ld_special with tilebuffer selectors. */ 634*61046927SAndroid Build Coastguard Worker midgard_op_st_tilebuffer_32f = 0xE8, 635*61046927SAndroid Build Coastguard Worker midgard_op_st_tilebuffer_16f = 0xE9, 636*61046927SAndroid Build Coastguard Worker midgard_op_st_tilebuffer_raw = 0xEA, 637*61046927SAndroid Build Coastguard Worker midgard_op_trap = 0xFC, 638*61046927SAndroid Build Coastguard Worker } midgard_load_store_op; 639*61046927SAndroid Build Coastguard Worker 640*61046927SAndroid Build Coastguard Worker typedef enum { 641*61046927SAndroid Build Coastguard Worker midgard_interp_sample = 0, 642*61046927SAndroid Build Coastguard Worker midgard_interp_centroid = 1, 643*61046927SAndroid Build Coastguard Worker midgard_interp_default = 2 644*61046927SAndroid Build Coastguard Worker } midgard_interpolation; 645*61046927SAndroid Build Coastguard Worker 646*61046927SAndroid Build Coastguard Worker typedef enum { 647*61046927SAndroid Build Coastguard Worker midgard_varying_mod_none = 0, 648*61046927SAndroid Build Coastguard Worker 649*61046927SAndroid Build Coastguard Worker /* Take the would-be result and divide all components by its y/z/w 650*61046927SAndroid Build Coastguard Worker * (perspective division baked in with the load) */ 651*61046927SAndroid Build Coastguard Worker midgard_varying_mod_perspective_y = 1, 652*61046927SAndroid Build Coastguard Worker midgard_varying_mod_perspective_z = 2, 653*61046927SAndroid Build Coastguard Worker midgard_varying_mod_perspective_w = 3, 654*61046927SAndroid Build Coastguard Worker 655*61046927SAndroid Build Coastguard Worker /* The result is a 64-bit cubemap descriptor to use with 656*61046927SAndroid Build Coastguard Worker * midgard_tex_op_normal or midgard_tex_op_gradient */ 657*61046927SAndroid Build Coastguard Worker midgard_varying_mod_cubemap = 4, 658*61046927SAndroid Build Coastguard Worker } midgard_varying_modifier; 659*61046927SAndroid Build Coastguard Worker 660*61046927SAndroid Build Coastguard Worker typedef struct __attribute__((__packed__)) { 661*61046927SAndroid Build Coastguard Worker midgard_varying_modifier modifier : 3; 662*61046927SAndroid Build Coastguard Worker 663*61046927SAndroid Build Coastguard Worker bool flat_shading : 1; 664*61046927SAndroid Build Coastguard Worker 665*61046927SAndroid Build Coastguard Worker /* These are ignored if flat_shading is enabled. */ 666*61046927SAndroid Build Coastguard Worker bool perspective_correction : 1; 667*61046927SAndroid Build Coastguard Worker bool centroid_mapping : 1; 668*61046927SAndroid Build Coastguard Worker 669*61046927SAndroid Build Coastguard Worker /* This is ignored if the shader only runs once per pixel. */ 670*61046927SAndroid Build Coastguard Worker bool interpolate_sample : 1; 671*61046927SAndroid Build Coastguard Worker 672*61046927SAndroid Build Coastguard Worker bool zero0 : 1; /* Always zero */ 673*61046927SAndroid Build Coastguard Worker 674*61046927SAndroid Build Coastguard Worker unsigned direct_sample_pos_x : 4; 675*61046927SAndroid Build Coastguard Worker unsigned direct_sample_pos_y : 4; 676*61046927SAndroid Build Coastguard Worker } midgard_varying_params; 677*61046927SAndroid Build Coastguard Worker 678*61046927SAndroid Build Coastguard Worker /* 8-bit register/etc selector for load/store ops */ 679*61046927SAndroid Build Coastguard Worker typedef struct __attribute__((__packed__)) { 680*61046927SAndroid Build Coastguard Worker /* Indexes into the register */ 681*61046927SAndroid Build Coastguard Worker unsigned component : 2; 682*61046927SAndroid Build Coastguard Worker 683*61046927SAndroid Build Coastguard Worker /* Register select between r26/r27 */ 684*61046927SAndroid Build Coastguard Worker unsigned select : 1; 685*61046927SAndroid Build Coastguard Worker 686*61046927SAndroid Build Coastguard Worker unsigned unknown : 2; 687*61046927SAndroid Build Coastguard Worker 688*61046927SAndroid Build Coastguard Worker /* Like any good Arm instruction set, load/store arguments can be 689*61046927SAndroid Build Coastguard Worker * implicitly left-shifted... but only the second argument. Zero for no 690*61046927SAndroid Build Coastguard Worker * shifting, up to <<7 possible though. This is useful for indexing. 691*61046927SAndroid Build Coastguard Worker * 692*61046927SAndroid Build Coastguard Worker * For the first argument, it's unknown what these bits mean */ 693*61046927SAndroid Build Coastguard Worker unsigned shift : 3; 694*61046927SAndroid Build Coastguard Worker } midgard_ldst_register_select; 695*61046927SAndroid Build Coastguard Worker 696*61046927SAndroid Build Coastguard Worker typedef enum { 697*61046927SAndroid Build Coastguard Worker /* 0 is reserved */ 698*61046927SAndroid Build Coastguard Worker midgard_index_address_u64 = 1, 699*61046927SAndroid Build Coastguard Worker midgard_index_address_u32 = 2, 700*61046927SAndroid Build Coastguard Worker midgard_index_address_s32 = 3, 701*61046927SAndroid Build Coastguard Worker } midgard_index_address_format; 702*61046927SAndroid Build Coastguard Worker 703*61046927SAndroid Build Coastguard Worker typedef struct __attribute__((__packed__)) { 704*61046927SAndroid Build Coastguard Worker midgard_load_store_op op : 8; 705*61046927SAndroid Build Coastguard Worker 706*61046927SAndroid Build Coastguard Worker /* Source/dest reg */ 707*61046927SAndroid Build Coastguard Worker unsigned reg : 5; 708*61046927SAndroid Build Coastguard Worker 709*61046927SAndroid Build Coastguard Worker /* Generally is a writemask. 710*61046927SAndroid Build Coastguard Worker * For ST_ATTR and ST_TEX, unused. 711*61046927SAndroid Build Coastguard Worker * For other stores, each bit masks 1/4th of the output. */ 712*61046927SAndroid Build Coastguard Worker unsigned mask : 4; 713*61046927SAndroid Build Coastguard Worker 714*61046927SAndroid Build Coastguard Worker /* Swizzle for stores, but for atomics it encodes also the source 715*61046927SAndroid Build Coastguard Worker * register. This fits because atomics dont need a swizzle since they 716*61046927SAndroid Build Coastguard Worker * are not vectorized instructions. */ 717*61046927SAndroid Build Coastguard Worker unsigned swizzle : 8; 718*61046927SAndroid Build Coastguard Worker 719*61046927SAndroid Build Coastguard Worker /* Arg reg, meaning changes according to each opcode */ 720*61046927SAndroid Build Coastguard Worker unsigned arg_comp : 2; 721*61046927SAndroid Build Coastguard Worker unsigned arg_reg : 3; 722*61046927SAndroid Build Coastguard Worker 723*61046927SAndroid Build Coastguard Worker /* 64-bit address enable 724*61046927SAndroid Build Coastguard Worker * 32-bit data type enable for CUBEMAP and perspective div. 725*61046927SAndroid Build Coastguard Worker * Explicit indexing enable for LD_ATTR. 726*61046927SAndroid Build Coastguard Worker * 64-bit coordinate enable for LD_IMAGE. */ 727*61046927SAndroid Build Coastguard Worker bool bitsize_toggle : 1; 728*61046927SAndroid Build Coastguard Worker 729*61046927SAndroid Build Coastguard Worker /* These are mainly used for opcodes that have addresses. 730*61046927SAndroid Build Coastguard Worker * For cmpxchg, index_reg is used for the comparison value. 731*61046927SAndroid Build Coastguard Worker * For ops that access the attrib table, bit 1 encodes which table. 732*61046927SAndroid Build Coastguard Worker * For LD_VAR and LD/ST_ATTR, bit 0 enables dest/src type inferral. */ 733*61046927SAndroid Build Coastguard Worker midgard_index_address_format index_format : 2; 734*61046927SAndroid Build Coastguard Worker unsigned index_comp : 2; 735*61046927SAndroid Build Coastguard Worker unsigned index_reg : 3; 736*61046927SAndroid Build Coastguard Worker unsigned index_shift : 4; 737*61046927SAndroid Build Coastguard Worker 738*61046927SAndroid Build Coastguard Worker /* Generaly is a signed offset, but has different bitsize and starts at 739*61046927SAndroid Build Coastguard Worker * different bits depending on the opcode, LDST_*_DISPLACEMENT helpers 740*61046927SAndroid Build Coastguard Worker * are recommended when packing/unpacking this attribute. 741*61046927SAndroid Build Coastguard Worker * For LD_UBO, bit 0 enables ubo index immediate. 742*61046927SAndroid Build Coastguard Worker * For LD_TILEBUFFER_RAW, bit 0 disables sample index immediate. */ 743*61046927SAndroid Build Coastguard Worker int signed_offset : 18; 744*61046927SAndroid Build Coastguard Worker } midgard_load_store_word; 745*61046927SAndroid Build Coastguard Worker 746*61046927SAndroid Build Coastguard Worker typedef struct __attribute__((__packed__)) { 747*61046927SAndroid Build Coastguard Worker unsigned type : 4; 748*61046927SAndroid Build Coastguard Worker unsigned next_type : 4; 749*61046927SAndroid Build Coastguard Worker uint64_t word1 : 60; 750*61046927SAndroid Build Coastguard Worker uint64_t word2 : 60; 751*61046927SAndroid Build Coastguard Worker } midgard_load_store; 752*61046927SAndroid Build Coastguard Worker 753*61046927SAndroid Build Coastguard Worker /* 8-bit register selector used in texture ops to select a bias/LOD/gradient 754*61046927SAndroid Build Coastguard Worker * register, shoved into the `bias` field */ 755*61046927SAndroid Build Coastguard Worker 756*61046927SAndroid Build Coastguard Worker typedef struct __attribute__((__packed__)) { 757*61046927SAndroid Build Coastguard Worker /* 32-bit register, clear for half-register */ 758*61046927SAndroid Build Coastguard Worker unsigned full : 1; 759*61046927SAndroid Build Coastguard Worker 760*61046927SAndroid Build Coastguard Worker /* Register select between r28/r29 */ 761*61046927SAndroid Build Coastguard Worker unsigned select : 1; 762*61046927SAndroid Build Coastguard Worker 763*61046927SAndroid Build Coastguard Worker /* For a half-register, selects the upper half */ 764*61046927SAndroid Build Coastguard Worker unsigned upper : 1; 765*61046927SAndroid Build Coastguard Worker 766*61046927SAndroid Build Coastguard Worker /* Indexes into the register */ 767*61046927SAndroid Build Coastguard Worker unsigned component : 2; 768*61046927SAndroid Build Coastguard Worker 769*61046927SAndroid Build Coastguard Worker /* Padding to make this 8-bit */ 770*61046927SAndroid Build Coastguard Worker unsigned zero : 3; 771*61046927SAndroid Build Coastguard Worker } midgard_tex_register_select; 772*61046927SAndroid Build Coastguard Worker 773*61046927SAndroid Build Coastguard Worker /* Texture pipeline results are in r28-r29 */ 774*61046927SAndroid Build Coastguard Worker #define REG_TEX_BASE 28 775*61046927SAndroid Build Coastguard Worker 776*61046927SAndroid Build Coastguard Worker enum mali_texture_op { 777*61046927SAndroid Build Coastguard Worker /* [texture + LOD bias] 778*61046927SAndroid Build Coastguard Worker * If the texture is mipmapped, barriers must be enabled in the 779*61046927SAndroid Build Coastguard Worker * instruction word in order for this opcode to compute the output 780*61046927SAndroid Build Coastguard Worker * correctly. */ 781*61046927SAndroid Build Coastguard Worker midgard_tex_op_normal = 1, 782*61046927SAndroid Build Coastguard Worker 783*61046927SAndroid Build Coastguard Worker /* [texture + gradient for LOD and anisotropy] 784*61046927SAndroid Build Coastguard Worker * Unlike midgard_tex_op_normal, this opcode does not require barriers 785*61046927SAndroid Build Coastguard Worker * to compute the output correctly. */ 786*61046927SAndroid Build Coastguard Worker midgard_tex_op_gradient = 2, 787*61046927SAndroid Build Coastguard Worker 788*61046927SAndroid Build Coastguard Worker /* [unfiltered texturing] 789*61046927SAndroid Build Coastguard Worker * Unlike midgard_tex_op_normal, this opcode does not require barriers 790*61046927SAndroid Build Coastguard Worker * to compute the output correctly. */ 791*61046927SAndroid Build Coastguard Worker midgard_tex_op_fetch = 4, 792*61046927SAndroid Build Coastguard Worker 793*61046927SAndroid Build Coastguard Worker /* [gradient from derivative] */ 794*61046927SAndroid Build Coastguard Worker midgard_tex_op_grad_from_derivative = 9, 795*61046927SAndroid Build Coastguard Worker 796*61046927SAndroid Build Coastguard Worker /* [mov] */ 797*61046927SAndroid Build Coastguard Worker midgard_tex_op_mov = 10, 798*61046927SAndroid Build Coastguard Worker 799*61046927SAndroid Build Coastguard Worker /* [noop] 800*61046927SAndroid Build Coastguard Worker * Mostly used for barriers. */ 801*61046927SAndroid Build Coastguard Worker midgard_tex_op_barrier = 11, 802*61046927SAndroid Build Coastguard Worker 803*61046927SAndroid Build Coastguard Worker /* [gradient from coords] */ 804*61046927SAndroid Build Coastguard Worker midgard_tex_op_grad_from_coords = 12, 805*61046927SAndroid Build Coastguard Worker 806*61046927SAndroid Build Coastguard Worker /* [derivative] 807*61046927SAndroid Build Coastguard Worker * Computes derivatives in 2x2 fragment blocks. */ 808*61046927SAndroid Build Coastguard Worker midgard_tex_op_derivative = 13 809*61046927SAndroid Build Coastguard Worker }; 810*61046927SAndroid Build Coastguard Worker 811*61046927SAndroid Build Coastguard Worker enum mali_sampler_type { 812*61046927SAndroid Build Coastguard Worker /* 0 is reserved */ 813*61046927SAndroid Build Coastguard Worker MALI_SAMPLER_FLOAT = 0x1, /* sampler */ 814*61046927SAndroid Build Coastguard Worker MALI_SAMPLER_UNSIGNED = 0x2, /* usampler */ 815*61046927SAndroid Build Coastguard Worker MALI_SAMPLER_SIGNED = 0x3, /* isampler */ 816*61046927SAndroid Build Coastguard Worker }; 817*61046927SAndroid Build Coastguard Worker 818*61046927SAndroid Build Coastguard Worker /* Texture modes */ 819*61046927SAndroid Build Coastguard Worker enum mali_texture_mode { 820*61046927SAndroid Build Coastguard Worker TEXTURE_NORMAL = 1, 821*61046927SAndroid Build Coastguard Worker TEXTURE_SHADOW = 5, 822*61046927SAndroid Build Coastguard Worker TEXTURE_GATHER_SHADOW = 6, 823*61046927SAndroid Build Coastguard Worker TEXTURE_GATHER_X = 8, 824*61046927SAndroid Build Coastguard Worker TEXTURE_GATHER_Y = 9, 825*61046927SAndroid Build Coastguard Worker TEXTURE_GATHER_Z = 10, 826*61046927SAndroid Build Coastguard Worker TEXTURE_GATHER_W = 11, 827*61046927SAndroid Build Coastguard Worker }; 828*61046927SAndroid Build Coastguard Worker 829*61046927SAndroid Build Coastguard Worker enum mali_derivative_mode { 830*61046927SAndroid Build Coastguard Worker TEXTURE_DFDX = 0, 831*61046927SAndroid Build Coastguard Worker TEXTURE_DFDY = 1, 832*61046927SAndroid Build Coastguard Worker }; 833*61046927SAndroid Build Coastguard Worker 834*61046927SAndroid Build Coastguard Worker enum midgard_partial_execution { 835*61046927SAndroid Build Coastguard Worker MIDGARD_PARTIAL_EXECUTION_SKIP = 1, 836*61046927SAndroid Build Coastguard Worker MIDGARD_PARTIAL_EXECUTION_KILL = 2, 837*61046927SAndroid Build Coastguard Worker MIDGARD_PARTIAL_EXECUTION_NONE = 3 838*61046927SAndroid Build Coastguard Worker }; 839*61046927SAndroid Build Coastguard Worker 840*61046927SAndroid Build Coastguard Worker typedef struct __attribute__((__packed__)) { 841*61046927SAndroid Build Coastguard Worker unsigned type : 4; 842*61046927SAndroid Build Coastguard Worker unsigned next_type : 4; 843*61046927SAndroid Build Coastguard Worker 844*61046927SAndroid Build Coastguard Worker enum mali_texture_op op : 4; 845*61046927SAndroid Build Coastguard Worker unsigned mode : 4; 846*61046927SAndroid Build Coastguard Worker enum midgard_partial_execution exec : 2; 847*61046927SAndroid Build Coastguard Worker 848*61046927SAndroid Build Coastguard Worker unsigned format : 2; 849*61046927SAndroid Build Coastguard Worker 850*61046927SAndroid Build Coastguard Worker /* Are sampler_handle/texture_handler respectively set by registers? If 851*61046927SAndroid Build Coastguard Worker * true, the lower 8-bits of the respective field is a register word. 852*61046927SAndroid Build Coastguard Worker * If false, they are an immediate */ 853*61046927SAndroid Build Coastguard Worker 854*61046927SAndroid Build Coastguard Worker unsigned sampler_register : 1; 855*61046927SAndroid Build Coastguard Worker unsigned texture_register : 1; 856*61046927SAndroid Build Coastguard Worker 857*61046927SAndroid Build Coastguard Worker /* Is a register used to specify the 858*61046927SAndroid Build Coastguard Worker * LOD/bias/offset? If set, use the `bias` field as 859*61046927SAndroid Build Coastguard Worker * a register index. If clear, use the `bias` field 860*61046927SAndroid Build Coastguard Worker * as an immediate. */ 861*61046927SAndroid Build Coastguard Worker unsigned lod_register : 1; 862*61046927SAndroid Build Coastguard Worker 863*61046927SAndroid Build Coastguard Worker /* Is a register used to specify an offset? If set, use the 864*61046927SAndroid Build Coastguard Worker * offset_reg_* fields to encode this, duplicated for each of the 865*61046927SAndroid Build Coastguard Worker * components. If clear, there is implcitly always an immediate offst 866*61046927SAndroid Build Coastguard Worker * specificed in offset_imm_* */ 867*61046927SAndroid Build Coastguard Worker unsigned offset_register : 1; 868*61046927SAndroid Build Coastguard Worker 869*61046927SAndroid Build Coastguard Worker unsigned in_reg_full : 1; 870*61046927SAndroid Build Coastguard Worker unsigned in_reg_select : 1; 871*61046927SAndroid Build Coastguard Worker unsigned in_reg_upper : 1; 872*61046927SAndroid Build Coastguard Worker unsigned in_reg_swizzle : 8; 873*61046927SAndroid Build Coastguard Worker 874*61046927SAndroid Build Coastguard Worker unsigned unknown8 : 2; 875*61046927SAndroid Build Coastguard Worker 876*61046927SAndroid Build Coastguard Worker unsigned out_full : 1; 877*61046927SAndroid Build Coastguard Worker 878*61046927SAndroid Build Coastguard Worker enum mali_sampler_type sampler_type : 2; 879*61046927SAndroid Build Coastguard Worker 880*61046927SAndroid Build Coastguard Worker unsigned out_reg_select : 1; 881*61046927SAndroid Build Coastguard Worker unsigned out_upper : 1; 882*61046927SAndroid Build Coastguard Worker 883*61046927SAndroid Build Coastguard Worker unsigned mask : 4; 884*61046927SAndroid Build Coastguard Worker 885*61046927SAndroid Build Coastguard Worker /* Intriguingly, textures can take an outmod just like alu ops. Int 886*61046927SAndroid Build Coastguard Worker * outmods are not supported as far as I can tell, so this is only 887*61046927SAndroid Build Coastguard Worker * meaningful for float samplers */ 888*61046927SAndroid Build Coastguard Worker midgard_outmod_float outmod : 2; 889*61046927SAndroid Build Coastguard Worker 890*61046927SAndroid Build Coastguard Worker unsigned swizzle : 8; 891*61046927SAndroid Build Coastguard Worker 892*61046927SAndroid Build Coastguard Worker /* These indicate how many bundles after this texture op may be 893*61046927SAndroid Build Coastguard Worker * executed in parallel with this op. We may execute only ALU and 894*61046927SAndroid Build Coastguard Worker * ld/st in parallel (not other textures), and obviously there cannot 895*61046927SAndroid Build Coastguard Worker * be any dependency (the blob appears to forbid even accessing other 896*61046927SAndroid Build Coastguard Worker * channels of a given texture register). */ 897*61046927SAndroid Build Coastguard Worker 898*61046927SAndroid Build Coastguard Worker unsigned out_of_order : 4; 899*61046927SAndroid Build Coastguard Worker unsigned unknown4 : 8; 900*61046927SAndroid Build Coastguard Worker 901*61046927SAndroid Build Coastguard Worker /* In immediate mode, each offset field is an immediate range [0, 7]. 902*61046927SAndroid Build Coastguard Worker * 903*61046927SAndroid Build Coastguard Worker * In register mode, offset_x becomes a register (full, select, upper) 904*61046927SAndroid Build Coastguard Worker * triplet followed by a vec3 swizzle is splattered across 905*61046927SAndroid Build Coastguard Worker * offset_y/offset_z in a genuinely bizarre way. 906*61046927SAndroid Build Coastguard Worker * 907*61046927SAndroid Build Coastguard Worker * For texel fetches in immediate mode, the range is the full [-8, 7], 908*61046927SAndroid Build Coastguard Worker * but for normal texturing the top bit must be zero and a register 909*61046927SAndroid Build Coastguard Worker * used instead. It's not clear where this limitation is from. 910*61046927SAndroid Build Coastguard Worker * 911*61046927SAndroid Build Coastguard Worker * union { 912*61046927SAndroid Build Coastguard Worker * struct { 913*61046927SAndroid Build Coastguard Worker * signed offset_x : 4; 914*61046927SAndroid Build Coastguard Worker * signed offset_y : 4; 915*61046927SAndroid Build Coastguard Worker * signed offset_z : 4; 916*61046927SAndroid Build Coastguard Worker * } immediate; 917*61046927SAndroid Build Coastguard Worker * struct { 918*61046927SAndroid Build Coastguard Worker * bool full : 1; 919*61046927SAndroid Build Coastguard Worker * bool select : 1; 920*61046927SAndroid Build Coastguard Worker * bool upper : 1; 921*61046927SAndroid Build Coastguard Worker * unsigned swizzle : 8; 922*61046927SAndroid Build Coastguard Worker * unsigned zero : 1; 923*61046927SAndroid Build Coastguard Worker * } register; 924*61046927SAndroid Build Coastguard Worker * } 925*61046927SAndroid Build Coastguard Worker */ 926*61046927SAndroid Build Coastguard Worker 927*61046927SAndroid Build Coastguard Worker unsigned offset : 12; 928*61046927SAndroid Build Coastguard Worker 929*61046927SAndroid Build Coastguard Worker /* In immediate bias mode, for a normal texture op, this is 930*61046927SAndroid Build Coastguard Worker * texture bias, computed as int(2^8 * frac(biasf)), with 931*61046927SAndroid Build Coastguard Worker * bias_int = floor(bias). For a textureLod, it's that, but 932*61046927SAndroid Build Coastguard Worker * s/bias/lod. For a texel fetch, this is the LOD as-is. 933*61046927SAndroid Build Coastguard Worker * 934*61046927SAndroid Build Coastguard Worker * In register mode, this is a midgard_tex_register_select 935*61046927SAndroid Build Coastguard Worker * structure and bias_int is zero */ 936*61046927SAndroid Build Coastguard Worker 937*61046927SAndroid Build Coastguard Worker unsigned bias : 8; 938*61046927SAndroid Build Coastguard Worker signed bias_int : 8; 939*61046927SAndroid Build Coastguard Worker 940*61046927SAndroid Build Coastguard Worker /* If sampler/texture_register is set, the bottom 8-bits are 941*61046927SAndroid Build Coastguard Worker * midgard_tex_register_select and the top 8-bits are zero. If they are 942*61046927SAndroid Build Coastguard Worker * clear, they are immediate texture indices */ 943*61046927SAndroid Build Coastguard Worker 944*61046927SAndroid Build Coastguard Worker unsigned sampler_handle : 16; 945*61046927SAndroid Build Coastguard Worker unsigned texture_handle : 16; 946*61046927SAndroid Build Coastguard Worker } midgard_texture_word; 947*61046927SAndroid Build Coastguard Worker 948*61046927SAndroid Build Coastguard Worker /* Technically barriers are texture instructions but it's less work to add them 949*61046927SAndroid Build Coastguard Worker * as an explicitly zeroed special case, since most fields are forced to go to 950*61046927SAndroid Build Coastguard Worker * zero */ 951*61046927SAndroid Build Coastguard Worker 952*61046927SAndroid Build Coastguard Worker typedef struct __attribute__((__packed__)) { 953*61046927SAndroid Build Coastguard Worker unsigned type : 4; 954*61046927SAndroid Build Coastguard Worker unsigned next_type : 4; 955*61046927SAndroid Build Coastguard Worker 956*61046927SAndroid Build Coastguard Worker /* op = TEXTURE_OP_BARRIER */ 957*61046927SAndroid Build Coastguard Worker unsigned op : 6; 958*61046927SAndroid Build Coastguard Worker unsigned zero1 : 2; 959*61046927SAndroid Build Coastguard Worker 960*61046927SAndroid Build Coastguard Worker /* Since helper invocations don't make any sense, these are forced to one */ 961*61046927SAndroid Build Coastguard Worker unsigned cont : 1; 962*61046927SAndroid Build Coastguard Worker unsigned last : 1; 963*61046927SAndroid Build Coastguard Worker unsigned zero2 : 14; 964*61046927SAndroid Build Coastguard Worker 965*61046927SAndroid Build Coastguard Worker unsigned zero3 : 24; 966*61046927SAndroid Build Coastguard Worker unsigned out_of_order : 4; 967*61046927SAndroid Build Coastguard Worker unsigned zero4 : 4; 968*61046927SAndroid Build Coastguard Worker 969*61046927SAndroid Build Coastguard Worker uint64_t zero5; 970*61046927SAndroid Build Coastguard Worker } midgard_texture_barrier_word; 971*61046927SAndroid Build Coastguard Worker 972*61046927SAndroid Build Coastguard Worker typedef union midgard_constants { 973*61046927SAndroid Build Coastguard Worker double f64[2]; 974*61046927SAndroid Build Coastguard Worker uint64_t u64[2]; 975*61046927SAndroid Build Coastguard Worker int64_t i64[2]; 976*61046927SAndroid Build Coastguard Worker float f32[4]; 977*61046927SAndroid Build Coastguard Worker uint32_t u32[4]; 978*61046927SAndroid Build Coastguard Worker int32_t i32[4]; 979*61046927SAndroid Build Coastguard Worker uint16_t f16[8]; 980*61046927SAndroid Build Coastguard Worker uint16_t u16[8]; 981*61046927SAndroid Build Coastguard Worker int16_t i16[8]; 982*61046927SAndroid Build Coastguard Worker uint8_t u8[16]; 983*61046927SAndroid Build Coastguard Worker int8_t i8[16]; 984*61046927SAndroid Build Coastguard Worker } midgard_constants; 985*61046927SAndroid Build Coastguard Worker 986*61046927SAndroid Build Coastguard Worker enum midgard_roundmode { 987*61046927SAndroid Build Coastguard Worker MIDGARD_RTE = 0x0, /* round to even */ 988*61046927SAndroid Build Coastguard Worker MIDGARD_RTZ = 0x1, /* round to zero */ 989*61046927SAndroid Build Coastguard Worker MIDGARD_RTN = 0x2, /* round to negative */ 990*61046927SAndroid Build Coastguard Worker MIDGARD_RTP = 0x3, /* round to positive */ 991*61046927SAndroid Build Coastguard Worker }; 992*61046927SAndroid Build Coastguard Worker 993*61046927SAndroid Build Coastguard Worker #endif 994