[Mesa-dev] [PATCH 2/3] i965: Use a gl_color_union for sampler border color.

Ian Romanick idr at freedesktop.org
Fri Feb 6 04:47:24 PST 2015


On 02/06/2015 02:32 PM, Kenneth Graunke wrote:
> This should have no effect, but will make it easier to implement other
> bug fixes.
> 
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> Cc: Chris Forbes <chrisf at ijw.co.nz>
> Cc: mesa-stable at lists.freedesktop.org
> ---
>  src/mesa/drivers/dri/i965/brw_sampler_state.c | 107 +++++++++++++-------------
>  1 file changed, 54 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 0fe0853..c6a8ab1 100644
> --- a/src/mesa/drivers/dri/i965/brw_sampler_state.c
> +++ b/src/mesa/drivers/dri/i965/brw_sampler_state.c
> @@ -208,7 +208,9 @@ 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;
> +
> +   unsigned one = float_as_int(1.0);

const?

Either way, this patch is

Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>

>  
>     switch (firstImage->_BaseFormat) {
>     case GL_DEPTH_COMPONENT:
> @@ -216,40 +218,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] = one;
>        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 +260,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] = one;
>  
>     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 +279,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);
>     }
>  }
>  
> 



More information about the mesa-dev mailing list