From: Christian König <[email protected]> For now syncs all engines accessing a BO using the new kernel interface, older kernels should ignore the new chunk and maintain the old behavior.
Signed-off-by: Christian König <[email protected]> --- src/gallium/winsys/radeon/drm/radeon_drm_cs.c | 30 ++++++++++++++++++++++++--- src/gallium/winsys/radeon/drm/radeon_drm_cs.h | 5 +++-- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c index e821b6f..587719b 100644 --- a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c +++ b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c @@ -72,6 +72,9 @@ #include <stdint.h> #include <xf86drm.h> +#ifndef RADEON_CHUNK_ID_WAIT_FOR +#define RADEON_CHUNK_ID_WAIT_FOR 0x05 +#endif #define RELOC_DWORDS (sizeof(struct drm_radeon_cs_reloc) / sizeof(uint32_t)) @@ -100,6 +103,13 @@ static boolean radeon_init_cs_context(struct radeon_cs_context *csc, return FALSE; } + csc->cs_ids = CALLOC(csc->nrelocs, sizeof(uint64_t)); + if (!csc->cs_ids) { + FREE(csc->relocs_bo); + FREE(csc->relocs); + return FALSE; + } + csc->chunks[0].chunk_id = RADEON_CHUNK_ID_IB; csc->chunks[0].length_dw = 0; csc->chunks[0].chunk_data = (uint64_t)(uintptr_t)csc->buf; @@ -109,13 +119,17 @@ static boolean radeon_init_cs_context(struct radeon_cs_context *csc, csc->chunks[2].chunk_id = RADEON_CHUNK_ID_FLAGS; csc->chunks[2].length_dw = 5; csc->chunks[2].chunk_data = (uint64_t)(uintptr_t)&csc->flags; + csc->chunks[3].chunk_id = RADEON_CHUNK_ID_WAIT_FOR; + csc->chunks[3].length_dw = 0; + csc->chunks[3].chunk_data = (uint64_t)(uintptr_t)csc->cs_ids; csc->chunk_array[0] = (uint64_t)(uintptr_t)&csc->chunks[0]; csc->chunk_array[1] = (uint64_t)(uintptr_t)&csc->chunks[1]; csc->chunk_array[2] = (uint64_t)(uintptr_t)&csc->chunks[2]; + csc->chunk_array[3] = (uint64_t)(uintptr_t)&csc->chunks[3]; csc->cs.chunks = (uint64_t)(uintptr_t)csc->chunk_array; - csc->cs.num_chunks = 3; + csc->cs.num_chunks = 4; for (i = 0; i < Elements(csc->reloc_indices_hashlist); i++) { csc->reloc_indices_hashlist[i] = -1; @@ -285,8 +299,11 @@ static unsigned radeon_add_reloc(struct radeon_drm_cs *cs, size = csc->nrelocs * sizeof(struct drm_radeon_cs_reloc); csc->relocs = realloc(csc->relocs, size); - csc->chunks[1].chunk_data = (uint64_t)(uintptr_t)csc->relocs; + + size = csc->nrelocs * sizeof(uint64_t); + csc->cs_ids = realloc(csc->cs_ids, size); + csc->chunks[3].chunk_data = (uint64_t)(uintptr_t)csc->cs_ids; } /* Initialize the new relocation. */ @@ -383,7 +400,14 @@ static boolean radeon_drm_cs_memory_below_limit(struct radeon_winsys_cs *rcs, ui void radeon_drm_cs_emit_ioctl_oneshot(struct radeon_drm_cs *cs, struct radeon_cs_context *csc) { uint64_t id; - unsigned i; + unsigned i, c; + + for (i = 0, c = 0; i < csc->crelocs; i++) { + id = csc->relocs_bo[i]->last_cs_id; + if (id) + csc->cs_ids[c++] = id; + } + csc->chunks[3].length_dw = c * 2; if (drmCommandWriteRead(csc->fd, DRM_RADEON_CS, &csc->cs, sizeof(struct drm_radeon_cs))) { diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_cs.h b/src/gallium/winsys/radeon/drm/radeon_drm_cs.h index 1d0bc64..f903b5d 100644 --- a/src/gallium/winsys/radeon/drm/radeon_drm_cs.h +++ b/src/gallium/winsys/radeon/drm/radeon_drm_cs.h @@ -35,8 +35,8 @@ struct radeon_cs_context { int fd; struct drm_radeon_cs cs; - struct drm_radeon_cs_chunk chunks[3]; - uint64_t chunk_array[3]; + struct drm_radeon_cs_chunk chunks[4]; + uint64_t chunk_array[4]; uint32_t flags[5]; uint32_t cs_trace_id; @@ -47,6 +47,7 @@ struct radeon_cs_context { unsigned validated_crelocs; struct radeon_bo **relocs_bo; struct drm_radeon_cs_reloc *relocs; + uint64_t *cs_ids; int reloc_indices_hashlist[512]; -- 1.9.1 _______________________________________________ mesa-dev mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-dev
