On 4/11/19 3:30 AM, Marek Olšák wrote:
From: Marek Olšák <marek.ol...@amd.com>

---
  src/amd/common/ac_nir_to_llvm.c | 70 +++------------------------------
  1 file changed, 5 insertions(+), 65 deletions(-)

diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c
index 3d2f738edec..3abde6e0969 100644
--- a/src/amd/common/ac_nir_to_llvm.c
+++ b/src/amd/common/ac_nir_to_llvm.c
@@ -2323,92 +2323,32 @@ static int image_type_to_components_count(enum 
glsl_sampler_dim dim, bool array)
        case GLSL_SAMPLER_DIM_SUBPASS:
                return 2;
        case GLSL_SAMPLER_DIM_SUBPASS_MS:
                return 3;
        default:
                break;
        }
        return 0;
  }
-
-/* Adjust the sample index according to FMASK.
- *
- * For uncompressed MSAA surfaces, FMASK should return 0x76543210,
- * which is the identity mapping. Each nibble says which physical sample
- * should be fetched to get that sample.
- *
- * For example, 0x11111100 means there are only 2 samples stored and
- * the second sample covers 3/4 of the pixel. When reading samples 0
- * and 1, return physical sample 0 (determined by the first two 0s
- * in FMASK), otherwise return physical sample 1.
- *
- * The sample index should be adjusted as follows:
- *   sample_index = (fmask >> (sample_index * 4)) & 0xF;
- */
  static LLVMValueRef adjust_sample_index_using_fmask(struct ac_llvm_context 
*ctx,
                                                    LLVMValueRef coord_x, 
LLVMValueRef coord_y,
                                                    LLVMValueRef coord_z,
                                                    LLVMValueRef sample_index,
                                                    LLVMValueRef fmask_desc_ptr)
  {
-       struct ac_image_args args = {0};
-       LLVMValueRef res;
+       unsigned sample_chan = coord_z ? 3 : 2;
+       LLVMValueRef addr[4] = {coord_x, coord_y, coord_z};
+       addr[sample_chan] = sample_index;
- args.coords[0] = coord_x;
-       args.coords[1] = coord_y;
-       if (coord_z)
-               args.coords[2] = coord_z;
-
-       args.opcode = ac_image_load;
-       args.dim = coord_z ? ac_image_2darray : ac_image_2d;
-       args.resource = fmask_desc_ptr;
-       args.dmask = 0xf;
-       args.attributes = AC_FUNC_ATTR_READNONE;
-
-       res = ac_build_image_opcode(ctx, &args);
-
-       res = ac_to_integer(ctx, res);
-       LLVMValueRef four = LLVMConstInt(ctx->i32, 4, false);
-       LLVMValueRef F = LLVMConstInt(ctx->i32, 0xf, false);
-
-       LLVMValueRef fmask = LLVMBuildExtractElement(ctx->builder,
-                                                    res,
-                                                    ctx->i32_0, "");
-
-       LLVMValueRef sample_index4 =
-               LLVMBuildMul(ctx->builder, sample_index, four, "");
-       LLVMValueRef shifted_fmask =
-               LLVMBuildLShr(ctx->builder, fmask, sample_index4, "");
-       LLVMValueRef final_sample =
-               LLVMBuildAnd(ctx->builder, shifted_fmask, F, "");

The only difference is the mask (ie. ac_apply_fmask_to_sample uses 0x7) while this code uses 0xF.

According to the comment in that function, I assume 0x7 is the correct value?

-
-       /* Don't rewrite the sample index if WORD1.DATA_FORMAT of the FMASK
-        * resource descriptor is 0 (invalid),
-        */
-       LLVMValueRef fmask_desc =
-               LLVMBuildBitCast(ctx->builder, fmask_desc_ptr,
-                                ctx->v8i32, "");
-
-       LLVMValueRef fmask_word1 =
-               LLVMBuildExtractElement(ctx->builder, fmask_desc,
-                                       ctx->i32_1, "");
-
-       LLVMValueRef word1_is_nonzero =
-               LLVMBuildICmp(ctx->builder, LLVMIntNE,
-                             fmask_word1, ctx->i32_0, "");
-
-       /* Replace the MSAA sample index. */
-       sample_index =
-               LLVMBuildSelect(ctx->builder, word1_is_nonzero,
-                               final_sample, sample_index, "");
-       return sample_index;
+       ac_apply_fmask_to_sample(ctx, fmask_desc_ptr, addr, coord_z != NULL);
+       return addr[sample_chan];
  }
static nir_deref_instr *get_image_deref(const nir_intrinsic_instr *instr)
  {
        assert(instr->src[0].is_ssa);
        return nir_instr_as_deref(instr->src[0].ssa->parent_instr);
  }
static LLVMValueRef get_image_descriptor(struct ac_nir_context *ctx,
                                           const nir_intrinsic_instr *instr,
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to