X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fmain%2Fpack.c;h=4f0caa7636c4e9a9e1f24d6e13cde14953724618;hb=d012e6d8fe2f4f1139af9e47a684960e8cde103e;hp=62e352f3fc9c5656e5d8188407e01852813ec7d2;hpb=9520f483b8f1e45fa474674b415554988de5d8d3;p=mesa.git diff --git a/src/mesa/main/pack.c b/src/mesa/main/pack.c index 62e352f3fc9..4f0caa7636c 100644 --- a/src/mesa/main/pack.c +++ b/src/mesa/main/pack.c @@ -29,39 +29,34 @@ */ +/* + * XXX: MSVC takes forever to compile this module for x86_64 unless we disable + * this global optimization. + * + * See also: + * - http://msdn.microsoft.com/en-us/library/1yk3ydd7.aspx + * - http://msdn.microsoft.com/en-us/library/chh3fb0k.aspx + */ +#if defined(_MSC_VER) && defined(_M_X64) +# pragma optimize( "g", off ) +#endif + + #include "glheader.h" #include "colormac.h" #include "enums.h" #include "image.h" #include "imports.h" +#include "macros.h" #include "mtypes.h" #include "pack.h" #include "pixeltransfer.h" #include "imports.h" +#include "glformats.h" #include "../../gallium/auxiliary/util/u_format_rgb9e5.h" #include "../../gallium/auxiliary/util/u_format_r11g11b10f.h" -/** - * NOTE: - * Normally, BYTE_TO_FLOAT(0) returns 0.00392 That causes problems when - * we later convert the float to a packed integer value (such as for - * GL_RGB5_A1) because we'll wind up with a non-zero value. - * - * We redefine the macros here so zero is handled correctly. - */ -#undef BYTE_TO_FLOAT -#define BYTE_TO_FLOAT(B) ((B) == 0 ? 0.0F : ((2.0F * (B) + 1.0F) * (1.0F/255.0F))) - -#undef SHORT_TO_FLOAT -#define SHORT_TO_FLOAT(S) ((S) == 0 ? 0.0F : ((2.0F * (S) + 1.0F) * (1.0F/65535.0F))) - - - -/** Compute ceiling of integer quotient of A divided by B. */ -#define CEILING( A, B ) ( (A) % (B) == 0 ? (A)/(B) : (A)/(B)+1 ) - - /** * Flip the 8 bits in each byte of the given array. * @@ -162,7 +157,7 @@ _mesa_unpack_bitmap( GLint width, GLint height, const GLubyte *pixels, /* Alloc dest storage */ bytes = ((width + 7) / 8 * height); - buffer = (GLubyte *) malloc( bytes ); + buffer = malloc( bytes ); if (!buffer) return NULL; @@ -467,6 +462,785 @@ get_type_min_max(GLenum type, GLfloat *min, GLfloat *max) } } +/* Customization of unsigned integer packing. + */ +#define SRC_TYPE GLuint + +#define DST_TYPE GLuint +#define SRC_CONVERT(x) (x) +#define FN_NAME pack_uint_from_uint_rgba +#include "pack_tmp.h" +#undef DST_TYPE +#undef SRC_CONVERT +#undef FN_NAME + +#define DST_TYPE GLint +#define SRC_CONVERT(x) MIN2(x, 0x7fffffff) +#define FN_NAME pack_int_from_uint_rgba +#include "pack_tmp.h" +#undef DST_TYPE +#undef SRC_CONVERT +#undef FN_NAME + +#define DST_TYPE GLushort +#define SRC_CONVERT(x) MIN2(x, 0xffff) +#define FN_NAME pack_ushort_from_uint_rgba +#include "pack_tmp.h" +#undef DST_TYPE +#undef SRC_CONVERT +#undef FN_NAME + +#define DST_TYPE GLshort +#define SRC_CONVERT(x) CLAMP((int)x, -32768, 32767) +#define FN_NAME pack_short_from_uint_rgba +#include "pack_tmp.h" +#undef DST_TYPE +#undef SRC_CONVERT +#undef FN_NAME + +#define DST_TYPE GLubyte +#define SRC_CONVERT(x) MIN2(x, 0xff) +#define FN_NAME pack_ubyte_from_uint_rgba +#include "pack_tmp.h" +#undef DST_TYPE +#undef SRC_CONVERT +#undef FN_NAME + +#define DST_TYPE GLbyte +#define SRC_CONVERT(x) CLAMP((int)x, -128, 127) +#define FN_NAME pack_byte_from_uint_rgba +#include "pack_tmp.h" +#undef DST_TYPE +#undef SRC_CONVERT +#undef FN_NAME + +#undef SRC_TYPE + +static void +_pack_rgba_span_from_uints_problem(struct gl_context *ctx, + GLenum dstFormat, GLenum dstType) +{ + _mesa_problem(ctx, + "Unsupported type (%s) / format (%s) " + "in _mesa_pack_rgba_span_from_uints", + _mesa_lookup_enum_by_nr(dstType), + _mesa_lookup_enum_by_nr(dstFormat)); +} + +void +_mesa_pack_rgba_span_from_uints(struct gl_context *ctx, GLuint n, GLuint rgba[][4], + GLenum dstFormat, GLenum dstType, + GLvoid *dstAddr) +{ + GLuint i; + + switch(dstType) { + case GL_UNSIGNED_INT: + pack_uint_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n); + break; + case GL_INT: + pack_int_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n); + break; + case GL_UNSIGNED_SHORT: + pack_ushort_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n); + break; + case GL_SHORT: + pack_short_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n); + break; + case GL_UNSIGNED_BYTE: + pack_ubyte_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n); + break; + case GL_BYTE: + pack_byte_from_uint_rgba(ctx, dstAddr, dstFormat, rgba, n); + break; + case GL_UNSIGNED_BYTE_3_3_2: + if ((dstFormat == GL_RGB) || (dstFormat == GL_RGB_INTEGER)) { + GLubyte *dst = (GLubyte *) dstAddr; + for (i=0;iSwapBytes) { GLint swapSize = _mesa_sizeof_packed_type(dstType); if (swapSize == 2) { - if (dstPacking->SwapBytes) { - _mesa_swap2((GLushort *) dstAddr, n * comps); - } + _mesa_swap2((GLushort *) dstAddr, n * comps); } else if (swapSize == 4) { - if (dstPacking->SwapBytes) { - _mesa_swap4((GLuint *) dstAddr, n * comps); - } + _mesa_swap4((GLuint *) dstAddr, n * comps); } } @@ -2200,7 +3007,7 @@ get_component_mapping(GLenum format, *gSrc = 0; *rSrc = *bSrc = *aSrc = -1; break; - case GL_BLUE: + case GL_BLUE: case GL_BLUE_INTEGER_EXT: *bSrc = 0; *rSrc = *gSrc = *aSrc = -1; @@ -2246,6 +3053,7 @@ get_component_mapping(GLenum format, *aDst = 3; break; case GL_BGR: + case GL_BGR_INTEGER: *rSrc = 2; *gSrc = 1; *bSrc = 0; @@ -2267,6 +3075,7 @@ get_component_mapping(GLenum format, *aDst = 3; break; case GL_BGRA: + case GL_BGRA_INTEGER: *rSrc = 2; *gSrc = 1; *bSrc = 0; @@ -2348,6 +3157,7 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4], srcFormat == GL_GREEN_INTEGER_EXT || srcFormat == GL_BLUE_INTEGER_EXT || srcFormat == GL_ALPHA_INTEGER_EXT || + srcFormat == GL_RG_INTEGER || srcFormat == GL_RGB_INTEGER_EXT || srcFormat == GL_RGBA_INTEGER_EXT || srcFormat == GL_BGR_INTEGER_EXT || @@ -2384,7 +3194,7 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4], stride = _mesa_components_in_format(srcFormat); - intFormat = _mesa_is_integer_format(srcFormat); + intFormat = _mesa_is_enum_format_integer(srcFormat); #define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT_FLT, DEFAULT_INT, TYPE, CONVERSION) \ if ((SRC_INDEX) < 0) { \ @@ -2443,10 +3253,10 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4], PROCESS(aSrc, ACOMP, 1.0F, 255, GLubyte, UBYTE_TO_FLOAT); break; case GL_BYTE: - PROCESS(rSrc, RCOMP, 0.0F, 0, GLbyte, BYTE_TO_FLOAT); - PROCESS(gSrc, GCOMP, 0.0F, 0, GLbyte, BYTE_TO_FLOAT); - PROCESS(bSrc, BCOMP, 0.0F, 0, GLbyte, BYTE_TO_FLOAT); - PROCESS(aSrc, ACOMP, 1.0F, 127, GLbyte, BYTE_TO_FLOAT); + PROCESS(rSrc, RCOMP, 0.0F, 0, GLbyte, BYTE_TO_FLOATZ); + PROCESS(gSrc, GCOMP, 0.0F, 0, GLbyte, BYTE_TO_FLOATZ); + PROCESS(bSrc, BCOMP, 0.0F, 0, GLbyte, BYTE_TO_FLOATZ); + PROCESS(aSrc, ACOMP, 1.0F, 127, GLbyte, BYTE_TO_FLOATZ); break; case GL_UNSIGNED_SHORT: PROCESS(rSrc, RCOMP, 0.0F, 0, GLushort, USHORT_TO_FLOAT); @@ -2455,10 +3265,10 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4], PROCESS(aSrc, ACOMP, 1.0F, 0xffff, GLushort, USHORT_TO_FLOAT); break; case GL_SHORT: - PROCESS(rSrc, RCOMP, 0.0F, 0, GLshort, SHORT_TO_FLOAT); - PROCESS(gSrc, GCOMP, 0.0F, 0, GLshort, SHORT_TO_FLOAT); - PROCESS(bSrc, BCOMP, 0.0F, 0, GLshort, SHORT_TO_FLOAT); - PROCESS(aSrc, ACOMP, 1.0F, 32767, GLshort, SHORT_TO_FLOAT); + PROCESS(rSrc, RCOMP, 0.0F, 0, GLshort, SHORT_TO_FLOATZ); + PROCESS(gSrc, GCOMP, 0.0F, 0, GLshort, SHORT_TO_FLOATZ); + PROCESS(bSrc, BCOMP, 0.0F, 0, GLshort, SHORT_TO_FLOATZ); + PROCESS(aSrc, ACOMP, 1.0F, 32767, GLshort, SHORT_TO_FLOATZ); break; case GL_UNSIGNED_INT: PROCESS(rSrc, RCOMP, 0.0F, 0, GLuint, UINT_TO_FLOAT); @@ -2910,31 +3720,10 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4], } -static inline GLuint -clamp_byte_to_uint(GLbyte b) -{ - return b < 0 ? 0 : b; -} - - -static inline GLuint -clamp_short_to_uint(GLshort s) -{ - return s < 0 ? 0 : s; -} - - -static inline GLuint -clamp_int_to_uint(GLint i) -{ - return i < 0 ? 0 : i; -} - - static inline GLuint clamp_float_to_uint(GLfloat f) { - return f < 0.0F ? 0 : IROUND(f); + return f < 0.0F ? 0 : F_TO_I(f); } @@ -2942,7 +3731,7 @@ static inline GLuint clamp_half_to_uint(GLhalfARB h) { GLfloat f = _mesa_half_to_float(h); - return f < 0.0F ? 0 : IROUND(f); + return f < 0.0F ? 0 : F_TO_I(f); } @@ -2974,6 +3763,7 @@ extract_uint_rgba(GLuint n, GLuint rgba[][4], srcFormat == GL_DU8DV8_ATI || srcFormat == GL_DUDV_ATI || srcFormat == GL_RED_INTEGER_EXT || + srcFormat == GL_RG_INTEGER || srcFormat == GL_GREEN_INTEGER_EXT || srcFormat == GL_BLUE_INTEGER_EXT || srcFormat == GL_ALPHA_INTEGER_EXT || @@ -3052,10 +3842,10 @@ extract_uint_rgba(GLuint n, GLuint rgba[][4], PROCESS(aSrc, ACOMP, 1, GLubyte, (GLuint)); break; case GL_BYTE: - PROCESS(rSrc, RCOMP, 0, GLbyte, clamp_byte_to_uint); - PROCESS(gSrc, GCOMP, 0, GLbyte, clamp_byte_to_uint); - PROCESS(bSrc, BCOMP, 0, GLbyte, clamp_byte_to_uint); - PROCESS(aSrc, ACOMP, 1, GLbyte, clamp_byte_to_uint); + PROCESS(rSrc, RCOMP, 0, GLbyte, (GLuint)); + PROCESS(gSrc, GCOMP, 0, GLbyte, (GLuint)); + PROCESS(bSrc, BCOMP, 0, GLbyte, (GLuint)); + PROCESS(aSrc, ACOMP, 1, GLbyte, (GLuint)); break; case GL_UNSIGNED_SHORT: PROCESS(rSrc, RCOMP, 0, GLushort, (GLuint)); @@ -3064,10 +3854,10 @@ extract_uint_rgba(GLuint n, GLuint rgba[][4], PROCESS(aSrc, ACOMP, 1, GLushort, (GLuint)); break; case GL_SHORT: - PROCESS(rSrc, RCOMP, 0, GLshort, clamp_short_to_uint); - PROCESS(gSrc, GCOMP, 0, GLshort, clamp_short_to_uint); - PROCESS(bSrc, BCOMP, 0, GLshort, clamp_short_to_uint); - PROCESS(aSrc, ACOMP, 1, GLshort, clamp_short_to_uint); + PROCESS(rSrc, RCOMP, 0, GLshort, (GLuint)); + PROCESS(gSrc, GCOMP, 0, GLshort, (GLuint)); + PROCESS(bSrc, BCOMP, 0, GLshort, (GLuint)); + PROCESS(aSrc, ACOMP, 1, GLshort, (GLuint)); break; case GL_UNSIGNED_INT: PROCESS(rSrc, RCOMP, 0, GLuint, (GLuint)); @@ -3076,10 +3866,10 @@ extract_uint_rgba(GLuint n, GLuint rgba[][4], PROCESS(aSrc, ACOMP, 1, GLuint, (GLuint)); break; case GL_INT: - PROCESS(rSrc, RCOMP, 0, GLint, clamp_int_to_uint); - PROCESS(gSrc, GCOMP, 0, GLint, clamp_int_to_uint); - PROCESS(bSrc, BCOMP, 0, GLint, clamp_int_to_uint); - PROCESS(aSrc, ACOMP, 1, GLint, clamp_int_to_uint); + PROCESS(rSrc, RCOMP, 0, GLint, (GLuint)); + PROCESS(gSrc, GCOMP, 0, GLint, (GLuint)); + PROCESS(bSrc, BCOMP, 0, GLint, (GLuint)); + PROCESS(aSrc, ACOMP, 1, GLint, (GLuint)); break; case GL_FLOAT: PROCESS(rSrc, RCOMP, 0, GLfloat, clamp_float_to_uint); @@ -3459,7 +4249,7 @@ _mesa_unpack_color_span_ubyte(struct gl_context *ctx, const struct gl_pixelstore_attrib *srcPacking, GLbitfield transferOps ) { - GLboolean intFormat = _mesa_is_integer_format(srcFormat); + GLboolean intFormat = _mesa_is_enum_format_integer(srcFormat); ASSERT(dstFormat == GL_ALPHA || dstFormat == GL_LUMINANCE || dstFormat == GL_LUMINANCE_ALPHA || @@ -3564,70 +4354,6 @@ _mesa_unpack_color_span_ubyte(struct gl_context *ctx, return; } } - /* - * Common situation, loading 8bit RGBA/RGB source images - * into 16/32 bit destination. (OSMesa16/32) - */ - else if (srcType == GL_UNSIGNED_BYTE) { - if (dstFormat == GL_RGBA) { - if (srcFormat == GL_RGB) { - GLuint i; - const GLubyte *src = (const GLubyte *) source; - GLubyte *dst = dest; - for (i = 0; i < n; i++) { - dst[0] = src[0]; - dst[1] = src[1]; - dst[2] = src[2]; - dst[3] = 255; - src += 3; - dst += 4; - } - return; - } - else if (srcFormat == GL_RGBA) { - GLuint i; - const GLubyte *src = (const GLubyte *) source; - GLubyte *dst = dest; - for (i = 0; i < n; i++) { - dst[0] = src[0]; - dst[1] = src[1]; - dst[2] = src[2]; - dst[3] = src[3]; - src += 4; - dst += 4; - } - return; - } - } - else if (dstFormat == GL_RGB) { - if (srcFormat == GL_RGB) { - GLuint i; - const GLubyte *src = (const GLubyte *) source; - GLubyte *dst = dest; - for (i = 0; i < n; i++) { - dst[0] = src[0]; - dst[1] = src[1]; - dst[2] = src[2]; - src += 3; - dst += 3; - } - return; - } - else if (srcFormat == GL_RGBA) { - GLuint i; - const GLubyte *src = (const GLubyte *) source; - GLubyte *dst = dest; - for (i = 0; i < n; i++) { - dst[0] = src[0]; - dst[1] = src[1]; - dst[2] = src[2]; - src += 4; - dst += 3; - } - return; - } - } - } } @@ -3635,7 +4361,7 @@ _mesa_unpack_color_span_ubyte(struct gl_context *ctx, { GLint dstComponents; GLint rDst, gDst, bDst, aDst, lDst, iDst; - GLfloat (*rgba)[4] = (GLfloat (*)[4]) malloc(4 * n * sizeof(GLfloat)); + GLfloat (*rgba)[4] = malloc(4 * n * sizeof(GLfloat)); if (!rgba) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); @@ -3650,10 +4376,11 @@ _mesa_unpack_color_span_ubyte(struct gl_context *ctx, * Extract image data and convert to RGBA floats */ if (srcFormat == GL_COLOR_INDEX) { - GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint)); + GLuint *indexes = malloc(n * sizeof(GLuint)); if (!indexes) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); + free(rgba); return; } @@ -3791,6 +4518,7 @@ _mesa_unpack_color_span_float( struct gl_context *ctx, srcFormat == GL_GREEN_INTEGER_EXT || srcFormat == GL_BLUE_INTEGER_EXT || srcFormat == GL_ALPHA_INTEGER_EXT || + srcFormat == GL_RG_INTEGER || srcFormat == GL_RGB_INTEGER_EXT || srcFormat == GL_RGBA_INTEGER_EXT || srcFormat == GL_BGR_INTEGER_EXT || @@ -3827,8 +4555,8 @@ _mesa_unpack_color_span_float( struct gl_context *ctx, { GLint dstComponents; GLint rDst, gDst, bDst, aDst, lDst, iDst; - GLfloat (*rgba)[4] = (GLfloat (*)[4]) malloc(4 * n * sizeof(GLfloat)); - GLboolean intFormat = _mesa_is_integer_format(srcFormat); + GLfloat (*rgba)[4] = malloc(4 * n * sizeof(GLfloat)); + GLboolean intFormat = _mesa_is_enum_format_integer(srcFormat); if (!rgba) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); @@ -3850,7 +4578,7 @@ _mesa_unpack_color_span_float( struct gl_context *ctx, * Extract image data and convert to RGBA floats */ if (srcFormat == GL_COLOR_INDEX) { - GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint)); + GLuint *indexes = malloc(n * sizeof(GLuint)); if (!indexes) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); @@ -3963,7 +4691,7 @@ _mesa_unpack_color_span_uint(struct gl_context *ctx, const GLvoid *source, const struct gl_pixelstore_attrib *srcPacking) { - GLuint (*rgba)[4] = (GLuint (*)[4]) malloc(n * 4 * sizeof(GLfloat)); + GLuint (*rgba)[4] = malloc(n * 4 * sizeof(GLfloat)); if (!rgba) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); @@ -3996,6 +4724,7 @@ _mesa_unpack_color_span_uint(struct gl_context *ctx, srcFormat == GL_GREEN_INTEGER_EXT || srcFormat == GL_BLUE_INTEGER_EXT || srcFormat == GL_ALPHA_INTEGER_EXT || + srcFormat == GL_RG_INTEGER || srcFormat == GL_RGB_INTEGER_EXT || srcFormat == GL_RGBA_INTEGER_EXT || srcFormat == GL_BGR_INTEGER_EXT || @@ -4140,7 +4869,7 @@ _mesa_unpack_dudv_span_byte( struct gl_context *ctx, GLint dstComponents; GLbyte *dst = dest; GLuint i; - GLfloat (*rgba)[4] = (GLfloat (*)[4]) malloc(4 * n * sizeof(GLfloat)); + GLfloat (*rgba)[4] = malloc(4 * n * sizeof(GLfloat)); if (!rgba) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); @@ -4227,7 +4956,7 @@ _mesa_unpack_index_span( struct gl_context *ctx, GLuint n, /* * general solution */ - GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint)); + GLuint *indexes = malloc(n * sizeof(GLuint)); if (!indexes) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking"); @@ -4278,7 +5007,7 @@ _mesa_pack_index_span( struct gl_context *ctx, GLuint n, const struct gl_pixelstore_attrib *dstPacking, GLbitfield transferOps ) { - GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint)); + GLuint *indexes = malloc(n * sizeof(GLuint)); if (!indexes) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing"); @@ -4454,7 +5183,7 @@ _mesa_unpack_stencil_span( struct gl_context *ctx, GLuint n, /* * general solution */ - GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint)); + GLuint *indexes = malloc(n * sizeof(GLuint)); if (!indexes) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "stencil unpacking"); @@ -4521,10 +5250,10 @@ _mesa_unpack_stencil_span( struct gl_context *ctx, GLuint n, void _mesa_pack_stencil_span( struct gl_context *ctx, GLuint n, - GLenum dstType, GLvoid *dest, const GLstencil *source, + GLenum dstType, GLvoid *dest, const GLubyte *source, const struct gl_pixelstore_attrib *dstPacking ) { - GLstencil *stencil = (GLstencil *) malloc(n * sizeof(GLstencil)); + GLubyte *stencil = malloc(n * sizeof(GLubyte)); if (!stencil) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "stencil packing"); @@ -4534,23 +5263,14 @@ _mesa_pack_stencil_span( struct gl_context *ctx, GLuint n, if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset || ctx->Pixel.MapStencilFlag) { /* make a copy of input */ - memcpy(stencil, source, n * sizeof(GLstencil)); + memcpy(stencil, source, n * sizeof(GLubyte)); _mesa_apply_stencil_transfer_ops(ctx, n, stencil); source = stencil; } switch (dstType) { case GL_UNSIGNED_BYTE: - if (sizeof(GLstencil) == 1) { - memcpy( dest, source, n ); - } - else { - GLubyte *dst = (GLubyte *) dest; - GLuint i; - for (i=0;i= (GLdouble) 0xffffffff) zValues[i] = 0xffffffff; else @@ -4936,7 +5656,7 @@ _mesa_pack_depth_span( struct gl_context *ctx, GLuint n, GLvoid *dest, GLenum dstType, const GLfloat *depthSpan, const struct gl_pixelstore_attrib *dstPacking ) { - GLfloat *depthCopy = (GLfloat *) malloc(n * sizeof(GLfloat)); + GLfloat *depthCopy = malloc(n * sizeof(GLfloat)); if (!depthCopy) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing"); return; @@ -5055,11 +5775,11 @@ void _mesa_pack_depth_stencil_span(struct gl_context *ctx,GLuint n, GLenum dstType, GLuint *dest, const GLfloat *depthVals, - const GLstencil *stencilVals, + const GLubyte *stencilVals, const struct gl_pixelstore_attrib *dstPacking) { - GLfloat *depthCopy = (GLfloat *) malloc(n * sizeof(GLfloat)); - GLstencil *stencilCopy = (GLstencil *) malloc(n * sizeof(GLstencil)); + GLfloat *depthCopy = malloc(n * sizeof(GLfloat)); + GLubyte *stencilCopy = malloc(n * sizeof(GLubyte)); GLuint i; if (!depthCopy || !stencilCopy) { @@ -5078,7 +5798,7 @@ _mesa_pack_depth_stencil_span(struct gl_context *ctx,GLuint n, if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset || ctx->Pixel.MapStencilFlag) { - memcpy(stencilCopy, stencilVals, n * sizeof(GLstencil)); + memcpy(stencilCopy, stencilVals, n * sizeof(GLubyte)); _mesa_apply_stencil_transfer_ops(ctx, n, stencilCopy); stencilVals = stencilCopy; } @@ -5157,7 +5877,7 @@ _mesa_unpack_image( GLuint dimensions, { GLubyte *destBuffer - = (GLubyte *) malloc(bytesPerRow * height * depth); + = malloc(bytesPerRow * height * depth); GLubyte *dst; GLint img, row; if (!destBuffer) @@ -5248,3 +5968,94 @@ _mesa_unpack_image( GLuint dimensions, } } + + +/** + * If we unpack colors from a luminance surface, we'll get pixel colors + * such as (l, l, l, a). + * When we call _mesa_pack_rgba_span_float(format=GL_LUMINANCE), that + * function will compute L=R+G+B before packing. The net effect is we'll + * accidentally store luminance values = 3*l. + * This function compensates for that by converting (aka rebasing) (l,l,l,a) + * to be (l,0,0,a). + * It's a similar story for other formats such as LUMINANCE_ALPHA, ALPHA + * and INTENSITY. + * + * Finally, we also need to do this when the actual surface format does + * not match the logical surface format. For example, suppose the user + * requests a GL_LUMINANCE texture but the driver stores it as RGBA. + * Again, we'll get pixel values like (l,l,l,a). + */ +void +_mesa_rebase_rgba_float(GLuint n, GLfloat rgba[][4], GLenum baseFormat) +{ + GLuint i; + + switch (baseFormat) { + case GL_ALPHA: + for (i = 0; i < n; i++) { + rgba[i][RCOMP] = 0.0F; + rgba[i][GCOMP] = 0.0F; + rgba[i][BCOMP] = 0.0F; + } + break; + case GL_INTENSITY: + /* fall-through */ + case GL_LUMINANCE: + for (i = 0; i < n; i++) { + rgba[i][GCOMP] = 0.0F; + rgba[i][BCOMP] = 0.0F; + rgba[i][ACOMP] = 1.0F; + } + break; + case GL_LUMINANCE_ALPHA: + for (i = 0; i < n; i++) { + rgba[i][GCOMP] = 0.0F; + rgba[i][BCOMP] = 0.0F; + } + break; + default: + /* no-op */ + ; + } +} + + +/** + * As above, but GLuint components. + */ +void +_mesa_rebase_rgba_uint(GLuint n, GLuint rgba[][4], GLenum baseFormat) +{ + GLuint i; + + switch (baseFormat) { + case GL_ALPHA: + for (i = 0; i < n; i++) { + rgba[i][RCOMP] = 0; + rgba[i][GCOMP] = 0; + rgba[i][BCOMP] = 0; + } + break; + case GL_INTENSITY: + /* fall-through */ + case GL_LUMINANCE: + for (i = 0; i < n; i++) { + rgba[i][GCOMP] = 0; + rgba[i][BCOMP] = 0; + rgba[i][ACOMP] = 1; + } + break; + case GL_LUMINANCE_ALPHA: + for (i = 0; i < n; i++) { + rgba[i][GCOMP] = 0; + rgba[i][BCOMP] = 0; + } + break; + default: + /* no-op */ + ; + } +} + +