i965: Use a gl_color_union for sampler border color.
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 7 May 2014 05:56:17 +0000 (22:56 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Mon, 9 Feb 2015 21:18:58 +0000 (13:18 -0800)
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 <kenneth@whitecape.org>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Cc: mesa-stable@lists.freedesktop.org
src/mesa/drivers/dri/i965/brw_sampler_state.c

index 0fe0853420363beca9597a660f8be2c3bfe11bf4..d9a8eea60c0d5bac1fbf0fb561cbccafc0eaec68 100644 (file)
@@ -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);
    }
 }