[Mesa-dev] [PATCH 2/2] radeonsi: always place sparse buffers in VRAM
Dieter Nützel
Dieter at nuetzel-hh.de
Wed Dec 6 09:02:26 UTC 2017
Hello Nicolai,
any updates?
Dieter
Am 29.11.2017 02:57, schrieb Dieter Nützel:
> For the series:
>
> Tested-by: Dieter Nützel <Dieter at nuetzel-hh.de>
>
> on RX580
>
> with UH, UV, DiRT Rally, some Wine apps - LS2015/LS2017
>
> Dieter
>
> Am 28.11.2017 14:44, schrieb Nicolai Hähnle:
>> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>>
>> Together with "radeonsi: fix the R600_RESOURCE_FLAG_UNMAPPABLE check",
>> this ensures that sparse buffers are placed in VRAM.
>>
>> Noticed by an assertion that started triggering with commit d4fac1e1d7
>> ("gallium/radeon: enable suballocations for VRAM with no CPU access")
>>
>> Fixes KHR-GL45.sparse_buffer_tests.BufferStorageTest in debug builds.
>> ---
>> src/gallium/drivers/radeon/r600_buffer_common.c | 3 +++
>> src/gallium/winsys/amdgpu/drm/amdgpu_bo.c | 5 +++--
>> 2 files changed, 6 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/gallium/drivers/radeon/r600_buffer_common.c
>> b/src/gallium/drivers/radeon/r600_buffer_common.c
>> index 158cabcfaeb..36a29181edc 100644
>> --- a/src/gallium/drivers/radeon/r600_buffer_common.c
>> +++ b/src/gallium/drivers/radeon/r600_buffer_common.c
>> @@ -616,20 +616,23 @@ r600_alloc_buffer_struct(struct pipe_screen
>> *screen,
>> return rbuffer;
>> }
>>
>> struct pipe_resource *si_buffer_create(struct pipe_screen *screen,
>> const struct pipe_resource *templ,
>> unsigned alignment)
>> {
>> struct r600_common_screen *rscreen = (struct
>> r600_common_screen*)screen;
>> struct r600_resource *rbuffer = r600_alloc_buffer_struct(screen,
>> templ);
>>
>> + if (templ->flags & PIPE_RESOURCE_FLAG_SPARSE)
>> + rbuffer->b.b.flags |= R600_RESOURCE_FLAG_UNMAPPABLE;
>> +
>> si_init_resource_fields(rscreen, rbuffer, templ->width0, alignment);
>>
>> if (templ->flags & PIPE_RESOURCE_FLAG_SPARSE)
>> rbuffer->flags |= RADEON_FLAG_SPARSE;
>>
>> if (!si_alloc_resource(rscreen, rbuffer)) {
>> FREE(rbuffer);
>> return NULL;
>> }
>> return &rbuffer->b.b;
>> diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c
>> b/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c
>> index c3e97c22861..d6d5805deed 100644
>> --- a/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c
>> +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c
>> @@ -1143,20 +1143,23 @@ amdgpu_bo_create(struct radeon_winsys *rws,
>> struct amdgpu_winsys *ws = amdgpu_winsys(rws);
>> struct amdgpu_winsys_bo *bo;
>> unsigned usage = 0, pb_cache_bucket = 0;
>>
>> /* VRAM implies WC. This is not optional. */
>> assert(!(domain & RADEON_DOMAIN_VRAM) || flags &
>> RADEON_FLAG_GTT_WC);
>>
>> /* NO_CPU_ACCESS is valid with VRAM only. */
>> assert(domain == RADEON_DOMAIN_VRAM || !(flags &
>> RADEON_FLAG_NO_CPU_ACCESS));
>>
>> + /* Sparse buffers must have NO_CPU_ACCESS set. */
>> + assert(!(flags & RADEON_FLAG_SPARSE) || flags &
>> RADEON_FLAG_NO_CPU_ACCESS);
>> +
>> /* Sub-allocate small buffers from slabs. */
>> if (!(flags & (RADEON_FLAG_NO_SUBALLOC | RADEON_FLAG_SPARSE)) &&
>> size <= (1 << AMDGPU_SLAB_MAX_SIZE_LOG2) &&
>> alignment <= MAX2(1 << AMDGPU_SLAB_MIN_SIZE_LOG2,
>> util_next_power_of_two(size))) {
>> struct pb_slab_entry *entry;
>> int heap = radeon_get_heap_index(domain, flags);
>>
>> if (heap < 0 || heap >= RADEON_MAX_SLAB_HEAPS)
>> goto no_slab;
>>
>> @@ -1175,22 +1178,20 @@ amdgpu_bo_create(struct radeon_winsys *rws,
>>
>> pipe_reference_init(&bo->base.reference, 1);
>>
>> return &bo->base;
>> }
>> no_slab:
>>
>> if (flags & RADEON_FLAG_SPARSE) {
>> assert(RADEON_SPARSE_PAGE_SIZE % alignment == 0);
>>
>> - flags |= RADEON_FLAG_NO_CPU_ACCESS;
>> -
>> return amdgpu_bo_sparse_create(ws, size, domain, flags);
>> }
>>
>> /* This flag is irrelevant for the cache. */
>> flags &= ~RADEON_FLAG_NO_SUBALLOC;
>>
>> /* Align size to page size. This is the minimum alignment for
>> normal
>> * BOs. Aligning this here helps the cached bufmgr. Especially
>> small BOs,
>> * like constant/uniform buffers, can benefit from better and more
>> reuse.
>> */
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list