radeonsi: split out interpolation input selection
authorDave Airlie <airlied@redhat.com>
Fri, 17 Jul 2015 03:43:09 +0000 (04:43 +0100)
committerDave Airlie <airlied@redhat.com>
Sat, 25 Jul 2015 00:06:41 +0000 (01:06 +0100)
This is prep work for using it in the interpolation code
later.

Also add storage for the input interpolation mode so we
can pick it up later.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
src/gallium/drivers/radeonsi/si_shader.c
src/gallium/drivers/radeonsi/si_shader.h

index 77ba9c9e0a12ff2bfd2683e1856e885559c57158..5a3de96a84667990432dd8e149cf7eccfaa393fb 100644 (file)
@@ -836,6 +836,35 @@ static LLVMValueRef fetch_input_gs(
                                tgsi2llvmtype(bld_base, type), "");
 }
 
+static int lookup_interp_param_index(unsigned interpolate, unsigned location)
+{
+       switch (interpolate) {
+       case TGSI_INTERPOLATE_CONSTANT:
+               return 0;
+
+       case TGSI_INTERPOLATE_LINEAR:
+               if (location == TGSI_INTERPOLATE_LOC_SAMPLE)
+                       return SI_PARAM_LINEAR_SAMPLE;
+               else if (location == TGSI_INTERPOLATE_LOC_CENTROID)
+                       return SI_PARAM_LINEAR_CENTROID;
+               else
+                       return SI_PARAM_LINEAR_CENTER;
+               break;
+       case TGSI_INTERPOLATE_COLOR:
+       case TGSI_INTERPOLATE_PERSPECTIVE:
+               if (location == TGSI_INTERPOLATE_LOC_SAMPLE)
+                       return SI_PARAM_PERSP_SAMPLE;
+               else if (location == TGSI_INTERPOLATE_LOC_CENTROID)
+                       return SI_PARAM_PERSP_CENTROID;
+               else
+                       return SI_PARAM_PERSP_CENTER;
+               break;
+       default:
+               fprintf(stderr, "Warning: Unhandled interpolation mode.\n");
+               return -1;
+       }
+}
+
 static void declare_input_fs(
        struct radeon_llvm_context *radeon_bld,
        unsigned input_index,
@@ -850,7 +879,8 @@ static void declare_input_fs(
        LLVMTypeRef input_type = LLVMFloatTypeInContext(gallivm->context);
        LLVMValueRef main_fn = radeon_bld->main_fn;
 
-       LLVMValueRef interp_param;
+       LLVMValueRef interp_param = NULL;
+       int interp_param_idx;
        const char * intr_name;
 
        /* This value is:
@@ -899,31 +929,13 @@ static void declare_input_fs(
        attr_number = lp_build_const_int32(gallivm,
                                           shader->ps_input_param_offset[input_index]);
 
-       switch (decl->Interp.Interpolate) {
-       case TGSI_INTERPOLATE_CONSTANT:
-               interp_param = 0;
-               break;
-       case TGSI_INTERPOLATE_LINEAR:
-               if (decl->Interp.Location == TGSI_INTERPOLATE_LOC_SAMPLE)
-                       interp_param = LLVMGetParam(main_fn, SI_PARAM_LINEAR_SAMPLE);
-               else if (decl->Interp.Location == TGSI_INTERPOLATE_LOC_CENTROID)
-                       interp_param = LLVMGetParam(main_fn, SI_PARAM_LINEAR_CENTROID);
-               else
-                       interp_param = LLVMGetParam(main_fn, SI_PARAM_LINEAR_CENTER);
-               break;
-       case TGSI_INTERPOLATE_COLOR:
-       case TGSI_INTERPOLATE_PERSPECTIVE:
-               if (decl->Interp.Location == TGSI_INTERPOLATE_LOC_SAMPLE)
-                       interp_param = LLVMGetParam(main_fn, SI_PARAM_PERSP_SAMPLE);
-               else if (decl->Interp.Location == TGSI_INTERPOLATE_LOC_CENTROID)
-                       interp_param = LLVMGetParam(main_fn, SI_PARAM_PERSP_CENTROID);
-               else
-                       interp_param = LLVMGetParam(main_fn, SI_PARAM_PERSP_CENTER);
-               break;
-       default:
-               fprintf(stderr, "Warning: Unhandled interpolation mode.\n");
+       shader->ps_input_interpolate[input_index] = decl->Interp.Interpolate;
+       interp_param_idx = lookup_interp_param_index(decl->Interp.Interpolate,
+                                                    decl->Interp.Location);
+       if (interp_param_idx == -1)
                return;
-       }
+       else if (interp_param_idx)
+               interp_param = LLVMGetParam(main_fn, interp_param_idx);
 
        /* fs.constant returns the param from the middle vertex, so it's not
         * really useful for flat shading. It's meant to be used for custom
index b52714d5abeed5920909d1283a9712659dcc800b..82e9c915965627065d3e168f1721ef78e3059d19 100644 (file)
@@ -258,7 +258,7 @@ struct si_shader {
        unsigned                nparam;
        unsigned                vs_output_param_offset[PIPE_MAX_SHADER_OUTPUTS];
        unsigned                ps_input_param_offset[PIPE_MAX_SHADER_INPUTS];
-
+       unsigned                ps_input_interpolate[PIPE_MAX_SHADER_INPUTS];
        bool                    uses_instanceid;
        unsigned                nr_pos_exports;
        unsigned                nr_param_exports;