1<?xml version="1.0" encoding="UTF-8"?> 2<!-- 3Copyright © 2020 Google, Inc. 4 5Permission is hereby granted, free of charge, to any person obtaining a 6copy of this software and associated documentation files (the "Software"), 7to deal in the Software without restriction, including without limitation 8the rights to use, copy, modify, merge, publish, distribute, sublicense, 9and/or sell copies of the Software, and to permit persons to whom the 10Software is furnished to do so, subject to the following conditions: 11 12The above copyright notice and this permission notice (including the next 13paragraph) shall be included in all copies or substantial portions of the 14Software. 15 16THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22SOFTWARE. 23 --> 24 25<isa> 26 27<!-- 28 Cat5 Instructions: texture instructions 29 --> 30 31<bitset name="#cat5-s2en-bindless-base" size="1"> 32 <doc> 33 The BASE field is actually split across BASE_LO and BASE_HI, 34 but '.baseN' should only appear in the bindless case.. the 35 easiest way to accomplish that is by splitting it out into a 36 bitset. We just arbitrarily map this to BASE_LO 37 </doc> 38 <override> 39 <expr>{BINDLESS}</expr> 40 <display> 41 .base{BASE} 42 </display> 43 </override> 44 <display/> 45 <field name="BASE_LO" pos="0" type="uint"/> 46 <derived name="BASE" type="uint"> 47 <expr>({BASE_HI} * 2) | {BASE_LO}</expr> 48 </derived> 49 <encode type="struct ir3_instruction *"> 50 <map name="BASE_LO">src->cat5.tex_base & 0x1</map> 51 </encode> 52</bitset> 53 54<bitset name="#instruction-cat5" extends="#instruction"> 55 <override> 56 <expr>{S2EN_BINDLESS}</expr> 57 <doc> 58 The s2en (indirect) or bindless case 59 </doc> 60 <display> 61 {SY}{JP}{NAME}{3D}{A}{O}{P}{S}{S2EN}{UNIFORM}{NONUNIFORM}{BASE} {TYPE}({WRMASK}){DST_HALF}{DST}{SRC1}{SRC2}{SRC3}{A1} 62 </display> 63 <field name="BASE_HI" low="19" high="20" type="uint"/> 64 <field name="SRC3" low="21" high="28" type="#cat5-src3"> 65 <param name="BINDLESS"/> 66 <param name="DESC_MODE"/> 67 <param name="HAS_SAMP"/> 68 <param name="HAS_TEX"/> 69 </field> 70 <field name="DESC_MODE" low="29" high="31" type="#cat5-s2en-bindless-desc-mode"/> 71 <field name="BASE" pos="47" type="#cat5-s2en-bindless-base"> 72 <param name="BINDLESS"/> 73 <param name="BASE_HI"/> 74 </field> 75 <derived name="BINDLESS" expr="#cat5-s2enb-is-bindless" type="bool"/> 76 <derived name="S2EN" expr="#cat5-s2enb-is-indirect" type="bool" display=".s2en"/> 77 <derived name="UNIFORM" expr="#cat5-s2enb-is-uniform" type="bool" display=".uniform"/> 78 <derived name="NONUNIFORM" expr="#cat5-s2enb-is-nonuniform" type="bool" display=".nonuniform"/> 79 <derived name="A1" expr="#cat5-s2enb-uses_a1" type="bool" display=", a1.x"/> 80 </override> 81 82 <doc> 83 The "normal" case, ie. not s2en (indirect) and/or bindless 84 </doc> 85 <display> 86 {SY}{JP}{NAME}{3D}{A}{O}{P}{S} {TYPE}({WRMASK}){DST_HALF}{DST}{SRC1}{SRC2}{SAMP}{TEX} 87 </display> 88 <derived name="DST_HALF" type="bool" display="h"> 89 <expr> 90 ({TYPE} == 0) /* f16 */ || 91 ({TYPE} == 2) /* u16 */ || 92 ({TYPE} == 4) /* s16 */ || 93 ({TYPE} == 6) /* u8 */ || 94 ({TYPE} == 7) /* s8 */ 95 </expr> 96 </derived> 97 <field name="FULL" pos="0" type="bool"/> 98 <derived name="HALF" expr="#multisrc-half" type="bool" display="h"/> 99 <field name="SRC1" low="1" high="8" type="#cat5-src1"> 100 <param name="NUM_SRC"/> 101 <param name="HALF"/> 102 </field> 103 <field name="SRC2" low="9" high="16" type="#cat5-src2"> 104 <param name="NUM_SRC"/> 105 <param name="HALF"/> 106 <param name="O"/> 107 </field> 108 <!-- 109 TODO remainder of first 32b differ depending on s2en/bindless.. 110 possibly use overrides? Need to sort-out how to display.. 111 112 Note b17 seems to show up in some blob traces (samgpN), need 113 to figure out what this bit does 114 --> 115 <pattern low="17" high="18">0x</pattern> 116 <assert low="19" high="20">00</assert> <!-- BASE_HI --> 117 <field name="SAMP" low="21" high="24" type="#cat5-samp"> 118 <param name="HAS_SAMP"/> 119 </field> 120 <field name="TEX" low="25" high="31" type="#cat5-tex"> 121 <param name="HAS_TEX"/> 122 </field> 123 124 <field name="DST" low="32" high="39" type="#reg-gpr"/> 125 <field name="WRMASK" low="40" high="43" type="#wrmask"/> 126 <field name="TYPE" low="44" high="46" type="#cat5-type"> 127 <param name="HAS_TYPE"/> 128 </field> 129 <assert pos="47">0</assert> <!-- BASE_LO --> 130 <field name="3D" pos="48" type="bool" display=".3d"/> 131 <field name="A" pos="49" type="bool" display=".a"/> 132 <field name="S" pos="50" type="bool" display=".s"/> 133 <field name="S2EN_BINDLESS" pos="51" type="bool"/> 134 <field name="O" pos="52" type="bool" display=".o"/> 135 <field name="P" pos="53" type="bool" display=".p"/> 136 <!-- OPC --> 137 <field name="JP" pos="59" type="bool" display="(jp)"/> 138 <field name="SY" pos="60" type="bool" display="(sy)"/> 139 <pattern low="61" high="63">101</pattern> <!-- cat5 --> 140 <encode> 141 <map name="FULL">extract_cat5_FULL(src)</map> 142 <map name="TEX">src</map> 143 <map name="SAMP">src</map> 144 <map name="WRMASK">src->dsts[0]->wrmask</map> 145 <map name="BASE">src</map> 146 <map name="TYPE">src</map> 147 <map name="BASE_HI">src->cat5.tex_base >> 1</map> 148 <map name="3D">!!(src->flags & IR3_INSTR_3D)</map> 149 <map name="A">!!(src->flags & IR3_INSTR_A)</map> 150 <map name="S">!!(src->flags & IR3_INSTR_S)</map> 151 <map name="S2EN_BINDLESS">!!(src->flags & (IR3_INSTR_S2EN | IR3_INSTR_B))</map> 152 <map name="O">!!(src->flags & IR3_INSTR_O)</map> 153 <map name="P">!!(src->flags & IR3_INSTR_P)</map> 154 <map name="DESC_MODE">extract_cat5_DESC_MODE(src)</map> 155 <!-- 156 TODO the src order is currently a bit messy due to ir3 using srcs[0] 157 for s2en src in the s2en case 158 --> 159 <map name="SRC1">extract_cat5_SRC(src, 0)</map> 160 <map name="SRC2">extract_cat5_SRC(src, 1)</map> 161 <map name="SRC3">(src->srcs_count > 0) ? src->srcs[0] : NULL</map> 162 </encode> 163</bitset> 164 165<bitset name="isam" extends="#instruction-cat5"> 166 <pattern low="54" high="58">00000</pattern> 167 <derived name="NUM_SRC" expr="#one" type="uint"/> 168 <derived name="HAS_SAMP" expr="#true" type="bool"/> 169 <derived name="HAS_TEX" expr="#true" type="bool"/> 170 <derived name="HAS_TYPE" expr="#true" type="bool"/> 171</bitset> 172 173<bitset name="isaml" extends="#instruction-cat5"> 174 <pattern low="54" high="58">00001</pattern> 175 <derived name="NUM_SRC" expr="#two" type="uint"/> 176 <derived name="HAS_SAMP" expr="#true" type="bool"/> 177 <derived name="HAS_TEX" expr="#true" type="bool"/> 178 <derived name="HAS_TYPE" expr="#true" type="bool"/> 179</bitset> 180 181<bitset name="isamm" extends="#instruction-cat5"> 182 <pattern low="54" high="58">00010</pattern> 183 <derived name="NUM_SRC" expr="#one" type="uint"/> 184 <derived name="HAS_SAMP" expr="#true" type="bool"/> 185 <derived name="HAS_TEX" expr="#true" type="bool"/> 186 <derived name="HAS_TYPE" expr="#true" type="bool"/> 187</bitset> 188 189<bitset name="sam" extends="#instruction-cat5"> 190 <pattern low="54" high="58">00011</pattern> 191 <derived name="NUM_SRC" expr="#one" type="uint"/> 192 <derived name="HAS_SAMP" expr="#true" type="bool"/> 193 <derived name="HAS_TEX" expr="#true" type="bool"/> 194 <derived name="HAS_TYPE" expr="#true" type="bool"/> 195</bitset> 196 197<bitset name="samb" extends="#instruction-cat5"> 198 <pattern low="54" high="58">00100</pattern> 199 <derived name="NUM_SRC" expr="#two" type="uint"/> 200 <derived name="HAS_SAMP" expr="#true" type="bool"/> 201 <derived name="HAS_TEX" expr="#true" type="bool"/> 202 <derived name="HAS_TYPE" expr="#true" type="bool"/> 203</bitset> 204 205<bitset name="saml" extends="#instruction-cat5"> 206 <pattern low="54" high="58">00101</pattern> 207 <derived name="NUM_SRC" expr="#two" type="uint"/> 208 <derived name="HAS_SAMP" expr="#true" type="bool"/> 209 <derived name="HAS_TEX" expr="#true" type="bool"/> 210 <derived name="HAS_TYPE" expr="#true" type="bool"/> 211</bitset> 212 213<bitset name="samgq" extends="#instruction-cat5"> 214 <pattern low="54" high="58">00110</pattern> 215 <derived name="NUM_SRC" expr="#one" type="uint"/> 216 <derived name="HAS_SAMP" expr="#true" type="bool"/> 217 <derived name="HAS_TEX" expr="#true" type="bool"/> 218 <derived name="HAS_TYPE" expr="#true" type="bool"/> 219</bitset> 220 221<bitset name="getlod" extends="#instruction-cat5"> 222 <pattern low="54" high="58">00111</pattern> 223 <derived name="NUM_SRC" expr="#one" type="uint"/> 224 <derived name="HAS_SAMP" expr="#true" type="bool"/> 225 <derived name="HAS_TEX" expr="#true" type="bool"/> 226 <derived name="HAS_TYPE" expr="#true" type="bool"/> 227</bitset> 228 229<bitset name="conv" extends="#instruction-cat5"> 230 <pattern low="54" high="58">01000</pattern> 231 <derived name="NUM_SRC" expr="#two" type="uint"/> 232 <derived name="HAS_SAMP" expr="#true" type="bool"/> 233 <derived name="HAS_TEX" expr="#true" type="bool"/> 234 <derived name="HAS_TYPE" expr="#true" type="bool"/> 235</bitset> 236 237<bitset name="convm" extends="#instruction-cat5"> 238 <pattern low="54" high="58">01001</pattern> 239 <derived name="NUM_SRC" expr="#two" type="uint"/> 240 <derived name="HAS_SAMP" expr="#true" type="bool"/> 241 <derived name="HAS_TEX" expr="#true" type="bool"/> 242 <derived name="HAS_TYPE" expr="#true" type="bool"/> 243</bitset> 244 245<bitset name="getsize" extends="#instruction-cat5"> 246 <pattern low="54" high="58">01010</pattern> 247 <derived name="NUM_SRC" expr="#one" type="uint"/> 248 <derived name="HAS_SAMP" expr="#false" type="bool"/> 249 <derived name="HAS_TEX" expr="#true" type="bool"/> 250 <derived name="HAS_TYPE" expr="#true" type="bool"/> 251</bitset> 252 253<bitset name="getbuf" extends="#instruction-cat5"> 254 <pattern low="54" high="58">01011</pattern> 255 <derived name="NUM_SRC" expr="#zero" type="uint"/> 256 <derived name="HAS_SAMP" expr="#false" type="bool"/> 257 <derived name="HAS_TEX" expr="#true" type="bool"/> 258 <derived name="HAS_TYPE" expr="#true" type="bool"/> 259</bitset> 260 261<bitset name="getpos" extends="#instruction-cat5"> 262 <pattern low="54" high="58">01100</pattern> 263 <derived name="NUM_SRC" expr="#one" type="uint"/> 264 <derived name="HAS_SAMP" expr="#false" type="bool"/> 265 <derived name="HAS_TEX" expr="#true" type="bool"/> 266 <derived name="HAS_TYPE" expr="#true" type="bool"/> 267</bitset> 268 269<bitset name="getinfo" extends="#instruction-cat5"> 270 <pattern low="54" high="58">01101</pattern> 271 <derived name="NUM_SRC" expr="#zero" type="uint"/> 272 <derived name="HAS_SAMP" expr="#false" type="bool"/> 273 <derived name="HAS_TEX" expr="#true" type="bool"/> 274 <derived name="HAS_TYPE" expr="#true" type="bool"/> 275</bitset> 276 277<bitset name="dsx" extends="#instruction-cat5"> 278 <pattern low="54" high="58">01110</pattern> 279 <derived name="NUM_SRC" expr="#one" type="uint"/> 280 <derived name="HAS_SAMP" expr="#false" type="bool"/> 281 <derived name="HAS_TEX" expr="#false" type="bool"/> 282 <derived name="HAS_TYPE" expr="#true" type="bool"/> 283</bitset> 284 285<bitset name="dsy" extends="#instruction-cat5"> 286 <pattern low="54" high="58">01111</pattern> 287 <derived name="NUM_SRC" expr="#one" type="uint"/> 288 <derived name="HAS_SAMP" expr="#false" type="bool"/> 289 <derived name="HAS_TEX" expr="#false" type="bool"/> 290 <derived name="HAS_TYPE" expr="#true" type="bool"/> 291</bitset> 292 293<bitset name="gather4r" extends="#instruction-cat5"> 294 <pattern low="54" high="58">10000</pattern> 295 <derived name="NUM_SRC" expr="#one" type="uint"/> 296 <derived name="HAS_SAMP" expr="#true" type="bool"/> 297 <derived name="HAS_TEX" expr="#true" type="bool"/> 298 <derived name="HAS_TYPE" expr="#true" type="bool"/> 299</bitset> 300 301<bitset name="gather4g" extends="#instruction-cat5"> 302 <pattern low="54" high="58">10001</pattern> 303 <derived name="NUM_SRC" expr="#one" type="uint"/> 304 <derived name="HAS_SAMP" expr="#true" type="bool"/> 305 <derived name="HAS_TEX" expr="#true" type="bool"/> 306 <derived name="HAS_TYPE" expr="#true" type="bool"/> 307</bitset> 308 309<bitset name="gather4b" extends="#instruction-cat5"> 310 <pattern low="54" high="58">10010</pattern> 311 <derived name="NUM_SRC" expr="#one" type="uint"/> 312 <derived name="HAS_SAMP" expr="#true" type="bool"/> 313 <derived name="HAS_TEX" expr="#true" type="bool"/> 314 <derived name="HAS_TYPE" expr="#true" type="bool"/> 315</bitset> 316 317<bitset name="gather4a" extends="#instruction-cat5"> 318 <pattern low="54" high="58">10011</pattern> 319 <derived name="NUM_SRC" expr="#one" type="uint"/> 320 <derived name="HAS_SAMP" expr="#true" type="bool"/> 321 <derived name="HAS_TEX" expr="#true" type="bool"/> 322 <derived name="HAS_TYPE" expr="#true" type="bool"/> 323</bitset> 324 325<bitset name="samgp0" extends="#instruction-cat5"> 326 <pattern low="54" high="58">10100</pattern> 327 <derived name="NUM_SRC" expr="#one" type="uint"/> 328 <derived name="HAS_SAMP" expr="#true" type="bool"/> 329 <derived name="HAS_TEX" expr="#true" type="bool"/> 330 <derived name="HAS_TYPE" expr="#true" type="bool"/> 331</bitset> 332 333<bitset name="samgp1" extends="#instruction-cat5"> 334 <pattern low="54" high="58">10101</pattern> 335 <derived name="NUM_SRC" expr="#one" type="uint"/> 336 <derived name="HAS_SAMP" expr="#true" type="bool"/> 337 <derived name="HAS_TEX" expr="#true" type="bool"/> 338 <derived name="HAS_TYPE" expr="#true" type="bool"/> 339</bitset> 340 341<bitset name="samgp2" extends="#instruction-cat5"> 342 <pattern low="54" high="58">10110</pattern> 343 <derived name="NUM_SRC" expr="#one" type="uint"/> 344 <derived name="HAS_SAMP" expr="#true" type="bool"/> 345 <derived name="HAS_TEX" expr="#true" type="bool"/> 346 <derived name="HAS_TYPE" expr="#true" type="bool"/> 347</bitset> 348 349<bitset name="samgp3" extends="#instruction-cat5"> 350 <pattern low="54" high="58">10111</pattern> 351 <derived name="NUM_SRC" expr="#one" type="uint"/> 352 <derived name="HAS_SAMP" expr="#true" type="bool"/> 353 <derived name="HAS_TEX" expr="#true" type="bool"/> 354 <derived name="HAS_TYPE" expr="#true" type="bool"/> 355</bitset> 356 357<bitset name="dsxpp.1" extends="#instruction-cat5"> 358 <pattern low="54" high="58">11000</pattern> 359 <derived name="NUM_SRC" expr="#one" type="uint"/> 360 <derived name="HAS_SAMP" expr="#false" type="bool"/> 361 <derived name="HAS_TEX" expr="#false" type="bool"/> 362 <derived name="HAS_TYPE" expr="#false" type="bool"/> 363</bitset> 364 365<bitset name="dsypp.1" extends="#instruction-cat5"> 366 <pattern low="54" high="58">11001</pattern> 367 <derived name="NUM_SRC" expr="#one" type="uint"/> 368 <derived name="HAS_SAMP" expr="#false" type="bool"/> 369 <derived name="HAS_TEX" expr="#false" type="bool"/> 370 <derived name="HAS_TYPE" expr="#false" type="bool"/> 371</bitset> 372 373<bitset name="rgetpos" extends="#instruction-cat5"> 374 <pattern low="54" high="58">11010</pattern> 375 <derived name="NUM_SRC" expr="#one" type="uint"/> 376 <derived name="HAS_SAMP" expr="#false" type="bool"/> 377 <derived name="HAS_TEX" expr="#false" type="bool"/> 378 <derived name="HAS_TYPE" expr="#true" type="bool"/> 379</bitset> 380 381<bitset name="rgetinfo" extends="#instruction-cat5"> 382 <pattern low="54" high="58">11011</pattern> 383 <derived name="NUM_SRC" expr="#zero" type="uint"/> 384 <derived name="HAS_SAMP" expr="#false" type="bool"/> 385 <derived name="HAS_TEX" expr="#false" type="bool"/> 386 <derived name="HAS_TYPE" expr="#true" type="bool"/> 387</bitset> 388 389 390<!-- 391 All the magic for conditionally displaying various srcs, etc 392 for the non-bindless / non-indirect case, or things that are in 393 common with the bindless / indirect case 394 --> 395 396<bitset name="#cat5-src1" size="8"> 397 <override> 398 <expr>{NUM_SRC} > 0</expr> 399 <display> 400 , {HALF}{SRC} 401 </display> 402 <field name="SRC" low="0" high="7" type="#reg-gpr"/> 403 </override> 404 <display/> 405 <assert low="0" high="7">00000000</assert> 406 <encode type="struct ir3_register *"> 407 <map name="SRC">src</map> 408 </encode> 409</bitset> 410 411<bitset name="#cat5-src2" size="8"> 412 <override> 413 <expr>{O} || ({NUM_SRC} > 1)</expr> 414 <display> 415 , {HALF}{SRC} 416 </display> 417 <field name="SRC" low="0" high="7" type="#reg-gpr"/> 418 </override> 419 <display/> 420 <assert low="0" high="7">00000000</assert> 421 <encode type="struct ir3_register *"> 422 <map name="SRC">src</map> 423 </encode> 424</bitset> 425 426<bitset name="#cat5-samp" size="4"> 427 <override> 428 <expr>{HAS_SAMP}</expr> 429 <display> 430 , s#{SAMP} 431 </display> 432 <field name="SAMP" low="0" high="3" type="uint"/> 433 </override> 434 <display/> 435 <assert low="0" high="3">0000</assert> 436 <encode type="struct ir3_instruction *"> 437 <map name="SAMP">src->cat5.samp</map> 438 </encode> 439</bitset> 440 441<bitset name="#cat5-samp-s2en-bindless-a1" size="8"> 442 <doc>s2en (indirect) / bindless case with a1.x has 8b samp</doc> 443 <override> 444 <expr>{HAS_SAMP}</expr> 445 <display> 446 , s#{SAMP} 447 </display> 448 <field name="SAMP" low="0" high="7" type="uint"/> 449 </override> 450 <display/> 451 <assert low="0" high="7">00000000</assert> 452 <encode type="struct ir3_instruction *"> 453 <map name="SAMP">src->cat5.samp</map> 454 </encode> 455</bitset> 456 457<bitset name="#cat5-tex" size="7"> 458 <override> 459 <expr>{HAS_TEX}</expr> 460 <display> 461 , t#{TEX} 462 </display> 463 <field name="TEX" low="0" high="6" type="uint"/> 464 </override> 465 <display/> 466 <assert low="0" high="6">0000000</assert> 467 <encode type="struct ir3_instruction *"> 468 <map name="TEX">src->cat5.tex</map> 469 </encode> 470</bitset> 471 472<bitset name="#cat5-tex-s2en-bindless" size="4"> 473 <doc>s2en (indirect) / bindless case only has 4b tex</doc> 474 <override> 475 <expr>{HAS_TEX}</expr> 476 <display> 477 , t#{TEX} 478 </display> 479 <field name="TEX" low="0" high="3" type="uint"/> 480 </override> 481 <display/> 482 <assert low="0" high="3">0000</assert> 483 <encode type="struct ir3_instruction *"> 484 <!-- 485 TODO properly decouple the encoding from ir3 IR in this 486 case.. the IR has no business knowing how this gets 487 encoded into "SRC3".. 488 --> 489 <map name="TEX">src->cat5.samp >> 4</map> 490 </encode> 491</bitset> 492 493<bitset name="#cat5-type" size="3"> 494 <display/> 495 <override> 496 <expr>{HAS_TYPE}</expr> 497 <display> 498 ({TYPE}) 499 </display> 500 </override> 501 <field name="TYPE" low="0" high="2" type="#type"/> 502 <encode type="struct ir3_instruction *"> 503 <!-- 504 Normally we only encode fields that have visible impact on 505 the decoded disasm, but the type field is one of those 506 special exceptions 507 --> 508 <map name="TYPE" force="true">src->cat5.type</map> 509 </encode> 510</bitset> 511 512<!-- 513 Helpers/bitsets/etc for dealing with the bindless/indirect case: 514 --> 515 516<enum name="#cat5-s2en-bindless-desc-mode"> 517 <doc> 518 We don't actually display this enum, but it is useful to 519 document the various cases 520 521 TODO we should probably have an option for uniforms w/out 522 display strings, but which have 'C' names that can be used 523 to generate header that the compiler can use 524 </doc> 525 <value val="0" display="CAT5_NONUNIFORM"> 526 <doc> 527 Use traditional GL binding model, get texture and sampler index 528 from src3 which is not presumed to be uniform. This is 529 backwards-compatible with earlier generations, where this field was 530 always 0 and nonuniform-indexed sampling always worked. 531 </doc> 532 </value> 533 <value val="1" display="CAT5_BINDLESS_A1_UNIFORM"> 534 <doc> 535 The sampler base comes from the low 3 bits of a1.x, and the sampler 536 and texture index come from src3 which is presumed to be uniform. 537 </doc> 538 </value> 539 <value val="2" display="CAT5_BINDLESS_NONUNIFORM"> 540 <doc> 541 The texture and sampler share the same base, and the sampler and 542 texture index come from src3 which is *not* presumed to be uniform. 543 </doc> 544 </value> 545 <value val="3" display="CAT5_BINDLESS_A1_NONUNIFORM"> 546 <doc> 547 The sampler base comes from the low 3 bits of a1.x, and the sampler 548 and texture index come from src3 which is *not* presumed to be 549 uniform. 550 </doc> 551 </value> 552 <value val="4" display="CAT5_UNIFORM"> 553 <doc> 554 Use traditional GL binding model, get texture and sampler index 555 from src3 which is presumed to be uniform. 556 </doc> 557 </value> 558 <value val="5" display="CAT5_BINDLESS_UNIFORM"> 559 <doc> 560 The texture and sampler share the same base, and the sampler and 561 texture index come from src3 which is presumed to be uniform. 562 </doc> 563 </value> 564 <value val="6" display="CAT5_BINDLESS_IMM"> 565 <doc> 566 The texture and sampler share the same base, get sampler index from low 567 4 bits of src3 and texture index from high 4 bits. 568 </doc> 569 </value> 570 <value val="7" display="CAT5_BINDLESS_A1_IMM"> 571 <doc> 572 The sampler base comes from the low 3 bits of a1.x, and the texture 573 index comes from the next 8 bits of a1.x. The sampler index is an 574 immediate in src3. 575 </doc> 576 </value> 577</enum> 578 579<!-- Helper to map s2en/bindless DESC_MODE to whether it is an indirect mode --> 580<expr name="#cat5-s2enb-is-indirect"> 581 {DESC_MODE} < 6 /* CAT5_BINDLESS_IMM */ 582</expr> 583 584<!-- Helper to map s2en/bindless DESC_MODE to whether it is a bindless mode --> 585<expr name="#cat5-s2enb-is-bindless"> 586 ({DESC_MODE} == 1) /* CAT5_BINDLESS_A1_UNIFORM */ || 587 ({DESC_MODE} == 2) /* CAT5_BINDLESS_NONUNIFORM */ || 588 ({DESC_MODE} == 3) /* CAT5_BINDLESS_A1_NONUNIFORM */ || 589 ({DESC_MODE} == 5) /* CAT5_BINDLESS_UNIFORM */ || 590 ({DESC_MODE} == 6) /* CAT5_BINDLESS_IMM */ || 591 ({DESC_MODE} == 7) /* CAT5_BINDLESS_A1_IMM */ 592</expr> 593 594<!-- Helper to map s2en/bindless DESC_MODE to whether it uses a1.x --> 595<expr name="#cat5-s2enb-uses_a1"> 596 ({DESC_MODE} == 1) /* CAT5_BINDLESS_A1_UNIFORM */ || 597 ({DESC_MODE} == 3) /* CAT5_BINDLESS_A1_NONUNIFORM */ || 598 ({DESC_MODE} == 7) /* CAT5_BINDLESS_A1_IMM */ 599</expr> 600 601<!-- Helper to map s2en/bindless DESC_MODE to whether it is uniform (flow control) mode --> 602<expr name="#cat5-s2enb-is-uniform"> 603 ({DESC_MODE} == 1) /* CAT5_BINDLESS_A1_UNIFORM */ || 604 ({DESC_MODE} == 4) /* CAT5_UNIFORM */ || 605 ({DESC_MODE} == 5) /* CAT5_BINDLESS_UNIFORM */ 606</expr> 607 608<!-- Helper to map s2en/bindless DESC_MODE to whether it is non-uniform mode 609 Note that it returns only for bindless for now, since we need to figure out bindful 610 uniform/nonuniform mode correctly. See TODO in extract_cat5_DESC_MODE in encode.c --> 611<expr name="#cat5-s2enb-is-nonuniform"> 612 ({DESC_MODE} == 2) /* CAT5_BINDLESS_NONUNIFORM */ || 613 ({DESC_MODE} == 3) /* CAT5_BINDLESS_A1_NONUNIFORM */ 614</expr> 615 616<bitset name="#cat5-src3" size="8"> 617 <doc>bindless/indirect src3, which can either be GPR or samp/tex</doc> 618 <override expr="#cat5-s2enb-is-indirect"> 619 <display> 620 , {SRC_HALF}{SRC} 621 </display> 622 <field name="SRC" low="0" high="7" type="#reg-gpr"/> 623 <derived name="SRC_HALF" type="bool" display="h"> 624 <expr>!{BINDLESS}</expr> 625 </derived> 626 </override> 627 <override expr="#cat5-s2enb-uses_a1"> 628 <doc> 629 In the case that a1.x is used, all 8 bits encode sampler 630 </doc> 631 <display> 632 {SAMP} 633 </display> 634 <field name="SAMP" low="0" high="7" type="#cat5-samp-s2en-bindless-a1"> 635 <param name="HAS_SAMP"/> 636 </field> 637 </override> 638 <display> 639 {SAMP}{TEX} 640 </display> 641 <field name="SAMP" low="0" high="3" type="#cat5-samp"> 642 <param name="HAS_SAMP"/> 643 </field> 644 <field name="TEX" low="4" high="7" type="#cat5-tex-s2en-bindless"> 645 <param name="HAS_TEX"/> 646 </field> 647 <encode type="struct ir3_register *"> 648 <map name="SAMP">s->instr</map> 649 <map name="TEX">s->instr</map> 650 <map name="SRC">src</map> 651 </encode> 652</bitset> 653 654</isa> 655