/* Called under etna_drm_table_lock */
void _etna_bo_del(struct etna_bo *bo)
{
+ VG_BO_FREE(bo);
+
+ if (bo->va)
+ util_vma_heap_free(&bo->dev->address_space, bo->va, bo->size);
+
if (bo->map)
os_munmap(bo->map, bo->size);
- if (bo->name)
- _mesa_hash_table_remove_key(bo->dev->name_table, &bo->name);
-
if (bo->handle) {
struct drm_gem_close req = {
.handle = bo->handle,
};
+ if (bo->name)
+ _mesa_hash_table_remove_key(bo->dev->name_table, &bo->name);
+
_mesa_hash_table_remove_key(bo->dev->handle_table, &bo->handle);
drmIoctl(bo->dev->fd, DRM_IOCTL_GEM_CLOSE, &req);
}
/* add ourselves to the handle table: */
_mesa_hash_table_insert(dev->handle_table, &bo->handle, bo);
+ if (dev->use_softpin)
+ bo->va = util_vma_heap_alloc(&dev->address_space, bo->size, 4096);
+
return bo;
}
bo->reuse = 1;
pthread_mutex_unlock(&etna_drm_table_lock);
+ VG_BO_ALLOC(bo);
+
return bo;
}
goto out_unlock;
bo = bo_from_handle(dev, req.size, req.handle, 0);
- if (bo)
+ if (bo) {
set_name(bo, name);
+ VG_BO_ALLOC(bo);
+ }
out_unlock:
pthread_mutex_unlock(&etna_drm_table_lock);
bo = bo_from_handle(dev, size, handle, 0);
+ VG_BO_ALLOC(bo);
+
out_unlock:
pthread_mutex_unlock(&etna_drm_table_lock);
/* destroy a buffer object */
void etna_bo_del(struct etna_bo *bo)
{
- struct etna_device *dev = bo->dev;
-
if (!bo)
return;
+ struct etna_device *dev = bo->dev;
+
if (!p_atomic_dec_zero(&bo->refcnt))
return;
return bo->size;
}
+uint32_t etna_bo_gpu_va(struct etna_bo *bo)
+{
+ return bo->va;
+}
+
void *etna_bo_map(struct etna_bo *bo)
{
if (!bo->map) {