#include "../../gallium/auxiliary/util/u_format_r11g11b10f.h"
+/** Helper struct for MESA_FORMAT_Z32_FLOAT_X24S8 */
+struct z32f_x24s8
+{
+ float z;
+ uint32_t x24s8;
+};
+
+
typedef void (*pack_ubyte_rgba_row_func)(GLuint n,
const GLubyte src[][4], void *dst);
}
-/* MESA_FORMAT_RG1616 */
+/* MESA_FORMAT_GR1616 */
static void
-pack_ubyte_RG1616(const GLubyte src[4], void *dst)
+pack_ubyte_GR1616(const GLubyte src[4], void *dst)
{
GLuint *d = ((GLuint *) dst);
GLushort r = UBYTE_TO_USHORT(src[RCOMP]);
}
static void
-pack_float_RG1616(const GLfloat src[4], void *dst)
+pack_float_GR1616(const GLfloat src[4], void *dst)
{
GLuint *d = ((GLuint *) dst);
GLushort r, g;
}
-/* MESA_FORMAT_RG1616_REV */
+/* MESA_FORMAT_RG1616 */
static void
-pack_ubyte_RG1616_REV(const GLubyte src[4], void *dst)
+pack_ubyte_RG1616(const GLubyte src[4], void *dst)
{
GLuint *d = ((GLuint *) dst);
GLushort r = UBYTE_TO_USHORT(src[RCOMP]);
static void
-pack_float_RG1616_REV(const GLfloat src[4], void *dst)
+pack_float_RG1616(const GLfloat src[4], void *dst)
{
GLuint *d = ((GLuint *) dst);
GLushort r, g;
}
+/* MESA_FORMAT_ABGR2101010_UINT */
+
+static void
+pack_ubyte_ABGR2101010_UINT(const GLubyte src[4], void *dst)
+{
+ GLuint *d = ((GLuint *) dst);
+ GLushort r = UBYTE_TO_USHORT(src[RCOMP]);
+ GLushort g = UBYTE_TO_USHORT(src[GCOMP]);
+ GLushort b = UBYTE_TO_USHORT(src[BCOMP]);
+ GLushort a = UBYTE_TO_USHORT(src[ACOMP]);
+ *d = PACK_COLOR_2101010_US(a, b, g, r);
+}
+
+static void
+pack_float_ABGR2101010_UINT(const GLfloat src[4], void *dst)
+{
+ GLuint *d = ((GLuint *) dst);
+ GLushort r, g, b, a;
+ UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]);
+ UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]);
+ UNCLAMPED_FLOAT_TO_USHORT(b, src[BCOMP]);
+ UNCLAMPED_FLOAT_TO_USHORT(a, src[ACOMP]);
+ *d = PACK_COLOR_2101010_US(a, b, g, r);
+}
+
+
/* MESA_FORMAT_SRGB8 */
static void
}
+/*
+ * MESA_FORMAT_XRGB4444_UNORM
+ */
+
+static void
+pack_ubyte_XRGB4444_UNORM(const GLubyte src[4], void *dst)
+{
+ GLushort *d = ((GLushort *) dst);
+ *d = PACK_COLOR_4444(255, src[RCOMP], src[GCOMP], src[BCOMP]);
+}
+
+static void
+pack_float_XRGB4444_UNORM(const GLfloat src[4], void *dst)
+{
+ GLubyte v[4];
+ _mesa_unclamped_float_rgba_to_ubyte(v, src);
+ pack_ubyte_XRGB4444_UNORM(v, dst);
+}
+
+
+/*
+ * MESA_FORMAT_XRGB1555_UNORM
+ */
+
+static void
+pack_ubyte_XRGB1555_UNORM(const GLubyte src[4], void *dst)
+{
+ GLushort *d = ((GLushort *) dst);
+ *d = PACK_COLOR_1555(255, src[RCOMP], src[GCOMP], src[BCOMP]);
+}
+
+static void
+pack_float_XRGB1555_UNORM(const GLfloat src[4], void *dst)
+{
+ GLubyte v[4];
+ _mesa_unclamped_float_rgba_to_ubyte(v, src);
+ pack_ubyte_XRGB1555_UNORM(v, dst);
+}
+
+
+/*
+ * MESA_FORMAT_XBGR8888_SNORM
+ */
+
+static void
+pack_float_XBGR8888_SNORM(const GLfloat src[4], void *dst)
+{
+ GLuint *d = (GLuint *) dst;
+ GLbyte r = FLOAT_TO_BYTE(CLAMP(src[RCOMP], -1.0f, 1.0f));
+ GLbyte g = FLOAT_TO_BYTE(CLAMP(src[GCOMP], -1.0f, 1.0f));
+ GLbyte b = FLOAT_TO_BYTE(CLAMP(src[BCOMP], -1.0f, 1.0f));
+ *d = PACK_COLOR_8888(127, b, g, r);
+}
+
+
+/*
+ * MESA_FORMAT_XBGR8888_SRGB
+ */
+
+static void
+pack_float_XBGR8888_SRGB(const GLfloat src[4], void *dst)
+{
+ GLuint *d = (GLuint *) dst;
+ GLubyte r = linear_float_to_srgb_ubyte(src[RCOMP]);
+ GLubyte g = linear_float_to_srgb_ubyte(src[GCOMP]);
+ GLubyte b = linear_float_to_srgb_ubyte(src[BCOMP]);
+ *d = PACK_COLOR_8888(127, b, g, r);
+}
+
+
+/* MESA_FORMAT_XRGB2101010_UNORM */
+
+static void
+pack_ubyte_XRGB2101010_UNORM(const GLubyte src[4], void *dst)
+{
+ GLuint *d = ((GLuint *) dst);
+ GLushort r = UBYTE_TO_USHORT(src[RCOMP]);
+ GLushort g = UBYTE_TO_USHORT(src[GCOMP]);
+ GLushort b = UBYTE_TO_USHORT(src[BCOMP]);
+ *d = PACK_COLOR_2101010_US(3, r, g, b);
+}
+
+static void
+pack_float_XRGB2101010_UNORM(const GLfloat src[4], void *dst)
+{
+ GLuint *d = ((GLuint *) dst);
+ 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]);
+ *d = PACK_COLOR_2101010_US(3, r, g, b);
+}
+
+
+/* MESA_FORMAT_XBGR16161616_UNORM */
+
+static void
+pack_ubyte_XBGR16161616_UNORM(const GLubyte src[4], void *dst)
+{
+ GLushort *d = ((GLushort *) dst);
+ d[0] = UBYTE_TO_USHORT(src[RCOMP]);
+ d[1] = UBYTE_TO_USHORT(src[GCOMP]);
+ d[2] = UBYTE_TO_USHORT(src[BCOMP]);
+ d[3] = 65535;
+}
+
+static void
+pack_float_XBGR16161616_UNORM(const GLfloat src[4], void *dst)
+{
+ GLushort *d = ((GLushort *) dst);
+ UNCLAMPED_FLOAT_TO_USHORT(d[0], src[RCOMP]);
+ UNCLAMPED_FLOAT_TO_USHORT(d[1], src[GCOMP]);
+ UNCLAMPED_FLOAT_TO_USHORT(d[2], src[BCOMP]);
+ d[3] = 65535;
+}
+
+
+/* MESA_FORMAT_XBGR16161616_SNORM */
+
+static void
+pack_float_XBGR16161616_SNORM(const GLfloat src[4], void *dst)
+{
+ GLushort *d = ((GLushort *) dst);
+ UNCLAMPED_FLOAT_TO_SHORT(d[0], src[RCOMP]);
+ UNCLAMPED_FLOAT_TO_SHORT(d[1], src[GCOMP]);
+ UNCLAMPED_FLOAT_TO_SHORT(d[2], src[BCOMP]);
+ d[3] = 32767;
+}
+
+
+/* MESA_FORMAT_XBGR16161616_FLOAT */
+
+static void
+pack_float_XBGR16161616_FLOAT(const GLfloat src[4], void *dst)
+{
+ GLushort *d = ((GLushort *) dst);
+ d[0] = _mesa_float_to_half(src[RCOMP]);
+ d[1] = _mesa_float_to_half(src[GCOMP]);
+ d[2] = _mesa_float_to_half(src[BCOMP]);
+ d[3] = _mesa_float_to_half(1.0);
+}
+
+/* MESA_FORMAT_XBGR32323232_FLOAT */
+
+static void
+pack_float_XBGR32323232_FLOAT(const GLfloat src[4], void *dst)
+{
+ GLfloat *d = ((GLfloat *) dst);
+ d[0] = src[RCOMP];
+ d[1] = src[GCOMP];
+ d[2] = src[BCOMP];
+ d[3] = 1.0;
+}
+
/**
* Return a function that can pack a GLubyte rgba[4] color.
table[MESA_FORMAT_GR88] = pack_ubyte_GR88;
table[MESA_FORMAT_RG88] = pack_ubyte_RG88;
table[MESA_FORMAT_R16] = pack_ubyte_R16;
+ table[MESA_FORMAT_GR1616] = pack_ubyte_GR1616;
table[MESA_FORMAT_RG1616] = pack_ubyte_RG1616;
- table[MESA_FORMAT_RG1616_REV] = pack_ubyte_RG1616_REV;
table[MESA_FORMAT_ARGB2101010] = pack_ubyte_ARGB2101010;
+ table[MESA_FORMAT_ABGR2101010_UINT] = pack_ubyte_ABGR2101010_UINT;
/* should never convert RGBA to these formats */
table[MESA_FORMAT_Z24_S8] = NULL;
table[MESA_FORMAT_RGB9_E5_FLOAT] = pack_ubyte_RGB9_E5_FLOAT;
table[MESA_FORMAT_R11_G11_B10_FLOAT] = pack_ubyte_R11_G11_B10_FLOAT;
+ table[MESA_FORMAT_XRGB4444_UNORM] = pack_ubyte_XRGB4444_UNORM;
+ table[MESA_FORMAT_XRGB1555_UNORM] = pack_ubyte_XRGB1555_UNORM;
+ table[MESA_FORMAT_XBGR8888_SNORM] = NULL;
+ table[MESA_FORMAT_XBGR8888_SRGB] = NULL;
+ table[MESA_FORMAT_XBGR8888_UINT] = NULL;
+ table[MESA_FORMAT_XBGR8888_SINT] = NULL;
+ table[MESA_FORMAT_XRGB2101010_UNORM] = pack_ubyte_XRGB2101010_UNORM;
+ table[MESA_FORMAT_XBGR16161616_UNORM] = pack_ubyte_XBGR16161616_UNORM;
+ table[MESA_FORMAT_XBGR16161616_SNORM] = NULL;
+ table[MESA_FORMAT_XBGR16161616_FLOAT] = NULL;
+ table[MESA_FORMAT_XBGR16161616_UINT] = NULL;
+ table[MESA_FORMAT_XBGR16161616_SINT] = NULL;
+ table[MESA_FORMAT_XBGR32323232_FLOAT] = NULL;
+ table[MESA_FORMAT_XBGR32323232_UINT] = NULL;
+ table[MESA_FORMAT_XBGR32323232_SINT] = NULL;
+
initialized = GL_TRUE;
}
table[MESA_FORMAT_GR88] = pack_float_GR88;
table[MESA_FORMAT_RG88] = pack_float_RG88;
table[MESA_FORMAT_R16] = pack_float_R16;
+ table[MESA_FORMAT_GR1616] = pack_float_GR1616;
table[MESA_FORMAT_RG1616] = pack_float_RG1616;
- table[MESA_FORMAT_RG1616_REV] = pack_float_RG1616_REV;
table[MESA_FORMAT_ARGB2101010] = pack_float_ARGB2101010;
+ table[MESA_FORMAT_ABGR2101010_UINT] = pack_float_ABGR2101010_UINT;
/* should never convert RGBA to these formats */
table[MESA_FORMAT_Z24_S8] = NULL;
table[MESA_FORMAT_RGB9_E5_FLOAT] = pack_float_RGB9_E5_FLOAT;
table[MESA_FORMAT_R11_G11_B10_FLOAT] = pack_float_R11_G11_B10_FLOAT;
+ table[MESA_FORMAT_XRGB4444_UNORM] = pack_float_XRGB4444_UNORM;
+ table[MESA_FORMAT_XRGB1555_UNORM] = pack_float_XRGB1555_UNORM;
+ table[MESA_FORMAT_XBGR8888_SNORM] = pack_float_XBGR8888_SNORM;
+ table[MESA_FORMAT_XBGR8888_SRGB] = pack_float_XBGR8888_SRGB;
+ table[MESA_FORMAT_XBGR8888_UINT] = NULL;
+ table[MESA_FORMAT_XBGR8888_SINT] = NULL;
+ table[MESA_FORMAT_XRGB2101010_UNORM] = pack_float_XRGB2101010_UNORM;
+ table[MESA_FORMAT_XBGR16161616_UNORM] = pack_float_XBGR16161616_UNORM;
+ table[MESA_FORMAT_XBGR16161616_SNORM] = pack_float_XBGR16161616_SNORM;
+ table[MESA_FORMAT_XBGR16161616_FLOAT] = pack_float_XBGR16161616_FLOAT;
+ table[MESA_FORMAT_XBGR16161616_UINT] = NULL;
+ table[MESA_FORMAT_XBGR16161616_SINT] = NULL;
+ table[MESA_FORMAT_XBGR32323232_FLOAT] = pack_float_XBGR32323232_FLOAT;
+ table[MESA_FORMAT_XBGR32323232_UINT] = NULL;
+ table[MESA_FORMAT_XBGR32323232_SINT] = NULL;
+
initialized = GL_TRUE;
}
{
GLuint *d = ((GLuint *) dst);
const GLdouble scale = 1.0 / (GLdouble) 0xffffffff;
- *d = *src * scale;
+ *d = (GLuint) (*src * scale);
assert(*d >= 0.0f);
assert(*d <= 1.0f);
}
{
GLfloat *d = ((GLfloat *) dst);
const GLdouble scale = 1.0 / (GLdouble) 0xffffffff;
- *d = *src * scale;
+ *d = (GLfloat) (*src * scale);
assert(*d >= 0.0f);
assert(*d <= 1.0f);
}
break;
case MESA_FORMAT_Z32_FLOAT_X24S8:
{
- GLfloat *d = ((GLfloat *) dst);
+ struct z32f_x24s8 *d = (struct z32f_x24s8 *) dst;
GLuint i;
for (i = 0; i < n; i++) {
- d[i * 2] = src[i];
+ d[i].z = src[i];
}
}
break;
const GLdouble scale = 1.0 / (GLdouble) 0xffffffff;
GLuint i;
for (i = 0; i < n; i++) {
- d[i] = src[i] * scale;
+ d[i] = (GLuint) (src[i] * scale);
assert(d[i] >= 0.0f);
assert(d[i] <= 1.0f);
}
break;
case MESA_FORMAT_Z32_FLOAT_X24S8:
{
- GLfloat *d = ((GLfloat *) dst);
+ struct z32f_x24s8 *d = (struct z32f_x24s8 *) dst;
const GLdouble scale = 1.0 / (GLdouble) 0xffffffff;
GLuint i;
for (i = 0; i < n; i++) {
- d[i * 2] = src[i] * scale;
- assert(d[i * 2] >= 0.0f);
- assert(d[i * 2] <= 1.0f);
+ d[i].z = (GLfloat) (src[i] * scale);
+ assert(d[i].z >= 0.0f);
+ assert(d[i].z <= 1.0f);
}
}
break;
break;
case MESA_FORMAT_Z32_FLOAT_X24S8:
{
- GLuint *d = dst;
+ struct z32f_x24s8 *d = (struct z32f_x24s8 *) dst;
GLuint i;
for (i = 0; i < n; i++) {
- d[i * 2 + 1] = src[i];
+ d[i].x24s8 = src[i];
}
}
break;
}
}
break;
+ case MESA_FORMAT_Z32_FLOAT_X24S8:
+ {
+ const GLdouble scale = 1.0 / (GLdouble) 0xffffff;
+ struct z32f_x24s8 *d = (struct z32f_x24s8 *) dst;
+ GLuint i;
+ for (i = 0; i < n; i++) {
+ GLfloat z = (GLfloat) ((src[i] >> 8) * scale);
+ d[i].z = z;
+ d[i].x24s8 = src[i];
+ }
+ }
+ break;
default:
_mesa_problem(NULL, "bad format %s in _mesa_pack_ubyte_s_row",
_mesa_get_format_name(format));
switch (_mesa_get_format_datatype(format)) {
case GL_UNSIGNED_NORMALIZED:
/* simple: 1.0 will convert to ~0 in the right bit positions */
- maskColor[0] = colorMask[0] ? 1.0 : 0.0;
- maskColor[1] = colorMask[1] ? 1.0 : 0.0;
- maskColor[2] = colorMask[2] ? 1.0 : 0.0;
- maskColor[3] = colorMask[3] ? 1.0 : 0.0;
+ maskColor[0] = colorMask[0] ? 1.0f : 0.0f;
+ maskColor[1] = colorMask[1] ? 1.0f : 0.0f;
+ maskColor[2] = colorMask[2] ? 1.0f : 0.0f;
+ maskColor[3] = colorMask[3] ? 1.0f : 0.0f;
_mesa_pack_float_rgba_row(format, 1,
(const GLfloat (*)[4]) maskColor, dst);
break;
if (bits == 8) {
GLubyte *d = (GLubyte *) dst;
for (i = 0; i < bytes; i++) {
- d[i] = d[i] ? 0xffff : 0x0;
+ d[i] = d[i] ? 0xff : 0x0;
}
}
else if (bits == 16) {