From a66a2359d72ceb67781c7e366f34265c7aaae91a Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Mon, 19 Sep 2011 15:06:23 +0100 Subject: [PATCH] st/mesa: add readpixel integer support This adds support for readpixels integer paths, it deals with the signed/unsigned crossovers. Signed-off-by: Dave Airlie --- src/mesa/state_tracker/st_cb_readpixels.c | 40 +++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/src/mesa/state_tracker/st_cb_readpixels.c b/src/mesa/state_tracker/st_cb_readpixels.c index e2b29fe3068..7fa1672fda8 100644 --- a/src/mesa/state_tracker/st_cb_readpixels.c +++ b/src/mesa/state_tracker/st_cb_readpixels.c @@ -387,6 +387,8 @@ st_readpixels(struct gl_context *ctx, GLint x, GLint y, GLsizei width, GLsizei h GLsizei i, j; GLint yStep, dfStride; GLfloat *df; + GLuint *dui; + GLint *di; struct st_renderbuffer *strb; struct gl_pixelstore_attrib clippedPacking = *pack; struct pipe_transfer *trans; @@ -454,10 +456,13 @@ st_readpixels(struct gl_context *ctx, GLint x, GLint y, GLsizei width, GLsizei h } else { /* write tile(row) into temp row buffer */ - df = (GLfloat *) temp; + df = (GLfloat *)temp; dfStride = 0; } + dui = (GLuint *)df; + di = (GLint *)df; + if (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP) { /* convert GL Y to Gallium Y */ y = strb->Base.Height - y - height; @@ -611,7 +616,38 @@ st_readpixels(struct gl_context *ctx, GLint x, GLint y, GLsizei width, GLsizei h dst += dstStride; } } - else { + else if (util_format_is_pure_sint(pformat)) { + for (i = 0; i < height; i++) { + if (type == GL_UNSIGNED_INT) + pipe_get_tile_ui_format(pipe, trans, 0, y, width, 1, + pformat, dui); + else + pipe_get_tile_i_format(pipe, trans, 0, y, width, 1, + pformat, di); + y += yStep; + if (!dfStride) { + _mesa_pack_rgba_span_int(ctx, width, (GLuint (*)[4])temp, + format, type, dst); + dst += dstStride; + } + } + } else if (util_format_is_pure_uint(pformat)) { + for (i = 0; i < height; i++) { + if (type == GL_UNSIGNED_INT) + pipe_get_tile_ui_format(pipe, trans, 0, y, width, 1, + pformat, dui); + else + pipe_get_tile_i_format(pipe, trans, 0, y, width, 1, + pformat, di); + y += yStep; + df += dfStride; + if (!dfStride) { + _mesa_pack_rgba_span_int(ctx, width, (GLuint (*)[4])temp, + format, type, dst); + dst += dstStride; + } + } + } else { /* RGBA format */ /* Do a row at a time to flip image data vertically */ for (i = 0; i < height; i++) { -- 2.30.2