static unsigned amdgpu_add_buffer(struct amdgpu_cs *cs, struct amdgpu_winsys_bo *bo, enum radeon_bo_usage usage, enum radeon_bo_domain domains, unsigned priority, enum radeon_bo_domain *added_domains) { struct amdgpu_cs_buffer *buffer; unsigned hash = bo->unique_id & (Elements(cs->buffer_indices_hashlist)-1); int i = -1; assert(priority < 64); *added_domains = 0; i = amdgpu_lookup_buffer(cs, bo); if (i >= 0) { buffer = &cs->buffers[i]; buffer->priority_usage |= 1llu << priority; buffer->usage |= usage; *added_domains = domains & ~buffer->domains; buffer->domains |= domains; cs->flags[i] = MAX2(cs->flags[i], priority / 4); return i; } /* New buffer, check if the backing array is large enough. */ if (cs->num_buffers >= cs->max_num_buffers) { uint32_t size; cs->max_num_buffers += 10; size = cs->max_num_buffers * sizeof(struct amdgpu_cs_buffer); cs->buffers = realloc(cs->buffers, size); size = cs->max_num_buffers * sizeof(amdgpu_bo_handle); cs->handles = realloc(cs->handles, size); cs->flags = realloc(cs->flags, cs->max_num_buffers); } /* Initialize the new buffer. */ cs->buffers[cs->num_buffers].bo = NULL; amdgpu_winsys_bo_reference(&cs->buffers[cs->num_buffers].bo, bo); cs->handles[cs->num_buffers] = bo->bo; cs->flags[cs->num_buffers] = priority / 4; p_atomic_inc(&bo->num_cs_references); buffer = &cs->buffers[cs->num_buffers]; buffer->bo = bo; buffer->priority_usage = 1llu << priority; buffer->usage = usage; buffer->domains = domains; cs->buffer_indices_hashlist[hash] = cs->num_buffers; *added_domains = domains; return cs->num_buffers++; }
static unsigned amdgpu_add_reloc(struct amdgpu_cs *cs, struct amdgpu_winsys_bo *bo, enum radeon_bo_usage usage, enum radeon_bo_domain domains, unsigned priority, enum radeon_bo_domain *added_domains) { struct amdgpu_cs_buffer *reloc; unsigned hash = bo->unique_id & (Elements(cs->buffer_indices_hashlist)-1); int i = -1; priority = MIN2(priority, 15); *added_domains = 0; i = amdgpu_get_reloc(cs, bo); if (i >= 0) { reloc = &cs->buffers[i]; reloc->usage |= usage; *added_domains = domains & ~reloc->domains; reloc->domains |= domains; cs->flags[i] = MAX2(cs->flags[i], priority); return i; } /* New relocation, check if the backing array is large enough. */ if (cs->num_buffers >= cs->max_num_buffers) { uint32_t size; cs->max_num_buffers += 10; size = cs->max_num_buffers * sizeof(struct amdgpu_cs_buffer); cs->buffers = realloc(cs->buffers, size); size = cs->max_num_buffers * sizeof(amdgpu_bo_handle); cs->handles = realloc(cs->handles, size); cs->flags = realloc(cs->flags, cs->max_num_buffers); } /* Initialize the new relocation. */ cs->buffers[cs->num_buffers].bo = NULL; amdgpu_winsys_bo_reference(&cs->buffers[cs->num_buffers].bo, bo); cs->handles[cs->num_buffers] = bo->bo; cs->flags[cs->num_buffers] = priority; p_atomic_inc(&bo->num_cs_references); reloc = &cs->buffers[cs->num_buffers]; reloc->bo = bo; reloc->usage = usage; reloc->domains = domains; cs->buffer_indices_hashlist[hash] = cs->num_buffers; *added_domains = domains; return cs->num_buffers++; }
static void amdgpu_cs_context_cleanup(struct amdgpu_cs *cs) { unsigned i; for (i = 0; i < cs->num_buffers; i++) { p_atomic_dec(&cs->buffers[i].bo->num_cs_references); amdgpu_winsys_bo_reference(&cs->buffers[i].bo, NULL); cs->handles[i] = NULL; cs->flags[i] = 0; } cs->num_buffers = 0; cs->used_gart = 0; cs->used_vram = 0; for (i = 0; i < Elements(cs->buffer_indices_hashlist); i++) { cs->buffer_indices_hashlist[i] = -1; } }