[Mesa-dev] [PATCH 13/18] winsys/amdgpu: start with smaller IBs, growing as necessary
Marek Olšák
maraeo at gmail.com
Sat May 14 10:19:17 UTC 2016
On Tue, May 10, 2016 at 1:21 AM, Nicolai Hähnle <nhaehnle at gmail.com> wrote:
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>
> This avoids allocating giant IBs from the outset, especially for CE and DMA.
>
> With this change, we also never flush prematurely due to the CE IB: as long
> as there is space in the buffer, we will use it.
> ---
> src/gallium/winsys/amdgpu/drm/amdgpu_cs.c | 55 +++++++++++++++++++++++++------
> src/gallium/winsys/amdgpu/drm/amdgpu_cs.h | 1 +
> 2 files changed, 46 insertions(+), 10 deletions(-)
>
> diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
> index a318670..546f224 100644
> --- a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
> +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
> @@ -335,11 +335,31 @@ static unsigned amdgpu_cs_add_buffer(struct radeon_winsys_cs *rcs,
> return index;
> }
>
> -static bool amdgpu_ib_new_buffer(struct radeon_winsys *ws, struct amdgpu_ib *ib,
> - unsigned buffer_size)
> +static bool amdgpu_ib_new_buffer(struct radeon_winsys *ws, struct amdgpu_ib *ib)
> {
> struct pb_buffer *pb;
> uint8_t *mapped;
> + unsigned buffer_size;
> +
> + /* Always create a buffer that is at least as large as the largest IB
> + * seen so far (multiplied by a factor to reduce internal fragmentation),
> + * but never more than the maximum IB size supported by the hardware.
> + */
> + buffer_size = 4 << MIN2(19, 2 + util_last_bit(ib->max_ib_size));
Would you please use something more readable? I think it's equal or
very similar to this expression:
MIN2(2 * 1024 * 1024, 4 * 4 * util_next_power_of_two(ib->max_ib_size))
And a comment explaining those numbers would be useful. For example,
"2MB is the maximum IB size allowed by the winsys" (I think the hw
limit is 4 MB actually) "and we always allocate 4 times more space
than the maximum seen IB size aligned to 2^n".
> +
> + switch (ib->ib_type) {
> + case IB_CONST_PREAMBLE:
> + buffer_size = MAX2(buffer_size, 4 * 1024);
> + break;
> + case IB_CONST:
> + buffer_size = MAX2(buffer_size, 16 * 1024 * 4);
> + break;
> + case IB_MAIN:
> + buffer_size = MAX2(buffer_size, 8 * 1024 * 4);
> + break;
> + default:
> + unreachable("unhandled IB type");
> + }
>
> pb = ws->buffer_create(ws, buffer_size, 4096, RADEON_DOMAIN_GTT,
> RADEON_FLAG_CPU_ACCESS);
> @@ -370,35 +390,34 @@ static bool amdgpu_get_new_ib(struct radeon_winsys *ws, struct amdgpu_cs *cs,
> */
> struct amdgpu_ib *ib = NULL;
> struct amdgpu_cs_ib_info *info = &cs->csc->ib[ib_type];
> - unsigned buffer_size, ib_size;
> + unsigned ib_size = 0;
>
> switch (ib_type) {
> case IB_CONST_PREAMBLE:
> ib = &cs->const_preamble_ib;
> - buffer_size = 4 * 1024 * 4;
> - ib_size = 1024 * 4;
> + ib_size = 256 * 4;
> break;
> case IB_CONST:
> ib = &cs->const_ib;
> - buffer_size = 512 * 1024 * 4;
> - ib_size = 128 * 1024 * 4;
> + ib_size = 8 * 1024 * 4;
> break;
> case IB_MAIN:
> ib = &cs->main;
> - buffer_size = 128 * 1024 * 4;
> - ib_size = 20 * 1024 * 4;
> + ib_size = 4 * 1024 * 4;
> break;
> default:
> unreachable("unhandled IB type");
> }
>
> + ib_size = MAX2(ib_size, 4 << MIN2(19, util_last_bit(ib->max_ib_size)));
This is an expression similar to the one above. Some unification would be nice.
Marek
More information about the mesa-dev
mailing list