nv50: support more formats in surface_copy,fill

Fixes corrupted fonts in bzFlag, where we've been silently
failing to copy I8 mipmaps to a new miptree.

Print an error message on unsupported format now, since we
can't return failure.
This commit is contained in:
Christoph Bumiller 2010-03-16 22:32:42 +01:00
parent 5782b2a968
commit e548babb1f
1 changed files with 30 additions and 1 deletions

View File

@ -28,6 +28,7 @@
#include "util/u_inlines.h"
#include "util/u_tile.h"
#include "util/u_format.h"
static INLINE int
nv50_format(enum pipe_format format)
@ -37,10 +38,35 @@ nv50_format(enum pipe_format format)
return NV50_2D_DST_FORMAT_A8R8G8B8_UNORM;
case PIPE_FORMAT_B8G8R8X8_UNORM:
return NV50_2D_DST_FORMAT_X8R8G8B8_UNORM;
case PIPE_FORMAT_B8G8R8A8_SRGB:
return NV50_2D_DST_FORMAT_A8R8G8B8_SRGB;
case PIPE_FORMAT_B8G8R8X8_SRGB:
return NV50_2D_DST_FORMAT_X8R8G8B8_SRGB;
case PIPE_FORMAT_B5G6R5_UNORM:
return NV50_2D_DST_FORMAT_R5G6B5_UNORM;
case PIPE_FORMAT_B5G5R5A1_UNORM:
return NV50_2D_DST_FORMAT_A1R5G5B5_UNORM;
case PIPE_FORMAT_A8_UNORM:
case PIPE_FORMAT_I8_UNORM:
case PIPE_FORMAT_L8_UNORM:
return NV50_2D_DST_FORMAT_R8_UNORM;
case PIPE_FORMAT_R32G32B32A32_FLOAT:
return NV50_2D_DST_FORMAT_R32G32B32A32_FLOAT;
case PIPE_FORMAT_R32G32B32_FLOAT:
return NV50_2D_DST_FORMAT_R32G32B32X32_FLOAT;
case PIPE_FORMAT_Z32_FLOAT:
return NV50_2D_DST_FORMAT_R32_FLOAT;
/* only because we require src format == dst format: */
case PIPE_FORMAT_R16G16_SNORM:
case PIPE_FORMAT_R16G16_UNORM:
case PIPE_FORMAT_S8Z24_UNORM:
case PIPE_FORMAT_Z24S8_UNORM:
return NV50_2D_DST_FORMAT_A8R8G8B8_UNORM;
case PIPE_FORMAT_L8A8_UNORM:
case PIPE_FORMAT_B4G4R4A4_UNORM:
return NV50_2D_DST_FORMAT_R16_UNORM;
default:
return -1;
}
@ -57,8 +83,11 @@ nv50_surface_set(struct nv50_screen *screen, struct pipe_surface *ps, int dst)
int flags = NOUVEAU_BO_VRAM | (dst ? NOUVEAU_BO_WR : NOUVEAU_BO_RD);
format = nv50_format(ps->format);
if (format < 0)
if (format < 0) {
NOUVEAU_ERR("invalid/unsupported surface format: %s\n",
util_format_name(ps->format));
return 1;
}
if (!bo->tile_flags) {
MARK_RING (chan, 9, 2); /* flush on lack of space or relocs */