[Mesa-dev] [PATCH v2] i965: Handle lum, intensity and missing components in the fast clear
Neil Roberts
neil at linux.intel.com
Mon Nov 23 08:17:02 PST 2015
I've pushed this patch to master but I think it would be a good
candidate to go on the 11.1 branch as well. Do I have to do something to
make that happen?
- Neil
Neil Roberts <neil at linux.intel.com> writes:
> It looks like the sampler hardware doesn't take into account the
> surface format when sampling a cleared color after a fast clear has
> been done. So for example if you clear a GL_RED surface to 1,1,1,1
> then the sampling instructions will return 1,1,1,1 instead of 1,0,0,1.
> This patch makes it override the color that is programmed in the
> surface state in order to swizzle for luminance and intensity as well
> as overriding the missing components.
>
> v2: Handle luminance and intensity formats
> ---
>
> I made a more extensive test case which tests all of the formats in
> fbo_formats.h as well as using more than one test color here:
>
> http://patchwork.freedesktop.org/patch/64578/
>
> In the process I noticed that there is a similar problem with
> luminance and intensity textures so here is a v2 to cope with that.
>
> I've made another version of this patch which is rebased on top of
> Ben's skl-fast-clear branch so we can take whichever version depending
> on which lands first:
>
> https://github.com/bpeel/mesa/commit/da7edcb6dfd93c7dd86b2e148c44dff7
>
> src/mesa/drivers/dri/i965/brw_meta_fast_clear.c | 38 +++++++++++++++++++++++--
> 1 file changed, 35 insertions(+), 3 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_meta_fast_clear.c b/src/mesa/drivers/dri/i965/brw_meta_fast_clear.c
> index 69fe7b4..3071590 100644
> --- a/src/mesa/drivers/dri/i965/brw_meta_fast_clear.c
> +++ b/src/mesa/drivers/dri/i965/brw_meta_fast_clear.c
> @@ -361,12 +361,43 @@ is_color_fast_clear_compatible(struct brw_context *brw,
> * SURFACE_STATE.
> */
> static uint32_t
> -compute_fast_clear_color_bits(const union gl_color_union *color)
> +compute_fast_clear_color_bits(mesa_format format,
> + const union gl_color_union *color)
> {
> + union gl_color_union override_color = *color;
> uint32_t bits = 0;
> +
> + /* The sampler doesn't look at the format of the surface when the fast
> + * clear color is used so we need to implement luminance, intensity and
> + * missing components manually.
> + */
> + switch (_mesa_get_format_base_format(format)) {
> + case GL_INTENSITY:
> + override_color.ui[3] = override_color.ui[0];
> + /* flow through */
> + case GL_LUMINANCE:
> + case GL_LUMINANCE_ALPHA:
> + override_color.ui[1] = override_color.ui[0];
> + override_color.ui[2] = override_color.ui[0];
> + break;
> + default:
> + for (int i = 0; i < 3; i++) {
> + if (!_mesa_format_has_color_component(format, i))
> + override_color.ui[i] = 0;
> + }
> + break;
> + }
> +
> + if (!_mesa_format_has_color_component(format, 3)) {
> + if (_mesa_is_format_integer_color(format))
> + override_color.ui[3] = 1;
> + else
> + override_color.f[3] = 1.0f;
> + }
> +
> for (int i = 0; i < 4; i++) {
> /* Testing for non-0 works for integer and float colors */
> - if (color->f[i] != 0.0f)
> + if (override_color.f[i] != 0.0f)
> bits |= 1 << (GEN7_SURFACE_CLEAR_COLOR_SHIFT + (3 - i));
> }
> return bits;
> @@ -505,7 +536,8 @@ brw_meta_fast_clear(struct brw_context *brw, struct gl_framebuffer *fb,
> switch (clear_type) {
> case FAST_CLEAR:
> irb->mt->fast_clear_color_value =
> - compute_fast_clear_color_bits(&ctx->Color.ClearColor);
> + compute_fast_clear_color_bits(irb->mt->format,
> + &ctx->Color.ClearColor);
> irb->need_downsample = true;
>
> /* If the buffer is already in INTEL_FAST_CLEAR_STATE_CLEAR, the
> --
> 1.9.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list