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];
+ union gl_color_union color;
switch (firstImage->_BaseFormat) {
case GL_DEPTH_COMPONENT:
* 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];
+ color.ui[0] = sampler->BorderColor.ui[0];
+ color.ui[1] = sampler->BorderColor.ui[0];
+ color.ui[2] = sampler->BorderColor.ui[0];
+ color.ui[3] = sampler->BorderColor.ui[0];
break;
case GL_ALPHA:
- color[0] = 0.0;
- color[1] = 0.0;
- color[2] = 0.0;
- color[3] = sampler->BorderColor.f[3];
+ color.ui[0] = 0u;
+ color.ui[1] = 0u;
+ color.ui[2] = 0u;
+ color.ui[3] = sampler->BorderColor.ui[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];
+ color.ui[0] = sampler->BorderColor.ui[0];
+ color.ui[1] = sampler->BorderColor.ui[0];
+ color.ui[2] = sampler->BorderColor.ui[0];
+ color.ui[3] = sampler->BorderColor.ui[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;
+ color.ui[0] = sampler->BorderColor.ui[0];
+ color.ui[1] = sampler->BorderColor.ui[0];
+ color.ui[2] = sampler->BorderColor.ui[0];
+ color.ui[3] = float_as_int(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];
+ color.ui[0] = sampler->BorderColor.ui[0];
+ color.ui[1] = sampler->BorderColor.ui[0];
+ color.ui[2] = sampler->BorderColor.ui[0];
+ color.ui[3] = sampler->BorderColor.ui[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];
+ color.ui[0] = sampler->BorderColor.ui[0];
+ color.ui[1] = sampler->BorderColor.ui[1];
+ color.ui[2] = sampler->BorderColor.ui[2];
+ color.ui[3] = sampler->BorderColor.ui[3];
break;
}
* the border color alpha to 1.0 in that case.
*/
if (firstImage->_BaseFormat == GL_RGB)
- color[3] = 1.0;
+ color.ui[3] = float_as_int(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.
+ * format. This matches the sampler->BorderColor union exactly; just
+ * memcpy the values.
*/
- float *sdc = brw_state_batch(brw, AUB_TRACE_SAMPLER_DEFAULT_COLOR,
- 4 * 4, 64, sdc_offset);
- COPY_4FV(sdc, color);
+ uint32_t *sdc = brw_state_batch(brw, AUB_TRACE_SAMPLER_DEFAULT_COLOR,
+ 4 * 4, 64, sdc_offset);
+ memcpy(sdc, color.ui, 4 * 4);
} else if (brw->gen == 5 || brw->gen == 6) {
struct gen5_sampler_default_color *sdc;
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_UBYTE(sdc->ub[0], color.f[0]);
+ UNCLAMPED_FLOAT_TO_UBYTE(sdc->ub[1], color.f[1]);
+ UNCLAMPED_FLOAT_TO_UBYTE(sdc->ub[2], color.f[2]);
+ UNCLAMPED_FLOAT_TO_UBYTE(sdc->ub[3], color.f[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_USHORT(sdc->us[0], color.f[0]);
+ UNCLAMPED_FLOAT_TO_USHORT(sdc->us[1], color.f[1]);
+ UNCLAMPED_FLOAT_TO_USHORT(sdc->us[2], color.f[2]);
+ UNCLAMPED_FLOAT_TO_USHORT(sdc->us[3], color.f[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]);
+ UNCLAMPED_FLOAT_TO_SHORT(sdc->s[0], color.f[0]);
+ UNCLAMPED_FLOAT_TO_SHORT(sdc->s[1], color.f[1]);
+ UNCLAMPED_FLOAT_TO_SHORT(sdc->s[2], color.f[2]);
+ UNCLAMPED_FLOAT_TO_SHORT(sdc->s[3], color.f[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->hf[0] = _mesa_float_to_half(color.f[0]);
+ sdc->hf[1] = _mesa_float_to_half(color.f[1]);
+ sdc->hf[2] = _mesa_float_to_half(color.f[2]);
+ sdc->hf[3] = _mesa_float_to_half(color.f[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];
+ sdc->f[0] = color.f[0];
+ sdc->f[1] = color.f[1];
+ sdc->f[2] = color.f[2];
+ sdc->f[3] = color.f[3];
} else {
float *sdc = brw_state_batch(brw, AUB_TRACE_SAMPLER_DEFAULT_COLOR,
4 * 4, 32, sdc_offset);
- memcpy(sdc, color, 4 * 4);
+ memcpy(sdc, color.f, 4 * 4);
}
}