mirror of
https://gitlab.freedesktop.org/mesa/drm.git
synced 2026-05-08 13:58:20 +02: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_private_t *dev_priv = dev->dev_private;
|
||||||
drm_radeon_buf_priv_t *buf_priv;
|
drm_radeon_buf_priv_t *buf_priv;
|
||||||
drm_buf_t *buf;
|
drm_buf_t *buf;
|
||||||
int i, t;
|
int i;
|
||||||
int start;
|
int start;
|
||||||
|
u32 done_age = RADEON_READ( RADEON_LAST_DISPATCH_REG );
|
||||||
|
|
||||||
if ( ++dev_priv->last_buf >= dma->buf_count )
|
if ( ++dev_priv->last_buf >= dma->buf_count )
|
||||||
dev_priv->last_buf = 0;
|
dev_priv->last_buf = 0;
|
||||||
|
|
||||||
start = dev_priv->last_buf;
|
start = dev_priv->last_buf;
|
||||||
|
|
||||||
for ( t = 0 ; t < dev_priv->usec_timeout ; t++ ) {
|
for ( i = start ; i < dma->buf_count ; i++ ) {
|
||||||
u32 done_age = RADEON_READ( RADEON_LAST_DISPATCH_REG );
|
buf = dma->buflist[i];
|
||||||
for ( i = start ; i < dma->buf_count ; i++ ) {
|
buf_priv = buf->dev_private;
|
||||||
buf = dma->buflist[i];
|
if ( buf->pid == 0 || (buf->pending &&
|
||||||
buf_priv = buf->dev_private;
|
buf_priv->age <= done_age) ) {
|
||||||
if ( buf->pid == 0 || (buf->pending &&
|
buf->pending = 0;
|
||||||
buf_priv->age <= done_age) ) {
|
return buf;
|
||||||
buf->pending = 0;
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
start = 0;
|
|
||||||
}
|
}
|
||||||
udelay( 1 );
|
start = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
DRM_ERROR( "returning NULL!\n" );
|
/* It's not really an error for this to fail.
|
||||||
|
*/
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue