mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-06-18 23:48:22 +02:00
agx: Add ld_vary_flat opcode
Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11718>
This commit is contained in:
parent
10b8563966
commit
3d3e4928b2
3 changed files with 11 additions and 4 deletions
|
|
@ -237,6 +237,7 @@ for is_float in [False, True]:
|
|||
op("bitop", (0x7E, 0x7F, 6, _), srcs = 2, imms = [TRUTH_TABLE])
|
||||
op("convert", (0x3E | L, 0x7F | L | (0x3 << 38), 6, _), srcs = 2, imms = [ROUND])
|
||||
op("ld_vary", (0x21, 0xBF, 8, _), srcs = 1, imms = [CHANNELS, PERSPECTIVE])
|
||||
op("ld_vary_flat", (0xA1, 0xBF, 8, _), srcs = 1, imms = [CHANNELS])
|
||||
op("st_vary", None, dests = 0, srcs = 2, can_eliminate = False)
|
||||
op("stop", (0x88, 0xFFFF, 2, _), dests = 0, can_eliminate = False)
|
||||
op("trap", (0x08, 0xFFFF, 2, _), dests = 0, can_eliminate = False)
|
||||
|
|
|
|||
|
|
@ -398,22 +398,26 @@ agx_pack_instr(struct util_dynarray *emission, struct util_dynarray *fixups, agx
|
|||
}
|
||||
|
||||
case AGX_OPCODE_LD_VARY:
|
||||
case AGX_OPCODE_LD_VARY_FLAT:
|
||||
{
|
||||
bool flat = (I->op == AGX_OPCODE_LD_VARY_FLAT);
|
||||
unsigned D = agx_pack_alu_dst(I->dest[0]);
|
||||
unsigned channels = (I->channels & 0x3);
|
||||
assert(I->mask < 0xF); /* 0 indicates full mask */
|
||||
agx_index index_src = I->src[0];
|
||||
assert(index_src.type == AGX_INDEX_IMMEDIATE);
|
||||
assert(!(flat && I->perspective));
|
||||
unsigned index = index_src.value;
|
||||
|
||||
uint64_t raw =
|
||||
0x21 | (I->perspective ? (1 << 6) : 0) |
|
||||
0x21 | (flat ? (1 << 7) : 0) |
|
||||
(I->perspective ? (1 << 6) : 0) |
|
||||
((D & 0xFF) << 7) |
|
||||
(1ull << 15) | /* XXX */
|
||||
(((uint64_t) index) << 16) |
|
||||
(((uint64_t) channels) << 30) |
|
||||
(1ull << 46) | /* XXX */
|
||||
(1ull << 52) | /* XXX */
|
||||
(!flat ? (1ull << 46) : 0) | /* XXX */
|
||||
(!flat ? (1ull << 52) : 0) | /* XXX */
|
||||
(((uint64_t) (D >> 8)) << 56);
|
||||
|
||||
unsigned size = 8;
|
||||
|
|
|
|||
|
|
@ -90,7 +90,9 @@ agx_ra(agx_context *ctx)
|
|||
unsigned size = ins->dest[d].size == AGX_SIZE_32 ? 2 : 1;
|
||||
if (size == 2 && usage & 1) usage++;
|
||||
unsigned v = usage;
|
||||
unsigned comps = (ins->op == AGX_OPCODE_LD_VARY || ins->op == AGX_OPCODE_DEVICE_LOAD || ins->op == AGX_OPCODE_TEXTURE_SAMPLE || ins->op == AGX_OPCODE_LD_TILE) ? 4 : 1; // todo systematic
|
||||
unsigned comps = (ins->op == AGX_OPCODE_LD_VARY || ins->op == AGX_OPCODE_DEVICE_LOAD || ins->op == AGX_OPCODE_TEXTURE_SAMPLE || ins->op == AGX_OPCODE_LD_TILE) ? 4 :
|
||||
(ins->op == AGX_OPCODE_LD_VARY_FLAT) ? 3 :
|
||||
1; // todo systematic
|
||||
usage += comps * size;
|
||||
alloc[ins->dest[d].value] = v;
|
||||
ins->dest[d] = agx_replace_index(ins->dest[d], agx_register(v, ins->dest[d].size));
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue