radeonsi/nir: load VS inputs
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Thu, 8 Jun 2017 16:38:06 +0000 (18:38 +0200)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Mon, 31 Jul 2017 12:55:36 +0000 (14:55 +0200)
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/drivers/radeonsi/si_shader.c
src/gallium/drivers/radeonsi/si_shader_internal.h
src/gallium/drivers/radeonsi/si_shader_nir.c

index 0d25773cc3d835f0db7becd80f784be76eee35df..44ba6ad5d919df1df3c79313ba38503c272210b4 100644 (file)
@@ -409,10 +409,9 @@ static LLVMValueRef extract_double_to_float(struct si_shader_context *ctx,
        return LLVMBuildFPTrunc(builder, value, ctx->f32, "");
 }
 
-static void declare_input_vs(
+void si_llvm_load_input_vs(
        struct si_shader_context *ctx,
        unsigned input_index,
-       const struct tgsi_full_declaration *decl,
        LLVMValueRef out[4])
 {
        struct gallivm_state *gallivm = &ctx->gallivm;
@@ -615,6 +614,14 @@ static void declare_input_vs(
        }
 }
 
+static void declare_input_vs(
+       struct si_shader_context *ctx,
+       unsigned input_index,
+       const struct tgsi_full_declaration *decl,
+       LLVMValueRef out[4])
+{
+       si_llvm_load_input_vs(ctx, input_index, out);
+}
 
 static LLVMValueRef get_primitive_id(struct si_shader_context *ctx,
                                     unsigned swizzle)
index 31b4c30ee90fe43b9a440d7db5f10f161ed19c82..a86fd02217731e059c0c8769f41e6b63acd0695f 100644 (file)
@@ -314,6 +314,11 @@ LLVMTypeRef si_const_array(LLVMTypeRef elem_type, int num_elements);
 void si_shader_context_init_alu(struct lp_build_tgsi_context *bld_base);
 void si_shader_context_init_mem(struct si_shader_context *ctx);
 
+void si_llvm_load_input_vs(
+       struct si_shader_context *ctx,
+       unsigned input_index,
+       LLVMValueRef out[4]);
+
 bool si_nir_build_llvm(struct si_shader_context *ctx, struct nir_shader *nir);
 
 #endif
index 00bcf963bea5e88050366e9cdf8fdb9e0bb1c560..ef0dd9dbf963b4ed18ab1e21d029d6eb1c959a9d 100644 (file)
@@ -313,8 +313,34 @@ void si_nir_scan_shader(const struct nir_shader *nir,
        }
 }
 
+static void declare_nir_input_vs(struct si_shader_context *ctx,
+                                struct nir_variable *variable, unsigned rel,
+                                LLVMValueRef out[4])
+{
+       si_llvm_load_input_vs(ctx, variable->data.driver_location / 4 + rel, out);
+}
+
 bool si_nir_build_llvm(struct si_shader_context *ctx, struct nir_shader *nir)
 {
+       nir_foreach_variable(variable, &nir->inputs) {
+               unsigned attrib_count = glsl_count_attribute_slots(variable->type,
+                                                                  nir->stage == MESA_SHADER_VERTEX);
+               unsigned input_idx = variable->data.driver_location;
+
+               for (unsigned i = 0; i < attrib_count; ++i) {
+                       LLVMValueRef data[4];
+
+                       declare_nir_input_vs(ctx, variable, i, data);
+
+                       for (unsigned chan = 0; chan < 4; chan++) {
+                               ctx->inputs[input_idx + chan] =
+                                       LLVMBuildBitCast(ctx->ac.builder, data[chan], ctx->ac.i32, "");
+                       }
+               }
+       }
+
+       ctx->abi.inputs = &ctx->inputs[0];
+
        ac_nir_translate(&ctx->ac, &ctx->abi, nir, NULL);
 
        return true;