st/mesa: implement glBitmap unpacking from a PBO, for the cache path

We weren't mapping the PBO when using the bitmap cache (but we had
the PBO code for the non-cache path.)

Fixes http://bugs.freedesktop.org/show_bug.cgi?id=61026

Note: This is a candidate for the stable branches.
This commit is contained in:
Brian Paul 2013-02-18 08:36:35 -07:00
parent 5da967aff5
commit 63c30d7e4f
1 changed files with 11 additions and 2 deletions

View File

@ -675,11 +675,12 @@ st_flush_bitmap_cache(struct st_context *st)
* \return GL_TRUE for success, GL_FALSE if bitmap is too large, etc. * \return GL_TRUE for success, GL_FALSE if bitmap is too large, etc.
*/ */
static GLboolean static GLboolean
accum_bitmap(struct st_context *st, accum_bitmap(struct gl_context *ctx,
GLint x, GLint y, GLsizei width, GLsizei height, GLint x, GLint y, GLsizei width, GLsizei height,
const struct gl_pixelstore_attrib *unpack, const struct gl_pixelstore_attrib *unpack,
const GLubyte *bitmap ) const GLubyte *bitmap )
{ {
struct st_context *st = ctx->st;
struct bitmap_cache *cache = st->bitmap.cache; struct bitmap_cache *cache = st->bitmap.cache;
int px = -999, py = -999; int px = -999, py = -999;
const GLfloat z = st->ctx->Current.RasterPos[2]; const GLfloat z = st->ctx->Current.RasterPos[2];
@ -729,9 +730,17 @@ accum_bitmap(struct st_context *st,
/* create the transfer if needed */ /* create the transfer if needed */
create_cache_trans(st); create_cache_trans(st);
/* PBO source... */
bitmap = _mesa_map_pbo_source(ctx, unpack, bitmap);
if (!bitmap) {
return FALSE;
}
unpack_bitmap(st, px, py, width, height, unpack, bitmap, unpack_bitmap(st, px, py, width, height, unpack, bitmap,
cache->buffer, BITMAP_CACHE_WIDTH); cache->buffer, BITMAP_CACHE_WIDTH);
_mesa_unmap_pbo_source(ctx, unpack);
return GL_TRUE; /* accumulated */ return GL_TRUE; /* accumulated */
} }
@ -764,7 +773,7 @@ st_Bitmap(struct gl_context *ctx, GLint x, GLint y,
semantic_indexes); semantic_indexes);
} }
if (UseBitmapCache && accum_bitmap(st, x, y, width, height, unpack, bitmap)) if (UseBitmapCache && accum_bitmap(ctx, x, y, width, height, unpack, bitmap))
return; return;
pt = make_bitmap_texture(ctx, width, height, unpack, bitmap); pt = make_bitmap_texture(ctx, width, height, unpack, bitmap);