agx: Model and pack gathers
Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21264>
This commit is contained in:

committed by
Marge Bot

parent
8dc861dbb5
commit
978d3fefa8
@@ -1233,7 +1233,7 @@ agx_emit_tex(agx_builder *b, nir_tex_instr *instr)
|
|||||||
b, tmp, coords, lod, texture, sampler, compare_offset,
|
b, tmp, coords, lod, texture, sampler, compare_offset,
|
||||||
agx_tex_dim(instr->sampler_dim, instr->is_array),
|
agx_tex_dim(instr->sampler_dim, instr->is_array),
|
||||||
agx_lod_mode_for_nir(instr->op), mask, 0, !agx_is_null(packed_offset),
|
agx_lod_mode_for_nir(instr->op), mask, 0, !agx_is_null(packed_offset),
|
||||||
!agx_is_null(compare));
|
!agx_is_null(compare), AGX_GATHER_NONE);
|
||||||
|
|
||||||
if (txf)
|
if (txf)
|
||||||
I->op = AGX_OPCODE_TEXTURE_LOAD;
|
I->op = AGX_OPCODE_TEXTURE_LOAD;
|
||||||
|
@@ -335,9 +335,10 @@ typedef struct {
|
|||||||
bool invert_cond : 1;
|
bool invert_cond : 1;
|
||||||
|
|
||||||
/* TODO: Handle tex ops more efficient */
|
/* TODO: Handle tex ops more efficient */
|
||||||
enum agx_dim dim : 4;
|
enum agx_dim dim : 4;
|
||||||
bool offset : 1;
|
bool offset : 1;
|
||||||
bool shadow : 1;
|
bool shadow : 1;
|
||||||
|
enum agx_gather gather : 3;
|
||||||
|
|
||||||
/* Final st_vary op */
|
/* Final st_vary op */
|
||||||
bool last : 1;
|
bool last : 1;
|
||||||
@@ -356,7 +357,7 @@ typedef struct {
|
|||||||
bool saturate : 1;
|
bool saturate : 1;
|
||||||
unsigned mask : 4;
|
unsigned mask : 4;
|
||||||
|
|
||||||
unsigned padding : 11;
|
unsigned padding : 8;
|
||||||
} agx_instr;
|
} agx_instr;
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
|
@@ -108,6 +108,14 @@ DIM = enum("dim", {
|
|||||||
8: '2d_ms_array',
|
8: '2d_ms_array',
|
||||||
})
|
})
|
||||||
|
|
||||||
|
GATHER = enum("gather", {
|
||||||
|
0b000: "none",
|
||||||
|
0b001: "r",
|
||||||
|
0b011: "g",
|
||||||
|
0b101: "b",
|
||||||
|
0b111: "a",
|
||||||
|
})
|
||||||
|
|
||||||
OFFSET = immediate("offset", "bool")
|
OFFSET = immediate("offset", "bool")
|
||||||
SHADOW = immediate("shadow", "bool")
|
SHADOW = immediate("shadow", "bool")
|
||||||
SCOREBOARD = immediate("scoreboard")
|
SCOREBOARD = immediate("scoreboard")
|
||||||
@@ -234,7 +242,8 @@ op("fcmpsel",
|
|||||||
# TODO: anything else?
|
# TODO: anything else?
|
||||||
op("texture_sample",
|
op("texture_sample",
|
||||||
encoding_32 = (0x31, 0x7F, 8, 10), # XXX WRONG SIZE
|
encoding_32 = (0x31, 0x7F, 8, 10), # XXX WRONG SIZE
|
||||||
srcs = 5, imms = [DIM, LOD_MODE, MASK, SCOREBOARD, OFFSET, SHADOW])
|
srcs = 5, imms = [DIM, LOD_MODE, MASK, SCOREBOARD, OFFSET, SHADOW,
|
||||||
|
GATHER])
|
||||||
op("texture_load",
|
op("texture_load",
|
||||||
encoding_32 = (0x71, 0x7F, 8, 10), # XXX WRONG SIZE
|
encoding_32 = (0x71, 0x7F, 8, 10), # XXX WRONG SIZE
|
||||||
srcs = 5, imms = [DIM, LOD_MODE, MASK, SCOREBOARD, OFFSET])
|
srcs = 5, imms = [DIM, LOD_MODE, MASK, SCOREBOARD, OFFSET])
|
||||||
|
@@ -601,12 +601,11 @@ agx_pack_instr(struct util_dynarray *emission, struct util_dynarray *fixups,
|
|||||||
unsigned q2 = 0; // XXX
|
unsigned q2 = 0; // XXX
|
||||||
unsigned q3 = 12; // XXX
|
unsigned q3 = 12; // XXX
|
||||||
unsigned kill = 0; // helper invocation kill bit
|
unsigned kill = 0; // helper invocation kill bit
|
||||||
unsigned q6 = 0; // XXX
|
|
||||||
|
|
||||||
uint32_t extend = ((U & BITFIELD_MASK(5)) << 0) | (kill << 5) |
|
uint32_t extend = ((U & BITFIELD_MASK(5)) << 0) | (kill << 5) |
|
||||||
((I->dim >> 3) << 7) | ((R >> 6) << 8) |
|
((I->dim >> 3) << 7) | ((R >> 6) << 8) |
|
||||||
((C >> 6) << 10) | ((D >> 6) << 12) | ((T >> 6) << 14) |
|
((C >> 6) << 10) | ((D >> 6) << 12) | ((T >> 6) << 14) |
|
||||||
((O & BITFIELD_MASK(6)) << 16) | (q6 << 22) |
|
((O & BITFIELD_MASK(6)) << 16) | (I->gather << 23) |
|
||||||
(I->offset << 27) | ((S >> 6) << 28) | ((O >> 6) << 30);
|
(I->offset << 27) | ((S >> 6) << 28) | ((O >> 6) << 30);
|
||||||
|
|
||||||
bool L = (extend != 0);
|
bool L = (extend != 0);
|
||||||
|
Reference in New Issue
Block a user