[Mesa-dev] [PATCH] i965/gen4: Fix sampling from integer textures.

Paul Berry stereotype441 at gmail.com
Mon Nov 14 10:03:45 PST 2011


On 9 November 2011 16:11, Eric Anholt <eric at anholt.net> wrote:

> On original gen4, the surface format didn't determine the return data
> type from sampling like it does on g45 and later.
>
> Fixes GL_EXT_texture_integer/texture_integer_glsl130
> ---
>
> The dst type in your patch has already been smashed to UW for 16-wide,
> so it didn't end up working.
>
>  src/mesa/drivers/dri/i965/brw_eu.h        |    3 ++-
>  src/mesa/drivers/dri/i965/brw_eu_emit.c   |   11 +++++++----
>  src/mesa/drivers/dri/i965/brw_fs_emit.cpp |   16 +++++++++++++++-
>  src/mesa/drivers/dri/i965/brw_wm_emit.c   |    6 ++++--
>  4 files changed, 28 insertions(+), 8 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_eu.h
> b/src/mesa/drivers/dri/i965/brw_eu.h
> index 33492f6..dcb1fc9 100644
> --- a/src/mesa/drivers/dri/i965/brw_eu.h
> +++ b/src/mesa/drivers/dri/i965/brw_eu.h
> @@ -928,7 +928,8 @@ void brw_SAMPLE(struct brw_compile *p,
>                GLuint response_length,
>                GLuint msg_length,
>                GLuint header_present,
> -               GLuint simd_mode);
> +               GLuint simd_mode,
> +               GLuint return_format);
>
>  void brw_math_16( struct brw_compile *p,
>                  struct brw_reg dest,
> diff --git a/src/mesa/drivers/dri/i965/brw_eu_emit.c
> b/src/mesa/drivers/dri/i965/brw_eu_emit.c
> index dbb42f4..60350ca 100644
> --- a/src/mesa/drivers/dri/i965/brw_eu_emit.c
> +++ b/src/mesa/drivers/dri/i965/brw_eu_emit.c
> @@ -650,7 +650,8 @@ static void brw_set_sampler_message(struct brw_compile
> *p,
>                                     GLuint response_length,
>                                     GLuint msg_length,
>                                     GLuint header_present,
> -                                    GLuint simd_mode)
> +                                    GLuint simd_mode,
> +                                   GLuint return_format)
>  {
>    struct brw_context *brw = p->brw;
>    struct intel_context *intel = &brw->intel;
> @@ -676,7 +677,7 @@ static void brw_set_sampler_message(struct brw_compile
> *p,
>       insn->bits3.sampler.binding_table_index = binding_table_index;
>       insn->bits3.sampler.sampler = sampler;
>       insn->bits3.sampler.msg_type = msg_type;
> -      insn->bits3.sampler.return_format =
> BRW_SAMPLER_RETURN_FORMAT_FLOAT32;
> +      insn->bits3.sampler.return_format = return_format;
>    }
>  }
>
> @@ -2086,7 +2087,8 @@ void brw_SAMPLE(struct brw_compile *p,
>                GLuint response_length,
>                GLuint msg_length,
>                GLuint header_present,
> -               GLuint simd_mode)
> +               GLuint simd_mode,
> +               GLuint return_format)
>  {
>    struct intel_context *intel = &p->brw->intel;
>    bool need_stall = 0;
> @@ -2180,7 +2182,8 @@ void brw_SAMPLE(struct brw_compile *p,
>                              response_length,
>                              msg_length,
>                              header_present,
> -                             simd_mode);
> +                             simd_mode,
> +                             return_format);
>    }
>
>    if (need_stall) {
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_emit.cpp
> b/src/mesa/drivers/dri/i965/brw_fs_emit.cpp
> index ad4fae2..1ac215e 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_emit.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_emit.cpp
> @@ -256,6 +256,19 @@ fs_visitor::generate_tex(fs_inst *inst, struct
> brw_reg dst, struct brw_reg src)
>    int msg_type = -1;
>    int rlen = 4;
>    uint32_t simd_mode = BRW_SAMPLER_SIMD_MODE_SIMD8;
> +   uint32_t return_format;
> +
> +   switch (dst.type) {
> +   case BRW_REGISTER_TYPE_D:
> +      return_format = BRW_SAMPLER_RETURN_FORMAT_SINT32;
> +      break;
> +   case BRW_REGISTER_TYPE_UD:
> +      return_format = BRW_SAMPLER_RETURN_FORMAT_UINT32;
> +      break;
> +   default:
> +      return_format = BRW_SAMPLER_RETURN_FORMAT_FLOAT32;
> +      break;
> +   }
>
>    if (c->dispatch_width == 16)
>       simd_mode = BRW_SAMPLER_SIMD_MODE_SIMD16;
> @@ -369,7 +382,8 @@ fs_visitor::generate_tex(fs_inst *inst, struct brw_reg
> dst, struct brw_reg src)
>              rlen,
>              inst->mlen,
>              inst->header_present,
> -             simd_mode);
> +             simd_mode,
> +             return_format);
>  }
>
>
> diff --git a/src/mesa/drivers/dri/i965/brw_wm_emit.c
> b/src/mesa/drivers/dri/i965/brw_wm_emit.c
> index a451d56..b5a4a4f 100644
> --- a/src/mesa/drivers/dri/i965/brw_wm_emit.c
> +++ b/src/mesa/drivers/dri/i965/brw_wm_emit.c
> @@ -1162,7 +1162,8 @@ void emit_tex(struct brw_wm_compile *c,
>              response_length,
>              cur_mrf - 1,
>              1,
> -             simd_mode);
> +             simd_mode,
> +             BRW_SAMPLER_RETURN_FORMAT_FLOAT32);
>  }
>
>
> @@ -1240,7 +1241,8 @@ void emit_txb(struct brw_wm_compile *c,
>              response_length,
>              msgLength,
>              1,
> -             BRW_SAMPLER_SIMD_MODE_SIMD16);
> +             BRW_SAMPLER_SIMD_MODE_SIMD16,
> +             BRW_SAMPLER_RETURN_FORMAT_FLOAT32);
>  }
>
>
> --
> 1.7.7
>

Reviewed-by: Paul Berry <stereotype441 at gmail.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20111114/e703d2d9/attachment.htm>


More information about the mesa-dev mailing list