summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaciej Cencora <m.cencora@gmail.com>2010-01-16 18:37:39 +0100
committerMaciej Cencora <m.cencora@gmail.com>2010-01-16 22:47:55 +0100
commitfbd6ad8ad26fa906b38d1e950e99dffc366f7dac (patch)
tree8c066d3dfdc85f42c9d96e6533def293c312c051
parent668a3e471c60ee332f4f43e032b23ccc33103143 (diff)
radeon: use software tiling if accelerated blit isn't available
-rw-r--r--src/mesa/drivers/dri/radeon/radeon_texture.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/src/mesa/drivers/dri/radeon/radeon_texture.c b/src/mesa/drivers/dri/radeon/radeon_texture.c
index 8d6394a934..2e0de7cd64 100644
--- a/src/mesa/drivers/dri/radeon/radeon_texture.c
+++ b/src/mesa/drivers/dri/radeon/radeon_texture.c
@@ -45,7 +45,7 @@
#include "radeon_common.h"
#include "radeon_mipmap_tree.h"
-
+#include "radeon_tile.h"
void copy_rows(void* dst, GLuint dststride, const void* src, GLuint srcstride,
GLuint numrows, GLuint rowsize)
@@ -698,13 +698,26 @@ static void radeon_store_teximage(GLcontext* ctx, int dims,
/* Do the tiled blit to miptree now */
if (tiled_texture) {
- assert(rmesa->vtbl.blit);
+ unsigned succeeded = 0;
unsigned alignedWidth = dstRowStride / _mesa_get_format_bytes(texImage->TexFormat);
- rmesa->vtbl.blit(ctx, tmp_bo, 0, texImage->TexFormat, alignedWidth,
+ if (rmesa->vtbl.blit) {
+ succeeded = rmesa->vtbl.blit(ctx, tmp_bo, 0, texImage->TexFormat, alignedWidth,
width, height, 0, 0,
image->mt->bo, radeon_miptree_image_offset(image->mt, face, level),
texImage->TexFormat, alignedWidth, texImage->Width, texImage->Height,
xoffset, yoffset, width, height, 0);
+ }
+
+ if (!succeeded) {
+ radeon_bo_map(tmp_bo, 0);
+ radeon_bo_map(image->mt->bo, 1);
+ /*TODO: for subteximage untile orig, merge orig & new, tile merged */
+ tile_image(tmp_bo->ptr, alignedWidth, image->mt->bo->ptr, alignedWidth,
+ texImage->TexFormat, texImage->Width, texImage->Height);
+ radeon_bo_unmap(tmp_bo);
+ radeon_bo_unmap(image->mt->bo);
+ }
+
radeon_bo_unref(tmp_bo);
}
}