llvmpipe/linear: move to nir inputs

Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24436>
This commit is contained in:
Dave Airlie
2023-08-03 13:02:57 +10:00
parent 90c4468ed0
commit 129e27a46e
@@ -244,6 +244,7 @@ llvmpipe_fs_variant_linear_llvm(struct llvmpipe_context *lp,
shader->kind == LP_FS_KIND_BLIT_RGB1 ||
shader->kind == LP_FS_KIND_LLVM_LINEAR);
struct nir_shader *nir = shader->base.ir.nir;
struct gallivm_state *gallivm = variant->gallivm;
LLVMTypeRef int8t = LLVMInt8TypeInContext(gallivm->context);
LLVMTypeRef int32t = LLVMInt32TypeInContext(gallivm->context);
@@ -372,35 +373,40 @@ llvmpipe_fs_variant_linear_llvm(struct llvmpipe_context *lp,
*/
LLVMValueRef inputs_ptrs[LP_MAX_LINEAR_INPUTS];
for (unsigned attrib = 0; attrib < shader->info.base.num_inputs; ++attrib) {
assert(attrib < LP_MAX_LINEAR_INPUTS);
if (attrib >= LP_MAX_LINEAR_INPUTS) {
break;
nir_foreach_shader_in_variable(var, nir) {
unsigned slots = nir_variable_count_slots(var, var->type);
for (unsigned s = 0; s < slots; s++) {
unsigned attrib = var->data.driver_location + s;
assert(attrib < LP_MAX_LINEAR_INPUTS);
if (attrib >= LP_MAX_LINEAR_INPUTS) {
break;
}
LLVMValueRef index = LLVMConstInt(int32t, attrib, 0);
LLVMTypeRef input_type = variant->jit_linear_inputs_type;
LLVMValueRef elem =
lp_build_array_get2(bld.gallivm, input_type, interpolators_ptr, index);
assert(LLVMGetTypeKind(LLVMTypeOf(elem)) == LLVMPointerTypeKind);
LLVMTypeRef fetch_type = LLVMPointerType(variant->jit_linear_func_type, 0);
LLVMValueRef fetch_ptr = lp_build_pointer_get2(builder, fetch_type, elem,
LLVMConstInt(int32t, 0, 0));
assert(LLVMGetTypeKind(LLVMTypeOf(fetch_ptr)) == LLVMPointerTypeKind);
/* Pointer to a row of interpolated inputs */
LLVMTypeRef call_type = variant->jit_linear_func_type;
elem = LLVMBuildBitCast(builder, elem, pint8t, "");
LLVMValueRef inputs_ptr = LLVMBuildCall2(builder, call_type, fetch_ptr, &elem, 1, "");
assert(LLVMGetTypeKind(LLVMTypeOf(inputs_ptr)) == LLVMPointerTypeKind);
lp_add_function_attr(inputs_ptr, -1, LP_FUNC_ATTR_NOUNWIND);
lp_build_name(inputs_ptr, "input%u_ptr", attrib);
inputs_ptrs[attrib] = inputs_ptr;
}
LLVMValueRef index = LLVMConstInt(int32t, attrib, 0);
LLVMTypeRef input_type = variant->jit_linear_inputs_type;
LLVMValueRef elem =
lp_build_array_get2(bld.gallivm, input_type, interpolators_ptr, index);
assert(LLVMGetTypeKind(LLVMTypeOf(elem)) == LLVMPointerTypeKind);
LLVMTypeRef fetch_type = LLVMPointerType(variant->jit_linear_func_type, 0);
LLVMValueRef fetch_ptr = lp_build_pointer_get2(builder, fetch_type, elem,
LLVMConstInt(int32t, 0, 0));
assert(LLVMGetTypeKind(LLVMTypeOf(fetch_ptr)) == LLVMPointerTypeKind);
/* Pointer to a row of interpolated inputs */
LLVMTypeRef call_type = variant->jit_linear_func_type;
elem = LLVMBuildBitCast(builder, elem, pint8t, "");
LLVMValueRef inputs_ptr = LLVMBuildCall2(builder, call_type, fetch_ptr, &elem, 1, "");
assert(LLVMGetTypeKind(LLVMTypeOf(inputs_ptr)) == LLVMPointerTypeKind);
lp_add_function_attr(inputs_ptr, -1, LP_FUNC_ATTR_NOUNWIND);
lp_build_name(inputs_ptr, "input%u_ptr", attrib);
inputs_ptrs[attrib] = inputs_ptr;
}
/*