r600: use the drm ioctls for swap and texture upload
NOTE: THIS REQUIRES AN UPDATED DRM!
This commit is contained in:
parent
164d8e8701
commit
c2b29b5df5
|
@ -624,12 +624,34 @@ static int bo_vram_validate(struct radeon_bo *bo,
|
||||||
|
|
||||||
if (bo_legacy->dirty || bo_legacy->tobj->base.dirty_images[0]) {
|
if (bo_legacy->dirty || bo_legacy->tobj->base.dirty_images[0]) {
|
||||||
if (IS_R600_CLASS(boml->screen)) {
|
if (IS_R600_CLASS(boml->screen)) {
|
||||||
char *src = bo_legacy->ptr;
|
drm_radeon_texture_t tex;
|
||||||
char *dst = (char *) boml->screen->driScreen->pFB +
|
drm_radeon_tex_image_t tmp;
|
||||||
(bo_legacy->offset - boml->fb_location);
|
int ret;
|
||||||
|
|
||||||
/* FIXME: alignment, pitch, etc. */
|
tex.offset = bo_legacy->offset;
|
||||||
memcpy(dst, src, bo->size);
|
tex.image = &tmp;
|
||||||
|
assert(!(tex.offset & 1023));
|
||||||
|
|
||||||
|
tmp.x = 0;
|
||||||
|
tmp.y = 0;
|
||||||
|
tmp.width = bo->size;
|
||||||
|
tmp.height = 1;
|
||||||
|
tmp.data = bo_legacy->ptr;
|
||||||
|
tex.format = RADEON_TXFORMAT_ARGB8888;
|
||||||
|
tex.width = tmp.width;
|
||||||
|
tex.height = tmp.height;
|
||||||
|
tex.pitch = bo->size;
|
||||||
|
do {
|
||||||
|
ret = drmCommandWriteRead(bo->bom->fd,
|
||||||
|
DRM_RADEON_TEXTURE,
|
||||||
|
&tex,
|
||||||
|
sizeof(drm_radeon_texture_t));
|
||||||
|
if (ret) {
|
||||||
|
if (RADEON_DEBUG & DEBUG_IOCTL)
|
||||||
|
fprintf(stderr, "DRM_RADEON_TEXTURE: again!\n");
|
||||||
|
usleep(1);
|
||||||
|
}
|
||||||
|
} while (ret == -EAGAIN);
|
||||||
} else {
|
} else {
|
||||||
/* Copy to VRAM using a blit.
|
/* Copy to VRAM using a blit.
|
||||||
* All memory is 4K aligned. We're using 1024 pixels wide blits.
|
* All memory is 4K aligned. We're using 1024 pixels wide blits.
|
||||||
|
|
|
@ -481,32 +481,6 @@ void radeonCopyBuffer( __DRIdrawablePrivate *dPriv,
|
||||||
if (!n)
|
if (!n)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (IS_R600_CLASS(rmesa->radeonScreen)) {
|
|
||||||
int cpp = rmesa->radeonScreen->cpp;
|
|
||||||
int src_pitch = rmesa->radeonScreen->backPitch * cpp;
|
|
||||||
int dst_pitch = rmesa->radeonScreen->frontPitch * cpp;
|
|
||||||
char *src = (char *)rmesa->radeonScreen->driScreen->pFB + rmesa->radeonScreen->backOffset;
|
|
||||||
char *dst = (char *)rmesa->radeonScreen->driScreen->pFB + rmesa->radeonScreen->frontOffset;
|
|
||||||
int j;
|
|
||||||
drm_clip_rect_t *pb = rmesa->sarea->boxes;
|
|
||||||
|
|
||||||
for (j = 0; j < n; j++) {
|
|
||||||
int x = pb[j].x1;
|
|
||||||
int y = pb[j].y1;
|
|
||||||
int w = pb[j].x2 - x;
|
|
||||||
int h = pb[j].y2 - y;
|
|
||||||
|
|
||||||
src += (y * src_pitch) + (x * cpp);
|
|
||||||
dst += (y * dst_pitch) + (x * cpp);
|
|
||||||
|
|
||||||
while (h--) {
|
|
||||||
memcpy(dst, src, w * cpp);
|
|
||||||
src += src_pitch;
|
|
||||||
dst += dst_pitch;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = drmCommandNone( rmesa->dri.fd, DRM_RADEON_SWAP );
|
ret = drmCommandNone( rmesa->dri.fd, DRM_RADEON_SWAP );
|
||||||
|
|
||||||
if ( ret ) {
|
if ( ret ) {
|
||||||
|
|
Loading…
Reference in New Issue