-/* $Id: texutil_tmp.h,v 1.10 2002/06/29 19:48:16 brianp Exp $ */
+/**
+ * \file texutil_tmp.h
+ * Texture conversion templates.
+ *
+ * \author Gareth Hughes
+ *
+ * For 2D and 3D texture images, we generate functions for
+ * - conversion without pixel unpacking and standard stride
+ * - conversion without pixel unpacking and non-standard stride
+ * - conversion with pixel unpacking and standard stride
+ * - conversion with pixel unpacking and non-standard stride
+ *
+ * Macros which need to be defined before including this file:
+ * - \c TAG(x) - the function name wrapper
+ * - \c DST_TYPE - the destination texel data type (GLuint, GLushort, etc)
+ * - \c DST_TEXELS_PER_DWORD - number of destination texels that'll fit in 4 bytes
+ * - \c CONVERT_TEXEL - code to convert from source to destination texel
+ * - \c CONVER_TEXEL_DWORD - if multiple texels fit in 4 bytes, this macros
+ * will convert/store multiple texels at once
+ * - \c CONVERT_DIRECT - if defined, just memcpy texels from source to destination
+ * - \c SRC_TEXEL_BYTES - bytes per source texel
+ * - \c PRESERVE_DST_TYPE - if defined, don't undefined these macros at end
+ *
+ * \sa convert_func.
+ */
/*
* Mesa 3-D graphics library
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * Author:
- * Gareth Hughes <gareth@valinux.com>
*/
-
-/*
- * NOTE: All 3D teximage code is untested and most definitely broken...
- */
-
-
-
-
#define DST_TEXEL_BYTES (4 / DST_TEXELS_PER_DWORD)
#define DST_ROW_BYTES (convert->width * DST_TEXEL_BYTES)
#define DST_ROW_STRIDE (convert->dstImageWidth * DST_TEXEL_BYTES)
convert->dstImageHeight * DST_TEXEL_BYTES)
-/* =============================================================
- * PRE: No pixelstore attribs, width == dstImageWidth.
+/***************************************************************/
+/** \name Doesn't require pixelstore attributes or stride
+ *
+ * \code width == dstImageWidth \endcode
+ * and
+ * \code height == dstImageHeight \endcode
+ * if applicable.
*/
+/*@{*/
+
+/** \sa convert_func */
static GLboolean
-TAG(texsubimage2d)( struct gl_texture_convert *convert )
+TAG(texsubimage2d)( const struct convert_info *convert )
{
const GLubyte *src = (const GLubyte *)convert->srcImage;
GLuint *dst = (GLuint *)((GLubyte *)convert->dstImage +
return GL_TRUE;
}
-/* PRE: As above, height == dstImageHeight also.
- */
+/** \sa convert_func */
static GLboolean
-TAG(texsubimage3d)( struct gl_texture_convert *convert )
+TAG(texsubimage3d)( const struct convert_info *convert )
{
const GLubyte *src = (const GLubyte *)convert->srcImage;
GLuint *dst = (GLuint *)((GLubyte *)convert->dstImage +
return GL_TRUE;
}
+/*@}*/
-/* =============================================================
- * PRE: No pixelstore attribs, width != dstImageWidth.
+/***************************************************************/
+/** \name Requires stride but no pixelstore attributes
+ *
+ * \code width != dstImageWidth \endcode
+ * or
+ * \code height != dstImageHeight \endcode
+ * if applicable.
*/
+/*@{*/
+
+/** \sa convert_func */
static GLboolean
-TAG(texsubimage2d_stride)( struct gl_texture_convert *convert )
+TAG(texsubimage2d_stride)( const struct convert_info *convert )
{
const GLubyte *src = (const GLubyte *)convert->srcImage;
DST_TYPE *dst = (DST_TYPE *)((GLubyte *)convert->dstImage +
return GL_TRUE;
}
-/* PRE: As above, or height != dstImageHeight also.
- */
+/** \sa convert_func */
static GLboolean
-TAG(texsubimage3d_stride)( struct gl_texture_convert *convert )
+TAG(texsubimage3d_stride)( const struct convert_info *convert )
{
const GLubyte *src = (const GLubyte *)convert->srcImage;
DST_TYPE *dst = (DST_TYPE *)((GLubyte *)convert->dstImage +
return GL_TRUE;
}
+/*@}*/
-/* =============================================================
- * PRE: Require pixelstore attribs, width == dstImageWidth.
+/***************************************************************/
+/** \name Requires pixelstore attributes but no stride.
+ *
+ * \code width == dstImageWidth \endcode
+ * and
+ * \code height == dstImageHeight \endcode
+ * if applicable.
*/
+/*@{*/
+
+/** \sa convert_func */
static GLboolean
-TAG(texsubimage2d_unpack)( struct gl_texture_convert *convert )
+TAG(texsubimage2d_unpack)( const struct convert_info *convert )
{
const GLubyte *src = (const GLubyte *)
_mesa_image_address( convert->unpacking, convert->srcImage,
return GL_TRUE;
}
-/* PRE: as above, height == dstImageHeight also.
- */
+/** \sa convert_func */
static GLboolean
-TAG(texsubimage3d_unpack)( struct gl_texture_convert *convert )
+TAG(texsubimage3d_unpack)( const struct convert_info *convert )
{
const GLubyte *src = (const GLubyte *)
_mesa_image_address( convert->unpacking, convert->srcImage,
return GL_TRUE;
}
+/*@}*/
-/* =============================================================
- * PRE: Require pixelstore attribs, width != dstImageWidth.
+/***************************************************************/
+/** \name Requires pixelstore attributes and stride.
+ *
+ * \code width != dstImageWidth \endcode
+ * or
+ * \code height != dstImageHeight \endcode
+ * if applicable.
*/
+/*@{*/
+
+/** \sa convert_func */
static GLboolean
-TAG(texsubimage2d_stride_unpack)( struct gl_texture_convert *convert )
+TAG(texsubimage2d_stride_unpack)( const struct convert_info *convert )
{
const GLubyte *src = (const GLubyte *)
_mesa_image_address( convert->unpacking, convert->srcImage,
DST_TYPE *dst = (DST_TYPE *)((GLubyte *)convert->dstImage +
(convert->yoffset * convert->dstImageWidth +
convert->xoffset) * DST_TEXEL_BYTES);
- GLint adjust;
- GLint row, col;
- (void) col;
-
- adjust = convert->dstImageWidth - convert->width;
+ GLint row;
+#ifndef CONVERT_DIRECT
+ GLint adjust = convert->dstImageWidth - convert->width;
+#endif
#if DEBUG_TEXUTIL
_mesa_debug( NULL, __FUNCTION__ ":\n" );
_mesa_debug( NULL, " x=%d y=%d w=%d h=%d s=%d\n",
convert->xoffset, convert->yoffset, convert->width,
convert->height, convert->dstImageWidth );
- _mesa_debug( NULL, " adjust=%d\n", adjust );
#endif
for ( row = 0 ; row < convert->height ; row++ ) {
dst += convert->dstImageWidth;
#else
const GLubyte *srcRow = src;
+ GLint col;
for ( col = 0 ; col < convert->width ; col++ ) {
CONVERT_TEXEL( *dst++, src );
src += SRC_TEXEL_BYTES;
return GL_TRUE;
}
-/* PRE: As above, or height != dstImageHeight also.
- */
+/** \sa convert_func */
static GLboolean
-TAG(texsubimage3d_stride_unpack)( struct gl_texture_convert *convert )
+TAG(texsubimage3d_stride_unpack)( const struct convert_info *convert )
{
const GLubyte *src = (const GLubyte *)
_mesa_image_address( convert->unpacking, convert->srcImage,
((convert->zoffset * convert->dstImageHeight +
convert->yoffset) * convert->dstImageWidth +
convert->xoffset) * DST_TEXEL_BYTES);
- GLint adjust;
- GLint row, col, img;
- (void) col;
-
- adjust = convert->dstImageWidth - convert->width;
+ GLint row, img;
+#ifndef CONVERT_DIRECT
+ GLint adjust = convert->dstImageWidth - convert->width;
+#endif
#if DEBUG_TEXUTIL
_mesa_debug( NULL, __FUNCTION__ ":\n" );
_mesa_debug( NULL, " x=%d y=%d w=%d h=%d s=%d\n",
convert->xoffset, convert->yoffset, convert->width,
convert->height, convert->dstImageWidth );
- _mesa_debug( NULL, " adjust=%d\n", adjust );
#endif
for ( img = 0 ; img < convert->depth ; img++ ) {
dst += convert->dstImageWidth;
#else
const GLubyte *srcRow = src;
+ GLint col;
for ( col = 0 ; col < convert->width ; col++ ) {
CONVERT_TEXEL( *dst++, src );
src += SRC_TEXEL_BYTES;
return GL_TRUE;
}
+/*@}*/
+
+/***********************************************************************/
+/** \name Conversion function tables
+ */
+/*@{*/
+/**
+ * 2D texture conversion functions table.
+ *
+ * \sa convert_func.
+ */
static convert_func TAG(texsubimage2d_tab)[] = {
TAG(texsubimage2d),
TAG(texsubimage2d_stride),
TAG(texsubimage2d_stride_unpack),
};
+/**
+ * 3D texture conversion functions table.
+ *
+ * \sa convert_func.
+ */
static convert_func TAG(texsubimage3d_tab)[] = {
TAG(texsubimage3d),
TAG(texsubimage3d_stride),
TAG(texsubimage3d_stride_unpack),
};
+/*@}*/
+
#ifndef PRESERVE_DST_TYPE
#undef DST_TYPE