On Sun, Mar 16, 2014 at 12:46 PM, Marek Olšák <mar...@gmail.com> wrote:
> From: Marek Olšák <marek.ol...@amd.com>
>
> Also rewrite the comment for it to be readable and reorder the code.

Reviewed-by: Alex Deucher <alexander.deuc...@amd.com>

> ---
>  src/gallium/winsys/radeon/drm/radeon_drm_cs.c | 23 +++++++++++++----------
>  1 file changed, 13 insertions(+), 10 deletions(-)
>
> diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c 
> b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
> index afe1e82..abc8b99 100644
> --- a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
> +++ b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
> @@ -281,6 +281,7 @@ static unsigned radeon_add_reloc(struct radeon_drm_cs *cs,
>      if (csc->is_handle_added[hash]) {
>          i = csc->reloc_indices_hashlist[hash];
>          reloc = &csc->relocs[i];
> +
>          if (reloc->handle != bo->handle) {
>              /* Hash collision, look for the BO in the list of relocs 
> linearly. */
>              for (i = csc->crelocs - 1; i >= 0; i--) {
> @@ -293,21 +294,23 @@ static unsigned radeon_add_reloc(struct radeon_drm_cs 
> *cs,
>          }
>
>          if (i >= 0) {
> -            /* On DMA ring we need to emit as many relocation as there is 
> use of the bo
> -             * thus each time this function is call we should grow add again 
> the bo to
> -             * the relocation buffer
> +            update_reloc(reloc, rd, wd, priority, added_domains);
> +
> +            /* For async DMA, every add_reloc call must add a buffer to the 
> list
> +             * no matter how many duplicates there are. This is due to the 
> fact
> +             * the DMA CS checker doesn't use NOP packets for offset 
> patching,
> +             * but always uses the i-th buffer from the list to patch the 
> i-th
> +             * offset. If there are N offsets in a DMA CS, there must also 
> be N
> +             * buffers in the relocation list.
>               *
> -             * Do not update the hash table if it's dma ring, so that first 
> hash always point
> -             * to first bo relocation which will the one used by the kernel. 
> Following relocation
> -             * will be ignore by the kernel memory placement (but still use 
> by the kernel to
> -             * update the cmd stream with proper buffer offset).
> +             * This doesn't have to be done if virtual memory is enabled,
> +             * because there is no offset patching with virtual memory.
>               */
> -            update_hash = FALSE;
> -            update_reloc(reloc, rd, wd, priority, added_domains);
> -            if (cs->base.ring_type != RING_DMA) {
> +            if (cs->base.ring_type != RING_DMA || 
> cs->ws->info.r600_virtual_address) {
>                  csc->reloc_indices_hashlist[hash] = i;
>                  return i;
>              }
> +            update_hash = FALSE;
>          }
>      }
>
> --
> 1.8.3.2
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to