From 2128607014d057942c132cc22648692b5cc1cb13 Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Sun, 1 Jan 2023 11:29:12 -0800 Subject: [PATCH] freedreno/a6xx: Move fb_read descriptor to fd6_gmem We already overwrote the entire descriptor in patch_fb_read_sysmem(). Doing the same in patch_fb_read_gmem() will simplify things for moving the fb_read descriptor to the FS's bindless descriptor set. Signed-off-by: Rob Clark Part-of: --- src/gallium/drivers/freedreno/a6xx/fd6_emit.c | 27 +++---------- src/gallium/drivers/freedreno/a6xx/fd6_gmem.c | 39 ++++++++++++------- 2 files changed, 30 insertions(+), 36 deletions(-) diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_emit.c b/src/gallium/drivers/freedreno/a6xx/fd6_emit.c index 5c6863ee6cf..75424ace2b2 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_emit.c +++ b/src/gallium/drivers/freedreno/a6xx/fd6_emit.c @@ -53,27 +53,12 @@ static void fd6_emit_fb_tex(struct fd_ringbuffer *state, struct fd_context *ctx) assert_dt { - struct pipe_framebuffer_state *pfb = &ctx->batch->framebuffer; - struct pipe_surface *psurf = pfb->cbufs[0]; - struct fd_resource *rsc = fd_resource(psurf->texture); - - OUT_RINGP(state, 0, &ctx->batch->fb_read_patches); /* texconst0, patched in gmem emit */ - OUT_RING(state, A6XX_TEX_CONST_1_WIDTH(pfb->width) | - A6XX_TEX_CONST_1_HEIGHT(pfb->height)); - OUT_RING(state, 0); /* texconst2, patched in gmem emit */ - OUT_RING(state, A6XX_TEX_CONST_3_ARRAY_PITCH(rsc->layout.layer_size)); - OUT_RING(state, 0); /* BASE_LO, patched in gmem emit */ - OUT_RING(state, 0); /* BASE_HI, patched in gmem emit */ - OUT_RING(state, 0); /* texconst6 */ - OUT_RING(state, 0); /* texconst7 */ - OUT_RING(state, 0); /* texconst8 */ - OUT_RING(state, 0); /* texconst9 */ - OUT_RING(state, 0); /* texconst10 */ - OUT_RING(state, 0); /* texconst11 */ - OUT_RING(state, 0); - OUT_RING(state, 0); - OUT_RING(state, 0); - OUT_RING(state, 0); + /* This is patched with the appropriate descriptor for GMEM or + * sysmem rendering path in fd6_gmem + */ + OUT_RINGP(state, 0, &ctx->batch->fb_read_patches); + for (unsigned i = 1; i < FDL6_TEX_CONST_DWORDS; i++) + OUT_RING(state, 0); } void diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_gmem.c b/src/gallium/drivers/freedreno/a6xx/fd6_gmem.c index a00f98b406f..5542ff82f97 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_gmem.c +++ b/src/gallium/drivers/freedreno/a6xx/fd6_gmem.c @@ -272,24 +272,33 @@ patch_fb_read_gmem(struct fd_batch *batch) fdl6_format_swiz(psurf->format, false, swiz); /* always TILE6_2 mode in GMEM, which also means no swap: */ - uint32_t texconst0 = A6XX_TEX_CONST_0_FMT(fd6_texture_format(format, rsc->layout.tile_mode)) | - A6XX_TEX_CONST_0_SAMPLES(fd_msaa_samples(prsc->nr_samples)) | - A6XX_TEX_CONST_0_SWAP(WZYX) | - A6XX_TEX_CONST_0_TILE_MODE(TILE6_2) | - COND(util_format_is_srgb(format), A6XX_TEX_CONST_0_SRGB) | - A6XX_TEX_CONST_0_SWIZ_X(fdl6_swiz(swiz[0])) | - A6XX_TEX_CONST_0_SWIZ_Y(fdl6_swiz(swiz[1])) | - A6XX_TEX_CONST_0_SWIZ_Z(fdl6_swiz(swiz[2])) | - A6XX_TEX_CONST_0_SWIZ_W(fdl6_swiz(swiz[3])); + uint32_t descriptor[FDL6_TEX_CONST_DWORDS] = { + A6XX_TEX_CONST_0_FMT(fd6_texture_format(format, rsc->layout.tile_mode)) | + A6XX_TEX_CONST_0_SAMPLES(fd_msaa_samples(prsc->nr_samples)) | + A6XX_TEX_CONST_0_SWAP(WZYX) | + A6XX_TEX_CONST_0_TILE_MODE(TILE6_2) | + COND(util_format_is_srgb(format), A6XX_TEX_CONST_0_SRGB) | + A6XX_TEX_CONST_0_SWIZ_X(fdl6_swiz(swiz[0])) | + A6XX_TEX_CONST_0_SWIZ_Y(fdl6_swiz(swiz[1])) | + A6XX_TEX_CONST_0_SWIZ_Z(fdl6_swiz(swiz[2])) | + A6XX_TEX_CONST_0_SWIZ_W(fdl6_swiz(swiz[3])), + + A6XX_TEX_CONST_1_WIDTH(pfb->width) | + A6XX_TEX_CONST_1_HEIGHT(pfb->height), + + A6XX_TEX_CONST_2_PITCH(gmem->bin_w * gmem->cbuf_cpp[0]) | + A6XX_TEX_CONST_2_TYPE(A6XX_TEX_2D), + + A6XX_TEX_CONST_3_ARRAY_PITCH(rsc->layout.layer_size), + A6XX_TEX_CONST_4_BASE_LO(screen->gmem_base), + + A6XX_TEX_CONST_5_BASE_HI(screen->gmem_base >> 32) | + A6XX_TEX_CONST_5_DEPTH(1) + }; for (unsigned i = 0; i < num_patches; i++) { struct fd_cs_patch *patch = fd_patch_element(&batch->fb_read_patches, i); - patch->cs[0] = texconst0; - patch->cs[2] = A6XX_TEX_CONST_2_PITCH(gmem->bin_w * gmem->cbuf_cpp[0]) | - A6XX_TEX_CONST_2_TYPE(A6XX_TEX_2D); - patch->cs[4] = A6XX_TEX_CONST_4_BASE_LO(screen->gmem_base); - patch->cs[5] = A6XX_TEX_CONST_5_BASE_HI(screen->gmem_base >> 32) | - A6XX_TEX_CONST_5_DEPTH(1); + memcpy(patch->cs, descriptor, FDL6_TEX_CONST_DWORDS * 4); } util_dynarray_clear(&batch->fb_read_patches); }