diff --git a/src/gallium/auxiliary/util/u_index_modify.c b/src/gallium/auxiliary/util/u_index_modify.c index d0a28b5..d13d779 100644 --- a/src/gallium/auxiliary/util/u_index_modify.c +++ b/src/gallium/auxiliary/util/u_index_modify.c @@ -35,7 +35,7 @@ void util_shorten_ubyte_elts_to_userptr(struct pipe_context *context, { struct pipe_transfer *src_transfer; unsigned char *in_map; - unsigned short *out_map = out; + unsigned int *out_map = out; unsigned i; in_map = pipe_buffer_map(context, elts, @@ -44,12 +44,15 @@ void util_shorten_ubyte_elts_to_userptr(struct pipe_context *context, &src_transfer); in_map += start; - for (i = 0; i < count; i++) { - *out_map = (unsigned short)(*in_map + index_bias); - in_map++; + for (i = 0; i < (count - 1); i += 2) { + *out_map = (in_map[0] + index_bias) | ((unsigned int)(in_map[1] + index_bias)) << 16; + in_map += 2; out_map++; } + if (i < count) + *out_map = in_map[0] + index_bias; + pipe_buffer_unmap(context, src_transfer); } @@ -66,7 +69,7 @@ void util_shorten_ubyte_elts(struct pipe_context *context, new_elts = pipe_buffer_create(context->screen, PIPE_BIND_INDEX_BUFFER, PIPE_USAGE_STATIC, - 2 * count); + 2 * align(count, 2)); out_map = pipe_buffer_map(context, new_elts, PIPE_TRANSFER_WRITE, &dst_transfer); @@ -88,7 +91,7 @@ void util_rebuild_ushort_elts_to_userptr(struct pipe_context *context, { struct pipe_transfer *in_transfer = NULL; unsigned short *in_map; - unsigned short *out_map = out; + unsigned int *out_map = out; unsigned i; in_map = pipe_buffer_map(context, elts, @@ -97,12 +100,15 @@ void util_rebuild_ushort_elts_to_userptr(struct pipe_context *context, &in_transfer); in_map += start; - for (i = 0; i < count; i++) { - *out_map = (unsigned short)(*in_map + index_bias); - in_map++; + for (i = 0; i < (count - 1); i += 2) { + *out_map = (in_map[0] + index_bias) | ((unsigned int)(in_map[1] + index_bias)) << 16; + in_map += 2; out_map++; } + if (i < count) + *out_map = in_map[0] + index_bias; + pipe_buffer_unmap(context, in_transfer); } @@ -118,7 +124,7 @@ void util_rebuild_ushort_elts(struct pipe_context *context, new_elts = pipe_buffer_create(context->screen, PIPE_BIND_INDEX_BUFFER, PIPE_USAGE_STATIC, - 2 * count); + 2 * align(count, 2)); out_map = pipe_buffer_map(context, new_elts, PIPE_TRANSFER_WRITE, &out_transfer); diff --git a/src/gallium/drivers/r300/r300_render_translate.c b/src/gallium/drivers/r300/r300_render_translate.c index f8c7558..fd22779 100644 --- a/src/gallium/drivers/r300/r300_render_translate.c +++ b/src/gallium/drivers/r300/r300_render_translate.c @@ -51,7 +51,10 @@ void r300_translate_index_buffer(struct r300_context *r300, break; case 2: - if (index_offset) { +#ifdef PIPE_ARCH_LITTLE_ENDIAN + if (index_offset) +#endif + { u_upload_alloc(r300->vbuf_mgr->uploader, 0, count * 2, &out_offset, &out_buffer, &flushed, &ptr); diff --git a/src/mesa/main/colormac.h b/src/mesa/main/colormac.h index 4294f32..2c553fe 100644 --- a/src/mesa/main/colormac.h +++ b/src/mesa/main/colormac.h @@ -92,6 +92,14 @@ _mesa_unclamped_float_rgba_to_ubyte(GLubyte dst[4], const GLfloat src[4]) ((((B) >> 6) << 20) | (((G) >> 6) << 10) | ((R) >> 6) | \ (((A) >> 14) << 30)) +#define PACK_COLOR_2101010_REV_UB( A, B, G, R ) \ + BSWAP32(((B) << 22) | ((G) << 12) | ((R) << 2) | \ + (((A) & 0xc0) << 24)) + +#define PACK_COLOR_2101010_REV_US( A, B, G, R ) \ + BSWAP32((((B) >> 6) << 20) | (((G) >> 6) << 10) | ((R) >> 6) | \ + (((A) >> 14) << 30)) + #define PACK_COLOR_4444( R, G, B, A ) \ ((((R) & 0xf0) << 8) | (((G) & 0xf0) << 4) | ((B) & 0xf0) | ((A) >> 4)) @@ -111,7 +119,7 @@ _mesa_unclamped_float_rgba_to_ubyte(GLubyte dst[4], const GLfloat src[4]) (((L) << 16) | (A)) #define PACK_COLOR_1616_REV( L, A ) \ - (((A) << 16) | (L)) + BSWAP32(PACK_COLOR_1616( L, A )) #define PACK_COLOR_332( R, G, B ) \ (((R) & 0xe0) | (((G) & 0xe0) >> 3) | (((B) & 0xc0) >> 6)) diff --git a/src/mesa/main/compiler.h b/src/mesa/main/compiler.h index 25d9810..b17cedd 100644 --- a/src/mesa/main/compiler.h +++ b/src/mesa/main/compiler.h @@ -226,33 +226,45 @@ extern "C" { * Try to use a runtime test instead. * For now, only used by some DRI hardware drivers for color/texel packing. */ -#if defined(BYTE_ORDER) && defined(BIG_ENDIAN) && BYTE_ORDER == BIG_ENDIAN #if defined(__linux__) #include -#define CPU_TO_LE32( x ) bswap_32( x ) +#define BSWAP32( x ) bswap_32( x ) +#define BSWAP16( x ) bswap_16( x ) #elif defined(__APPLE__) #include -#define CPU_TO_LE32( x ) CFSwapInt32HostToLittle( x ) +#define BSWAP32( x ) CFSwapInt32HostToLittle( x ) +#define BSWAP16( x ) CFSwapInt16HostToLittle( x ) #elif (defined(_AIX) || defined(__blrts)) -static INLINE GLuint CPU_TO_LE32(GLuint x) +static INLINE GLuint BSWAP32(GLuint x) { return (((x & 0x000000ff) << 24) | ((x & 0x0000ff00) << 8) | ((x & 0x00ff0000) >> 8) | ((x & 0xff000000) >> 24)); } +static INLINE GLushort BSWAP16(GLushort x) +{ + return (((x & 0x00ff) << 8) | + ((x & 0xff00) >> 8)); +} #else /*__linux__ */ #include -#define CPU_TO_LE32( x ) bswap32( x ) +#define BSWAP32( x ) bswap32( x ) +#define BSWAP16( x ) bswap16( x ) #endif /*__linux__*/ + +#if defined(BYTE_ORDER) && defined(BIG_ENDIAN) && BYTE_ORDER == BIG_ENDIAN +#define CPU_TO_LE32( x ) BSWAP32( x ) +#define CPU_TO_LE16( x ) BSWAP16( x ) #define MESA_BIG_ENDIAN 1 #else #define CPU_TO_LE32( x ) ( x ) +#define CPU_TO_LE16( x ) ( x ) #define MESA_LITTLE_ENDIAN 1 #endif -#define LE32_TO_CPU( x ) CPU_TO_LE32( x ) - +#define LE32_TO_CPU( x ) CPU_TO_LE32( x ) +#define LE16_TO_CPU( x ) CPU_TO_LE16( x ) #if !defined(CAPI) && defined(WIN32) && !defined(BUILD_FOR_SNAP) #define CAPI _cdecl diff --git a/src/mesa/main/depthstencil.c b/src/mesa/main/depthstencil.c index af5c12f..67553a4 100644 --- a/src/mesa/main/depthstencil.c +++ b/src/mesa/main/depthstencil.c @@ -84,7 +84,9 @@ alloc_wrapper_storage(struct gl_context *ctx, struct gl_renderbuffer *rb, (void) internalFormat; ASSERT(dsrb->Format == MESA_FORMAT_Z24_S8 || + dsrb->Format == MESA_FORMAT_Z24_S8_REV || dsrb->Format == MESA_FORMAT_Z24_X8 || + dsrb->Format == MESA_FORMAT_Z24_X8_REV || dsrb->Format == MESA_FORMAT_S8_Z24 || dsrb->Format == MESA_FORMAT_X8_Z24); @@ -123,6 +125,11 @@ get_row_z24(struct gl_context *ctx, struct gl_renderbuffer *z24rb, GLuint count, dst[i] = src[i] >> 8; } } + else if (dsrb->Format == MESA_FORMAT_Z24_S8_REV) { + for (i = 0; i < count; i++) { + dst[i] = BSWAP32(src[i]) >> 8; + } + } else { assert(dsrb->Format == MESA_FORMAT_S8_Z24); for (i = 0; i < count; i++) { @@ -148,6 +155,11 @@ get_values_z24(struct gl_context *ctx, struct gl_renderbuffer *z24rb, GLuint cou dst[i] = temp[i] >> 8; } } + else if (dsrb->Format == MESA_FORMAT_Z24_S8_REV) { + for (i = 0; i < count; i++) { + dst[i] = BSWAP32(temp[i]) >> 8; + } + } else { assert(dsrb->Format == MESA_FORMAT_S8_Z24); for (i = 0; i < count; i++) { @@ -175,6 +187,13 @@ put_row_z24(struct gl_context *ctx, struct gl_renderbuffer *z24rb, GLuint count, } } } + else if (dsrb->Format == MESA_FORMAT_Z24_S8_REV) { + for (i = 0; i < count; i++) { + if (!mask || mask[i]) { + dst[i] = BSWAP32(src[i] << 8) | (dst[i] & 0xff000000); + } + } + } else { assert(dsrb->Format == MESA_FORMAT_S8_Z24); for (i = 0; i < count; i++) { @@ -195,6 +214,13 @@ put_row_z24(struct gl_context *ctx, struct gl_renderbuffer *z24rb, GLuint count, } } } + else if (dsrb->Format == MESA_FORMAT_Z24_S8_REV) { + for (i = 0; i < count; i++) { + if (!mask || mask[i]) { + temp[i] = BSWAP32(src[i] << 8) | (temp[i] & 0xff000000); + } + } + } else { assert(dsrb->Format == MESA_FORMAT_S8_Z24); for (i = 0; i < count; i++) { @@ -226,6 +252,14 @@ put_mono_row_z24(struct gl_context *ctx, struct gl_renderbuffer *z24rb, GLuint c } } } + else if (dsrb->Format == MESA_FORMAT_Z24_S8_REV) { + const GLuint shiftedVal = *((GLuint *) value) << 8; + for (i = 0; i < count; i++) { + if (!mask || mask[i]) { + dst[i] = BSWAP32(shiftedVal) | (dst[i] & 0xff000000); + } + } + } else { const GLuint shiftedVal = *((GLuint *) value); assert(dsrb->Format == MESA_FORMAT_S8_Z24); @@ -248,6 +282,14 @@ put_mono_row_z24(struct gl_context *ctx, struct gl_renderbuffer *z24rb, GLuint c } } } + else if (dsrb->Format == MESA_FORMAT_Z24_S8_REV) { + const GLuint shiftedVal = *((GLuint *) value) << 8; + for (i = 0; i < count; i++) { + if (!mask || mask[i]) { + temp[i] = BSWAP32(shiftedVal) | (temp[i] & 0xff000000); + } + } + } else { const GLuint shiftedVal = *((GLuint *) value); assert(dsrb->Format == MESA_FORMAT_S8_Z24); @@ -281,6 +323,14 @@ put_values_z24(struct gl_context *ctx, struct gl_renderbuffer *z24rb, GLuint cou } } } + else if (dsrb->Format == MESA_FORMAT_Z24_S8_REV) { + for (i = 0; i < count; i++) { + if (!mask || mask[i]) { + GLuint *dst = (GLuint *) dsrb->GetPointer(ctx, dsrb, x[i], y[i]); + *dst = BSWAP32(src[i] << 8) | (*dst & 0xff000000); + } + } + } else { assert(dsrb->Format == MESA_FORMAT_S8_Z24); for (i = 0; i < count; i++) { @@ -302,6 +352,13 @@ put_values_z24(struct gl_context *ctx, struct gl_renderbuffer *z24rb, GLuint cou } } } + else if (dsrb->Format == MESA_FORMAT_Z24_S8_REV) { + for (i = 0; i < count; i++) { + if (!mask || mask[i]) { + temp[i] = BSWAP32(src[i] << 8) | (temp[i] & 0xff000000); + } + } + } else { assert(dsrb->Format == MESA_FORMAT_S8_Z24); for (i = 0; i < count; i++) { @@ -331,6 +388,14 @@ put_mono_values_z24(struct gl_context *ctx, struct gl_renderbuffer *z24rb, } } } + else if (dsrb->Format == MESA_FORMAT_Z24_S8_REV) { + const GLuint shiftedVal = *((GLuint *) value) << 8; + for (i = 0; i < count; i++) { + if (!mask || mask[i]) { + temp[i] = BSWAP32(shiftedVal) | (temp[i] & 0xff000000); + } + } + } else { const GLuint shiftedVal = *((GLuint *) value); assert(dsrb->Format == MESA_FORMAT_S8_Z24); @@ -356,7 +421,9 @@ _mesa_new_z24_renderbuffer_wrapper(struct gl_context *ctx, struct gl_renderbuffer *z24rb; ASSERT(dsrb->Format == MESA_FORMAT_Z24_S8 || + dsrb->Format == MESA_FORMAT_Z24_S8_REV || dsrb->Format == MESA_FORMAT_Z24_X8 || + dsrb->Format == MESA_FORMAT_Z24_X8_REV || dsrb->Format == MESA_FORMAT_S8_Z24 || dsrb->Format == MESA_FORMAT_X8_Z24); ASSERT(dsrb->DataType == GL_UNSIGNED_INT_24_8_EXT); @@ -635,7 +702,8 @@ get_row_s8(struct gl_context *ctx, struct gl_renderbuffer *s8rb, GLuint count, } } else { - assert(dsrb->Format == MESA_FORMAT_S8_Z24); + assert(dsrb->Format == MESA_FORMAT_S8_Z24 || + dsrb->Format == MESA_FORMAT_Z24_S8_REV); for (i = 0; i < count; i++) { dst[i] = src[i] >> 24; } @@ -666,7 +734,8 @@ get_values_s8(struct gl_context *ctx, struct gl_renderbuffer *s8rb, GLuint count } } else { - assert(dsrb->Format == MESA_FORMAT_S8_Z24); + assert(dsrb->Format == MESA_FORMAT_S8_Z24 || + dsrb->Format == MESA_FORMAT_Z24_S8_REV); for (i = 0; i < count; i++) { dst[i] = temp[i] >> 24; } @@ -701,7 +770,8 @@ put_row_s8(struct gl_context *ctx, struct gl_renderbuffer *s8rb, GLuint count, } } else { - assert(dsrb->Format == MESA_FORMAT_S8_Z24); + assert(dsrb->Format == MESA_FORMAT_S8_Z24 || + dsrb->Format == MESA_FORMAT_Z24_S8_REV); for (i = 0; i < count; i++) { if (!mask || mask[i]) { dst[i] = (dst[i] & 0xffffff) | (src[i] << 24); @@ -728,7 +798,8 @@ put_row_s8(struct gl_context *ctx, struct gl_renderbuffer *s8rb, GLuint count, } } else { - assert(dsrb->Format == MESA_FORMAT_S8_Z24); + assert(dsrb->Format == MESA_FORMAT_S8_Z24 || + dsrb->Format == MESA_FORMAT_Z24_S8_REV); for (i = 0; i < count; i++) { if (!mask || mask[i]) { temp[i] = (temp[i] & 0xffffff) | (src[i] << 24); @@ -767,7 +838,8 @@ put_mono_row_s8(struct gl_context *ctx, struct gl_renderbuffer *s8rb, GLuint cou } } else { - assert(dsrb->Format == MESA_FORMAT_S8_Z24); + assert(dsrb->Format == MESA_FORMAT_S8_Z24 || + dsrb->Format == MESA_FORMAT_Z24_S8_REV); for (i = 0; i < count; i++) { if (!mask || mask[i]) { dst[i] = (dst[i] & 0xffffff) | (val << 24); @@ -794,7 +866,8 @@ put_mono_row_s8(struct gl_context *ctx, struct gl_renderbuffer *s8rb, GLuint cou } } else { - assert(dsrb->Format == MESA_FORMAT_S8_Z24); + assert(dsrb->Format == MESA_FORMAT_S8_Z24 || + dsrb->Format == MESA_FORMAT_Z24_S8_REV); for (i = 0; i < count; i++) { if (!mask || mask[i]) { temp[i] = (temp[i] & 0xffffff) | (val << 24); @@ -835,7 +908,8 @@ put_values_s8(struct gl_context *ctx, struct gl_renderbuffer *s8rb, GLuint count } } else { - assert(dsrb->Format == MESA_FORMAT_S8_Z24); + assert(dsrb->Format == MESA_FORMAT_S8_Z24 || + dsrb->Format == MESA_FORMAT_Z24_S8_REV); for (i = 0; i < count; i++) { if (!mask || mask[i]) { GLuint *dst = (GLuint *) dsrb->GetPointer(ctx, dsrb, x[i], y[i]); @@ -863,7 +937,8 @@ put_values_s8(struct gl_context *ctx, struct gl_renderbuffer *s8rb, GLuint count } } else { - assert(dsrb->Format == MESA_FORMAT_S8_Z24); + assert(dsrb->Format == MESA_FORMAT_S8_Z24 || + dsrb->Format == MESA_FORMAT_Z24_S8_REV); for (i = 0; i < count; i++) { if (!mask || mask[i]) { temp[i] = (temp[i] & 0xffffff) | (src[i] << 24); @@ -899,7 +974,8 @@ put_mono_values_s8(struct gl_context *ctx, struct gl_renderbuffer *s8rb, GLuint } } else { - assert(dsrb->Format == MESA_FORMAT_S8_Z24); + assert(dsrb->Format == MESA_FORMAT_S8_Z24 || + dsrb->Format == MESA_FORMAT_Z24_S8_REV); for (i = 0; i < count; i++) { if (!mask || mask[i]) { temp[i] = (temp[i] & 0xffffff) | (val << 24); @@ -921,6 +997,7 @@ _mesa_new_s8_renderbuffer_wrapper(struct gl_context *ctx, struct gl_renderbuffer struct gl_renderbuffer *s8rb; ASSERT(dsrb->Format == MESA_FORMAT_Z24_S8 || + dsrb->Format == MESA_FORMAT_Z24_S8_REV || dsrb->Format == MESA_FORMAT_S8_Z24 || dsrb->Format == MESA_FORMAT_Z32_FLOAT_X24S8); ASSERT(dsrb->DataType == GL_UNSIGNED_INT_24_8_EXT || diff --git a/src/mesa/main/format_pack.c b/src/mesa/main/format_pack.c index 390b494..b04663f 100644 --- a/src/mesa/main/format_pack.c +++ b/src/mesa/main/format_pack.c @@ -1129,6 +1129,31 @@ pack_float_RGBA_FLOAT32(const GLfloat src[4], void *dst) } +/* MESA_FORMAT_RGBA_FLOAT32_REV */ + +static void +pack_ubyte_RGBA_FLOAT32_REV(const GLubyte src[4], void *dst) +{ + GLuint *d = ((GLuint *) dst); + union { GLfloat f; GLuint ui; } fui; + fui.f = UBYTE_TO_FLOAT(src[0]); d[0] = BSWAP32(fui.ui); + fui.f = UBYTE_TO_FLOAT(src[1]); d[1] = BSWAP32(fui.ui); + fui.f = UBYTE_TO_FLOAT(src[2]); d[2] = BSWAP32(fui.ui); + fui.f = UBYTE_TO_FLOAT(src[3]); d[3] = BSWAP32(fui.ui); +} + +static void +pack_float_RGBA_FLOAT32_REV(const GLfloat src[4], void *dst) +{ + GLuint *d = ((GLuint *) dst); + union { GLfloat f; GLuint ui; } fui; + fui.f = src[0]; d[0] = BSWAP32(fui.ui); + fui.f = src[1]; d[1] = BSWAP32(fui.ui); + fui.f = src[2]; d[2] = BSWAP32(fui.ui); + fui.f = src[3]; d[3] = BSWAP32(fui.ui); +} + + /* MESA_FORMAT_RGBA_FLOAT16 */ static void @@ -1719,6 +1744,7 @@ _mesa_get_pack_ubyte_rgba_function(gl_format format) table[MESA_FORMAT_RGBA_DXT5] = NULL; /* pack_ubyte_RGBA_DXT5; */ table[MESA_FORMAT_RGBA_FLOAT32] = pack_ubyte_RGBA_FLOAT32; + table[MESA_FORMAT_RGBA_FLOAT32_REV] = pack_ubyte_RGBA_FLOAT32_REV; table[MESA_FORMAT_RGBA_FLOAT16] = pack_ubyte_RGBA_FLOAT16; table[MESA_FORMAT_RGB_FLOAT32] = pack_ubyte_RGB_FLOAT32; table[MESA_FORMAT_RGB_FLOAT16] = pack_ubyte_RGB_FLOAT16; @@ -1863,6 +1889,7 @@ _mesa_get_pack_float_rgba_function(gl_format format) table[MESA_FORMAT_RGBA_DXT5] = NULL; table[MESA_FORMAT_RGBA_FLOAT32] = pack_float_RGBA_FLOAT32; + table[MESA_FORMAT_RGBA_FLOAT32_REV] = pack_float_RGBA_FLOAT32_REV; table[MESA_FORMAT_RGBA_FLOAT16] = pack_float_RGBA_FLOAT16; table[MESA_FORMAT_RGB_FLOAT32] = pack_float_RGB_FLOAT32; table[MESA_FORMAT_RGB_FLOAT16] = pack_float_RGB_FLOAT16; diff --git a/src/mesa/main/format_unpack.c b/src/mesa/main/format_unpack.c index 4f23f3d..ebd17fb 100644 --- a/src/mesa/main/format_unpack.c +++ b/src/mesa/main/format_unpack.c @@ -275,7 +275,7 @@ unpack_ARGB1555_REV(const void *src, GLfloat dst[][4], GLuint n) const GLushort *s = ((const GLushort *) src); GLuint i; for (i = 0; i < n; i++) { - GLushort tmp = (s[i] << 8) | (s[i] >> 8); /* byteswap */ + GLushort tmp = BSWAP16(s[i]); dst[i][RCOMP] = ((tmp >> 10) & 0x1f) * (1.0F / 31.0F); dst[i][GCOMP] = ((tmp >> 5) & 0x1f) * (1.0F / 31.0F); dst[i][BCOMP] = ((tmp >> 0) & 0x1f) * (1.0F / 31.0F); @@ -389,6 +389,19 @@ unpack_A16(const void *src, GLfloat dst[][4], GLuint n) } static void +unpack_A16_REV(const void *src, GLfloat dst[][4], GLuint n) +{ + const GLushort *s = ((const GLushort *) src); + GLuint i; + for (i = 0; i < n; i++) { + dst[i][RCOMP] = + dst[i][GCOMP] = + dst[i][BCOMP] = 0.0F; + dst[i][ACOMP] = USHORT_TO_FLOAT(BSWAP16(s[i])); + } +} + +static void unpack_L8(const void *src, GLfloat dst[][4], GLuint n) { const GLubyte *s = ((const GLubyte *) src); @@ -415,6 +428,19 @@ unpack_L16(const void *src, GLfloat dst[][4], GLuint n) } static void +unpack_L16_REV(const void *src, GLfloat dst[][4], GLuint n) +{ + const GLushort *s = ((const GLushort *) src); + GLuint i; + for (i = 0; i < n; i++) { + dst[i][RCOMP] = + dst[i][GCOMP] = + dst[i][BCOMP] = USHORT_TO_FLOAT(BSWAP16(s[i])); + dst[i][ACOMP] = 1.0F; + } +} + +static void unpack_I8(const void *src, GLfloat dst[][4], GLuint n) { const GLubyte *s = ((const GLubyte *) src); @@ -441,6 +467,19 @@ unpack_I16(const void *src, GLfloat dst[][4], GLuint n) } static void +unpack_I16_REV(const void *src, GLfloat dst[][4], GLuint n) +{ + const GLushort *s = ((const GLushort *) src); + GLuint i; + for (i = 0; i < n; i++) { + dst[i][RCOMP] = + dst[i][GCOMP] = + dst[i][BCOMP] = + dst[i][ACOMP] = USHORT_TO_FLOAT(BSWAP16(s[i])); + } +} + +static void unpack_YCBCR(const void *src, GLfloat dst[][4], GLuint n) { GLuint i; @@ -543,6 +582,19 @@ unpack_R16(const void *src, GLfloat dst[][4], GLuint n) } static void +unpack_R16_REV(const void *src, GLfloat dst[][4], GLuint n) +{ + const GLushort *s = ((const GLushort *) src); + GLuint i; + for (i = 0; i < n; i++) { + dst[i][RCOMP] = USHORT_TO_FLOAT(BSWAP16(s[i])); + dst[i][GCOMP] = 0.0; + dst[i][BCOMP] = 0.0; + dst[i][ACOMP] = 1.0; + } +} + +static void unpack_RG1616(const void *src, GLfloat dst[][4], GLuint n) { const GLuint *s = ((const GLuint *) src); @@ -600,6 +652,23 @@ unpack_Z24_S8(const void *src, GLfloat dst[][4], GLuint n) } static void +unpack_Z24_S8_REV(const void *src, GLfloat dst[][4], GLuint n) +{ + /* only return Z, not stencil data */ + const GLuint *s = ((const GLuint *) src); + const GLfloat scale = 1.0F / (GLfloat) 0xffffff; + GLuint i; + for (i = 0; i < n; i++) { + dst[i][0] = + dst[i][1] = + dst[i][2] = (BSWAP32(s[i]) >> 8) * scale; + dst[i][3] = 1.0F; + ASSERT(dst[i][0] >= 0.0F); + ASSERT(dst[i][0] <= 1.0F); + } +} + +static void unpack_S8_Z24(const void *src, GLfloat dst[][4], GLuint n) { /* only return Z, not stencil data */ @@ -630,6 +699,19 @@ unpack_Z16(const void *src, GLfloat dst[][4], GLuint n) } static void +unpack_Z16_REV(const void *src, GLfloat dst[][4], GLuint n) +{ + const GLushort *s = ((const GLushort *) src); + GLuint i; + for (i = 0; i < n; i++) { + dst[i][0] = + dst[i][1] = + dst[i][2] = BSWAP16(s[i]) * (1.0F / 65535.0F); + dst[i][3] = 1.0F; + } +} + +static void unpack_X8_Z24(const void *src, GLfloat dst[][4], GLuint n) { unpack_S8_Z24(src, dst, n); @@ -642,6 +724,12 @@ unpack_Z24_X8(const void *src, GLfloat dst[][4], GLuint n) } static void +unpack_Z24_X8_REV(const void *src, GLfloat dst[][4], GLuint n) +{ + unpack_Z24_S8_REV(src, dst, n); +} + +static void unpack_Z32(const void *src, GLfloat dst[][4], GLuint n) { const GLuint *s = ((const GLuint *) src); @@ -825,6 +913,20 @@ unpack_RGBA_FLOAT32(const void *src, GLfloat dst[][4], GLuint n) } static void +unpack_RGBA_FLOAT32_REV(const void *src, GLfloat dst[][4], GLuint n) +{ + const GLuint *s = (const GLuint *) src; + union { GLfloat f; GLuint ui; } fui; + GLuint i; + for (i = 0; i < n; i++) { + fui.ui = BSWAP32(s[i*4+0]); dst[i][RCOMP] = fui.f; + fui.ui = BSWAP32(s[i*4+1]); dst[i][GCOMP] = fui.f; + fui.ui = BSWAP32(s[i*4+2]); dst[i][BCOMP] = fui.f; + fui.ui = BSWAP32(s[i*4+3]); dst[i][ACOMP] = fui.f; + } +} + +static void unpack_RGBA_FLOAT16(const void *src, GLfloat dst[][4], GLuint n) { const GLhalfARB *s = (const GLhalfARB *) src; @@ -1242,6 +1344,19 @@ unpack_RGBA_16(const void *src, GLfloat dst[][4], GLuint n) } static void +unpack_RGBA_16_REV(const void *src, GLfloat dst[][4], GLuint n) +{ + const GLushort *s = (const GLushort *) src; + GLuint i; + for (i = 0; i < n; i++) { + dst[i][RCOMP] = USHORT_TO_FLOAT( BSWAP16(s[i*4+0]) ); + dst[i][GCOMP] = USHORT_TO_FLOAT( BSWAP16(s[i*4+1]) ); + dst[i][BCOMP] = USHORT_TO_FLOAT( BSWAP16(s[i*4+2]) ); + dst[i][ACOMP] = USHORT_TO_FLOAT( BSWAP16(s[i*4+3]) ); + } +} + +static void unpack_RED_RGTC1(const void *src, GLfloat dst[][4], GLuint n) { /* XXX to do */ @@ -1459,24 +1574,31 @@ get_unpack_rgba_function(gl_format format) table[MESA_FORMAT_RGB332] = unpack_RGB332; table[MESA_FORMAT_A8] = unpack_A8; table[MESA_FORMAT_A16] = unpack_A16; + table[MESA_FORMAT_A16_REV] = unpack_A16_REV; table[MESA_FORMAT_L8] = unpack_L8; table[MESA_FORMAT_L16] = unpack_L16; + table[MESA_FORMAT_L16_REV] = unpack_L16_REV; table[MESA_FORMAT_I8] = unpack_I8; table[MESA_FORMAT_I16] = unpack_I16; + table[MESA_FORMAT_I16_REV] = unpack_I16_REV; table[MESA_FORMAT_YCBCR] = unpack_YCBCR; table[MESA_FORMAT_YCBCR_REV] = unpack_YCBCR_REV; table[MESA_FORMAT_R8] = unpack_R8; table[MESA_FORMAT_GR88] = unpack_GR88; table[MESA_FORMAT_RG88] = unpack_RG88; table[MESA_FORMAT_R16] = unpack_R16; + table[MESA_FORMAT_R16_REV] = unpack_R16_REV; table[MESA_FORMAT_RG1616] = unpack_RG1616; table[MESA_FORMAT_RG1616_REV] = unpack_RG1616_REV; table[MESA_FORMAT_ARGB2101010] = unpack_ARGB2101010; table[MESA_FORMAT_Z24_S8] = unpack_Z24_S8; + table[MESA_FORMAT_Z24_S8_REV] = unpack_Z24_S8_REV; table[MESA_FORMAT_S8_Z24] = unpack_S8_Z24; table[MESA_FORMAT_Z16] = unpack_Z16; + table[MESA_FORMAT_Z16_REV] = unpack_Z16_REV; table[MESA_FORMAT_X8_Z24] = unpack_X8_Z24; table[MESA_FORMAT_Z24_X8] = unpack_Z24_X8; + table[MESA_FORMAT_Z24_X8_REV] = unpack_Z24_X8_REV; table[MESA_FORMAT_Z32] = unpack_Z32; table[MESA_FORMAT_S8] = unpack_S8; table[MESA_FORMAT_SRGB8] = unpack_SRGB8; @@ -1497,6 +1619,7 @@ get_unpack_rgba_function(gl_format format) table[MESA_FORMAT_RGBA_DXT5] = unpack_RGBA_DXT5; table[MESA_FORMAT_RGBA_FLOAT32] = unpack_RGBA_FLOAT32; + table[MESA_FORMAT_RGBA_FLOAT32_REV] = unpack_RGBA_FLOAT32_REV; table[MESA_FORMAT_RGBA_FLOAT16] = unpack_RGBA_FLOAT16; table[MESA_FORMAT_RGB_FLOAT32] = unpack_RGB_FLOAT32; table[MESA_FORMAT_RGB_FLOAT16] = unpack_RGB_FLOAT16; @@ -1531,6 +1654,7 @@ get_unpack_rgba_function(gl_format format) table[MESA_FORMAT_SIGNED_RGB_16] = unpack_SIGNED_RGB_16; table[MESA_FORMAT_SIGNED_RGBA_16] = unpack_SIGNED_RGBA_16; table[MESA_FORMAT_RGBA_16] = unpack_RGBA_16; + table[MESA_FORMAT_RGBA_16_REV] = unpack_RGBA_16_REV; table[MESA_FORMAT_RED_RGTC1] = unpack_RED_RGTC1; table[MESA_FORMAT_SIGNED_RED_RGTC1] = unpack_SIGNED_RED_RGTC1; @@ -1771,6 +1895,20 @@ unpack_float_z_Z24_X8(GLuint n, const void *src, GLfloat *dst) } static void +unpack_float_z_Z24_X8_REV(GLuint n, const void *src, GLfloat *dst) +{ + /* only return Z, not stencil data */ + const GLuint *s = ((const GLuint *) src); + const GLfloat scale = 1.0F / (GLfloat) 0xffffff; + GLuint i; + for (i = 0; i < n; i++) { + dst[i] = (BSWAP32(s[i]) >> 8) * scale; + ASSERT(dst[i] >= 0.0F); + ASSERT(dst[i] <= 1.0F); + } +} + +static void unpack_float_z_X8_Z24(GLuint n, const void *src, GLfloat *dst) { /* only return Z, not stencil data */ @@ -1795,6 +1933,16 @@ unpack_float_z_Z16(GLuint n, const void *src, GLfloat *dst) } static void +unpack_float_z_Z16_REV(GLuint n, const void *src, GLfloat *dst) +{ + const GLushort *s = ((const GLushort *) src); + GLuint i; + for (i = 0; i < n; i++) { + dst[i] = BSWAP16(s[i]) * (1.0F / 65535.0F); + } +} + +static void unpack_float_z_Z32(GLuint n, const void *src, GLfloat *dst) { const GLuint *s = ((const GLuint *) src); @@ -1833,6 +1981,10 @@ _mesa_unpack_float_z_row(gl_format format, GLuint n, case MESA_FORMAT_Z24_X8: unpack = unpack_float_z_Z24_X8; break; + case MESA_FORMAT_Z24_S8_REV: + case MESA_FORMAT_Z24_X8_REV: + unpack = unpack_float_z_Z24_X8_REV; + break; case MESA_FORMAT_S8_Z24: case MESA_FORMAT_X8_Z24: unpack = unpack_float_z_X8_Z24; @@ -1840,6 +1992,9 @@ _mesa_unpack_float_z_row(gl_format format, GLuint n, case MESA_FORMAT_Z16: unpack = unpack_float_z_Z16; break; + case MESA_FORMAT_Z16_REV: + unpack = unpack_float_z_Z16_REV; + break; case MESA_FORMAT_Z32: unpack = unpack_float_z_Z32; break; @@ -1874,6 +2029,17 @@ unpack_uint_z_Z24_X8(const void *src, GLuint *dst, GLuint n) } static void +unpack_uint_z_Z24_X8_REV(const void *src, GLuint *dst, GLuint n) +{ + /* only return Z, not stencil data */ + const GLuint *s = ((const GLuint *) src); + GLuint i; + for (i = 0; i < n; i++) { + dst[i] = (BSWAP32(s[i]) & 0xffffff00) | (s[i] >> 24); + } +} + +static void unpack_uint_z_X8_Z24(const void *src, GLuint *dst, GLuint n) { /* only return Z, not stencil data */ @@ -1895,6 +2061,16 @@ unpack_uint_z_Z16(const void *src, GLuint *dst, GLuint n) } static void +unpack_uint_z_Z16_REV(const void *src, GLuint *dst, GLuint n) +{ + const GLushort *s = ((const GLushort *)src); + GLuint i; + for (i = 0; i < n; i++) { + dst[i] = BSWAP32(((GLuint)s[i] << 16) | s[i]); + } +} + +static void unpack_uint_z_Z32(const void *src, GLuint *dst, GLuint n) { memcpy(dst, src, n * sizeof(GLuint)); @@ -1913,6 +2089,10 @@ _mesa_unpack_uint_z_row(gl_format format, GLuint n, case MESA_FORMAT_Z24_X8: unpack = unpack_uint_z_Z24_X8; break; + case MESA_FORMAT_Z24_S8_REV: + case MESA_FORMAT_Z24_X8_REV: + unpack = unpack_uint_z_Z24_X8_REV; + break; case MESA_FORMAT_S8_Z24: case MESA_FORMAT_X8_Z24: unpack = unpack_uint_z_X8_Z24; @@ -1920,6 +2100,9 @@ _mesa_unpack_uint_z_row(gl_format format, GLuint n, case MESA_FORMAT_Z16: unpack = unpack_uint_z_Z16; break; + case MESA_FORMAT_Z16_REV: + unpack = unpack_uint_z_Z16_REV; + break; case MESA_FORMAT_Z32: unpack = unpack_uint_z_Z32; break; @@ -1950,6 +2133,16 @@ unpack_ubyte_s_Z24_S8(const void *src, GLubyte *dst, GLuint n) } static void +unpack_ubyte_s_Z24_S8_REV(const void *src, GLubyte *dst, GLuint n) +{ + GLuint i; + const GLuint *src32 = src; + + for (i = 0; i < n; i++) + dst[i] = BSWAP32(src32[i]) & 0xff; +} + +static void unpack_ubyte_s_S8_Z24(const void *src, GLubyte *dst, GLuint n) { GLuint i; @@ -1980,6 +2173,9 @@ _mesa_unpack_ubyte_stencil_row(gl_format format, GLuint n, case MESA_FORMAT_Z24_S8: unpack_ubyte_s_Z24_S8(src, dst, n); break; + case MESA_FORMAT_Z24_S8_REV: + unpack_ubyte_s_Z24_S8_REV(src, dst, n); + break; case MESA_FORMAT_S8_Z24: unpack_ubyte_s_S8_Z24(src, dst, n); break; @@ -2010,6 +2206,16 @@ unpack_uint_24_8_depth_stencil_Z24_S8(const GLuint *src, GLuint *dst, GLuint n) memcpy(dst, src, n * 4); } +static void +unpack_uint_24_8_depth_stencil_Z24_S8_REV(const GLuint *src, GLuint *dst, GLuint n) +{ + GLuint i; + + for (i = 0; i < n; i++) { + dst[i] = BSWAP32(src[i]); + } +} + void _mesa_unpack_uint_24_8_depth_stencil_row(gl_format format, GLuint n, const void *src, GLuint *dst) @@ -2018,6 +2224,9 @@ _mesa_unpack_uint_24_8_depth_stencil_row(gl_format format, GLuint n, case MESA_FORMAT_Z24_S8: unpack_uint_24_8_depth_stencil_Z24_S8(src, dst, n); break; + case MESA_FORMAT_Z24_S8_REV: + unpack_uint_24_8_depth_stencil_Z24_S8_REV(src, dst, n); + break; case MESA_FORMAT_S8_Z24: unpack_uint_24_8_depth_stencil_S8_Z24(src, dst, n); break; diff --git a/src/mesa/main/formats.c b/src/mesa/main/formats.c index 1f83a53..211c451d 100644 --- a/src/mesa/main/formats.c +++ b/src/mesa/main/formats.c @@ -312,6 +312,15 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] = 1, 1, 2 /* BlockWidth/Height,Bytes */ }, { + MESA_FORMAT_A16_REV, /* Name */ + "MESA_FORMAT_A16_REV", /* StrName */ + GL_ALPHA, /* BaseFormat */ + GL_UNSIGNED_NORMALIZED, /* DataType */ + 0, 0, 0, 16, /* Red/Green/Blue/AlphaBits */ + 0, 0, 0, 0, 0, /* Lum/Int/Index/Depth/StencilBits */ + 1, 1, 2 /* BlockWidth/Height,Bytes */ + }, + { MESA_FORMAT_L8, /* Name */ "MESA_FORMAT_L8", /* StrName */ GL_LUMINANCE, /* BaseFormat */ @@ -330,6 +339,15 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] = 1, 1, 2 /* BlockWidth/Height,Bytes */ }, { + MESA_FORMAT_L16_REV, /* Name */ + "MESA_FORMAT_L16_REV", /* StrName */ + GL_LUMINANCE, /* BaseFormat */ + GL_UNSIGNED_NORMALIZED, /* DataType */ + 0, 0, 0, 0, /* Red/Green/Blue/AlphaBits */ + 16, 0, 0, 0, 0, /* Lum/Int/Index/Depth/StencilBits */ + 1, 1, 2 /* BlockWidth/Height,Bytes */ + }, + { MESA_FORMAT_I8, /* Name */ "MESA_FORMAT_I8", /* StrName */ GL_INTENSITY, /* BaseFormat */ @@ -348,6 +366,15 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] = 1, 1, 2 /* BlockWidth/Height,Bytes */ }, { + MESA_FORMAT_I16_REV, /* Name */ + "MESA_FORMAT_I16_REV", /* StrName */ + GL_INTENSITY, /* BaseFormat */ + GL_UNSIGNED_NORMALIZED, /* DataType */ + 0, 0, 0, 0, /* Red/Green/Blue/AlphaBits */ + 0, 16, 0, 0, 0, /* Lum/Int/Index/Depth/StencilBits */ + 1, 1, 2 /* BlockWidth/Height,Bytes */ + }, + { MESA_FORMAT_YCBCR, /* Name */ "MESA_FORMAT_YCBCR", /* StrName */ GL_YCBCR_MESA, /* BaseFormat */ @@ -402,6 +429,15 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] = 1, 1, 2 }, { + MESA_FORMAT_R16_REV, + "MESA_FORMAT_R16_REV", + GL_RED, + GL_UNSIGNED_NORMALIZED, + 16, 0, 0, 0, + 0, 0, 0, 0, 0, + 1, 1, 2 + }, + { MESA_FORMAT_RG1616, "MESA_FORMAT_RG1616", GL_RG, @@ -429,6 +465,15 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] = 1, 1, 4 }, { + MESA_FORMAT_ARGB2101010_REV, + "MESA_FORMAT_ARGB2101010_REV", + GL_RGBA, + GL_UNSIGNED_NORMALIZED, + 10, 10, 10, 2, + 0, 0, 0, 0, 0, + 1, 1, 4 + }, + { MESA_FORMAT_Z24_S8, /* Name */ "MESA_FORMAT_Z24_S8", /* StrName */ GL_DEPTH_STENCIL, /* BaseFormat */ @@ -438,6 +483,15 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] = 1, 1, 4 /* BlockWidth/Height,Bytes */ }, { + MESA_FORMAT_Z24_S8_REV, /* Name */ + "MESA_FORMAT_Z24_S8_REV", /* StrName */ + GL_DEPTH_STENCIL, /* BaseFormat */ + GL_UNSIGNED_INT, /* DataType */ + 0, 0, 0, 0, /* Red/Green/Blue/AlphaBits */ + 0, 0, 0, 24, 8, /* Lum/Int/Index/Depth/StencilBits */ + 1, 1, 4 /* BlockWidth/Height,Bytes */ + }, + { MESA_FORMAT_S8_Z24, /* Name */ "MESA_FORMAT_S8_Z24", /* StrName */ GL_DEPTH_STENCIL, /* BaseFormat */ @@ -456,6 +510,15 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] = 1, 1, 2 /* BlockWidth/Height,Bytes */ }, { + MESA_FORMAT_Z16_REV, /* Name */ + "MESA_FORMAT_Z16_REV", /* StrName */ + GL_DEPTH_COMPONENT, /* BaseFormat */ + GL_UNSIGNED_INT, /* DataType */ + 0, 0, 0, 0, /* Red/Green/Blue/AlphaBits */ + 0, 0, 0, 16, 0, /* Lum/Int/Index/Depth/StencilBits */ + 1, 1, 2 /* BlockWidth/Height,Bytes */ + }, + { MESA_FORMAT_X8_Z24, /* Name */ "MESA_FORMAT_X8_Z24", /* StrName */ GL_DEPTH_COMPONENT, /* BaseFormat */ @@ -474,6 +537,15 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] = 1, 1, 4 /* BlockWidth/Height,Bytes */ }, { + MESA_FORMAT_Z24_X8_REV, /* Name */ + "MESA_FORMAT_Z24_X8_REV", /* StrName */ + GL_DEPTH_COMPONENT, /* BaseFormat */ + GL_UNSIGNED_INT, /* DataType */ + 0, 0, 0, 0, /* Red/Green/Blue/AlphaBits */ + 0, 0, 0, 24, 0, /* Lum/Int/Index/Depth/StencilBits */ + 1, 1, 4 /* BlockWidth/Height,Bytes */ + }, + { MESA_FORMAT_Z32, /* Name */ "MESA_FORMAT_Z32", /* StrName */ GL_DEPTH_COMPONENT, /* BaseFormat */ @@ -638,6 +710,15 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] = 1, 1, 16 }, { + MESA_FORMAT_RGBA_FLOAT32_REV, + "MESA_FORMAT_RGBA_FLOAT32_REV", + GL_RGBA, + GL_FLOAT, + 32, 32, 32, 32, + 0, 0, 0, 0, 0, + 1, 1, 16 + }, + { MESA_FORMAT_RGBA_FLOAT16, "MESA_FORMAT_RGBA_FLOAT16", GL_RGBA, @@ -1314,6 +1395,15 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] = 1, 1, 8 }, { + MESA_FORMAT_RGBA_16_REV, + "MESA_FORMAT_RGBA_16_REV", + GL_RGBA, + GL_UNSIGNED_NORMALIZED, + 16, 16, 16, 16, + 0, 0, 0, 0, 0, + 1, 1, 8 + }, + { MESA_FORMAT_RED_RGTC1, "MESA_FORMAT_RED_RGTC1", GL_RED, @@ -2062,6 +2152,7 @@ _mesa_format_to_type_and_comps(gl_format format, return; case MESA_FORMAT_ARGB2101010: + case MESA_FORMAT_ARGB2101010_REV: *datatype = GL_UNSIGNED_INT_2_10_10_10_REV; *comps = 4; return; @@ -2093,9 +2184,13 @@ _mesa_format_to_type_and_comps(gl_format format, return; case MESA_FORMAT_R16: + case MESA_FORMAT_R16_REV: case MESA_FORMAT_A16: + case MESA_FORMAT_A16_REV: case MESA_FORMAT_L16: + case MESA_FORMAT_L16_REV: case MESA_FORMAT_I16: + case MESA_FORMAT_I16_REV: *datatype = GL_UNSIGNED_SHORT; *comps = 1; return; @@ -2121,6 +2216,7 @@ _mesa_format_to_type_and_comps(gl_format format, return; case MESA_FORMAT_Z24_S8: + case MESA_FORMAT_Z24_S8_REV: *datatype = GL_UNSIGNED_INT_24_8_MESA; *comps = 2; return; @@ -2131,6 +2227,7 @@ _mesa_format_to_type_and_comps(gl_format format, return; case MESA_FORMAT_Z16: + case MESA_FORMAT_Z16_REV: *datatype = GL_UNSIGNED_SHORT; *comps = 1; return; @@ -2141,6 +2238,7 @@ _mesa_format_to_type_and_comps(gl_format format, return; case MESA_FORMAT_Z24_X8: + case MESA_FORMAT_Z24_X8_REV: *datatype = GL_UNSIGNED_INT; *comps = 1; return; @@ -2185,6 +2283,7 @@ _mesa_format_to_type_and_comps(gl_format format, return; case MESA_FORMAT_RGBA_16: + case MESA_FORMAT_RGBA_16_REV: *datatype = GL_UNSIGNED_SHORT; *comps = 4; return; @@ -2261,6 +2360,7 @@ _mesa_format_to_type_and_comps(gl_format format, return; case MESA_FORMAT_RGBA_FLOAT32: + case MESA_FORMAT_RGBA_FLOAT32_REV: *datatype = GL_FLOAT; *comps = 4; return; @@ -2597,15 +2697,21 @@ _mesa_format_matches_format_and_type(gl_format gl_format, case MESA_FORMAT_A8: return format == GL_ALPHA && type == GL_UNSIGNED_BYTE; case MESA_FORMAT_A16: - return format == GL_ALPHA && type == GL_UNSIGNED_SHORT && littleEndian; + return format == GL_ALPHA && type == GL_UNSIGNED_SHORT; + case MESA_FORMAT_A16_REV: + return GL_FALSE; case MESA_FORMAT_L8: return format == GL_LUMINANCE && type == GL_UNSIGNED_BYTE; case MESA_FORMAT_L16: - return format == GL_LUMINANCE && type == GL_UNSIGNED_SHORT && littleEndian; + return format == GL_LUMINANCE && type == GL_UNSIGNED_SHORT; + case MESA_FORMAT_L16_REV: + return GL_FALSE; case MESA_FORMAT_I8: return format == GL_INTENSITY && type == GL_UNSIGNED_BYTE; case MESA_FORMAT_I16: - return format == GL_INTENSITY && type == GL_UNSIGNED_SHORT && littleEndian; + return format == GL_INTENSITY && type == GL_UNSIGNED_SHORT; + case MESA_FORMAT_I16_REV: + return GL_FALSE; case MESA_FORMAT_YCBCR: case MESA_FORMAT_YCBCR_REV: @@ -2619,23 +2725,32 @@ _mesa_format_matches_format_and_type(gl_format gl_format, return GL_FALSE; case MESA_FORMAT_R16: - return format == GL_RED && type == GL_UNSIGNED_SHORT && littleEndian; + return format == GL_RED && type == GL_UNSIGNED_SHORT; + case MESA_FORMAT_R16_REV: + return GL_FALSE; case MESA_FORMAT_RG1616: return format == GL_RG && type == GL_UNSIGNED_SHORT && littleEndian; case MESA_FORMAT_RG1616_REV: return GL_FALSE; case MESA_FORMAT_ARGB2101010: - return format == GL_BGRA && type == GL_UNSIGNED_INT_2_10_10_10_REV; + return format == GL_BGRA && type == GL_UNSIGNED_INT_2_10_10_10_REV && littleEndian; + case MESA_FORMAT_ARGB2101010_REV: + return format == GL_BGRA && type == GL_UNSIGNED_INT_10_10_10_2 && !littleEndian; case MESA_FORMAT_Z24_S8: return format == GL_DEPTH_STENCIL && type == GL_UNSIGNED_INT_24_8; + case MESA_FORMAT_Z24_S8_REV: + return format == GL_DEPTH_STENCIL && type == GL_UNSIGNED_INT_8_24_REV_MESA; case MESA_FORMAT_Z24_X8: + case MESA_FORMAT_Z24_X8_REV: case MESA_FORMAT_S8_Z24: return GL_FALSE; case MESA_FORMAT_Z16: return format == GL_DEPTH_COMPONENT && type == GL_UNSIGNED_SHORT; + case MESA_FORMAT_Z16_REV: + return GL_FALSE; case MESA_FORMAT_X8_Z24: return GL_FALSE; @@ -2667,6 +2782,8 @@ _mesa_format_matches_format_and_type(gl_format gl_format, case MESA_FORMAT_RGBA_FLOAT32: return format == GL_RGBA && type == GL_FLOAT; + case MESA_FORMAT_RGBA_FLOAT32_REV: + return GL_FALSE; case MESA_FORMAT_RGBA_FLOAT16: return format == GL_RGBA && type == GL_HALF_FLOAT; @@ -2777,6 +2894,7 @@ _mesa_format_matches_format_and_type(gl_format gl_format, case MESA_FORMAT_SIGNED_RGB_16: case MESA_FORMAT_SIGNED_RGBA_16: case MESA_FORMAT_RGBA_16: + case MESA_FORMAT_RGBA_16_REV: /* FINISHME: SNORM */ return GL_FALSE; diff --git a/src/mesa/main/formats.h b/src/mesa/main/formats.h index e6b429d..6cf703c 100644 --- a/src/mesa/main/formats.h +++ b/src/mesa/main/formats.h @@ -92,24 +92,32 @@ typedef enum MESA_FORMAT_RGB332, /* RRRG GGBB */ MESA_FORMAT_A8, /* AAAA AAAA */ MESA_FORMAT_A16, /* AAAA AAAA AAAA AAAA */ + MESA_FORMAT_A16_REV, /* AAAA AAAA AAAA AAAA */ MESA_FORMAT_L8, /* LLLL LLLL */ MESA_FORMAT_L16, /* LLLL LLLL LLLL LLLL */ + MESA_FORMAT_L16_REV, /* LLLL LLLL LLLL LLLL */ MESA_FORMAT_I8, /* IIII IIII */ MESA_FORMAT_I16, /* IIII IIII IIII IIII */ + MESA_FORMAT_I16_REV, /* IIII IIII IIII IIII */ MESA_FORMAT_YCBCR, /* YYYY YYYY UorV UorV */ MESA_FORMAT_YCBCR_REV, /* UorV UorV YYYY YYYY */ MESA_FORMAT_R8, /* RRRR RRRR */ MESA_FORMAT_GR88, /* GGGG GGGG RRRR RRRR */ MESA_FORMAT_RG88, /* RRRR RRRR GGGG GGGG */ MESA_FORMAT_R16, /* RRRR RRRR RRRR RRRR */ + MESA_FORMAT_R16_REV, /* RRRR RRRR RRRR RRRR */ MESA_FORMAT_RG1616, /* GGGG GGGG GGGG GGGG RRRR RRRR RRRR RRRR */ MESA_FORMAT_RG1616_REV, /* RRRR RRRR RRRR RRRR GGGG GGGG GGGG GGGG */ MESA_FORMAT_ARGB2101010, /* AARR RRRR RRRR GGGG GGGG GGBB BBBB BBBB */ + MESA_FORMAT_ARGB2101010_REV, /* BBBB BBBB GGGG GGBB RRRR GGGG AARR RRRR */ MESA_FORMAT_Z24_S8, /* ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ SSSS SSSS */ + MESA_FORMAT_Z24_S8_REV, /* SSSS SSSS ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ */ MESA_FORMAT_S8_Z24, /* SSSS SSSS ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ */ MESA_FORMAT_Z16, /* ZZZZ ZZZZ ZZZZ ZZZZ */ + MESA_FORMAT_Z16_REV, /* ZZZZ ZZZZ ZZZZ ZZZZ */ MESA_FORMAT_X8_Z24, /* xxxx xxxx ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ */ MESA_FORMAT_Z24_X8, /* ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ xxxx xxxx */ + MESA_FORMAT_Z24_X8_REV, /* xxxx xxxx ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ */ MESA_FORMAT_Z32, /* ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ */ MESA_FORMAT_S8, /* SSSS SSSS */ /*@}*/ @@ -146,6 +154,7 @@ typedef enum */ /*@{*/ MESA_FORMAT_RGBA_FLOAT32, + MESA_FORMAT_RGBA_FLOAT32_REV, MESA_FORMAT_RGBA_FLOAT16, MESA_FORMAT_RGB_FLOAT32, MESA_FORMAT_RGB_FLOAT16, @@ -242,6 +251,7 @@ typedef enum MESA_FORMAT_SIGNED_RGB_16, /* ushort[0]=R, ushort[1]=G, ushort[2]=B */ MESA_FORMAT_SIGNED_RGBA_16, /* ... */ MESA_FORMAT_RGBA_16, /* ... */ + MESA_FORMAT_RGBA_16_REV, /* ... */ /*@}*/ /*@{*/ diff --git a/src/mesa/main/texformat.c b/src/mesa/main/texformat.c index c776b41..4b1abd3 100644 --- a/src/mesa/main/texformat.c +++ b/src/mesa/main/texformat.c @@ -103,7 +103,7 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat, case GL_RGBA12: case GL_RGBA16: RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16); - RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16); + RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16_REV); RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888); RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888); break; @@ -135,6 +135,7 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat, case GL_RGB12: case GL_RGB16: RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16); + RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16_REV); RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888); RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888); break; @@ -149,6 +150,7 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat, case GL_ALPHA12: case GL_ALPHA16: RETURN_IF_SUPPORTED(MESA_FORMAT_A16); + RETURN_IF_SUPPORTED(MESA_FORMAT_A16_REV); RETURN_IF_SUPPORTED(MESA_FORMAT_A8); break; @@ -163,6 +165,7 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat, case GL_LUMINANCE12: case GL_LUMINANCE16: RETURN_IF_SUPPORTED(MESA_FORMAT_L16); + RETURN_IF_SUPPORTED(MESA_FORMAT_L16_REV); RETURN_IF_SUPPORTED(MESA_FORMAT_L8); break; @@ -195,6 +198,7 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat, case GL_INTENSITY12: case GL_INTENSITY16: RETURN_IF_SUPPORTED(MESA_FORMAT_I16); + RETURN_IF_SUPPORTED(MESA_FORMAT_I16_REV); RETURN_IF_SUPPORTED(MESA_FORMAT_I8); break; @@ -213,6 +217,7 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat, break; case GL_DEPTH_COMPONENT16: RETURN_IF_SUPPORTED(MESA_FORMAT_Z16); + RETURN_IF_SUPPORTED(MESA_FORMAT_Z16_REV); RETURN_IF_SUPPORTED(MESA_FORMAT_X8_Z24); RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24); default: @@ -322,10 +327,12 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat, RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT16); RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT32); RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); + RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32_REV); break; case GL_ALPHA32F_ARB: RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT32); RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); + RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32_REV); RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT16); RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); break; @@ -333,10 +340,12 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat, RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT16); RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT32); RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); + RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32_REV); break; case GL_LUMINANCE32F_ARB: RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT32); RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); + RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32_REV); RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT16); RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); break; @@ -344,10 +353,12 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat, RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16); RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32); RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); + RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32_REV); break; case GL_LUMINANCE_ALPHA32F_ARB: RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32); RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); + RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32_REV); RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16); RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); break; @@ -355,10 +366,12 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat, RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT16); RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT32); RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); + RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32_REV); break; case GL_INTENSITY32F_ARB: RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT32); RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); + RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32_REV); RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT16); RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); break; @@ -367,19 +380,23 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat, RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32); RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); + RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32_REV); break; case GL_RGB32F_ARB: RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32); RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); + RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32_REV); RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT16); RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); break; case GL_RGBA16F_ARB: RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); + RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32_REV); break; case GL_RGBA32F_ARB: RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); + RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32_REV); RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); break; default: @@ -759,16 +776,19 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat, case GL_R16: RETURN_IF_SUPPORTED(MESA_FORMAT_R16); + RETURN_IF_SUPPORTED(MESA_FORMAT_R16_REV); break; case GL_RG: case GL_RG8: RETURN_IF_SUPPORTED(MESA_FORMAT_GR88); + RETURN_IF_SUPPORTED(MESA_FORMAT_RG88); break; case GL_COMPRESSED_RG: RETURN_IF_SUPPORTED(MESA_FORMAT_RG_RGTC2); RETURN_IF_SUPPORTED(MESA_FORMAT_GR88); + RETURN_IF_SUPPORTED(MESA_FORMAT_RG88); break; case GL_RG16: @@ -786,19 +806,23 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat, RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT16); RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32); RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); + RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32_REV); break; case GL_R32F: RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32); RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); + RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32_REV); break; case GL_RG16F: RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16); RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32); RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); + RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32_REV); break; case GL_RG32F: RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32); RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); + RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32_REV); break; default: diff --git a/src/mesa/main/texstore.c b/src/mesa/main/texstore.c index a57a38e..481e1aa 100644 --- a/src/mesa/main/texstore.c +++ b/src/mesa/main/texstore.c @@ -979,6 +979,60 @@ memcpy_texture(struct gl_context *ctx, /** + * Teximage storage routine for when simple byte swapping will do. + * No pixel transfer operations or special texel encodings allowed. + * 1D, 2D and 3D images supported. + */ +static void +byteswap_texture(struct gl_context *ctx, + GLuint dimensions, + gl_format dstFormat, + GLint dstXoffset, GLint dstYoffset, GLint dstZoffset, + GLint dstRowStride, + GLubyte **dstSlices, + GLint srcWidth, GLint srcHeight, GLint srcDepth, + GLenum srcFormat, GLenum srcType, + const GLvoid *srcAddr, + const struct gl_pixelstore_attrib *srcPacking) +{ + const GLint srcRowStride = _mesa_image_row_stride(srcPacking, srcWidth, + srcFormat, srcType); + const GLint srcImageStride = _mesa_image_image_stride(srcPacking, + srcWidth, srcHeight, srcFormat, srcType); + const GLubyte *srcImage = (const GLubyte *) _mesa_image_address(dimensions, + srcPacking, srcAddr, srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0); + const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); + const GLint bytesPerRow = srcWidth * texelBytes; + GLint img, row, i; + + for (img = 0; img < srcDepth; img++) { + const GLubyte *srcRow = srcImage; + GLubyte *dstRow = dstSlices[dstZoffset + img] + + dstYoffset * dstRowStride + + dstXoffset * texelBytes; + for (row = 0; row < srcHeight; row++) { + if (texelBytes == 2) { + GLushort *src = srcRow; + GLushort *dst = dstRow; + for (i = 0; i < bytesPerRow; i += 2) + *dst++ = BSWAP16(*src++); + } else { + ASSERT(texelBytes == 4); + GLuint *src = srcRow; + GLuint *dst = dstRow; + for (i = 0; i < bytesPerRow; i += 4) + *dst++ = BSWAP32(*src++); + } + dstRow += dstRowStride; + srcRow += srcRowStride; + } + srcImage += srcImageStride; + } +} + + + +/** * Store a 32-bit integer or float depth component texture image. */ static GLboolean @@ -1072,9 +1126,12 @@ _mesa_texstore_z24_x8(TEXSTORE_PARAMS) { const GLuint depthScale = 0xffffff; const GLuint texelBytes = 4; + const GLboolean swapBytes = srcPacking->SwapBytes != + (dstFormat == MESA_FORMAT_Z24_X8_REV); (void) dims; - ASSERT(dstFormat == MESA_FORMAT_Z24_X8); + ASSERT(dstFormat == MESA_FORMAT_Z24_X8 || + dstFormat == MESA_FORMAT_Z24_X8_REV); { /* general path */ @@ -1092,7 +1149,10 @@ _mesa_texstore_z24_x8(TEXSTORE_PARAMS) GL_UNSIGNED_INT, dst, depthScale, srcType, src, srcPacking); for (i = 0; i < srcWidth; i++) - dst[i] <<= 8; + if (swapBytes) + dst[i] = BSWAP32(dst[i] << 8); + else + dst[i] <<= 8; dstRow += dstRowStride; } } @@ -1109,22 +1169,31 @@ _mesa_texstore_z16(TEXSTORE_PARAMS) { const GLuint depthScale = 0xffff; const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); + const GLboolean swapBytes = srcPacking->SwapBytes != (dstFormat == MESA_FORMAT_Z16_REV); (void) dims; - ASSERT(dstFormat == MESA_FORMAT_Z16); + ASSERT(dstFormat == MESA_FORMAT_Z16 || + dstFormat == MESA_FORMAT_Z16_REV); ASSERT(texelBytes == sizeof(GLushort)); if (ctx->Pixel.DepthScale == 1.0f && ctx->Pixel.DepthBias == 0.0f && - !srcPacking->SwapBytes && baseInternalFormat == GL_DEPTH_COMPONENT && srcFormat == GL_DEPTH_COMPONENT && srcType == GL_UNSIGNED_SHORT) { - /* simple memcpy path */ - memcpy_texture(ctx, dims, - dstFormat, dstXoffset, dstYoffset, dstZoffset, - dstRowStride, dstSlices, - srcWidth, srcHeight, srcDepth, srcFormat, srcType, - srcAddr, srcPacking); + if (!swapBytes) { + /* simple memcpy path */ + memcpy_texture(ctx, dims, + dstFormat, dstXoffset, dstYoffset, dstZoffset, + dstRowStride, dstSlices, + srcWidth, srcHeight, srcDepth, srcFormat, srcType, + srcAddr, srcPacking); + } else { + byteswap_texture(ctx, dims, + dstFormat, dstXoffset, dstYoffset, dstZoffset, + dstRowStride, dstSlices, + srcWidth, srcHeight, srcDepth, srcFormat, srcType, + srcAddr, srcPacking); + } } else { /* general path */ @@ -2084,6 +2153,84 @@ _mesa_texstore_argb2101010(TEXSTORE_PARAMS) } +static GLboolean +_mesa_texstore_argb2101010_rev(TEXSTORE_PARAMS) +{ + const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); + const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); + + ASSERT(dstFormat == MESA_FORMAT_ARGB2101010_REV); + ASSERT(texelBytes == 4); + + if (0 && !ctx->_ImageTransferState && + !srcPacking->SwapBytes && + dstFormat == MESA_FORMAT_ARGB2101010_REV && + srcFormat == GL_BGRA && + srcType == GL_UNSIGNED_INT_2_10_10_10_REV && + baseInternalFormat == GL_RGBA) { + /* simple memcpy path */ + memcpy_texture(ctx, dims, + dstFormat, dstXoffset, dstYoffset, dstZoffset, + dstRowStride, dstSlices, + srcWidth, srcHeight, srcDepth, srcFormat, srcType, + srcAddr, srcPacking); + } + else { + /* general path */ + const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, + baseInternalFormat, + baseFormat, + srcWidth, srcHeight, srcDepth, + srcFormat, srcType, srcAddr, + srcPacking, + ctx->_ImageTransferState); + const GLfloat *src = tempImage; + GLint img, row, col; + if (!tempImage) + return GL_FALSE; + for (img = 0; img < srcDepth; img++) { + GLubyte *dstRow = dstSlices[dstZoffset + img] + + dstYoffset * dstRowStride + + dstXoffset * texelBytes; + if (baseInternalFormat == GL_RGBA) { + for (row = 0; row < srcHeight; row++) { + GLuint *dstUI = (GLuint *) dstRow; + for (col = 0; col < srcWidth; col++) { + GLushort a,r,g,b; + + UNCLAMPED_FLOAT_TO_USHORT(a, src[ACOMP]); + UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]); + UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]); + UNCLAMPED_FLOAT_TO_USHORT(b, src[BCOMP]); + dstUI[col] = PACK_COLOR_2101010_REV_US(a, r, g, b); + src += 4; + } + dstRow += dstRowStride; + } + } else if (baseInternalFormat == GL_RGB) { + for (row = 0; row < srcHeight; row++) { + GLuint *dstUI = (GLuint *) dstRow; + for (col = 0; col < srcWidth; col++) { + GLushort r,g,b; + + UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]); + UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]); + UNCLAMPED_FLOAT_TO_USHORT(b, src[BCOMP]); + dstUI[col] = PACK_COLOR_2101010_REV_US(0xffff, r, g, b); + src += 4; + } + dstRow += dstRowStride; + } + } else { + ASSERT(0); + } + } + free((void *) tempImage); + } + return GL_TRUE; +} + + /** * Do texstore for 2-channel, 4-bit/channel, unsigned normalized formats. */ @@ -2147,13 +2294,12 @@ _mesa_texstore_unorm88(TEXSTORE_PARAMS) if (!ctx->_ImageTransferState && !srcPacking->SwapBytes && - ((dstFormat == MESA_FORMAT_AL88 && + ((dstFormat == (littleEndian ? MESA_FORMAT_AL88 : MESA_FORMAT_AL88_REV) && baseInternalFormat == GL_LUMINANCE_ALPHA && srcFormat == GL_LUMINANCE_ALPHA) || - (dstFormat == MESA_FORMAT_GR88 && + (dstFormat == (littleEndian ? MESA_FORMAT_GR88 : MESA_FORMAT_RG88) && baseInternalFormat == srcFormat)) && - srcType == GL_UNSIGNED_BYTE && - littleEndian) { + srcType == GL_UNSIGNED_BYTE) { /* simple memcpy path */ memcpy_texture(ctx, dims, dstFormat, dstXoffset, dstYoffset, dstZoffset, @@ -2162,7 +2308,6 @@ _mesa_texstore_unorm88(TEXSTORE_PARAMS) srcAddr, srcPacking); } else if (!ctx->_ImageTransferState && - littleEndian && srcType == GL_UNSIGNED_BYTE && can_swizzle(baseInternalFormat) && can_swizzle(srcFormat)) { @@ -2267,13 +2412,12 @@ _mesa_texstore_unorm1616(TEXSTORE_PARAMS) if (!ctx->_ImageTransferState && !srcPacking->SwapBytes && - ((dstFormat == MESA_FORMAT_AL1616 && + ((dstFormat == (littleEndian ? MESA_FORMAT_AL1616 : MESA_FORMAT_AL1616_REV) && baseInternalFormat == GL_LUMINANCE_ALPHA && srcFormat == GL_LUMINANCE_ALPHA) || - (dstFormat == MESA_FORMAT_RG1616 && + (dstFormat == (littleEndian ? MESA_FORMAT_RG1616 : MESA_FORMAT_RG1616_REV) && baseInternalFormat == srcFormat)) && - srcType == GL_UNSIGNED_SHORT && - littleEndian) { + srcType == GL_UNSIGNED_SHORT) { /* simple memcpy path */ memcpy_texture(ctx, dims, dstFormat, dstXoffset, dstYoffset, dstZoffset, @@ -2337,18 +2481,23 @@ _mesa_texstore_unorm16(TEXSTORE_PARAMS) const GLboolean littleEndian = _mesa_little_endian(); const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); + const GLboolean isRev = dstFormat == MESA_FORMAT_R16_REV || + dstFormat == MESA_FORMAT_A16_REV || + dstFormat == MESA_FORMAT_L16_REV || + dstFormat == MESA_FORMAT_I16_REV; ASSERT(dstFormat == MESA_FORMAT_R16 || dstFormat == MESA_FORMAT_A16 || dstFormat == MESA_FORMAT_L16 || - dstFormat == MESA_FORMAT_I16); + dstFormat == MESA_FORMAT_I16 || + isRev); ASSERT(texelBytes == 2); if (!ctx->_ImageTransferState && !srcPacking->SwapBytes && baseInternalFormat == srcFormat && srcType == GL_UNSIGNED_SHORT && - littleEndian) { + littleEndian != isRev) { /* simple memcpy path */ memcpy_texture(ctx, dims, dstFormat, dstXoffset, dstYoffset, dstZoffset, @@ -2379,7 +2528,10 @@ _mesa_texstore_unorm16(TEXSTORE_PARAMS) GLushort r; UNCLAMPED_FLOAT_TO_USHORT(r, src[0]); - dstUS[col] = r; + if (isRev) + dstUS[col] = BSWAP16(r); + else + dstUS[col] = r; src += 1; } dstRow += dstRowStride; @@ -2394,15 +2546,18 @@ _mesa_texstore_unorm16(TEXSTORE_PARAMS) static GLboolean _mesa_texstore_rgba_16(TEXSTORE_PARAMS) { + const GLboolean littleEndian = _mesa_little_endian(); const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); - ASSERT(dstFormat == MESA_FORMAT_RGBA_16); + ASSERT(dstFormat == MESA_FORMAT_RGBA_16 || + dstFormat == MESA_FORMAT_RGBA_16_REV); ASSERT(texelBytes == 8); if (!ctx->_ImageTransferState && !srcPacking->SwapBytes && baseInternalFormat == GL_RGBA && + dstFormat == (littleEndian ? MESA_FORMAT_RGBA_16 : MESA_FORMAT_RGBA_16_REV) && srcFormat == GL_RGBA && srcType == GL_UNSIGNED_SHORT) { /* simple memcpy path */ @@ -2438,10 +2593,18 @@ _mesa_texstore_rgba_16(TEXSTORE_PARAMS) UNCLAMPED_FLOAT_TO_USHORT(g, src[1]); UNCLAMPED_FLOAT_TO_USHORT(b, src[2]); UNCLAMPED_FLOAT_TO_USHORT(a, src[3]); - dstUS[col*4+0] = r; - dstUS[col*4+1] = g; - dstUS[col*4+2] = b; - dstUS[col*4+3] = a; + + if (dstFormat == MESA_FORMAT_RGBA_16) { + dstUS[col*4+0] = r; + dstUS[col*4+1] = g; + dstUS[col*4+2] = b; + dstUS[col*4+3] = a; + } else { + dstUS[col*4+0] = BSWAP16(r); + dstUS[col*4+1] = BSWAP16(g); + dstUS[col*4+2] = BSWAP16(b); + dstUS[col*4+3] = BSWAP16(a); + } src += 4; } dstRow += dstRowStride; @@ -3193,7 +3356,8 @@ _mesa_texstore_z24_s8(TEXSTORE_PARAMS) = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); GLint img, row; - ASSERT(dstFormat == MESA_FORMAT_Z24_S8); + ASSERT(dstFormat == MESA_FORMAT_Z24_S8 || + dstFormat == MESA_FORMAT_Z24_S8_REV); ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT || srcFormat == GL_DEPTH_COMPONENT || srcFormat == GL_STENCIL_INDEX); @@ -3412,8 +3576,11 @@ _mesa_texstore_rgba_float32(TEXSTORE_PARAMS) const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); const GLint components = _mesa_components_in_format(baseFormat); + const GLboolean swapBytes = srcPacking->SwapBytes != + (dstFormat == MESA_FORMAT_RGBA_FLOAT32_REV); ASSERT(dstFormat == MESA_FORMAT_RGBA_FLOAT32 || + dstFormat == MESA_FORMAT_RGBA_FLOAT32_REV || dstFormat == MESA_FORMAT_RGB_FLOAT32 || dstFormat == MESA_FORMAT_ALPHA_FLOAT32 || dstFormat == MESA_FORMAT_LUMINANCE_FLOAT32 || @@ -3432,7 +3599,7 @@ _mesa_texstore_rgba_float32(TEXSTORE_PARAMS) ASSERT(texelBytes == components * sizeof(GLfloat)); if (!ctx->_ImageTransferState && - !srcPacking->SwapBytes && + !swapBytes && baseInternalFormat == srcFormat && baseInternalFormat == baseFormat && srcType == GL_FLOAT) { @@ -3463,7 +3630,17 @@ _mesa_texstore_rgba_float32(TEXSTORE_PARAMS) + dstYoffset * dstRowStride + dstXoffset * texelBytes; for (row = 0; row < srcHeight; row++) { - memcpy(dstRow, srcRow, bytesPerRow); + if (swapBytes) { + GLuint *d = (GLuint *)dstRow; + union { GLfloat f; GLuint ui; } fui; + GLuint i; + for (i = 0; i < bytesPerRow / sizeof(GLfloat); i++) { + fui.f = srcRow[i]; + d[i] = BSWAP32(fui.ui); + } + } else { + memcpy(dstRow, srcRow, bytesPerRow); + } dstRow += dstRowStride; srcRow += srcWidth * components; } @@ -4379,24 +4556,31 @@ _mesa_get_texstore_func(gl_format format) table[MESA_FORMAT_RGB332] = _mesa_texstore_rgb332; table[MESA_FORMAT_A8] = _mesa_texstore_unorm8; table[MESA_FORMAT_A16] = _mesa_texstore_unorm16; + table[MESA_FORMAT_A16_REV] = _mesa_texstore_unorm16; table[MESA_FORMAT_L8] = _mesa_texstore_unorm8; table[MESA_FORMAT_L16] = _mesa_texstore_unorm16; + table[MESA_FORMAT_L16_REV] = _mesa_texstore_unorm16; table[MESA_FORMAT_I8] = _mesa_texstore_unorm8; table[MESA_FORMAT_I16] = _mesa_texstore_unorm16; + table[MESA_FORMAT_I16_REV] = _mesa_texstore_unorm16; table[MESA_FORMAT_YCBCR] = _mesa_texstore_ycbcr; table[MESA_FORMAT_YCBCR_REV] = _mesa_texstore_ycbcr; table[MESA_FORMAT_R8] = _mesa_texstore_unorm8; table[MESA_FORMAT_GR88] = _mesa_texstore_unorm88; table[MESA_FORMAT_RG88] = _mesa_texstore_unorm88; table[MESA_FORMAT_R16] = _mesa_texstore_unorm16; + table[MESA_FORMAT_R16_REV] = _mesa_texstore_unorm16; table[MESA_FORMAT_RG1616] = _mesa_texstore_unorm1616; table[MESA_FORMAT_RG1616_REV] = _mesa_texstore_unorm1616; table[MESA_FORMAT_ARGB2101010] = _mesa_texstore_argb2101010; + table[MESA_FORMAT_ARGB2101010_REV] = _mesa_texstore_argb2101010_rev; table[MESA_FORMAT_Z24_S8] = _mesa_texstore_z24_s8; + table[MESA_FORMAT_Z24_S8_REV] = _mesa_texstore_z24_s8; table[MESA_FORMAT_S8_Z24] = _mesa_texstore_s8_z24; table[MESA_FORMAT_Z16] = _mesa_texstore_z16; table[MESA_FORMAT_X8_Z24] = _mesa_texstore_x8_z24; table[MESA_FORMAT_Z24_X8] = _mesa_texstore_z24_x8; + table[MESA_FORMAT_Z24_X8_REV] = _mesa_texstore_z24_x8; table[MESA_FORMAT_Z32] = _mesa_texstore_z32; table[MESA_FORMAT_S8] = _mesa_texstore_s8; table[MESA_FORMAT_SRGB8] = _mesa_texstore_srgb8; @@ -4415,6 +4599,7 @@ _mesa_get_texstore_func(gl_format format) table[MESA_FORMAT_RGBA_DXT3] = _mesa_texstore_rgba_dxt3; table[MESA_FORMAT_RGBA_DXT5] = _mesa_texstore_rgba_dxt5; table[MESA_FORMAT_RGBA_FLOAT32] = _mesa_texstore_rgba_float32; + table[MESA_FORMAT_RGBA_FLOAT32_REV] = _mesa_texstore_rgba_float32; table[MESA_FORMAT_RGBA_FLOAT16] = _mesa_texstore_rgba_float16; table[MESA_FORMAT_RGB_FLOAT32] = _mesa_texstore_rgba_float32; table[MESA_FORMAT_RGB_FLOAT16] = _mesa_texstore_rgba_float16; @@ -4441,6 +4626,7 @@ _mesa_get_texstore_func(gl_format format) table[MESA_FORMAT_SIGNED_RGB_16] = _mesa_texstore_signed_rgba_16; table[MESA_FORMAT_SIGNED_RGBA_16] = _mesa_texstore_signed_rgba_16; table[MESA_FORMAT_RGBA_16] = _mesa_texstore_rgba_16; + table[MESA_FORMAT_RGBA_16_REV] = _mesa_texstore_rgba_16; table[MESA_FORMAT_RED_RGTC1] = _mesa_texstore_red_rgtc1; table[MESA_FORMAT_SIGNED_RED_RGTC1] = _mesa_texstore_signed_red_rgtc1; table[MESA_FORMAT_RG_RGTC2] = _mesa_texstore_rg_rgtc2; diff --git a/src/mesa/state_tracker/st_cb_clear.c b/src/mesa/state_tracker/st_cb_clear.c index 61d98ae..895cb3a 100644 --- a/src/mesa/state_tracker/st_cb_clear.c +++ b/src/mesa/state_tracker/st_cb_clear.c @@ -389,6 +389,7 @@ check_clear_depth_stencil_with_quad(struct gl_context *ctx, struct gl_renderbuff assert(rb->Format == MESA_FORMAT_S8 || rb->Format == MESA_FORMAT_Z24_S8 || + rb->Format == MESA_FORMAT_Z24_S8_REV || rb->Format == MESA_FORMAT_S8_Z24 || rb->Format == MESA_FORMAT_Z32_FLOAT_X24S8); @@ -445,6 +446,7 @@ check_clear_stencil_with_quad(struct gl_context *ctx, struct gl_renderbuffer *rb assert(rb->Format == MESA_FORMAT_S8 || rb->Format == MESA_FORMAT_Z24_S8 || + rb->Format == MESA_FORMAT_Z24_S8_REV || rb->Format == MESA_FORMAT_S8_Z24 || rb->Format == MESA_FORMAT_Z32_FLOAT_X24S8); diff --git a/src/mesa/state_tracker/st_format.c b/src/mesa/state_tracker/st_format.c index 5f9ae91..377bbc7 100644 --- a/src/mesa/state_tracker/st_format.c +++ b/src/mesa/state_tracker/st_format.c @@ -147,6 +147,55 @@ st_format_datatype(enum pipe_format format) } +#if MESA_BIG_ENDIAN + +#define ST_FORMAT_RGBA8888 MESA_FORMAT_RGBA8888_REV +#define ST_FORMAT_RGBA8888_REV MESA_FORMAT_RGBA8888 +#define ST_FORMAT_SIGNED_RGBA8888 MESA_FORMAT_SIGNED_RGBA8888_REV + +#define ST_FORMAT_RGBX8888 MESA_FORMAT_RGBX8888_REV +#define ST_FORMAT_RGBX8888_REV MESA_FORMAT_RGBX8888 + +#define ST_FORMAT_ARGB8888 MESA_FORMAT_ARGB8888_REV +#define ST_FORMAT_ARGB8888_REV MESA_FORMAT_ARGB8888 + +#define ST_FORMAT_XRGB8888 MESA_FORMAT_XRGB8888_REV +#define ST_FORMAT_XRGB8888_REV MESA_FORMAT_XRGB8888 + +#define ST_FORMAT_ARGB1555 MESA_FORMAT_ARGB1555_REV +#define ST_FORMAT_ARGB4444 MESA_FORMAT_ARGB4444_REV +#define ST_FORMAT_RGB565 MESA_FORMAT_RGB565_REV + +#define ST_FORMAT_ARGB2101010 MESA_FORMAT_ARGB2101010_REV + +#define ST_FORMAT_RGBA_FLOAT32 MESA_FORMAT_RGBA_FLOAT32_REV + +#define ST_FORMAT_RG88 MESA_FORMAT_RG88_REV +#define ST_FORMAT_SIGNED_RG88 MESA_FORMAT_SIGNED_RG88_REV +#define ST_FORMAT_RG1616 MESA_FORMAT_RG1616_REV +#define ST_FORMAT_RGBA_16 MESA_FORMAT_RGBA_16_REV + +#define ST_FORMAT_AL88 MESA_FORMAT_AL88_REV +#define ST_FORMAT_SIGNED_AL88 MESA_FORMAT_SIGNED_AL88_REV +#define ST_FORMAT_AL1616 MESA_FORMAT_AL1616_REV +#define ST_FORMAT_SIGNED_AL1616 MESA_FORMAT_SIGNED_AL1616_REV +#define ST_FORMAT_R16 MESA_FORMAT_R16_REV +#define ST_FORMAT_A16 MESA_FORMAT_A16_REV +#define ST_FORMAT_L16 MESA_FORMAT_L16_REV +#define ST_FORMAT_I16 MESA_FORMAT_I16_REV + +#define ST_FORMAT_Z16 MESA_FORMAT_Z16_REV +#define ST_FORMAT_Z24_S8 MESA_FORMAT_Z24_S8_REV +#define ST_FORMAT_Z24_X8 MESA_FORMAT_Z24_X8_REV + +#define ST_FORMAT_YCBCR MESA_FORMAT_YCBCR_REV +#define ST_FORMAT_YCBCR_REV MESA_FORMAT_YCBCR + +#else /* MESA_LITTLE_ENDIAN */ + +#endif + + /** * Translate Mesa format to Gallium format. */ @@ -154,59 +203,59 @@ enum pipe_format st_mesa_format_to_pipe_format(gl_format mesaFormat) { switch (mesaFormat) { - case MESA_FORMAT_RGBA8888: + case ST_FORMAT_RGBA8888: return PIPE_FORMAT_A8B8G8R8_UNORM; - case MESA_FORMAT_RGBA8888_REV: + case ST_FORMAT_RGBA8888_REV: return PIPE_FORMAT_R8G8B8A8_UNORM; - case MESA_FORMAT_ARGB8888: + case ST_FORMAT_ARGB8888: return PIPE_FORMAT_B8G8R8A8_UNORM; - case MESA_FORMAT_ARGB8888_REV: + case ST_FORMAT_ARGB8888_REV: return PIPE_FORMAT_A8R8G8B8_UNORM; - case MESA_FORMAT_RGBX8888: + case ST_FORMAT_RGBX8888: return PIPE_FORMAT_X8B8G8R8_UNORM; - case MESA_FORMAT_RGBX8888_REV: + case ST_FORMAT_RGBX8888_REV: return PIPE_FORMAT_R8G8B8X8_UNORM; - case MESA_FORMAT_XRGB8888: + case ST_FORMAT_XRGB8888: return PIPE_FORMAT_B8G8R8X8_UNORM; - case MESA_FORMAT_XRGB8888_REV: + case ST_FORMAT_XRGB8888_REV: return PIPE_FORMAT_X8R8G8B8_UNORM; - case MESA_FORMAT_ARGB1555: + case ST_FORMAT_ARGB1555: return PIPE_FORMAT_B5G5R5A1_UNORM; - case MESA_FORMAT_ARGB4444: + case ST_FORMAT_ARGB4444: return PIPE_FORMAT_B4G4R4A4_UNORM; - case MESA_FORMAT_RGB565: + case ST_FORMAT_RGB565: return PIPE_FORMAT_B5G6R5_UNORM; case MESA_FORMAT_RGB332: return PIPE_FORMAT_B2G3R3_UNORM; - case MESA_FORMAT_ARGB2101010: + case ST_FORMAT_ARGB2101010: return PIPE_FORMAT_B10G10R10A2_UNORM; case MESA_FORMAT_AL44: return PIPE_FORMAT_L4A4_UNORM; - case MESA_FORMAT_AL88: + case ST_FORMAT_AL88: return PIPE_FORMAT_L8A8_UNORM; - case MESA_FORMAT_AL1616: + case ST_FORMAT_AL1616: return PIPE_FORMAT_L16A16_UNORM; case MESA_FORMAT_A8: return PIPE_FORMAT_A8_UNORM; - case MESA_FORMAT_A16: + case ST_FORMAT_A16: return PIPE_FORMAT_A16_UNORM; case MESA_FORMAT_L8: return PIPE_FORMAT_L8_UNORM; - case MESA_FORMAT_L16: + case ST_FORMAT_L16: return PIPE_FORMAT_L16_UNORM; case MESA_FORMAT_I8: return PIPE_FORMAT_I8_UNORM; - case MESA_FORMAT_I16: + case ST_FORMAT_I16: return PIPE_FORMAT_I16_UNORM; - case MESA_FORMAT_Z16: + case ST_FORMAT_Z16: return PIPE_FORMAT_Z16_UNORM; case MESA_FORMAT_Z32: return PIPE_FORMAT_Z32_UNORM; - case MESA_FORMAT_Z24_S8: + case ST_FORMAT_Z24_S8: return PIPE_FORMAT_S8_UINT_Z24_UNORM; case MESA_FORMAT_S8_Z24: return PIPE_FORMAT_Z24_UNORM_S8_UINT; - case MESA_FORMAT_Z24_X8: + case ST_FORMAT_Z24_X8: return PIPE_FORMAT_X8Z24_UNORM; case MESA_FORMAT_X8_Z24: return PIPE_FORMAT_Z24X8_UNORM; @@ -216,7 +265,7 @@ st_mesa_format_to_pipe_format(gl_format mesaFormat) return PIPE_FORMAT_Z32_FLOAT; case MESA_FORMAT_Z32_FLOAT_X24S8: return PIPE_FORMAT_Z32_FLOAT_S8X24_UINT; - case MESA_FORMAT_YCBCR: + case ST_FORMAT_YCBCR: return PIPE_FORMAT_UYVY; #if FEATURE_texture_s3tc case MESA_FORMAT_RGB_DXT1: @@ -250,7 +299,7 @@ st_mesa_format_to_pipe_format(gl_format mesaFormat) case MESA_FORMAT_SARGB8: return PIPE_FORMAT_B8G8R8A8_SRGB; #endif - case MESA_FORMAT_RGBA_FLOAT32: + case ST_FORMAT_RGBA_FLOAT32: return PIPE_FORMAT_R32G32B32A32_FLOAT; case MESA_FORMAT_RGBA_FLOAT16: return PIPE_FORMAT_R16G16B16A16_FLOAT; @@ -285,13 +334,13 @@ st_mesa_format_to_pipe_format(gl_format mesaFormat) case MESA_FORMAT_R8: return PIPE_FORMAT_R8_UNORM; - case MESA_FORMAT_R16: + case ST_FORMAT_R16: return PIPE_FORMAT_R16_UNORM; case MESA_FORMAT_GR88: return PIPE_FORMAT_R8G8_UNORM; - case MESA_FORMAT_RG1616: + case ST_FORMAT_RG1616: return PIPE_FORMAT_R16G16_UNORM; - case MESA_FORMAT_RGBA_16: + case ST_FORMAT_RGBA_16: return PIPE_FORMAT_R16G16B16A16_UNORM; /* signed int formats */ @@ -426,9 +475,9 @@ st_mesa_format_to_pipe_format(gl_format mesaFormat) /* signed normalized formats */ case MESA_FORMAT_SIGNED_R8: return PIPE_FORMAT_R8_SNORM; - case MESA_FORMAT_SIGNED_RG88_REV: + case ST_FORMAT_SIGNED_RG88: return PIPE_FORMAT_R8G8_SNORM; - case MESA_FORMAT_SIGNED_RGBA8888_REV: + case ST_FORMAT_SIGNED_RGBA8888: return PIPE_FORMAT_R8G8B8A8_SNORM; case MESA_FORMAT_SIGNED_A8: @@ -477,63 +526,63 @@ st_pipe_format_to_mesa_format(enum pipe_format format) { switch (format) { case PIPE_FORMAT_A8B8G8R8_UNORM: - return MESA_FORMAT_RGBA8888; + return ST_FORMAT_RGBA8888; case PIPE_FORMAT_R8G8B8A8_UNORM: - return MESA_FORMAT_RGBA8888_REV; + return ST_FORMAT_RGBA8888_REV; case PIPE_FORMAT_B8G8R8A8_UNORM: - return MESA_FORMAT_ARGB8888; + return ST_FORMAT_ARGB8888; case PIPE_FORMAT_A8R8G8B8_UNORM: - return MESA_FORMAT_ARGB8888_REV; + return ST_FORMAT_ARGB8888_REV; case PIPE_FORMAT_X8B8G8R8_UNORM: - return MESA_FORMAT_RGBX8888; + return ST_FORMAT_RGBX8888; case PIPE_FORMAT_R8G8B8X8_UNORM: - return MESA_FORMAT_RGBX8888_REV; + return ST_FORMAT_RGBX8888_REV; case PIPE_FORMAT_B8G8R8X8_UNORM: - return MESA_FORMAT_XRGB8888; + return ST_FORMAT_XRGB8888; case PIPE_FORMAT_X8R8G8B8_UNORM: - return MESA_FORMAT_XRGB8888_REV; + return ST_FORMAT_XRGB8888_REV; case PIPE_FORMAT_B5G5R5A1_UNORM: - return MESA_FORMAT_ARGB1555; + return ST_FORMAT_ARGB1555; case PIPE_FORMAT_B4G4R4A4_UNORM: - return MESA_FORMAT_ARGB4444; + return ST_FORMAT_ARGB4444; case PIPE_FORMAT_B5G6R5_UNORM: - return MESA_FORMAT_RGB565; + return ST_FORMAT_RGB565; case PIPE_FORMAT_B2G3R3_UNORM: return MESA_FORMAT_RGB332; case PIPE_FORMAT_B10G10R10A2_UNORM: - return MESA_FORMAT_ARGB2101010; + return ST_FORMAT_ARGB2101010; case PIPE_FORMAT_L4A4_UNORM: return MESA_FORMAT_AL44; case PIPE_FORMAT_L8A8_UNORM: - return MESA_FORMAT_AL88; + return ST_FORMAT_AL88; case PIPE_FORMAT_L16A16_UNORM: - return MESA_FORMAT_AL1616; + return ST_FORMAT_AL1616; case PIPE_FORMAT_A8_UNORM: return MESA_FORMAT_A8; case PIPE_FORMAT_A16_UNORM: - return MESA_FORMAT_A16; + return ST_FORMAT_A16; case PIPE_FORMAT_L8_UNORM: return MESA_FORMAT_L8; case PIPE_FORMAT_L16_UNORM: - return MESA_FORMAT_L16; + return ST_FORMAT_L16; case PIPE_FORMAT_I8_UNORM: return MESA_FORMAT_I8; case PIPE_FORMAT_I16_UNORM: - return MESA_FORMAT_I16; + return ST_FORMAT_I16; case PIPE_FORMAT_S8_UINT: return MESA_FORMAT_S8; case PIPE_FORMAT_R16G16B16A16_UNORM: - return MESA_FORMAT_RGBA_16; + return ST_FORMAT_RGBA_16; case PIPE_FORMAT_Z16_UNORM: - return MESA_FORMAT_Z16; + return ST_FORMAT_Z16; case PIPE_FORMAT_Z32_UNORM: return MESA_FORMAT_Z32; case PIPE_FORMAT_S8_UINT_Z24_UNORM: - return MESA_FORMAT_Z24_S8; + return ST_FORMAT_Z24_S8; case PIPE_FORMAT_X8Z24_UNORM: - return MESA_FORMAT_Z24_X8; + return ST_FORMAT_Z24_X8; case PIPE_FORMAT_Z24X8_UNORM: return MESA_FORMAT_X8_Z24; case PIPE_FORMAT_Z24_UNORM_S8_UINT: @@ -544,9 +593,9 @@ st_pipe_format_to_mesa_format(enum pipe_format format) return MESA_FORMAT_Z32_FLOAT_X24S8; case PIPE_FORMAT_UYVY: - return MESA_FORMAT_YCBCR; + return ST_FORMAT_YCBCR; case PIPE_FORMAT_YUYV: - return MESA_FORMAT_YCBCR_REV; + return ST_FORMAT_YCBCR_REV; #if FEATURE_texture_s3tc case PIPE_FORMAT_DXT1_RGB: @@ -582,7 +631,7 @@ st_pipe_format_to_mesa_format(enum pipe_format format) return MESA_FORMAT_SARGB8; #endif case PIPE_FORMAT_R32G32B32A32_FLOAT: - return MESA_FORMAT_RGBA_FLOAT32; + return ST_FORMAT_RGBA_FLOAT32; case PIPE_FORMAT_R16G16B16A16_FLOAT: return MESA_FORMAT_RGBA_FLOAT16; case PIPE_FORMAT_R32G32B32_FLOAT: @@ -617,11 +666,11 @@ st_pipe_format_to_mesa_format(enum pipe_format format) case PIPE_FORMAT_R8_UNORM: return MESA_FORMAT_R8; case PIPE_FORMAT_R16_UNORM: - return MESA_FORMAT_R16; + return ST_FORMAT_R16; case PIPE_FORMAT_R8G8_UNORM: return MESA_FORMAT_GR88; case PIPE_FORMAT_R16G16_UNORM: - return MESA_FORMAT_RG1616; + return ST_FORMAT_RG1616; case PIPE_FORMAT_A8_UINT: return MESA_FORMAT_ALPHA_UINT8; @@ -755,9 +804,9 @@ st_pipe_format_to_mesa_format(enum pipe_format format) case PIPE_FORMAT_R8_SNORM: return MESA_FORMAT_SIGNED_R8; case PIPE_FORMAT_R8G8_SNORM: - return MESA_FORMAT_SIGNED_RG88_REV; + return ST_FORMAT_SIGNED_RG88; case PIPE_FORMAT_R8G8B8A8_SNORM: - return MESA_FORMAT_SIGNED_RGBA8888_REV; + return ST_FORMAT_SIGNED_RGBA8888; case PIPE_FORMAT_A8_SNORM: return MESA_FORMAT_SIGNED_A8; @@ -1521,14 +1570,34 @@ struct exact_format_mapping enum pipe_format pformat; }; + +#if MESA_BIG_ENDIAN + +#define ST_UNSIGNED_INT_8_8_8_8 GL_UNSIGNED_INT_8_8_8_8_REV +#define ST_UNSIGNED_INT_8_8_8_8_REV GL_UNSIGNED_INT_8_8_8_8 + +#define ST_UNSIGNED_INT_10_10_10_2 GL_UNSIGNED_INT_2_10_10_10_REV +#define ST_UNSIGNED_INT_2_10_10_10_REV GL_UNSIGNED_INT_10_10_10_2 + +#else /* MESA_LITTLE_ENDIAN */ + +#define ST_UNSIGNED_INT_8_8_8_8 GL_UNSIGNED_INT_8_8_8_8 +#define ST_UNSIGNED_INT_8_8_8_8_REV GL_UNSIGNED_INT_8_8_8_8_REV + +#define ST_UNSIGNED_INT_10_10_10_2 GL_UNSIGNED_INT_10_10_10_2 +#define ST_UNSIGNED_INT_2_10_10_10_REV GL_UNSIGNED_INT_2_10_10_10_REV + +#endif + + static const struct exact_format_mapping rgba8888_tbl[] = { - { GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_A8B8G8R8_UNORM }, - { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_A8B8G8R8_UNORM }, - { GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_R8G8B8A8_UNORM }, - { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_R8G8B8A8_UNORM }, - { GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_A8R8G8B8_UNORM }, - { GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_B8G8R8A8_UNORM }, + { GL_RGBA, ST_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_A8B8G8R8_UNORM }, + { GL_ABGR_EXT, ST_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_A8B8G8R8_UNORM }, + { GL_RGBA, ST_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_R8G8B8A8_UNORM }, + { GL_ABGR_EXT, ST_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_R8G8B8A8_UNORM }, + { GL_BGRA, ST_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_A8R8G8B8_UNORM }, + { GL_BGRA, ST_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_B8G8R8A8_UNORM }, { GL_RGBA, GL_UNSIGNED_BYTE, PIPE_FORMAT_R8G8B8A8_UNORM }, { GL_ABGR_EXT, GL_UNSIGNED_BYTE, PIPE_FORMAT_A8B8G8R8_UNORM }, { GL_BGRA, GL_UNSIGNED_BYTE, PIPE_FORMAT_B8G8R8A8_UNORM }, @@ -1537,14 +1606,14 @@ static const struct exact_format_mapping rgba8888_tbl[] = static const struct exact_format_mapping rgbx8888_tbl[] = { - { GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_X8R8G8B8_UNORM }, - { GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_B8G8R8X8_UNORM }, + { GL_BGRA, ST_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_X8R8G8B8_UNORM }, + { GL_BGRA, ST_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_B8G8R8X8_UNORM }, { GL_BGRA, GL_UNSIGNED_BYTE, PIPE_FORMAT_B8G8R8X8_UNORM }, /* No Mesa formats for these Gallium formats: - { GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_X8B8G8R8_UNORM }, - { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_X8B8G8R8_UNORM }, - { GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_R8G8B8X8_UNORM }, - { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_R8G8B8X8_UNORM }, + { GL_RGBA, ST_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_X8B8G8R8_UNORM }, + { GL_ABGR_EXT, ST_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_X8B8G8R8_UNORM }, + { GL_RGBA, ST_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_R8G8B8X8_UNORM }, + { GL_ABGR_EXT, ST_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_R8G8B8X8_UNORM }, { GL_RGBA, GL_UNSIGNED_BYTE, PIPE_FORMAT_R8G8B8X8_UNORM }, { GL_ABGR_EXT, GL_UNSIGNED_BYTE, PIPE_FORMAT_X8B8G8R8_UNORM }, */ @@ -1553,15 +1622,16 @@ static const struct exact_format_mapping rgbx8888_tbl[] = static const struct exact_format_mapping rgba1010102_tbl[] = { - { GL_BGRA, GL_UNSIGNED_INT_2_10_10_10_REV, PIPE_FORMAT_B10G10R10A2_UNORM }, + { GL_BGRA, ST_UNSIGNED_INT_2_10_10_10_REV, PIPE_FORMAT_B10G10R10A2_UNORM }, /* No Mesa formats for these Gallium formats: - { GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, PIPE_FORMAT_R10G10B10A2_UNORM }, - { GL_ABGR_EXT, GL_UNSIGNED_INT_10_10_10_2, PIPE_FORMAT_R10G10B10A2_UNORM }, + { GL_RGBA, ST_UNSIGNED_INT_2_10_10_10_REV, PIPE_FORMAT_R10G10B10A2_UNORM }, + { GL_ABGR_EXT, ST_UNSIGNED_INT_10_10_10_2, PIPE_FORMAT_R10G10B10A2_UNORM }, { GL_ABGR_EXT, GL_UNSIGNED_INT, PIPE_FORMAT_R10G10B10A2_UNORM }, */ { 0, 0, 0 } }; + /** * If there is an exact pipe_format match for {internalFormat, format, type} * return that, otherwise return PIPE_FORMAT_NONE so we can do fuzzy matching.