mirror of
https://gitlab.freedesktop.org/mesa/drm.git
synced 2026-01-09 21:40:16 +01:00
don't wait in radeon_freelist_get
This commit is contained in:
parent
ff44b25041
commit
40a08a7e6d
3 changed files with 1174 additions and 14 deletions
89
bsd/gamma_drm.h
Normal file
89
bsd/gamma_drm.h
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
#ifndef _GAMMA_DRM_H_
|
||||
#define _GAMMA_DRM_H_
|
||||
|
||||
typedef struct _drm_gamma_tex_region {
|
||||
unsigned char next, prev; /* indices to form a circular LRU */
|
||||
unsigned char in_use; /* owned by a client, or free? */
|
||||
int age; /* tracked by clients to update local LRU's */
|
||||
} drm_gamma_tex_region_t;
|
||||
|
||||
typedef struct {
|
||||
unsigned int GDeltaMode;
|
||||
unsigned int GDepthMode;
|
||||
unsigned int GGeometryMode;
|
||||
unsigned int GTransformMode;
|
||||
} drm_gamma_context_regs_t;
|
||||
|
||||
typedef struct _drm_gamma_sarea {
|
||||
drm_gamma_context_regs_t context_state;
|
||||
|
||||
unsigned int dirty;
|
||||
|
||||
|
||||
/* Maintain an LRU of contiguous regions of texture space. If
|
||||
* you think you own a region of texture memory, and it has an
|
||||
* age different to the one you set, then you are mistaken and
|
||||
* it has been stolen by another client. If global texAge
|
||||
* hasn't changed, there is no need to walk the list.
|
||||
*
|
||||
* These regions can be used as a proxy for the fine-grained
|
||||
* texture information of other clients - by maintaining them
|
||||
* in the same lru which is used to age their own textures,
|
||||
* clients have an approximate lru for the whole of global
|
||||
* texture space, and can make informed decisions as to which
|
||||
* areas to kick out. There is no need to choose whether to
|
||||
* kick out your own texture or someone else's - simply eject
|
||||
* them all in LRU order.
|
||||
*/
|
||||
|
||||
#define GAMMA_NR_TEX_REGIONS 64
|
||||
drm_gamma_tex_region_t texList[GAMMA_NR_TEX_REGIONS+1];
|
||||
/* Last elt is sentinal */
|
||||
int texAge; /* last time texture was uploaded */
|
||||
int last_enqueue; /* last time a buffer was enqueued */
|
||||
int last_dispatch; /* age of the most recently dispatched buffer */
|
||||
int last_quiescent; /* */
|
||||
int ctxOwner; /* last context to upload state */
|
||||
|
||||
int vertex_prim;
|
||||
} drm_gamma_sarea_t;
|
||||
|
||||
/* WARNING: If you change any of these defines, make sure to change the
|
||||
* defines in the Xserver file (xf86drmGamma.h)
|
||||
*/
|
||||
|
||||
/* Gamma specific ioctls
|
||||
* The device specific ioctl range is 0x40 to 0x79.
|
||||
*/
|
||||
#define DRM_IOCTL_GAMMA_INIT DRM_IOW( 0x40, drm_gamma_init_t)
|
||||
#define DRM_IOCTL_GAMMA_COPY DRM_IOW( 0x41, drm_gamma_copy_t)
|
||||
|
||||
typedef struct drm_gamma_copy {
|
||||
unsigned int DMAOutputAddress;
|
||||
unsigned int DMAOutputCount;
|
||||
unsigned int DMAReadGLINTSource;
|
||||
unsigned int DMARectangleWriteAddress;
|
||||
unsigned int DMARectangleWriteLinePitch;
|
||||
unsigned int DMARectangleWrite;
|
||||
unsigned int DMARectangleReadAddress;
|
||||
unsigned int DMARectangleReadLinePitch;
|
||||
unsigned int DMARectangleRead;
|
||||
unsigned int DMARectangleReadTarget;
|
||||
} drm_gamma_copy_t;
|
||||
|
||||
typedef struct drm_gamma_init {
|
||||
enum {
|
||||
GAMMA_INIT_DMA = 0x01,
|
||||
GAMMA_CLEANUP_DMA = 0x02
|
||||
} func;
|
||||
|
||||
int sarea_priv_offset;
|
||||
int pcimode;
|
||||
unsigned int mmio0;
|
||||
unsigned int mmio1;
|
||||
unsigned int mmio2;
|
||||
unsigned int mmio3;
|
||||
unsigned int buffers_offset;
|
||||
} drm_gamma_init_t;
|
||||
|
||||
#endif /* _GAMMA_DRM_H_ */
|
||||
1073
libdrm/xf86drmCompat.c
Normal file
1073
libdrm/xf86drmCompat.c
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -1220,30 +1220,28 @@ drm_buf_t *radeon_freelist_get( drm_device_t *dev )
|
|||
drm_radeon_private_t *dev_priv = dev->dev_private;
|
||||
drm_radeon_buf_priv_t *buf_priv;
|
||||
drm_buf_t *buf;
|
||||
int i, t;
|
||||
int i;
|
||||
int start;
|
||||
u32 done_age = RADEON_READ( RADEON_LAST_DISPATCH_REG );
|
||||
|
||||
if ( ++dev_priv->last_buf >= dma->buf_count )
|
||||
dev_priv->last_buf = 0;
|
||||
|
||||
start = dev_priv->last_buf;
|
||||
|
||||
for ( t = 0 ; t < dev_priv->usec_timeout ; t++ ) {
|
||||
u32 done_age = RADEON_READ( RADEON_LAST_DISPATCH_REG );
|
||||
for ( i = start ; i < dma->buf_count ; i++ ) {
|
||||
buf = dma->buflist[i];
|
||||
buf_priv = buf->dev_private;
|
||||
if ( buf->pid == 0 || (buf->pending &&
|
||||
buf_priv->age <= done_age) ) {
|
||||
buf->pending = 0;
|
||||
return buf;
|
||||
}
|
||||
start = 0;
|
||||
for ( i = start ; i < dma->buf_count ; i++ ) {
|
||||
buf = dma->buflist[i];
|
||||
buf_priv = buf->dev_private;
|
||||
if ( buf->pid == 0 || (buf->pending &&
|
||||
buf_priv->age <= done_age) ) {
|
||||
buf->pending = 0;
|
||||
return buf;
|
||||
}
|
||||
udelay( 1 );
|
||||
start = 0;
|
||||
}
|
||||
|
||||
DRM_ERROR( "returning NULL!\n" );
|
||||
/* It's not really an error for this to fail.
|
||||
*/
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue