basic support for reading GL_DEPTH_COMPONENT
authorBrian <brian.paul@tungstengraphics.com>
Wed, 3 Oct 2007 19:45:24 +0000 (13:45 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Wed, 3 Oct 2007 19:50:11 +0000 (13:50 -0600)
src/mesa/state_tracker/st_cb_readpixels.c

index 98604e5b6b546f06a15d9133f61570457b0abcf6..a82c4e526aaca2577d153f042eb80b4d9d1b586a 100644 (file)
@@ -86,7 +86,12 @@ st_readpixels(GLcontext *ctx, GLint x, GLint y, GLsizei width, GLsizei height,
 
    }
 
-   strb = st_renderbuffer(ctx->ReadBuffer->_ColorReadBuffer);
+   if (format == GL_DEPTH_COMPONENT) {
+      strb = st_renderbuffer(ctx->ReadBuffer->_DepthBuffer);
+   }
+   else {
+      strb = st_renderbuffer(ctx->ReadBuffer->_ColorReadBuffer);
+   }
    if (!strb)
       return;
 
@@ -98,6 +103,14 @@ st_readpixels(GLcontext *ctx, GLint x, GLint y, GLsizei width, GLsizei height,
                                              height, format, type, 0, 0);
       dfStride = width * 4;
    }
+#if 0
+   else if (format == GL_DEPTH_COMPONENT && type == GL_FLOAT) {
+      /* write tile(row) directly into user's buffer */
+      df = (GLfloat *) _mesa_image_address2d(&clippedPacking, dest, width,
+                                             height, format, type, 0, 0);
+      dfStride = width;
+   }
+#endif
    else {
       /* write tile(row) into temp row buffer */
       df = (GLfloat *) temp;
@@ -122,8 +135,26 @@ st_readpixels(GLcontext *ctx, GLint x, GLint y, GLsizei width, GLsizei height,
          /* convert GLfloat to user's format/type */
          GLvoid *dst = _mesa_image_address2d(&clippedPacking, dest, width,
                                              height, format, type, i, 0);
-         _mesa_pack_rgba_span_float(ctx, width, temp, format, type, dst,
-                                    &clippedPacking, transferOps);
+         if (format == GL_DEPTH_COMPONENT) {
+            float z[MAX_WIDTH];
+            if (strb->surface->format == PIPE_FORMAT_S8_Z24) {
+               const double scale = 1.0 / ((1 << 24) - 1);
+               const uint *zs = (const uint *) temp;
+               uint k;
+               for (k = 0; k < width; k++) {
+                  z[k] = (zs[k] & 0xffffff) * scale;
+               }
+            }
+            else {
+               assert(0);
+            }
+            _mesa_pack_depth_span(ctx, width, dst, type,
+                                  z, &clippedPacking);
+         }
+         else {
+            _mesa_pack_rgba_span_float(ctx, width, temp, format, type, dst,
+                                       &clippedPacking, transferOps);
+         }
       }
    }