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:
@@ -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
|
||||
|
Reference in New Issue
Block a user