WIP: Replace TTM buffer pool manager with a simplified interface.

The interface is not solid yet (some simplification to do still, and
adjustment for 0-copy), and the drivers are not converted.  However, the new
interface allows using the same calls to support either a TTM or a classic
static allocation backend, with the static backend allowing a more limited
feature set.
This commit is contained in:
Eric Anholt
2007-05-16 15:14:20 -07:00
parent 64700be4e1
commit 7b971a5008
7 changed files with 1457 additions and 799 deletions

View File

@@ -1,5 +1,6 @@
/**************************************************************************
*
* Copyright <20> 2007 Intel Corporation
* Copyright 2006 Tungsten Graphics, Inc., Bismarck, ND., USA
* All Rights Reserved.
*
@@ -28,43 +29,142 @@
/*
* Authors: Thomas Hellstr<74>m <thomas-at-tungstengraphics-dot-com>
* Keith Whitwell <keithw-at-tungstengraphics-dot-com>
* Eric Anholt <eric@anholt.net>
*/
#ifndef _DRI_BUFMGR_H_
#define _DRI_BUFMGR_H_
#include <xf86drm.h>
typedef struct _dri_bufmgr dri_bufmgr;
typedef struct _dri_bo dri_bo;
typedef struct _dri_fence dri_fence;
struct _DriFenceObject;
struct _DriBufferObject;
struct _DriBufferPool;
struct _dri_bo {
/** Size in bytes of the buffer object. */
unsigned long size;
/**
* Card virtual address (offset from the beginning of the aperture) for the
* object. Only valid while validated.
*/
unsigned long offset;
/**
* Virtual address for accessing the buffer data. Only valid while mapped.
*/
void *virtual;
/** Buffer manager context associated with this buffer object */
dri_bufmgr *bufmgr;
};
extern struct _DriFenceObject *driFenceBuffers(int fd, char *name,
unsigned flags);
struct _dri_fence {
/**
* This is an ORed mask of DRM_BO_FLAG_READ, DRM_BO_FLAG_WRITE, and
* DRM_FLAG_EXE indicating the operations associated with this fence.
*
* It is constant for the life of the fence object.
*/
unsigned int type;
/** Buffer manager context associated with this fence */
dri_bufmgr *bufmgr;
};
extern struct _DriFenceObject *driFenceReference(struct _DriFenceObject *fence);
/**
* Context for a buffer manager instance.
*
* Contains public methods followed by private storage for the buffer manager.
*/
struct _dri_bufmgr {
/**
* Allocate a buffer object.
*
* Buffer objects are not necessarily initially mapped into CPU virtual
* 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);
extern void driFenceUnReference(struct _DriFenceObject *fence);
/**
* 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);
extern void
driFenceFinish(struct _DriFenceObject *fence, unsigned type, int lazy);
/** Takes a reference on a buffer object */
void (*bo_reference)(dri_bo *bo);
extern int driFenceSignaled(struct _DriFenceObject *fence, unsigned type);
extern unsigned driFenceType(struct _DriFenceObject *fence);
/**
* Releases a reference on a buffer object, freeing the data if
* rerefences remain.
*/
void (*bo_unreference)(dri_bo *bo);
/**
* Maps the buffer into userspace.
*
* This function will block waiting for any existing fence on the buffer to
* clear, first. The resulting mapping is available at buf->virtual.
\ */
int (*bo_map)(dri_bo *buf, GLboolean write_enable);
/** Reduces the refcount on the userspace mapping of the buffer object. */
int (*bo_unmap)(dri_bo *buf);
/**
* Makes the buffer accessible to the graphics chip.
*
* The resulting offset of the buffer within the graphics aperture is then
* available at buf->offset until the buffer is fenced.
*
* Flags should consist of the memory types that the buffer may be validated
* into and the read/write/exe flags appropriate to the use of the buffer.
*/
int (*bo_validate)(dri_bo *buf, unsigned int flags);
/**
* Associates the current set of validated buffers with a fence.
*
* Once fenced, the buffer manager will allow the validated buffers to be
* evicted when the graphics device's execution has passed the fence
* command.
*
* The fence object will have flags for the sum of the read/write/exe flags
* of the validated buffers associated with it.
*/
dri_fence * (*fence_validated)(dri_bufmgr *bufmgr, const char *name,
GLboolean flushed);
/** Takes a reference on a fence object */
void (*fence_reference)(dri_fence *fence);
/**
* Releases a reference on a fence object, freeing the data if
* rerefences remain.
*/
void (*fence_unreference)(dri_fence *fence);
/**
* Blocks until the given fence is signaled.
*/
void (*fence_wait)(dri_fence *fence);
/**
* Checks and returns whether the given fence is signaled.
*/
};
/*
* Return a pointer to the libdrm buffer object this DriBufferObject
* uses.
*/
extern drmBO *driBOKernel(struct _DriBufferObject *buf);
extern void *driBOMap(struct _DriBufferObject *buf, unsigned flags,
unsigned hint);
extern void driBOUnmap(struct _DriBufferObject *buf);
extern unsigned long driBOOffset(struct _DriBufferObject *buf);
extern unsigned driBOFlags(struct _DriBufferObject *buf);
extern struct _DriBufferObject *driBOReference(struct _DriBufferObject *buf);
extern void driBOUnReference(struct _DriBufferObject *buf);
extern void driBOData(struct _DriBufferObject *r_buf,
unsigned size, const void *data, unsigned flags);
extern void driBOSubData(struct _DriBufferObject *buf,
@@ -73,27 +173,40 @@ extern void driBOSubData(struct _DriBufferObject *buf,
extern void driBOGetSubData(struct _DriBufferObject *buf,
unsigned long offset, unsigned long size,
void *data);
extern void driGenBuffers(struct _DriBufferPool *pool,
const char *name,
unsigned n,
struct _DriBufferObject *buffers[],
unsigned alignment, unsigned flags, unsigned hint);
extern void driDeleteBuffers(unsigned n, struct _DriBufferObject *buffers[]);
extern void driInitBufMgr(int fd);
extern void driBOCreateList(int target, drmBOList * list);
extern void driBOResetList(drmBOList * list);
extern void driBOAddListItem(drmBOList * list, struct _DriBufferObject *buf,
unsigned flags, unsigned mask);
extern void driBOValidateList(int fd, drmBOList * list);
*/
extern void driBOFence(struct _DriBufferObject *buf,
struct _DriFenceObject *fence);
dri_bo *dri_bo_alloc(dri_bufmgr *bufmgr, const char *name, unsigned long size,
unsigned int alignment, unsigned int flags,
unsigned int hint);
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 dri_bo_reference(dri_bo *bo);
void dri_bo_unreference(dri_bo *bo);
int dri_bo_map(dri_bo *buf, GLboolean write_enable);
int dri_bo_unmap(dri_bo *buf);
int dri_bo_validate(dri_bo *buf, unsigned int flags);
dri_fence *dri_fence_validated(dri_bufmgr *bufmgr, const char *name,
GLboolean flushed);
void dri_fence_reference(dri_fence *fence);
void dri_fence_unreference(dri_fence *fence);
extern void driPoolTakeDown(struct _DriBufferPool *pool);
extern void driBOSetStatic(struct _DriBufferObject *buf,
unsigned long offset,
unsigned long size, void *virtual, unsigned flags);
extern void driBOWaitIdle(struct _DriBufferObject *buf, int lazy);
extern void driPoolTakeDown(struct _DriBufferPool *pool);
void dri_bo_subdata(dri_bo *bo, unsigned long offset,
unsigned long size, const void *data);
void dri_bo_get_subdata(dri_bo *bo, unsigned long offset,
unsigned long size, void *data);
dri_bufmgr *dri_bufmgr_ttm_init(int fd, unsigned int fence_type,
unsigned int fence_type_flush);
void dri_bufmgr_fake_contended_lock_take(dri_bufmgr *bufmgr);
dri_bufmgr *dri_bufmgr_fake_init(unsigned long low_offset, void *low_virtual,
unsigned long size,
unsigned int (*fence_emit)(void *private),
int (*fence_wait)(void *private,
unsigned int cookie),
void *driver_priv);
void dri_bufmgr_fake_contended_lock_take(dri_bufmgr *bufmgr);
#endif