OSDN Git Service

added _mesa_pack_depth_stencil_span()
authorBrian Paul <brian.paul@tungstengraphics.com>
Sat, 1 Oct 2005 16:02:38 +0000 (16:02 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Sat, 1 Oct 2005 16:02:38 +0000 (16:02 +0000)
src/mesa/main/image.c
src/mesa/main/image.h

index b6841d7..3523505 100644 (file)
@@ -4084,6 +4084,53 @@ _mesa_pack_depth_span( const GLcontext *ctx, GLuint n, GLvoid *dest,
 }
 
 
+
+/**
+ * Pack depth and stencil values as GL_DEPTH_STENCIL/GL_UNSIGNED_INT_24_8.
+ */
+void
+_mesa_pack_depth_stencil_span(const GLcontext *ctx, GLuint n, GLuint *dest,
+                              const GLfloat *depthVals,
+                              const GLstencil *stencilVals,
+                              const struct gl_pixelstore_attrib *dstPacking)
+{
+   GLfloat depthCopy[MAX_WIDTH];
+   GLstencil stencilCopy[MAX_WIDTH];
+   GLuint i;
+
+   ASSERT(n <= MAX_WIDTH);
+
+   if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) {
+      _mesa_memcpy(depthCopy, depthVals, n * sizeof(GLfloat));
+      _mesa_scale_and_bias_depth(ctx, n, depthCopy);
+      depthVals = depthCopy;
+   }
+
+   if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset) {
+      _mesa_memcpy(stencilCopy, stencilVals, n * sizeof(GLstencil));
+      _mesa_shift_and_offset_stencil(ctx, n, stencilCopy);
+      stencilVals = stencilCopy;
+   }
+   if (ctx->Pixel.MapStencilFlag) {
+      if (stencilVals != stencilCopy)
+         _mesa_memcpy(stencilCopy, stencilVals, n * sizeof(GLstencil));
+      _mesa_map_stencil(ctx, n, stencilCopy);
+      stencilVals = stencilCopy;
+   }
+
+   for (i = 0; i < n; i++) {
+      GLuint z = (GLuint) (depthVals[i] * 0xffffff);
+      dest[i] = (z << 8) | (stencilVals[i] & 0xff);
+   }
+
+   if (dstPacking->SwapBytes) {
+      _mesa_swap4(dest, n);
+   }
+}
+
+
+
+
 /**
  * Unpack image data.  Apply byte swapping, byte flipping (bitmap).
  * Return all image data in a contiguous block.  This is used when we
index 74be4ae..e319595 100644 (file)
@@ -189,6 +189,13 @@ _mesa_pack_depth_span( const GLcontext *ctx, GLuint n, GLvoid *dest,
                        const struct gl_pixelstore_attrib *dstPacking );
 
 
+extern void
+_mesa_pack_depth_stencil_span(const GLcontext *ctx, GLuint n, GLuint *dest,
+                              const GLfloat *depthVals,
+                              const GLstencil *stencilVals,
+                              const struct gl_pixelstore_attrib *dstPacking);
+
+
 extern void *
 _mesa_unpack_image( GLuint dimensions,
                     GLsizei width, GLsizei height, GLsizei depth,