radeonsi: force level zero on image instructions in non-fragment shaders (v2)
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Thu, 12 May 2016 17:44:44 +0000 (12:44 -0500)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Tue, 17 May 2016 20:28:40 +0000 (15:28 -0500)
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)
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/drivers/radeonsi/si_shader.c

index 4c5993eec062c51914839eae8d89b38f9606119d..6166403f5497adab91a088e5d82220cab02752b5 100644 (file)
@@ -4308,6 +4308,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;
@@ -4344,9 +4345,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:
@@ -4358,6 +4362,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);