/** * Upload SAMPLER_BORDER_COLOR_STATE. */ void upload_default_color(struct brw_context *brw, struct gl_sampler_object *sampler, int unit, uint32_t *sdc_offset) { struct gl_context *ctx = &brw->ctx; struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit]; struct gl_texture_object *texObj = texUnit->_Current; struct gl_texture_image *firstImage = texObj->Image[0][texObj->BaseLevel]; float color[4]; switch (firstImage->_BaseFormat) { case GL_DEPTH_COMPONENT: /* GL specs that border color for depth textures is taken from the * R channel, while the hardware uses A. Spam R into all the * channels for safety. */ color[0] = sampler->BorderColor.f[0]; color[1] = sampler->BorderColor.f[0]; color[2] = sampler->BorderColor.f[0]; color[3] = sampler->BorderColor.f[0]; break; case GL_ALPHA: color[0] = 0.0; color[1] = 0.0; color[2] = 0.0; color[3] = sampler->BorderColor.f[3]; break; case GL_INTENSITY: color[0] = sampler->BorderColor.f[0]; color[1] = sampler->BorderColor.f[0]; color[2] = sampler->BorderColor.f[0]; color[3] = sampler->BorderColor.f[0]; break; case GL_LUMINANCE: color[0] = sampler->BorderColor.f[0]; color[1] = sampler->BorderColor.f[0]; color[2] = sampler->BorderColor.f[0]; color[3] = 1.0; break; case GL_LUMINANCE_ALPHA: color[0] = sampler->BorderColor.f[0]; color[1] = sampler->BorderColor.f[0]; color[2] = sampler->BorderColor.f[0]; color[3] = sampler->BorderColor.f[3]; break; default: color[0] = sampler->BorderColor.f[0]; color[1] = sampler->BorderColor.f[1]; color[2] = sampler->BorderColor.f[2]; color[3] = sampler->BorderColor.f[3]; break; } /* In some cases we use an RGBA surface format for GL RGB textures, * where we've initialized the A channel to 1.0. We also have to set * the border color alpha to 1.0 in that case. */ if (firstImage->_BaseFormat == GL_RGB) color[3] = 1.0; if (brw->gen >= 8) { /* On Broadwell, the border color is represented as four 32-bit floats, * integers, or unsigned values, interpreted according to the surface * format. This matches the sampler->BorderColor union exactly. Since * we use floats both here and in the above reswizzling code, we preserve * the original bit pattern. So we actually handle all three formats. */ float *sdc = brw_state_batch(brw, AUB_TRACE_SAMPLER_DEFAULT_COLOR, 4 * 4, 64, sdc_offset); COPY_4FV(sdc, color); } else if (brw->gen == 5 || brw->gen == 6) { struct gen5_sampler_default_color *sdc; sdc = brw_state_batch(brw, AUB_TRACE_SAMPLER_DEFAULT_COLOR, sizeof(*sdc), 32, sdc_offset); memset(sdc, 0, sizeof(*sdc)); UNCLAMPED_FLOAT_TO_UBYTE(sdc->ub[0], color[0]); UNCLAMPED_FLOAT_TO_UBYTE(sdc->ub[1], color[1]); UNCLAMPED_FLOAT_TO_UBYTE(sdc->ub[2], color[2]); UNCLAMPED_FLOAT_TO_UBYTE(sdc->ub[3], color[3]); UNCLAMPED_FLOAT_TO_USHORT(sdc->us[0], color[0]); UNCLAMPED_FLOAT_TO_USHORT(sdc->us[1], color[1]); UNCLAMPED_FLOAT_TO_USHORT(sdc->us[2], color[2]); UNCLAMPED_FLOAT_TO_USHORT(sdc->us[3], color[3]); UNCLAMPED_FLOAT_TO_SHORT(sdc->s[0], color[0]); UNCLAMPED_FLOAT_TO_SHORT(sdc->s[1], color[1]); UNCLAMPED_FLOAT_TO_SHORT(sdc->s[2], color[2]); UNCLAMPED_FLOAT_TO_SHORT(sdc->s[3], color[3]); sdc->hf[0] = _mesa_float_to_half(color[0]); sdc->hf[1] = _mesa_float_to_half(color[1]); sdc->hf[2] = _mesa_float_to_half(color[2]); sdc->hf[3] = _mesa_float_to_half(color[3]); sdc->b[0] = sdc->s[0] >> 8; sdc->b[1] = sdc->s[1] >> 8; sdc->b[2] = sdc->s[2] >> 8; sdc->b[3] = sdc->s[3] >> 8; sdc->f[0] = color[0]; sdc->f[1] = color[1]; sdc->f[2] = color[2]; sdc->f[3] = color[3]; } else {
/** * Upload SAMPLER_BORDER_COLOR_STATE. */ void upload_default_color(struct brw_context *brw, struct gl_sampler_object *sampler, int unit, int ss_index) { struct intel_context *intel = &brw->intel; struct gl_context *ctx = &intel->ctx; struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit]; struct gl_texture_object *texObj = texUnit->_Current; struct gl_texture_image *firstImage = texObj->Image[0][texObj->BaseLevel]; float color[4]; if (firstImage->_BaseFormat == GL_DEPTH_COMPONENT) { /* GL specs that border color for depth textures is taken from the * R channel, while the hardware uses A. Spam R into all the * channels for safety. */ color[0] = sampler->BorderColor.f[0]; color[1] = sampler->BorderColor.f[0]; color[2] = sampler->BorderColor.f[0]; color[3] = sampler->BorderColor.f[0]; } else { color[0] = sampler->BorderColor.f[0]; color[1] = sampler->BorderColor.f[1]; color[2] = sampler->BorderColor.f[2]; color[3] = sampler->BorderColor.f[3]; } /* In some cases we use an RGBA surface format for GL RGB textures, * where we've initialized the A channel to 1.0. We also have to set * the border color alpha to 1.0 in that case. */ if (firstImage->_BaseFormat == GL_RGB) color[3] = 1.0; if (intel->gen == 5 || intel->gen == 6) { struct gen5_sampler_default_color *sdc; sdc = brw_state_batch(brw, AUB_TRACE_SAMPLER_DEFAULT_COLOR, sizeof(*sdc), 32, &brw->wm.sdc_offset[ss_index]); memset(sdc, 0, sizeof(*sdc)); UNCLAMPED_FLOAT_TO_UBYTE(sdc->ub[0], color[0]); UNCLAMPED_FLOAT_TO_UBYTE(sdc->ub[1], color[1]); UNCLAMPED_FLOAT_TO_UBYTE(sdc->ub[2], color[2]); UNCLAMPED_FLOAT_TO_UBYTE(sdc->ub[3], color[3]); UNCLAMPED_FLOAT_TO_USHORT(sdc->us[0], color[0]); UNCLAMPED_FLOAT_TO_USHORT(sdc->us[1], color[1]); UNCLAMPED_FLOAT_TO_USHORT(sdc->us[2], color[2]); UNCLAMPED_FLOAT_TO_USHORT(sdc->us[3], color[3]); UNCLAMPED_FLOAT_TO_SHORT(sdc->s[0], color[0]); UNCLAMPED_FLOAT_TO_SHORT(sdc->s[1], color[1]); UNCLAMPED_FLOAT_TO_SHORT(sdc->s[2], color[2]); UNCLAMPED_FLOAT_TO_SHORT(sdc->s[3], color[3]); sdc->hf[0] = _mesa_float_to_half(color[0]); sdc->hf[1] = _mesa_float_to_half(color[1]); sdc->hf[2] = _mesa_float_to_half(color[2]); sdc->hf[3] = _mesa_float_to_half(color[3]); sdc->b[0] = sdc->s[0] >> 8; sdc->b[1] = sdc->s[1] >> 8; sdc->b[2] = sdc->s[2] >> 8; sdc->b[3] = sdc->s[3] >> 8; sdc->f[0] = color[0]; sdc->f[1] = color[1]; sdc->f[2] = color[2]; sdc->f[3] = color[3]; } else {
/* * XXX the packed pixel formats haven't been tested. */ static void pack_histogram( GLcontext *ctx, GLuint n, CONST GLuint rgba[][4], GLenum format, GLenum type, GLvoid *destination, const struct gl_pixelstore_attrib *packing ) { const GLint comps = _mesa_components_in_format(format); GLuint luminance[MAX_WIDTH]; if (format == GL_LUMINANCE || format == GL_LUMINANCE_ALPHA) { GLuint i; for (i = 0; i < n; i++) { luminance[i] = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP]; } } #define PACK_MACRO(TYPE) \ { \ GLuint i; \ switch (format) { \ case GL_RED: \ for (i=0;i<n;i++) \ dst[i] = (TYPE) rgba[i][RCOMP]; \ break; \ case GL_GREEN: \ for (i=0;i<n;i++) \ dst[i] = (TYPE) rgba[i][GCOMP]; \ break; \ case GL_BLUE: \ for (i=0;i<n;i++) \ dst[i] = (TYPE) rgba[i][BCOMP]; \ break; \ case GL_ALPHA: \ for (i=0;i<n;i++) \ dst[i] = (TYPE) rgba[i][ACOMP]; \ break; \ case GL_LUMINANCE: \ for (i=0;i<n;i++) \ dst[i] = (TYPE) luminance[i]; \ break; \ case GL_LUMINANCE_ALPHA: \ for (i=0;i<n;i++) { \ dst[i*2+0] = (TYPE) luminance[i]; \ dst[i*2+1] = (TYPE) rgba[i][ACOMP]; \ } \ break; \ case GL_RGB: \ for (i=0;i<n;i++) { \ dst[i*3+0] = (TYPE) rgba[i][RCOMP]; \ dst[i*3+1] = (TYPE) rgba[i][GCOMP]; \ dst[i*3+2] = (TYPE) rgba[i][BCOMP]; \ } \ break; \ case GL_RGBA: \ for (i=0;i<n;i++) { \ dst[i*4+0] = (TYPE) rgba[i][RCOMP]; \ dst[i*4+1] = (TYPE) rgba[i][GCOMP]; \ dst[i*4+2] = (TYPE) rgba[i][BCOMP]; \ dst[i*4+3] = (TYPE) rgba[i][ACOMP]; \ } \ break; \ case GL_BGR: \ for (i=0;i<n;i++) { \ dst[i*3+0] = (TYPE) rgba[i][BCOMP]; \ dst[i*3+1] = (TYPE) rgba[i][GCOMP]; \ dst[i*3+2] = (TYPE) rgba[i][RCOMP]; \ } \ break; \ case GL_BGRA: \ for (i=0;i<n;i++) { \ dst[i*4+0] = (TYPE) rgba[i][BCOMP]; \ dst[i*4+1] = (TYPE) rgba[i][GCOMP]; \ dst[i*4+2] = (TYPE) rgba[i][RCOMP]; \ dst[i*4+3] = (TYPE) rgba[i][ACOMP]; \ } \ break; \ case GL_ABGR_EXT: \ for (i=0;i<n;i++) { \ dst[i*4+0] = (TYPE) rgba[i][ACOMP]; \ dst[i*4+1] = (TYPE) rgba[i][BCOMP]; \ dst[i*4+2] = (TYPE) rgba[i][GCOMP]; \ dst[i*4+3] = (TYPE) rgba[i][RCOMP]; \ } \ break; \ default: \ _mesa_problem(ctx, "bad format in pack_histogram"); \ } \ } switch (type) { case GL_UNSIGNED_BYTE: { GLubyte *dst = (GLubyte *) destination; PACK_MACRO(GLubyte); } break; case GL_BYTE: { GLbyte *dst = (GLbyte *) destination; PACK_MACRO(GLbyte); } break; case GL_UNSIGNED_SHORT: { GLushort *dst = (GLushort *) destination; PACK_MACRO(GLushort); if (packing->SwapBytes) { _mesa_swap2(dst, n * comps); } } break; case GL_SHORT: { GLshort *dst = (GLshort *) destination; PACK_MACRO(GLshort); if (packing->SwapBytes) { _mesa_swap2((GLushort *) dst, n * comps); } } break; case GL_UNSIGNED_INT: { GLuint *dst = (GLuint *) destination; PACK_MACRO(GLuint); if (packing->SwapBytes) { _mesa_swap4(dst, n * comps); } } break; case GL_INT: { GLint *dst = (GLint *) destination; PACK_MACRO(GLint); if (packing->SwapBytes) { _mesa_swap4((GLuint *) dst, n * comps); } } break; case GL_FLOAT: { GLfloat *dst = (GLfloat *) destination; PACK_MACRO(GLfloat); if (packing->SwapBytes) { _mesa_swap4((GLuint *) dst, n * comps); } } break; case GL_HALF_FLOAT_ARB: { /* temporarily store as GLuints */ GLuint temp[4*HISTOGRAM_TABLE_SIZE]; GLuint *dst = temp; GLhalfARB *half = (GLhalfARB *) destination; GLuint i; /* get GLuint values */ PACK_MACRO(GLuint); /* convert to GLhalf */ for (i = 0; i < n * comps; i++) { half[i] = _mesa_float_to_half((GLfloat) temp[i]); } if (packing->SwapBytes) { _mesa_swap2((GLushort *) half, n * comps); } } break; case GL_UNSIGNED_BYTE_3_3_2: if (format == GL_RGB) { GLubyte *dst = (GLubyte *) destination; GLuint i; for (i = 0; i < n; i++) { dst[i] = ((rgba[i][RCOMP] & 0x7) << 5) | ((rgba[i][GCOMP] & 0x7) << 2) | ((rgba[i][BCOMP] & 0x3) ); } } else { GLubyte *dst = (GLubyte *) destination; GLuint i; ASSERT(format == GL_BGR); for (i = 0; i < n; i++) { dst[i] = ((rgba[i][BCOMP] & 0x7) << 5) | ((rgba[i][GCOMP] & 0x7) << 2) | ((rgba[i][RCOMP] & 0x3) ); } } break; case GL_UNSIGNED_BYTE_2_3_3_REV: if (format == GL_RGB) { GLubyte *dst = (GLubyte *) destination; GLuint i; for (i = 0; i < n; i++) { dst[i] = ((rgba[i][RCOMP] & 0x3) << 6) | ((rgba[i][GCOMP] & 0x7) << 3) | ((rgba[i][BCOMP] & 0x7) ); } } else { GLubyte *dst = (GLubyte *) destination; GLuint i; ASSERT(format == GL_BGR); for (i = 0; i < n; i++) { dst[i] = ((rgba[i][BCOMP] & 0x3) << 6) | ((rgba[i][GCOMP] & 0x7) << 3) | ((rgba[i][RCOMP] & 0x7) ); } } break; case GL_UNSIGNED_SHORT_5_6_5: if (format == GL_RGB) { GLushort *dst = (GLushort *) destination; GLuint i; for (i = 0; i < n; i++) { dst[i] = ((rgba[i][RCOMP] & 0x1f) << 11) | ((rgba[i][GCOMP] & 0x3f) << 5) | ((rgba[i][BCOMP] & 0x1f) ); } } else { GLushort *dst = (GLushort *) destination; GLuint i; ASSERT(format == GL_BGR); for (i = 0; i < n; i++) { dst[i] = ((rgba[i][BCOMP] & 0x1f) << 11) | ((rgba[i][GCOMP] & 0x3f) << 5) | ((rgba[i][RCOMP] & 0x1f) ); } } break; case GL_UNSIGNED_SHORT_5_6_5_REV: if (format == GL_RGB) { GLushort *dst = (GLushort *) destination; GLuint i; for (i = 0; i < n; i++) { dst[i] = ((rgba[i][BCOMP] & 0x1f) << 11) | ((rgba[i][GCOMP] & 0x3f) << 5) | ((rgba[i][RCOMP] & 0x1f) ); } } else { GLushort *dst = (GLushort *) destination; GLuint i; ASSERT(format == GL_BGR); for (i = 0; i < n; i++) { dst[i] = ((rgba[i][RCOMP] & 0x1f) << 11) | ((rgba[i][GCOMP] & 0x3f) << 5) | ((rgba[i][BCOMP] & 0x1f) ); } } break; case GL_UNSIGNED_SHORT_4_4_4_4: if (format == GL_RGBA) { GLushort *dst = (GLushort *) destination; GLuint i; for (i = 0; i < n; i++) { dst[i] = ((rgba[i][RCOMP] & 0xf) << 12) | ((rgba[i][GCOMP] & 0xf) << 8) | ((rgba[i][BCOMP] & 0xf) << 4) | ((rgba[i][ACOMP] & 0xf) ); } } else if (format == GL_BGRA) { GLushort *dst = (GLushort *) destination; GLuint i; for (i = 0; i < n; i++) { dst[i] = ((rgba[i][BCOMP] & 0xf) << 12) | ((rgba[i][GCOMP] & 0xf) << 8) | ((rgba[i][RCOMP] & 0xf) << 4) | ((rgba[i][ACOMP] & 0xf) ); } } else { GLushort *dst = (GLushort *) destination; GLuint i; ASSERT(format == GL_ABGR_EXT); for (i = 0; i < n; i++) { dst[i] = ((rgba[i][ACOMP] & 0xf) << 12) | ((rgba[i][BCOMP] & 0xf) << 8) | ((rgba[i][GCOMP] & 0xf) << 4) | ((rgba[i][RCOMP] & 0xf) ); } } break; case GL_UNSIGNED_SHORT_4_4_4_4_REV: if (format == GL_RGBA) { GLushort *dst = (GLushort *) destination; GLuint i; for (i = 0; i < n; i++) { dst[i] = ((rgba[i][ACOMP] & 0xf) << 12) | ((rgba[i][BCOMP] & 0xf) << 8) | ((rgba[i][GCOMP] & 0xf) << 4) | ((rgba[i][RCOMP] & 0xf) ); } } else if (format == GL_BGRA) { GLushort *dst = (GLushort *) destination; GLuint i; for (i = 0; i < n; i++) { dst[i] = ((rgba[i][ACOMP] & 0xf) << 12) | ((rgba[i][RCOMP] & 0xf) << 8) | ((rgba[i][GCOMP] & 0xf) << 4) | ((rgba[i][BCOMP] & 0xf) ); } } else { GLushort *dst = (GLushort *) destination; GLuint i; ASSERT(format == GL_ABGR_EXT); for (i = 0; i < n; i++) { dst[i] = ((rgba[i][RCOMP] & 0xf) << 12) | ((rgba[i][GCOMP] & 0xf) << 8) | ((rgba[i][BCOMP] & 0xf) << 4) | ((rgba[i][ACOMP] & 0xf) ); } } break; case GL_UNSIGNED_SHORT_5_5_5_1: if (format == GL_RGBA) { GLushort *dst = (GLushort *) destination; GLuint i; for (i = 0; i < n; i++) { dst[i] = ((rgba[i][RCOMP] & 0x1f) << 11) | ((rgba[i][GCOMP] & 0x1f) << 6) | ((rgba[i][BCOMP] & 0x1f) << 1) | ((rgba[i][ACOMP] & 0x1) ); } } else if (format == GL_BGRA) { GLushort *dst = (GLushort *) destination; GLuint i; for (i = 0; i < n; i++) { dst[i] = ((rgba[i][BCOMP] & 0x1f) << 11) | ((rgba[i][GCOMP] & 0x1f) << 6) | ((rgba[i][RCOMP] & 0x1f) << 1) | ((rgba[i][ACOMP] & 0x1) ); } } else { GLushort *dst = (GLushort *) destination; GLuint i; ASSERT(format == GL_ABGR_EXT); for (i = 0; i < n; i++) { dst[i] = ((rgba[i][ACOMP] & 0x1f) << 11) | ((rgba[i][BCOMP] & 0x1f) << 6) | ((rgba[i][GCOMP] & 0x1f) << 1) | ((rgba[i][RCOMP] & 0x1) ); } } break; case GL_UNSIGNED_SHORT_1_5_5_5_REV: if (format == GL_RGBA) { GLushort *dst = (GLushort *) destination; GLuint i; for (i = 0; i < n; i++) { dst[i] = ((rgba[i][ACOMP] & 0x1f) << 11) | ((rgba[i][BCOMP] & 0x1f) << 6) | ((rgba[i][GCOMP] & 0x1f) << 1) | ((rgba[i][RCOMP] & 0x1) ); } } else if (format == GL_BGRA) { GLushort *dst = (GLushort *) destination; GLuint i; for (i = 0; i < n; i++) { dst[i] = ((rgba[i][ACOMP] & 0x1f) << 11) | ((rgba[i][RCOMP] & 0x1f) << 6) | ((rgba[i][GCOMP] & 0x1f) << 1) | ((rgba[i][BCOMP] & 0x1) ); } } else { GLushort *dst = (GLushort *) destination; GLuint i; ASSERT(format == GL_ABGR_EXT); for (i = 0; i < n; i++) { dst[i] = ((rgba[i][RCOMP] & 0x1f) << 11) | ((rgba[i][GCOMP] & 0x1f) << 6) | ((rgba[i][BCOMP] & 0x1f) << 1) | ((rgba[i][ACOMP] & 0x1) ); } } break; case GL_UNSIGNED_INT_8_8_8_8: if (format == GL_RGBA) { GLuint *dst = (GLuint *) destination; GLuint i; for (i = 0; i < n; i++) { dst[i] = ((rgba[i][RCOMP] & 0xff) << 24) | ((rgba[i][GCOMP] & 0xff) << 16) | ((rgba[i][BCOMP] & 0xff) << 8) | ((rgba[i][ACOMP] & 0xff) ); } } else if (format == GL_BGRA) { GLuint *dst = (GLuint *) destination; GLuint i; for (i = 0; i < n; i++) { dst[i] = ((rgba[i][BCOMP] & 0xff) << 24) | ((rgba[i][GCOMP] & 0xff) << 16) | ((rgba[i][RCOMP] & 0xff) << 8) | ((rgba[i][ACOMP] & 0xff) ); } } else { GLuint *dst = (GLuint *) destination; GLuint i; ASSERT(format == GL_ABGR_EXT); for (i = 0; i < n; i++) { dst[i] = ((rgba[i][ACOMP] & 0xff) << 24) | ((rgba[i][BCOMP] & 0xff) << 16) | ((rgba[i][GCOMP] & 0xff) << 8) | ((rgba[i][RCOMP] & 0xff) ); } } break; case GL_UNSIGNED_INT_8_8_8_8_REV: if (format == GL_RGBA) { GLuint *dst = (GLuint *) destination; GLuint i; for (i = 0; i < n; i++) { dst[i] = ((rgba[i][ACOMP] & 0xff) << 24) | ((rgba[i][BCOMP] & 0xff) << 16) | ((rgba[i][GCOMP] & 0xff) << 8) | ((rgba[i][RCOMP] & 0xff) ); } } else if (format == GL_BGRA) { GLuint *dst = (GLuint *) destination; GLuint i; for (i = 0; i < n; i++) { dst[i] = ((rgba[i][ACOMP] & 0xff) << 24) | ((rgba[i][RCOMP] & 0xff) << 16) | ((rgba[i][GCOMP] & 0xff) << 8) | ((rgba[i][BCOMP] & 0xff) ); } } else { GLuint *dst = (GLuint *) destination; GLuint i; ASSERT(format == GL_ABGR_EXT); for (i = 0; i < n; i++) { dst[i] = ((rgba[i][RCOMP] & 0xff) << 24) | ((rgba[i][GCOMP] & 0xff) << 16) | ((rgba[i][BCOMP] & 0xff) << 8) | ((rgba[i][ACOMP] & 0xff) ); } } break; case GL_UNSIGNED_INT_10_10_10_2: if (format == GL_RGBA) { GLuint *dst = (GLuint *) destination; GLuint i; for (i = 0; i < n; i++) { dst[i] = ((rgba[i][RCOMP] & 0x3ff) << 22) | ((rgba[i][GCOMP] & 0x3ff) << 12) | ((rgba[i][BCOMP] & 0x3ff) << 2) | ((rgba[i][ACOMP] & 0x3) ); } } else if (format == GL_BGRA) { GLuint *dst = (GLuint *) destination; GLuint i; for (i = 0; i < n; i++) { dst[i] = ((rgba[i][BCOMP] & 0x3ff) << 22) | ((rgba[i][GCOMP] & 0x3ff) << 12) | ((rgba[i][RCOMP] & 0x3ff) << 2) | ((rgba[i][ACOMP] & 0x3) ); } } else { GLuint *dst = (GLuint *) destination; GLuint i; ASSERT(format == GL_ABGR_EXT); for (i = 0; i < n; i++) { dst[i] = ((rgba[i][ACOMP] & 0x3ff) << 22) | ((rgba[i][BCOMP] & 0x3ff) << 12) | ((rgba[i][GCOMP] & 0x3ff) << 2) | ((rgba[i][RCOMP] & 0x3) ); } } break; case GL_UNSIGNED_INT_2_10_10_10_REV: if (format == GL_RGBA) { GLuint *dst = (GLuint *) destination; GLuint i; for (i = 0; i < n; i++) { dst[i] = ((rgba[i][ACOMP] & 0x3ff) << 22) | ((rgba[i][BCOMP] & 0x3ff) << 12) | ((rgba[i][GCOMP] & 0x3ff) << 2) | ((rgba[i][RCOMP] & 0x3) ); } } else if (format == GL_BGRA) { GLuint *dst = (GLuint *) destination; GLuint i; for (i = 0; i < n; i++) { dst[i] = ((rgba[i][ACOMP] & 0x3ff) << 22) | ((rgba[i][RCOMP] & 0x3ff) << 12) | ((rgba[i][GCOMP] & 0x3ff) << 2) | ((rgba[i][BCOMP] & 0x3) ); } } else { GLuint *dst = (GLuint *) destination; GLuint i; ASSERT(format == GL_ABGR_EXT); for (i = 0; i < n; i++) { dst[i] = ((rgba[i][RCOMP] & 0x3ff) << 22) | ((rgba[i][GCOMP] & 0x3ff) << 12) | ((rgba[i][BCOMP] & 0x3ff) << 2) | ((rgba[i][ACOMP] & 0x3) ); } } break; default: _mesa_problem(ctx, "Bad type in pack_histogram"); } #undef PACK_MACRO }