mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-23 17:40:11 +01:00
freedreno/batch: Move submit bo tracking to batch
We already do _most_ of the tracking of rsc associated with a batch at the batch level. If we manually add the handful of BOs that aren't part of the resource tracking, we can drop the duplicate drm level tracking. Signed-off-by: Rob Clark <robdclark@chromium.org> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23149>
This commit is contained in:
parent
5d26070f08
commit
b43e5aec0d
7 changed files with 29 additions and 8 deletions
|
|
@ -74,7 +74,6 @@ __reg_iova(const struct fd_reg_pair *reg)
|
|||
uint64_t *__p64 = (uint64_t *)__p; \
|
||||
*__p64 = __reg_iova(&__regs[i]) | __regs[i].value; \
|
||||
__p += 2; \
|
||||
fd_ringbuffer_attach_bo(ring, __regs[i].bo); \
|
||||
} else { \
|
||||
*__p++ = __regs[i].value; \
|
||||
if (__regs[i].is_address) \
|
||||
|
|
|
|||
|
|
@ -319,7 +319,6 @@ OUT_RELOC(struct fd_ringbuffer *ring, struct fd_bo *bo, uint32_t offset,
|
|||
uint64_t *cur = (uint64_t *)ring->cur;
|
||||
*cur = iova;
|
||||
ring->cur += 2;
|
||||
fd_ringbuffer_attach_bo(ring, bo);
|
||||
#else
|
||||
struct fd_reloc reloc = {
|
||||
.bo = bo,
|
||||
|
|
|
|||
|
|
@ -904,17 +904,24 @@ fd6_emit_restore(struct fd_batch *batch, struct fd_ringbuffer *ring)
|
|||
*/
|
||||
if (batch->tessellation) {
|
||||
assert(screen->tess_bo);
|
||||
fd_ringbuffer_attach_bo(ring, screen->tess_bo);
|
||||
OUT_PKT4(ring, REG_A6XX_PC_TESSFACTOR_ADDR, 2);
|
||||
OUT_RELOC(ring, screen->tess_bo, 0, 0, 0);
|
||||
/* Updating PC_TESSFACTOR_ADDR could race with the next draw which uses it. */
|
||||
OUT_WFI5(ring);
|
||||
}
|
||||
|
||||
struct fd6_context *fd6_ctx = fd6_context(batch->ctx);
|
||||
struct fd_bo *bcolor_mem = fd6_ctx->bcolor_mem;
|
||||
OUT_PKT4(ring, REG_A6XX_SP_TP_BORDER_COLOR_BASE_ADDR, 2);
|
||||
OUT_RELOC(ring, fd6_context(batch->ctx)->bcolor_mem, 0, 0, 0);
|
||||
OUT_RELOC(ring, bcolor_mem, 0, 0, 0);
|
||||
|
||||
OUT_PKT4(ring, REG_A6XX_SP_PS_TP_BORDER_COLOR_BASE_ADDR, 2);
|
||||
OUT_RELOC(ring, fd6_context(batch->ctx)->bcolor_mem, 0, 0, 0);
|
||||
OUT_RELOC(ring, bcolor_mem, 0, 0, 0);
|
||||
|
||||
fd_ringbuffer_attach_bo(ring, bcolor_mem);
|
||||
|
||||
fd_ringbuffer_attach_bo(ring, fd6_ctx->control_mem);
|
||||
|
||||
if (!batch->nondraw) {
|
||||
trace_end_state_restore(&batch->trace, ring);
|
||||
|
|
@ -942,6 +949,8 @@ fd6_mem_to_mem(struct fd_ringbuffer *ring, struct pipe_resource *dst,
|
|||
dst_off += 4;
|
||||
src_off += 4;
|
||||
}
|
||||
fd_ringbuffer_attach_bo(ring, dst_bo);
|
||||
fd_ringbuffer_attach_bo(ring, src_bo);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
|
|
@ -255,6 +255,7 @@ emit_lrz(struct fd_batch *batch, struct fd_batch_subpass *subpass)
|
|||
OUT_REG(ring, A6XX_GRAS_LRZ_BUFFER_BASE(.bo = subpass->lrz),
|
||||
A6XX_GRAS_LRZ_BUFFER_PITCH(.pitch = zsbuf->lrz_pitch),
|
||||
A6XX_GRAS_LRZ_FAST_CLEAR_BUFFER_BASE());
|
||||
fd_ringbuffer_attach_bo(ring, subpass->lrz);
|
||||
}
|
||||
|
||||
/* Emit any needed lrz clears to the prologue cmds
|
||||
|
|
@ -568,6 +569,9 @@ update_vsc_pipe(struct fd_batch *batch)
|
|||
ring, A6XX_VSC_DRAW_STRM_ADDRESS(.bo = fd6_ctx->vsc_draw_strm),
|
||||
A6XX_VSC_DRAW_STRM_PITCH(.dword = fd6_ctx->vsc_draw_strm_pitch),
|
||||
A6XX_VSC_DRAW_STRM_LIMIT(.dword = fd6_ctx->vsc_draw_strm_pitch - 64));
|
||||
|
||||
fd_ringbuffer_attach_bo(ring, fd6_ctx->vsc_draw_strm);
|
||||
fd_ringbuffer_attach_bo(ring, fd6_ctx->vsc_prim_strm);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -713,6 +717,9 @@ emit_common_fini(struct fd_batch *batch)
|
|||
if (!result)
|
||||
return;
|
||||
|
||||
// TODO attach directly to submit:
|
||||
fd_ringbuffer_attach_bo(ring, at->results_mem);
|
||||
|
||||
OUT_PKT4(ring, REG_A6XX_RB_SAMPLE_COUNT_CONTROL, 1);
|
||||
OUT_RING(ring, A6XX_RB_SAMPLE_COUNT_CONTROL_COPY);
|
||||
|
||||
|
|
|
|||
|
|
@ -202,16 +202,12 @@ fd6_build_bindless_state(struct fd_context *ctx, enum pipe_shader_type shader,
|
|||
struct pipe_shader_buffer *buf = &bufso->sb[b];
|
||||
unsigned idx = b + IR3_BINDLESS_SSBO_OFFSET;
|
||||
validate_buffer_descriptor(ctx, set, idx, buf);
|
||||
if (buf->buffer)
|
||||
fd_ringbuffer_attach_bo(ring, fd_resource(buf->buffer)->bo);
|
||||
}
|
||||
|
||||
u_foreach_bit (b, imgso->enabled_mask) {
|
||||
struct pipe_image_view *img = &imgso->si[b];
|
||||
unsigned idx = b + IR3_BINDLESS_IMAGE_OFFSET;
|
||||
validate_image_descriptor(ctx, set, idx, img);
|
||||
if (img->resource)
|
||||
fd_ringbuffer_attach_bo(ring, fd_resource(img->resource)->bo);
|
||||
}
|
||||
|
||||
if (!set->bo) {
|
||||
|
|
@ -258,6 +254,8 @@ fd6_build_bindless_state(struct fd_context *ctx, enum pipe_shader_type shader,
|
|||
|
||||
unsigned idx = ir3_shader_descriptor_set(shader);
|
||||
|
||||
fd_ringbuffer_attach_bo(ring, set->bo);
|
||||
|
||||
if (shader == PIPE_SHADER_COMPUTE) {
|
||||
OUT_REG(ring, HLSQ_INVALIDATE_CMD(CHIP, .cs_bindless = 0x1f));
|
||||
OUT_REG(ring, SP_CS_BINDLESS_BASE_DESCRIPTOR(CHIP,
|
||||
|
|
|
|||
|
|
@ -133,6 +133,7 @@ fd6_emit_shader(struct fd_context *ctx, struct fd_ringbuffer *ring,
|
|||
OUT_RING(ring, A6XX_SP_VS_PVT_MEM_PARAM_MEMSIZEPERITEM(per_fiber_size));
|
||||
if (so->pvtmem_size > 0) { /* SP_xS_PVT_MEM_ADDR */
|
||||
OUT_RELOC(ring, ctx->pvtmem[so->pvtmem_per_wave].bo, 0, 0, 0);
|
||||
fd_ringbuffer_attach_bo(ring, ctx->pvtmem[so->pvtmem_per_wave].bo);
|
||||
} else {
|
||||
OUT_RING(ring, 0);
|
||||
OUT_RING(ring, 0);
|
||||
|
|
@ -154,6 +155,8 @@ fd6_emit_shader(struct fd_context *ctx, struct fd_ringbuffer *ring,
|
|||
CP_LOAD_STATE6_0_STATE_BLOCK(sb) |
|
||||
CP_LOAD_STATE6_0_NUM_UNIT(shader_preload_size));
|
||||
OUT_RELOC(ring, so->bo, 0, 0, 0);
|
||||
|
||||
fd_ringbuffer_attach_bo(ring, so->bo);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -498,6 +498,12 @@ fd_batch_add_resource(struct fd_batch *batch, struct fd_resource *rsc)
|
|||
|
||||
_mesa_set_add_pre_hashed(batch->resources, rsc->hash, rsc);
|
||||
rsc->track->batch_mask |= (1 << batch->idx);
|
||||
|
||||
fd_ringbuffer_attach_bo(batch->draw, rsc->bo);
|
||||
if (unlikely(rsc->b.b.next)) {
|
||||
struct fd_resource *n = fd_resource(rsc->b.b.next);
|
||||
fd_ringbuffer_attach_bo(batch->draw, n->bo);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue