tu: Move tu6_emit_mrt() to use CRB.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/38762>
This commit is contained in:
Emma Anholt 2025-08-13 15:08:08 -07:00 committed by Marge Bot
parent daa9c0e228
commit 5bfc950128
3 changed files with 39 additions and 35 deletions

View file

@ -719,6 +719,8 @@ tu6_emit_mrt(struct tu_cmd_buffer *cmd,
enum a6xx_format mrt0_format = FMT6_NONE;
tu_crb crb = cs->crb(10 * MAX_RTS + 6);
uint32_t written = 0;
for (uint32_t i = 0; i < subpass->color_count; ++i) {
uint32_t a = subpass->color_attachments[i].attachment;
@ -729,21 +731,21 @@ tu6_emit_mrt(struct tu_cmd_buffer *cmd,
const struct tu_image_view *iview = cmd->state.attachments[a];
tu_cs_emit_regs(cs,
RB_MRT_BUF_INFO(CHIP, remapped, .dword = iview->view.RB_MRT_BUF_INFO),
A6XX_RB_MRT_PITCH(remapped, iview->view.pitch),
A6XX_RB_MRT_ARRAY_PITCH(remapped, iview->view.layer_size),
A6XX_RB_MRT_BASE(remapped, .qword = tu_layer_address(&iview->view, 0)),
A6XX_RB_MRT_BASE_GMEM(remapped,
tu_attachment_gmem_offset(cmd, &cmd->state.pass->attachments[a], 0)
),
);
tu_cs_emit_regs(cs,
A6XX_SP_PS_MRT_REG(remapped, .dword = iview->view.SP_PS_MRT_REG));
tu_cs_emit_pkt4(cs, REG_A6XX_RB_COLOR_FLAG_BUFFER_ADDR(remapped), 3);
tu_cs_image_flag_ref(cs, &iview->view, 0);
crb.add(RB_MRT_BUF_INFO(CHIP, remapped,
.dword = iview->view.RB_MRT_BUF_INFO));
crb.add(A6XX_RB_MRT_PITCH(remapped, iview->view.pitch));
crb.add(A6XX_RB_MRT_ARRAY_PITCH(remapped, iview->view.layer_size));
crb.add(A6XX_RB_MRT_BASE(remapped,
.qword = tu_layer_address(&iview->view, 0)));
crb.add(A6XX_RB_MRT_BASE_GMEM(
remapped, tu_attachment_gmem_offset(
cmd, &cmd->state.pass->attachments[a], 0)));
crb.add(
A6XX_SP_PS_MRT_REG(remapped, .dword = iview->view.SP_PS_MRT_REG));
crb.add(A6XX_RB_COLOR_FLAG_BUFFER_ADDR(
remapped, .qword = tu_layer_flag_address(&iview->view, 0)));
crb.add(A6XX_RB_COLOR_FLAG_BUFFER_PITCH(
remapped, .dword = iview->view.FLAG_BUFFER_PITCH));
if (remapped == 0)
mrt0_format = (enum a6xx_format) (iview->view.SP_PS_MRT_REG & 0xff);
@ -771,19 +773,15 @@ tu6_emit_mrt(struct tu_cmd_buffer *cmd,
* write to attachments beyond those that exist in the render pass, so
* we have all attachments not written up to MAX_RTS.
*/
tu_cs_emit_regs(cs,
RB_MRT_BUF_INFO(CHIP, i),
A6XX_RB_MRT_PITCH(i),
A6XX_RB_MRT_ARRAY_PITCH(i),
A6XX_RB_MRT_BASE(i),
A6XX_RB_MRT_BASE_GMEM(i),
);
tu_cs_emit_regs(cs,
A6XX_SP_PS_MRT_REG(i, .dword = 0));
crb.add(RB_MRT_BUF_INFO(CHIP, i));
crb.add(A6XX_RB_MRT_PITCH(i));
crb.add(A6XX_RB_MRT_ARRAY_PITCH(i));
crb.add(A6XX_RB_MRT_BASE(i));
crb.add(A6XX_RB_MRT_BASE_GMEM(i));
crb.add(A6XX_SP_PS_MRT_REG(i, .dword = 0));
}
tu_cs_emit_regs(cs, GRAS_LRZ_MRT_BUFFER_INFO_0(CHIP, .color_format = mrt0_format));
crb.add(GRAS_LRZ_MRT_BUFFER_INFO_0(CHIP, .color_format = mrt0_format));
const bool dither = subpass->legacy_dithering_enabled;
const uint32_t dither_cntl =
@ -797,18 +795,15 @@ tu6_emit_mrt(struct tu_cmd_buffer *cmd,
.dither_mode_mrt6 = dither ? DITHER_ALWAYS : DITHER_DISABLE,
.dither_mode_mrt7 = dither ? DITHER_ALWAYS : DITHER_DISABLE, )
.value;
tu_cs_emit_regs(cs, A6XX_RB_DITHER_CNTL(.dword = dither_cntl));
crb.add(A6XX_RB_DITHER_CNTL(.dword = dither_cntl));
if (CHIP >= A7XX) {
tu_cs_emit_regs(cs, SP_DITHER_CNTL(CHIP, .dword = dither_cntl));
crb.add(SP_DITHER_CNTL(CHIP, .dword = dither_cntl));
}
tu_cs_emit_regs(cs,
A6XX_RB_SRGB_CNTL(.dword = subpass->srgb_cntl));
tu_cs_emit_regs(cs,
A6XX_SP_SRGB_CNTL(.dword = subpass->srgb_cntl));
crb.add(A6XX_RB_SRGB_CNTL(.dword = subpass->srgb_cntl));
crb.add(A6XX_SP_SRGB_CNTL(.dword = subpass->srgb_cntl));
unsigned layers = MAX2(fb->layers, util_logbase2(subpass->multiview_mask) + 1);
tu_cs_emit_regs(cs, GRAS_CL_ARRAY_SIZE(CHIP, layers - 1));
crb.add(GRAS_CL_ARRAY_SIZE(CHIP, layers - 1));
}
struct tu_bin_size_params {

View file

@ -141,6 +141,12 @@ tu_layer_address(const struct fdl6_view *iview, uint32_t layer)
return iview->base_addr + iview->layer_size * layer;
}
uint64_t
tu_layer_flag_address(const struct fdl6_view *iview, uint32_t layer)
{
return iview->ubwc_addr + iview->ubwc_layer_size * layer;
}
void
tu_cs_image_ref(struct tu_cs *cs, const struct fdl6_view *iview, uint32_t layer)
{
@ -181,7 +187,7 @@ TU_GENX(tu_cs_image_ref_2d);
void
tu_cs_image_flag_ref(struct tu_cs *cs, const struct fdl6_view *iview, uint32_t layer)
{
tu_cs_emit_qw(cs, iview->ubwc_addr + iview->ubwc_layer_size * layer);
tu_cs_emit_qw(cs, tu_layer_flag_address(iview, layer));
tu_cs_emit(cs, iview->FLAG_BUFFER_PITCH);
}

View file

@ -126,6 +126,9 @@ template <chip CHIP>
void
tu_cs_image_ref_2d(struct tu_cs *cs, const struct fdl6_view *iview, uint32_t layer, bool src);
uint64_t
tu_layer_flag_address(const struct fdl6_view *iview, uint32_t layer);
void
tu_cs_image_flag_ref(struct tu_cs *cs, const struct fdl6_view *iview, uint32_t layer);