From e1e73443c572b5432ef66a923fe64b73467f411b Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Tue, 6 May 2014 22:56:17 -0700 Subject: [PATCH] i965: Use a gl_color_union for sampler border color. This should have no effect, but will make it easier to implement other bug fixes. v2: Eliminate "unsigned one" local; just use the value where necessary. Signed-off-by: Kenneth Graunke Reviewed-by: Ian Romanick Cc: mesa-stable@lists.freedesktop.org --- src/mesa/drivers/dri/i965/brw_sampler_state.c | 105 +++++++++--------- 1 file changed, 52 insertions(+), 53 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_sampler_state.c b/src/mesa/drivers/dri/i965/brw_sampler_state.c index 0fe08534203..d9a8eea60c0 100644 --- a/src/mesa/drivers/dri/i965/brw_sampler_state.c +++ b/src/mesa/drivers/dri/i965/brw_sampler_state.c @@ -208,7 +208,7 @@ upload_default_color(struct brw_context *brw, 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: @@ -216,40 +216,40 @@ upload_default_color(struct brw_context *brw, * 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; } @@ -258,18 +258,17 @@ upload_default_color(struct brw_context *brw, * 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; @@ -278,39 +277,39 @@ upload_default_color(struct brw_context *brw, 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); } } -- 2.30.2