llvmpipe/linear: move to nir inputs
authorDave Airlie <airlied@redhat.com>
Thu, 3 Aug 2023 03:02:57 +0000 (13:02 +1000)
committerDave Airlie <airlied@redhat.com>
Mon, 25 Sep 2023 03:23:07 +0000 (13:23 +1000)
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>

src/gallium/drivers/llvmpipe/lp_state_fs_linear_llvm.c

index a336733..c64f5cf 100644 (file)
@@ -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);
 
-      LLVMValueRef index = LLVMConstInt(int32t, attrib, 0);
+      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;
+         }
 
-      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);
+         LLVMValueRef index = LLVMConstInt(int32t, attrib, 0);
 
-      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);
+         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);
 
-      /* 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);
+         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_add_function_attr(inputs_ptr, -1, LP_FUNC_ATTR_NOUNWIND);
 
-      lp_build_name(inputs_ptr, "input%u_ptr", attrib);
+         lp_build_name(inputs_ptr, "input%u_ptr", attrib);
 
-      inputs_ptrs[attrib] = inputs_ptr;
+         inputs_ptrs[attrib] = inputs_ptr;
+      }
    }
 
    /*