agx: Model both sources of sample_mask
We need to control both sources to implement multisampling properly. The semantic is something like: foreach sample in the first mask { if correspond bit in second bit set { make sample live } else { make sample dead } } But I'm reticent to document more formally until the details are really understood and properly tested. Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23480>
This commit is contained in:

committed by
Marge Bot

parent
954e2eee29
commit
6fd16dd7c9
@@ -428,7 +428,7 @@ agx_write_sample_mask_1(agx_builder *b)
|
||||
* we are therefore still active and need to write a full sample mask.
|
||||
* TODO: interactions with MSAA and gl_SampleMask writes
|
||||
*/
|
||||
agx_sample_mask(b, agx_immediate(1));
|
||||
agx_sample_mask(b, agx_immediate(0xFF), agx_immediate(1));
|
||||
agx_signal_pix(b, 1);
|
||||
b->shader->did_sample_mask = true;
|
||||
|
||||
@@ -688,7 +688,7 @@ agx_emit_discard(agx_builder *b)
|
||||
b->shader->did_writeout = true;
|
||||
|
||||
b->shader->out->writes_sample_mask = true;
|
||||
agx_sample_mask(b, agx_immediate(0));
|
||||
agx_sample_mask(b, agx_immediate(0xFF), agx_immediate(0));
|
||||
return agx_signal_pix(b, 1);
|
||||
}
|
||||
|
||||
|
@@ -41,6 +41,7 @@ should_lower(enum agx_opcode op, agx_index uniform, unsigned src_index)
|
||||
case AGX_OPCODE_UNIFORM_STORE:
|
||||
case AGX_OPCODE_ST_VARY:
|
||||
case AGX_OPCODE_LOCAL_ATOMIC:
|
||||
case AGX_OPCODE_SAMPLE_MASK:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
|
@@ -292,7 +292,7 @@ op("wait", (0x38, 0xFF, 2, _), dests = 0,
|
||||
|
||||
op("get_sr", (0x72, 0x7F | L, 4, _), dests = 1, imms = [SR])
|
||||
|
||||
op("sample_mask", (0x7fc1, 0xffff, 6, _), dests = 0, srcs = 1, can_eliminate = False)
|
||||
op("sample_mask", (0x7fc1, 0xffff, 6, _), dests = 0, srcs = 2, can_eliminate = False)
|
||||
|
||||
# Sources: sample mask, combined depth/stencil
|
||||
op("zs_emit", (0x41, 0xFF | L, 4, _), dests = 0, srcs = 2,
|
||||
|
@@ -502,9 +502,10 @@ agx_pack_instr(struct util_dynarray *emission, struct util_dynarray *fixups,
|
||||
}
|
||||
|
||||
case AGX_OPCODE_SAMPLE_MASK: {
|
||||
unsigned S = agx_pack_sample_mask_src(I->src[0]);
|
||||
unsigned T = 0xFF;
|
||||
bool Tt = true /* immediate */;
|
||||
unsigned S = agx_pack_sample_mask_src(I->src[1]);
|
||||
unsigned T = I->src[0].value;
|
||||
bool Tt = I->src[0].type == AGX_INDEX_IMMEDIATE;
|
||||
assert(Tt || I->src[0].type == AGX_INDEX_REGISTER);
|
||||
uint32_t raw = 0xc1 | (Tt ? BITFIELD_BIT(8) : 0) |
|
||||
((T & BITFIELD_MASK(6)) << 9) | ((S & 0xff) << 16) |
|
||||
((T >> 6) << 24) | ((S >> 8) << 26);
|
||||
|
Reference in New Issue
Block a user