diff options
author | Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl> | 2016-06-06 22:36:35 +0200 |
---|---|---|
committer | Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl> | 2016-06-10 12:18:29 +0200 |
commit | 54f755fa0fda14c578022767bcef2f27b2e89707 (patch) | |
tree | 3d923c25cd64d24f7965e550009c37d97a5f63a7 /src/gallium/drivers/radeonsi/si_descriptors.c | |
parent | f93c22109e281ee927c3bb349b94a43fd47ed9ad (diff) | |
download | external_mesa3d-54f755fa0fda14c578022767bcef2f27b2e89707.zip external_mesa3d-54f755fa0fda14c578022767bcef2f27b2e89707.tar.gz external_mesa3d-54f755fa0fda14c578022767bcef2f27b2e89707.tar.bz2 |
radeonsi: Reinitialize all descriptors in CE preamble.
This fixes a problem with the CE preamble and restoring only stuff in the
preamble when needed.
To illustrate suppose we have two graphics IB's 1 and 2, which are submitted in
that order. Furthermore suppose IB 1 does not use CE ram, but IB 2 does, and we
have a context switch at the start of IB 1, but not between IB 1 and IB 2.
The old code put the CE RAM loads in the preamble of IB 2. As the preamble of
IB 1 does not have the loads and the preamble of IB 2 does not get executed, the
old values are not load into CE RAM.
Fix this by always restoring the entire CE RAM.
v2: - Just load all descriptor set buffers instead of load and store the entire
CE RAM.
- Leave the ce_ram_dirty tracking in place for the non-preamble case.
v3: - Fixed parameter alignment.
- Rebased to master (Nicolai's descriptor series).
Signed-off-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
Diffstat (limited to 'src/gallium/drivers/radeonsi/si_descriptors.c')
-rw-r--r-- | src/gallium/drivers/radeonsi/si_descriptors.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c b/src/gallium/drivers/radeonsi/si_descriptors.c index e80db39..2d780e6 100644 --- a/src/gallium/drivers/radeonsi/si_descriptors.c +++ b/src/gallium/drivers/radeonsi/si_descriptors.c @@ -160,8 +160,8 @@ static bool si_ce_upload(struct si_context *sctx, unsigned ce_offset, unsigned s return true; } -static void si_reinitialize_ce_ram(struct si_context *sctx, - struct si_descriptors *desc) +static void si_ce_reinitialize_descriptors(struct si_context *sctx, + struct si_descriptors *desc) { if (desc->buffer) { struct r600_resource *buffer = (struct r600_resource*)desc->buffer; @@ -186,6 +186,14 @@ static void si_reinitialize_ce_ram(struct si_context *sctx, desc->ce_ram_dirty = false; } +void si_ce_reinitialize_all_descriptors(struct si_context *sctx) +{ + int i; + + for (i = 0; i < SI_NUM_DESCS; ++i) + si_ce_reinitialize_descriptors(sctx, &sctx->descriptors[i]); +} + void si_ce_enable_loads(struct radeon_winsys_cs *ib) { radeon_emit(ib, PKT3(PKT3_CONTEXT_CONTROL, 1, 0)); @@ -207,7 +215,7 @@ static bool si_upload_descriptors(struct si_context *sctx, uint32_t const* list = (uint32_t const*)desc->list; if (desc->ce_ram_dirty) - si_reinitialize_ce_ram(sctx, desc); + si_ce_reinitialize_descriptors(sctx, desc); while(desc->dirty_mask) { int begin, count; |