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:
Alyssa Rosenzweig
2023-05-25 13:22:47 -04:00
committed by Marge Bot
parent 954e2eee29
commit 6fd16dd7c9
4 changed files with 8 additions and 6 deletions

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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,

View File

@@ -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);