X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fgallium%2Fwinsys%2Famdgpu%2Fdrm%2Famdgpu_winsys.c;h=98d72bd9f2c8fa4e545211c1a177e04a30ad8946;hb=79a8e674aef8d50e79f5d4ab25e0f951d1c69398;hp=3961ee384400dabf286275e4899dbbde40fb5135;hpb=480ac143df281fef762e30f92bccc3b89674fef8;p=mesa.git diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c index 3961ee38440..98d72bd9f2c 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c @@ -318,8 +318,8 @@ static bool do_winsys_init(struct amdgpu_winsys *ws, int fd) /* Set hardware information. */ ws->info.gart_size = gtt.heap_size; ws->info.vram_size = vram.heap_size; - /* TODO: the kernel reports vram/gart.max_allocation == 251 MB (bug?) */ - ws->info.max_alloc_size = MAX2(ws->info.vram_size, ws->info.gart_size); + /* The kernel can split large buffers, so we can do large allocations. */ + ws->info.max_alloc_size = MAX2(ws->info.vram_size, ws->info.gart_size) * 0.9; /* convert the shader clock from KHz to MHz */ ws->info.max_shader_clock = ws->amdinfo.max_engine_clk / 1000; ws->info.max_se = ws->amdinfo.num_shader_engines; @@ -382,6 +382,7 @@ static void amdgpu_winsys_destroy(struct radeon_winsys *rws) util_queue_destroy(&ws->cs_queue); pipe_mutex_destroy(ws->bo_fence_lock); + pb_slabs_deinit(&ws->bo_slabs); pb_cache_deinit(&ws->bo_cache); pipe_mutex_destroy(ws->global_bo_list_lock); do_winsys_deinit(ws); @@ -547,6 +548,17 @@ amdgpu_winsys_create(int fd, radeon_screen_create_t screen_create) (ws->info.vram_size + ws->info.gart_size) / 8, amdgpu_bo_destroy, amdgpu_bo_can_reclaim); + if (!pb_slabs_init(&ws->bo_slabs, + AMDGPU_SLAB_MIN_SIZE_LOG2, AMDGPU_SLAB_MAX_SIZE_LOG2, + 12, /* number of heaps (domain/flags combinations) */ + ws, + amdgpu_bo_can_reclaim_slab, + amdgpu_bo_slab_alloc, + amdgpu_bo_slab_free)) + goto fail_cache; + + ws->info.min_alloc_size = 1 << AMDGPU_SLAB_MIN_SIZE_LOG2; + /* init reference */ pipe_reference_init(&ws->reference, 1); @@ -590,6 +602,9 @@ amdgpu_winsys_create(int fd, radeon_screen_create_t screen_create) return &ws->base; +fail_cache: + pb_cache_deinit(&ws->bo_cache); + do_winsys_deinit(ws); fail_alloc: FREE(ws); fail: