Now, allocations only take locations, rather than a variety of unused flags.
The only interesting flag before was the no_move/no_evict pair for scanout
and similar buffers, which the DRI drivers don't use. That will be readded
when we get to using this code for display buffer allocation, by adding a
pin/unpin call (dynamic pinning/unpinning may be useful for VT switching and
root window resizing).
This commit changes one instance of DRM_BO_FLAG_MEM_LOCAL with
DRM_BO_FLAG_MEM_TT, which appeared to have been unintentional.
dri_bo *
dri_bo_alloc(dri_bufmgr *bufmgr, const char *name, unsigned long size,
- unsigned int alignment, unsigned int flags, unsigned int hint)
+ unsigned int alignment, unsigned int location_mask)
{
- return bufmgr->bo_alloc(bufmgr, name, size, alignment, flags, hint);
+ assert((location_mask & ~(DRM_BO_FLAG_MEM_LOCAL | DRM_BO_FLAG_MEM_TT |
+ DRM_BO_FLAG_MEM_VRAM | DRM_BO_FLAG_MEM_PRIV0 |
+ DRM_BO_FLAG_MEM_PRIV1 | DRM_BO_FLAG_MEM_PRIV2 |
+ DRM_BO_FLAG_MEM_PRIV3 |
+ DRM_BO_FLAG_MEM_PRIV4)) == 0);
+
+ return bufmgr->bo_alloc(bufmgr, name, size, alignment, location_mask);
}
dri_bo *
dri_bo_alloc_static(dri_bufmgr *bufmgr, const char *name, unsigned long offset,
- unsigned long size, void *virtual, unsigned int flags,
- unsigned int hint)
+ unsigned long size, void *virtual,
+ unsigned int location_mask)
{
+ assert((location_mask & ~(DRM_BO_FLAG_MEM_LOCAL | DRM_BO_FLAG_MEM_TT |
+ DRM_BO_FLAG_MEM_VRAM | DRM_BO_FLAG_MEM_PRIV0 |
+ DRM_BO_FLAG_MEM_PRIV1 | DRM_BO_FLAG_MEM_PRIV2 |
+ DRM_BO_FLAG_MEM_PRIV3 |
+ DRM_BO_FLAG_MEM_PRIV4)) == 0);
+
return bufmgr->bo_alloc_static(bufmgr, name, offset, size, virtual,
- flags, hint);
+ location_mask);
}
void
* address space or graphics device aperture. They must be mapped using
* bo_map() to be used by the CPU, and validated for use using bo_validate()
* to be used from the graphics device.
- *
- * XXX: flags/hint reason to live?
*/
dri_bo *(*bo_alloc)(dri_bufmgr *bufmgr_ctx, const char *name,
unsigned long size, unsigned int alignment,
- unsigned int flags, unsigned int hint);
+ unsigned int location_mask);
/**
* Allocates a buffer object for a static allocation.
*
* Static allocations are ones such as the front buffer that are offered by
* the X Server, which are never evicted and never moved.
- *
- * XXX: flags/hint reason to live?
*/
dri_bo *(*bo_alloc_static)(dri_bufmgr *bufmgr_ctx, const char *name,
unsigned long offset, unsigned long size,
- void *virtual, unsigned int flags,
- unsigned int hint);
+ void *virtual, unsigned int location_mask);
/** Takes a reference on a buffer object */
void (*bo_reference)(dri_bo *bo);
};
dri_bo *dri_bo_alloc(dri_bufmgr *bufmgr, const char *name, unsigned long size,
- unsigned int alignment, unsigned int flags,
- unsigned int hint);
+ unsigned int alignment, unsigned int location_mask);
dri_bo *dri_bo_alloc_static(dri_bufmgr *bufmgr, const char *name,
unsigned long offset, unsigned long size,
- void *virtual, unsigned int flags,
- unsigned int hint);
+ void *virtual, unsigned int location_mask);
void dri_bo_reference(dri_bo *bo);
void dri_bo_unreference(dri_bo *bo);
int dri_bo_map(dri_bo *buf, GLboolean write_enable);
}
static dri_bo *
-dri_fake_alloc(dri_bufmgr *bufmgr, const char *name,
- unsigned long size, unsigned int alignment, unsigned int flags,
- unsigned int hint)
+dri_fake_bo_alloc(dri_bufmgr *bufmgr, const char *name,
+ unsigned long size, unsigned int alignment,
+ unsigned int location_mask)
{
dri_bufmgr_fake *bufmgr_fake;
dri_bo_fake *bo_fake;
bo_fake->alignment = alignment;
bo_fake->id = ++bufmgr_fake->buf_nr;
bo_fake->name = name;
- bo_fake->flags = flags;
+ bo_fake->flags = 0;
bo_fake->is_static = GL_FALSE;
return &bo_fake->bo;
}
static dri_bo *
-dri_fake_alloc_static(dri_bufmgr *bufmgr, const char *name,
- unsigned long offset, unsigned long size, void *virtual,
- unsigned int flags, unsigned int hint)
+dri_fake_bo_alloc_static(dri_bufmgr *bufmgr, const char *name,
+ unsigned long offset, unsigned long size,
+ void *virtual, unsigned int location_mask)
{
dri_bufmgr_fake *bufmgr_fake;
dri_bo_fake *bo_fake;
bo_fake->bo.bufmgr = bufmgr;
bo_fake->refcount = 1;
bo_fake->name = name;
- bo_fake->flags = flags;
+ bo_fake->flags = DRM_BO_FLAG_NO_EVICT | DRM_BO_FLAG_NO_MOVE;
bo_fake->is_static = GL_TRUE;
return &bo_fake->bo;
_glthread_INIT_MUTEX(bufmgr_fake->mutex);
/* Hook in methods */
- bufmgr_fake->bufmgr.bo_alloc = dri_fake_alloc;
- bufmgr_fake->bufmgr.bo_alloc_static = dri_fake_alloc_static;
+ bufmgr_fake->bufmgr.bo_alloc = dri_fake_bo_alloc;
+ bufmgr_fake->bufmgr.bo_alloc_static = dri_fake_bo_alloc_static;
bufmgr_fake->bufmgr.bo_reference = dri_fake_bo_reference;
bufmgr_fake->bufmgr.bo_unreference = dri_fake_bo_unreference;
bufmgr_fake->bufmgr.bo_map = dri_fake_bo_map;
static dri_bo *
dri_ttm_alloc(dri_bufmgr *bufmgr, const char *name,
- unsigned long size, unsigned int alignment, unsigned int flags,
- unsigned int hint)
+ unsigned long size, unsigned int alignment,
+ unsigned int location_mask)
{
dri_bufmgr_ttm *ttm_bufmgr;
dri_bo_ttm *ttm_buf;
unsigned int pageSize = getpagesize();
int ret;
+ unsigned int flags, hint;
ttm_bufmgr = (dri_bufmgr_ttm *)bufmgr;
if (!ttm_buf)
return NULL;
+ /* The mask argument doesn't do anything for us that we want other than
+ * determine which pool (TTM or local) the buffer is allocated into, so just
+ * pass all of the allocation class flags.
+ */
+ flags = location_mask | DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE |
+ DRM_BO_FLAG_EXE;
+ /* No hints we want to use. */
+ hint = 0;
+
ret = drmBOCreate(ttm_bufmgr->fd, 0, size, alignment / pageSize,
NULL, drm_bo_type_dc,
flags, hint, &ttm_buf->drm_bo);
static dri_bo *
dri_ttm_alloc_static(dri_bufmgr *bufmgr, const char *name,
unsigned long offset, unsigned long size, void *virtual,
- unsigned int flags, unsigned int hint)
+ unsigned int location_mask)
{
dri_bufmgr_ttm *ttm_bufmgr;
dri_bo_ttm *ttm_buf;
int ret;
+ unsigned int flags, hint;
ttm_bufmgr = (dri_bufmgr_ttm *)bufmgr;
if (!ttm_buf)
return NULL;
+ /* The mask argument doesn't do anything for us that we want other than
+ * determine which pool (TTM or local) the buffer is allocated into, so just
+ * pass all of the allocation class flags.
+ */
+ flags = location_mask | DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE |
+ DRM_BO_FLAG_EXE | DRM_BO_FLAG_NO_EVICT | DRM_BO_FLAG_NO_MOVE;
+ /* No hints we want to use. */
+ hint = 0;
+
ret = drmBOCreate(ttm_bufmgr->fd, offset, size, 0,
NULL, drm_bo_type_fake,
- flags, 0, &ttm_buf->drm_bo);
+ flags, hint, &ttm_buf->drm_bo);
if (ret != 0) {
free(ttm_buf);
return NULL;
batch->buf = dri_bo_alloc(intel->intelScreen->bufmgr, "batchbuffer",
intel->intelScreen->maxBatchSize, 4096,
- DRM_BO_FLAG_MEM_TT |
- DRM_BO_FLAG_EXE, 0);
+ DRM_BO_FLAG_MEM_TT);
dri_bo_map(batch->buf, GL_TRUE);
batch->map = batch->buf->virtual;
batch->size = intel->intelScreen->maxBatchSize;
{
intel_obj->buffer = dri_bo_alloc(intel->intelScreen->bufmgr, "bufferobj",
intel_obj->Base.Size, 64,
- DRM_BO_FLAG_MEM_LOCAL |
- DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE, 0);
+ DRM_BO_FLAG_MEM_TT);
}
/**
region->refcount = 1;
region->buffer = dri_bo_alloc(intelScreen->bufmgr, "region",
- pitch * cpp * height, 64, 0, 0);
+ pitch * cpp * height, 64, DRM_BO_FLAG_MEM_TT);
return region;
}
/* XXX: questionable flags */
region->buffer = dri_bo_alloc_static(intelScreen->bufmgr, "static region",
offset, pitch * cpp * height, virtual,
- DRM_BO_FLAG_MEM_TT |
- DRM_BO_FLAG_NO_MOVE |
- DRM_BO_FLAG_READ |
- DRM_BO_FLAG_WRITE, 0);
+ DRM_BO_FLAG_MEM_TT);
return region;
}
/* XXX: questionable flags */
region->buffer = dri_bo_alloc_static(intelScreen->bufmgr, "static region",
offset, pitch * cpp * height, virtual,
- DRM_BO_FLAG_MEM_TT |
- DRM_BO_FLAG_NO_MOVE |
- DRM_BO_FLAG_READ |
- DRM_BO_FLAG_WRITE, 0);
+ DRM_BO_FLAG_MEM_TT);
}
region->buffer = dri_bo_alloc(intelScreen->bufmgr, "region",
region->pitch * region->cpp * region->height,
- 64, 0, 0);
+ 64, DRM_BO_FLAG_MEM_TT);
}
/* Break the COW tie to the pbo. Both the pbo and the region end up