Bugzilla 6242: [mach64] Use private DMA buffers (only)
https://bugs.freedesktop.org/show_bug.cgi?id=6242 Patch by George Sapountzis: https://bugs.freedesktop.org/attachment.cgi?id=6271 Update to new mach64 DRM 2.0.0 with private DMA buffers. Handle EAGAIN in mach64FireBlitLocked: call drmCommandWrite up to MACH64_TIMEOUT times when EAGAIN is returned. Also handle EAGAIN in mach64FlushVerticesLocked.
This commit is contained in:
@@ -105,7 +105,7 @@ void mach64FlushVerticesLocked( mach64ContextPtr mmesa )
|
||||
int prim = mmesa->hw_primitive;
|
||||
int fd = mmesa->driScreen->fd;
|
||||
drm_mach64_vertex_t vertex;
|
||||
int i, ret;
|
||||
int i;
|
||||
|
||||
mmesa->num_verts = 0;
|
||||
mmesa->vert_used = 0;
|
||||
@@ -123,6 +123,9 @@ void mach64FlushVerticesLocked( mach64ContextPtr mmesa )
|
||||
mmesa->dirty |= MACH64_UPLOAD_CLIPRECTS;
|
||||
|
||||
if ( !count || !(mmesa->dirty & MACH64_UPLOAD_CLIPRECTS) ) {
|
||||
int to = 0;
|
||||
int ret;
|
||||
|
||||
/* FIXME: Is this really necessary */
|
||||
if ( nbox == 1 )
|
||||
mmesa->sarea->nbox = 0;
|
||||
@@ -133,7 +136,10 @@ void mach64FlushVerticesLocked( mach64ContextPtr mmesa )
|
||||
vertex.buf = buffer;
|
||||
vertex.used = count;
|
||||
vertex.discard = 1;
|
||||
ret = drmCommandWrite( fd, DRM_MACH64_VERTEX, &vertex, sizeof(drm_mach64_vertex_t) );
|
||||
do {
|
||||
ret = drmCommandWrite( fd, DRM_MACH64_VERTEX,
|
||||
&vertex, sizeof(drm_mach64_vertex_t) );
|
||||
} while ( ( ret == -EAGAIN ) && ( to++ < MACH64_TIMEOUT ) );
|
||||
if ( ret ) {
|
||||
UNLOCK_HARDWARE( mmesa );
|
||||
fprintf( stderr, "Error flushing vertex buffer: return = %d\n", ret );
|
||||
@@ -146,6 +152,8 @@ void mach64FlushVerticesLocked( mach64ContextPtr mmesa )
|
||||
int nr = MIN2( i + MACH64_NR_SAREA_CLIPRECTS, nbox );
|
||||
drm_clip_rect_t *b = mmesa->sarea->boxes;
|
||||
int discard = 0;
|
||||
int to = 0;
|
||||
int ret;
|
||||
|
||||
mmesa->sarea->nbox = nr - i;
|
||||
for ( ; i < nr ; i++ ) {
|
||||
@@ -164,7 +172,10 @@ void mach64FlushVerticesLocked( mach64ContextPtr mmesa )
|
||||
vertex.buf = buffer;
|
||||
vertex.used = count;
|
||||
vertex.discard = discard;
|
||||
ret = drmCommandWrite( fd, DRM_MACH64_VERTEX, &vertex, sizeof(drm_mach64_vertex_t) );
|
||||
do {
|
||||
ret = drmCommandWrite( fd, DRM_MACH64_VERTEX,
|
||||
&vertex, sizeof(drm_mach64_vertex_t) );
|
||||
} while ( ( ret == -EAGAIN ) && ( to++ < MACH64_TIMEOUT ) );
|
||||
if ( ret ) {
|
||||
UNLOCK_HARDWARE( mmesa );
|
||||
fprintf( stderr, "Error flushing vertex buffer: return = %d\n", ret );
|
||||
@@ -180,14 +191,15 @@ void mach64FlushVerticesLocked( mach64ContextPtr mmesa )
|
||||
* Texture uploads
|
||||
*/
|
||||
|
||||
void mach64FireBlitLocked( mach64ContextPtr mmesa, drmBufPtr buffer,
|
||||
void mach64FireBlitLocked( mach64ContextPtr mmesa, void *buffer,
|
||||
GLint offset, GLint pitch, GLint format,
|
||||
GLint x, GLint y, GLint width, GLint height )
|
||||
{
|
||||
drm_mach64_blit_t blit;
|
||||
GLint ret;
|
||||
int to = 0;
|
||||
int ret;
|
||||
|
||||
blit.idx = buffer->idx;
|
||||
blit.buf = buffer;
|
||||
blit.offset = offset;
|
||||
blit.pitch = pitch;
|
||||
blit.format = format;
|
||||
@@ -196,8 +208,10 @@ void mach64FireBlitLocked( mach64ContextPtr mmesa, drmBufPtr buffer,
|
||||
blit.width = width;
|
||||
blit.height = height;
|
||||
|
||||
ret = drmCommandWrite( mmesa->driFd, DRM_MACH64_BLIT,
|
||||
&blit, sizeof(drm_mach64_blit_t) );
|
||||
do {
|
||||
ret = drmCommandWrite( mmesa->driFd, DRM_MACH64_BLIT,
|
||||
&blit, sizeof(drm_mach64_blit_t) );
|
||||
} while ( ( ret == -EAGAIN ) && ( to++ < MACH64_TIMEOUT ) );
|
||||
|
||||
if ( ret ) {
|
||||
UNLOCK_HARDWARE( mmesa );
|
||||
|
||||
@@ -74,7 +74,7 @@ static __inline void *mach64AllocDmaLocked( mach64ContextPtr mmesa, int bytes )
|
||||
return head;
|
||||
}
|
||||
|
||||
extern void mach64FireBlitLocked( mach64ContextPtr mmesa, drmBufPtr buffer,
|
||||
extern void mach64FireBlitLocked( mach64ContextPtr mmesa, void *buffer,
|
||||
GLint offset, GLint pitch, GLint format,
|
||||
GLint x, GLint y, GLint width, GLint height );
|
||||
|
||||
|
||||
@@ -520,7 +520,7 @@ void * __driCreateNewScreen_20050727( __DRInativeDisplay *dpy, int scrn, __DRIsc
|
||||
__DRIscreenPrivate *psp;
|
||||
static const __DRIversion ddx_expected = { 6, 4, 0 };
|
||||
static const __DRIversion dri_expected = { 4, 0, 0 };
|
||||
static const __DRIversion drm_expected = { 1, 0, 0 };
|
||||
static const __DRIversion drm_expected = { 2, 0, 0 };
|
||||
|
||||
dri_interface = interface;
|
||||
|
||||
|
||||
@@ -569,27 +569,17 @@ static void mach64UploadLocalSubImage( mach64ContextPtr mmesa,
|
||||
remaining > 0 ;
|
||||
remaining -= rows, y += rows, i++ )
|
||||
{
|
||||
drmBufPtr buffer;
|
||||
CARD32 *dst;
|
||||
|
||||
height = MIN2(remaining, rows);
|
||||
|
||||
/* Grab the dma buffer for the texture blit */
|
||||
buffer = mach64GetBufferLocked( mmesa );
|
||||
|
||||
dst = (CARD32 *)((char *)buffer->address + MACH64_HOSTDATA_BLIT_OFFSET);
|
||||
|
||||
assert(image->Data);
|
||||
|
||||
{
|
||||
const GLubyte *src = (const GLubyte *) image->Data +
|
||||
(y * image->Width + x) * image->TexFormat->TexelBytes;
|
||||
const GLuint bytes = width * height * image->TexFormat->TexelBytes;
|
||||
memcpy(dst, src, bytes);
|
||||
}
|
||||
|
||||
mach64FireBlitLocked( mmesa, buffer, offset, pitch, format,
|
||||
x, y, width, height );
|
||||
mach64FireBlitLocked( mmesa, (void *)src, offset, pitch, format,
|
||||
x, y, width, height );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user