mirror of
https://gitlab.freedesktop.org/mesa/drm.git
synced 2026-05-09 10:58:06 +02:00
Add support for different primitive types in vertex buffer flush ioctl.
Try and fix Mobility 128 lockups. Seems to lock when shutting down the X
server from non-standard resolutions, so I've probably messed up the
CCE ioctls somewhat. Default panel resolution seems to be rock solid...
This commit is contained in:
parent
05ef8effbf
commit
79857ad822
6 changed files with 37 additions and 9 deletions
|
|
@ -37,7 +37,7 @@
|
|||
|
||||
#define R128_NAME "r128"
|
||||
#define R128_DESC "ATI Rage 128"
|
||||
#define R128_DATE "20001019"
|
||||
#define R128_DATE "20001027"
|
||||
#define R128_MAJOR 1
|
||||
#define R128_MINOR 1
|
||||
#define R128_PATCHLEVEL 0
|
||||
|
|
|
|||
|
|
@ -149,7 +149,7 @@ static int r128_do_pixcache_flush( drm_r128_private_t *dev_priv )
|
|||
udelay( 1 );
|
||||
}
|
||||
|
||||
DRM_DEBUG( "%s failed!\n", __FUNCTION__ );
|
||||
DRM_ERROR( "%s failed!\n", __FUNCTION__ );
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
|
|
@ -579,11 +579,15 @@ int r128_cce_stop( struct inode *inode, struct file *filp,
|
|||
DRM_ERROR( "%s called without lock held\n", __FUNCTION__ );
|
||||
return -EINVAL;
|
||||
}
|
||||
if ( !dev_priv )
|
||||
if ( !dev_priv ) {
|
||||
DRM_DEBUG( "%s called before init done\n", __FUNCTION__ );
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if ( !dev_priv->cce_running || dev_priv->cce_mode == R128_PM4_NONPM4 )
|
||||
if ( !dev_priv->cce_running || dev_priv->cce_mode == R128_PM4_NONPM4 ){
|
||||
DRM_DEBUG( "%s while CCE not running\n", __FUNCTION__ );
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Flush any pending CCE commands. This ensures any outstanding
|
||||
* commands are exectuted by the engine before we turn it off.
|
||||
|
|
@ -621,11 +625,16 @@ int r128_cce_reset( struct inode *inode, struct file *filp,
|
|||
DRM_ERROR( "%s called without lock held\n", __FUNCTION__ );
|
||||
return -EINVAL;
|
||||
}
|
||||
if ( !dev_priv )
|
||||
if ( !dev_priv ) {
|
||||
DRM_DEBUG( "%s called before init done\n", __FUNCTION__ );
|
||||
return -EINVAL;
|
||||
|
||||
if ( !dev_priv->cce_running || dev_priv->cce_mode == R128_PM4_NONPM4 )
|
||||
}
|
||||
#if 0
|
||||
if ( !dev_priv->cce_running || dev_priv->cce_mode == R128_PM4_NONPM4 ){
|
||||
DRM_DEBUG( "%s while CCE not running\n", __FUNCTION__ );
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
r128_do_cce_reset( dev_priv );
|
||||
|
||||
|
|
|
|||
|
|
@ -58,6 +58,15 @@
|
|||
#define R128_BACK 0x2
|
||||
#define R128_DEPTH 0x4
|
||||
|
||||
/* Primitive types
|
||||
*/
|
||||
#define R128_POINTS 0x1
|
||||
#define R128_LINES 0x2
|
||||
#define R128_LINE_STRIP 0x3
|
||||
#define R128_TRIANGLES 0x4
|
||||
#define R128_TRIANGLE_FAN 0x5
|
||||
#define R128_TRIANGLE_STRIP 0x6
|
||||
|
||||
/* Vertex/indirect buffer size
|
||||
*/
|
||||
#define R128_BUFFER_SIZE 16384
|
||||
|
|
@ -203,6 +212,7 @@ typedef struct drm_r128_clear {
|
|||
} drm_r128_clear_t;
|
||||
|
||||
typedef struct drm_r128_vertex {
|
||||
int prim;
|
||||
int idx; /* Index of vertex buffer */
|
||||
int used; /* Amount of buffer used */
|
||||
int discard; /* Client finished with buffer? */
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@
|
|||
|
||||
#define R128_NAME "r128"
|
||||
#define R128_DESC "ATI Rage 128"
|
||||
#define R128_DATE "20001019"
|
||||
#define R128_DATE "20001027"
|
||||
#define R128_MAJOR 1
|
||||
#define R128_MINOR 1
|
||||
#define R128_PATCHLEVEL 0
|
||||
|
|
|
|||
|
|
@ -95,6 +95,7 @@ typedef struct drm_r128_private {
|
|||
|
||||
typedef struct drm_r128_buf_priv {
|
||||
u32 age;
|
||||
int prim;
|
||||
int discard;
|
||||
int dispatched;
|
||||
drm_r128_freelist_t *list_entry;
|
||||
|
|
|
|||
|
|
@ -507,7 +507,7 @@ static void r128_cce_dispatch_vertex( drm_device_t *dev,
|
|||
int index = buf->idx;
|
||||
int offset = dev_priv->buffers->offset + buf->offset - dev->agp->base;
|
||||
int size = buf->used / (vertsize * sizeof(u32));
|
||||
int prim;
|
||||
int prim = buf_priv->prim;
|
||||
int i = 0;
|
||||
RING_LOCALS;
|
||||
DRM_DEBUG( "%s\n", __FUNCTION__ );
|
||||
|
|
@ -524,7 +524,9 @@ static void r128_cce_dispatch_vertex( drm_device_t *dev,
|
|||
if ( 0 )
|
||||
r128_print_dirty( "dispatch_vertex", sarea_priv->dirty );
|
||||
|
||||
#if 0
|
||||
prim = R128_CCE_VC_CNTL_PRIM_TYPE_TRI_LIST;
|
||||
#endif
|
||||
|
||||
if ( buf->used ) {
|
||||
buf_priv->dispatched = 1;
|
||||
|
|
@ -854,6 +856,11 @@ int r128_cce_vertex( struct inode *inode, struct file *filp,
|
|||
vertex.idx, dma->buf_count - 1 );
|
||||
return -EINVAL;
|
||||
}
|
||||
if ( vertex.prim < 0 ||
|
||||
vertex.prim > R128_CCE_VC_CNTL_PRIM_TYPE_TRI_TYPE2 ) {
|
||||
DRM_ERROR( "buffer prim %d\n", vertex.prim );
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
buf = dma->buflist[vertex.idx];
|
||||
buf_priv = buf->dev_private;
|
||||
|
|
@ -869,6 +876,7 @@ int r128_cce_vertex( struct inode *inode, struct file *filp,
|
|||
}
|
||||
|
||||
buf->used = vertex.used;
|
||||
buf_priv->prim = vertex.prim;
|
||||
buf_priv->discard = vertex.discard;
|
||||
|
||||
r128_cce_dispatch_vertex( dev, buf );
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue