[Mesa-dev] [PATCH 3/4] radv/ac: Use constants for immutable samplers.

Bas Nieuwenhuizen bas at basnieuwenhuizen.nl
Mon Feb 27 23:08:08 UTC 2017


Signed-off-by: Bas Nieuwenhuizen <basni at google.com>
---
 src/amd/common/ac_nir_to_llvm.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c
index 4f3d689db7e..db7194c3086 100644
--- a/src/amd/common/ac_nir_to_llvm.c
+++ b/src/amd/common/ac_nir_to_llvm.c
@@ -3383,6 +3383,7 @@ static LLVMValueRef get_sampler_desc(struct nir_to_llvm_context *ctx,
 	LLVMBuilderRef builder = ctx->builder;
 	LLVMTypeRef type;
 	LLVMValueRef index = NULL;
+	unsigned constant_index = 0;
 
 	assert(deref->var->data.binding < layout->binding_count);
 
@@ -3419,6 +3420,21 @@ static LLVMValueRef get_sampler_desc(struct nir_to_llvm_context *ctx,
 		if (child->deref_array_type == nir_deref_array_type_indirect) {
 			index = get_src(ctx, child->indirect);
 		}
+
+		constant_index = child->base_offset;
+	}
+	if (desc_type == DESC_SAMPLER && binding->immutable_samplers &&
+	    (!index || binding->immutable_samplers_equal)) {
+		if (binding->immutable_samplers_equal)
+			constant_index = 0;
+
+		LLVMValueRef constants[] = {
+			LLVMConstInt(ctx->i32, binding->immutable_samplers[constant_index * 4 + 0], 0),
+			LLVMConstInt(ctx->i32, binding->immutable_samplers[constant_index * 4 + 1], 0),
+			LLVMConstInt(ctx->i32, binding->immutable_samplers[constant_index * 4 + 2], 0),
+			LLVMConstInt(ctx->i32, binding->immutable_samplers[constant_index * 4 + 3], 0),
+		};
+		return ac_build_gather_values(&ctx->ac, constants, 4);
 	}
 
 	assert(stride % type_size == 0);
-- 
2.11.1



More information about the mesa-dev mailing list