[Mesa-dev] [PATCH] radeonsi: force level zero on image instructions in non-fragment shaders (v2)
Marek Olšák
maraeo at gmail.com
Mon May 16 08:40:08 UTC 2016
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Marek
On Fri, May 13, 2016 at 7:22 AM, Nicolai Hähnle <nhaehnle at gmail.com> wrote:
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>
> Section 8.9 (Texture Functions) of the OpenGL Shading Language 4.5
> specification:
>
> However, automatic level of detail is computed only for fragment shaders.
> Other shaders operate as though the base level of detail were computed as
> zero.
>
> and Section 8.9.3 (Texture Gather Functions):
>
> When performing a texture gather operation, the minification and
> magnification filters are ignored, and the rules for LINEAR filtering in
> the OpenGL Specification are applied to the base level of the texture
> image to identify the four texels i_0 j_1, i_1 j_1, i_1 j_0, and i_0 j_0.
>
> Of course, explicit LOD or derivative variants work in all shader types.
>
> This fixes several GL4x-CTS.texture_gather.* tests.
>
> v2: TG4 is always level zero (thanks, Ilia)
> ---
> src/gallium/drivers/radeonsi/si_shader.c | 5 +++++
> 1 file changed, 5 insertions(+)
>
> diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
> index 3f937ee..d492c62 100644
> --- a/src/gallium/drivers/radeonsi/si_shader.c
> +++ b/src/gallium/drivers/radeonsi/si_shader.c
> @@ -4301,6 +4301,7 @@ static void build_tex_intrinsic(const struct lp_build_tgsi_action *action,
> struct lp_build_tgsi_context *bld_base,
> struct lp_build_emit_data *emit_data)
> {
> + struct si_shader_context *ctx = si_shader_context(bld_base);
> struct lp_build_context *base = &bld_base->base;
> unsigned opcode = emit_data->inst->Instruction.Opcode;
> unsigned target = emit_data->inst->Texture.Texture;
> @@ -4337,9 +4338,12 @@ static void build_tex_intrinsic(const struct lp_build_tgsi_action *action,
> case TGSI_OPCODE_TEX:
> case TGSI_OPCODE_TEX2:
> case TGSI_OPCODE_TXP:
> + if (ctx->type != PIPE_SHADER_FRAGMENT)
> + infix = ".lz";
> break;
> case TGSI_OPCODE_TXB:
> case TGSI_OPCODE_TXB2:
> + assert(ctx->type == PIPE_SHADER_FRAGMENT);
> infix = ".b";
> break;
> case TGSI_OPCODE_TXL:
> @@ -4351,6 +4355,7 @@ static void build_tex_intrinsic(const struct lp_build_tgsi_action *action,
> break;
> case TGSI_OPCODE_TG4:
> name = "llvm.SI.gather4";
> + infix = ".lz";
> break;
> default:
> assert(0);
> --
> 2.7.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list