[Mesa-dev] [PATCH 2/9] radeonsi: use V_BFE for extracting a sample index
Marek Olšák
maraeo at gmail.com
Mon Mar 2 03:54:16 PST 2015
From: Marek Olšák <marek.olsak at amd.com>
---
src/gallium/drivers/radeonsi/si_shader.c | 22 ++++++++++++++++------
1 file changed, 16 insertions(+), 6 deletions(-)
diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
index b0417ed..f125483 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -192,6 +192,20 @@ static int get_param_index(unsigned semantic_name, unsigned index,
}
/**
+ * BitField Extract: ((value >> rshift) & ((1 << bitwidth) - 1))
+ */
+static LLVMValueRef build_bfe(struct gallivm_state *gallivm,
+ LLVMValueRef value, LLVMValueRef rshift,
+ LLVMValueRef bitwidth)
+{
+ LLVMValueRef args[3] = {value, rshift, bitwidth};
+
+ return build_intrinsic(gallivm->builder, "llvm.AMDGPU.bfe.u32",
+ LLVMInt32TypeInContext(gallivm->context),
+ args, Elements(args), LLVMReadNoneAttribute);
+}
+
+/**
* Build an LLVM bytecode indexed load using LLVMBuildGEP + LLVMBuildLoad.
* It's equivalent to doing a load from &base_ptr[index].
*
@@ -1721,7 +1735,6 @@ static void tex_fetch_args(
/* Initialize some constants. */
LLVMValueRef four = LLVMConstInt(uint_bld->elem_type, 4, 0);
- LLVMValueRef F = LLVMConstInt(uint_bld->elem_type, 0xF, 0);
/* Apply the formula. */
LLVMValueRef fmask =
@@ -1734,11 +1747,8 @@ static void tex_fetch_args(
LLVMValueRef sample_index4 =
LLVMBuildMul(gallivm->builder, address[sample_chan], four, "");
- LLVMValueRef shifted_fmask =
- LLVMBuildLShr(gallivm->builder, fmask, sample_index4, "");
-
- LLVMValueRef final_sample =
- LLVMBuildAnd(gallivm->builder, shifted_fmask, F, "");
+ LLVMValueRef final_sample = build_bfe(gallivm, fmask,
+ sample_index4, four);
/* Don't rewrite the sample index if WORD1.DATA_FORMAT of the FMASK
* resource descriptor is 0 (invalid),
--
2.1.0
More information about the mesa-dev
mailing list