mesa: handle the pbo case for save_Bitmap
Wrap _mesa_unpack_bitmap to handle the case that data is stored in pixel buffer object. This would make calling Bitmap with data stored in PBO by display list work. Signed-off-by: Yuanhan Liu <yuanhan.liu@linux.intel.com> Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
+15
-7
@@ -875,7 +875,7 @@ translate_id(GLsizei n, GLenum type, const GLvoid * list)
|
||||
/**********************************************************************/
|
||||
|
||||
/**
|
||||
* Wrapper for _mesa_unpack_image() that handles pixel buffer objects.
|
||||
* Wrapper for _mesa_unpack_image/bitmap() that handles pixel buffer objects.
|
||||
* If width < 0 or height < 0 or format or type are invalid we'll just
|
||||
* return NULL. We will not generate an error since OpenGL command
|
||||
* arguments aren't error-checked until the command is actually executed
|
||||
@@ -899,8 +899,13 @@ unpack_image(struct gl_context *ctx, GLuint dimensions,
|
||||
|
||||
if (!_mesa_is_bufferobj(unpack->BufferObj)) {
|
||||
/* no PBO */
|
||||
GLvoid *image = _mesa_unpack_image(dimensions, width, height, depth,
|
||||
format, type, pixels, unpack);
|
||||
GLvoid *image;
|
||||
|
||||
if (type == GL_BITMAP)
|
||||
image = _mesa_unpack_bitmap(width, height, pixels, unpack);
|
||||
else
|
||||
image = _mesa_unpack_image(dimensions, width, height, depth,
|
||||
format, type, pixels, unpack);
|
||||
if (pixels && !image) {
|
||||
_mesa_error(ctx, GL_OUT_OF_MEMORY, "display list construction");
|
||||
}
|
||||
@@ -921,8 +926,11 @@ unpack_image(struct gl_context *ctx, GLuint dimensions,
|
||||
}
|
||||
|
||||
src = ADD_POINTERS(map, pixels);
|
||||
image = _mesa_unpack_image(dimensions, width, height, depth,
|
||||
format, type, src, unpack);
|
||||
if (type == GL_BITMAP)
|
||||
image = _mesa_unpack_bitmap(width, height, src, unpack);
|
||||
else
|
||||
image = _mesa_unpack_image(dimensions, width, height, depth,
|
||||
format, type, src, unpack);
|
||||
|
||||
ctx->Driver.UnmapBuffer(ctx, unpack->BufferObj);
|
||||
|
||||
@@ -935,7 +943,6 @@ unpack_image(struct gl_context *ctx, GLuint dimensions,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Allocate space for a display list instruction (opcode + payload space).
|
||||
* \param opcode the instruction opcode (OPCODE_* value)
|
||||
@@ -1121,7 +1128,8 @@ save_Bitmap(GLsizei width, GLsizei height,
|
||||
n[4].f = yorig;
|
||||
n[5].f = xmove;
|
||||
n[6].f = ymove;
|
||||
n[7].data = _mesa_unpack_bitmap(width, height, pixels, &ctx->Unpack);
|
||||
n[7].data = unpack_image(ctx, 2, width, height, 1, GL_COLOR_INDEX,
|
||||
GL_BITMAP, pixels, &ctx->Unpack);
|
||||
}
|
||||
if (ctx->ExecuteFlag) {
|
||||
CALL_Bitmap(ctx->Exec, (width, height,
|
||||
|
||||
Reference in New Issue
Block a user