st/mesa: add readpixel integer support
authorDave Airlie <airlied@redhat.com>
Mon, 19 Sep 2011 14:06:23 +0000 (15:06 +0100)
committerDave Airlie <airlied@redhat.com>
Sat, 8 Oct 2011 16:46:38 +0000 (17:46 +0100)
This adds support for readpixels integer paths, it deals with the signed/unsigned crossovers.

Signed-off-by: Dave Airlie <airlied@redhat.com>
src/mesa/state_tracker/st_cb_readpixels.c

index e2b29fe3068691d3932abde20366863c15275229..7fa1672fda8948fe0d5d450e6d5a538e9c8cf8bf 100644 (file)
@@ -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++) {