gallivm/nir: add indirect swizzle output loading support
[mesa.git] / src / gallium / auxiliary / draw / draw_llvm.c
index aabece0ce135403f1ce7f5c7d81086cb12ce932f..58636316dfb59c5653eae237d051ea8654dcef76 100644 (file)
@@ -3075,6 +3075,7 @@ draw_tcs_llvm_emit_fetch_input(const struct lp_build_tcs_iface *tes_iface,
                                LLVMValueRef vertex_index,
                                boolean is_aindex_indirect,
                                LLVMValueRef attrib_index,
+                               boolean is_sindex_indirect,
                                LLVMValueRef swizzle_index)
 {
    const struct draw_tcs_llvm_iface *tcs = draw_tcs_llvm_iface(tes_iface);
@@ -3084,7 +3085,7 @@ draw_tcs_llvm_emit_fetch_input(const struct lp_build_tcs_iface *tes_iface,
    LLVMValueRef res;
    struct lp_type type = bld->type;
 
-   if (is_vindex_indirect || is_aindex_indirect) {
+   if (is_vindex_indirect || is_aindex_indirect || is_sindex_indirect) {
       int i;
 
       res = bld->zero;
@@ -3092,6 +3093,7 @@ draw_tcs_llvm_emit_fetch_input(const struct lp_build_tcs_iface *tes_iface,
          LLVMValueRef idx = lp_build_const_int32(gallivm, i);
          LLVMValueRef vert_chan_index = vertex_index;
          LLVMValueRef attr_chan_index = attrib_index;
+         LLVMValueRef swiz_chan_index = swizzle_index;
          LLVMValueRef channel_vec;
 
          if (is_vindex_indirect) {
@@ -3102,10 +3104,14 @@ draw_tcs_llvm_emit_fetch_input(const struct lp_build_tcs_iface *tes_iface,
             attr_chan_index = LLVMBuildExtractElement(builder,
                                                       attrib_index, idx, "");
          }
+         if (is_sindex_indirect) {
+            swiz_chan_index = LLVMBuildExtractElement(builder,
+                                                      swizzle_index, idx, "");
+         }
 
          indices[0] = vert_chan_index;
          indices[1] = attr_chan_index;
-         indices[2] = swizzle_index;
+         indices[2] = swiz_chan_index;
 
          channel_vec = LLVMBuildGEP(builder, tcs->input, indices, 3, "");
          channel_vec = LLVMBuildLoad(builder, channel_vec, "");
@@ -3131,6 +3137,7 @@ draw_tcs_llvm_emit_fetch_output(const struct lp_build_tcs_iface *tes_iface,
                                 LLVMValueRef vertex_index,
                                 boolean is_aindex_indirect,
                                 LLVMValueRef attrib_index,
+                                boolean is_sindex_indirect,
                                 LLVMValueRef swizzle_index,
                                 uint32_t name)
 {
@@ -3141,7 +3148,7 @@ draw_tcs_llvm_emit_fetch_output(const struct lp_build_tcs_iface *tes_iface,
    LLVMValueRef res;
    struct lp_type type = bld->type;
 
-   if (is_vindex_indirect || is_aindex_indirect) {
+   if (is_vindex_indirect || is_aindex_indirect || is_sindex_indirect) {
       int i;
 
       res = bld->zero;
@@ -3149,6 +3156,7 @@ draw_tcs_llvm_emit_fetch_output(const struct lp_build_tcs_iface *tes_iface,
          LLVMValueRef idx = lp_build_const_int32(gallivm, i);
          LLVMValueRef vert_chan_index = vertex_index;
          LLVMValueRef attr_chan_index = attrib_index;
+         LLVMValueRef swiz_chan_index = swizzle_index;
          LLVMValueRef channel_vec;
 
          if (is_vindex_indirect) {
@@ -3159,10 +3167,14 @@ draw_tcs_llvm_emit_fetch_output(const struct lp_build_tcs_iface *tes_iface,
             attr_chan_index = LLVMBuildExtractElement(builder,
                                                       attrib_index, idx, "");
          }
+         if (is_sindex_indirect) {
+            swiz_chan_index = LLVMBuildExtractElement(builder,
+                                                      swizzle_index, idx, "");
+         }
 
          indices[0] = vert_chan_index;
          indices[1] = attr_chan_index;
-         indices[2] = swizzle_index;
+         indices[2] = swiz_chan_index;
 
          channel_vec = LLVMBuildGEP(builder, tcs->output, indices, 3, "");
          channel_vec = LLVMBuildLoad(builder, channel_vec, "");
@@ -3734,6 +3746,7 @@ draw_tes_llvm_fetch_vertex_input(const struct lp_build_tes_iface *tes_iface,
                                  LLVMValueRef vertex_index,
                                  boolean is_aindex_indirect,
                                  LLVMValueRef attrib_index,
+                                 boolean is_sindex_indirect,
                                  LLVMValueRef swizzle_index)
 {
    const struct draw_tes_llvm_iface *tes = draw_tes_llvm_iface(tes_iface);
@@ -3743,7 +3756,7 @@ draw_tes_llvm_fetch_vertex_input(const struct lp_build_tes_iface *tes_iface,
    LLVMValueRef res;
    struct lp_type type = bld->type;
 
-   if (is_vindex_indirect || is_aindex_indirect) {
+   if (is_vindex_indirect || is_aindex_indirect || is_sindex_indirect) {
       int i;
 
       res = bld->zero;
@@ -3752,6 +3765,7 @@ draw_tes_llvm_fetch_vertex_input(const struct lp_build_tes_iface *tes_iface,
          LLVMValueRef idx = lp_build_const_int32(gallivm, i);
          LLVMValueRef vert_chan_index = vertex_index;
          LLVMValueRef attr_chan_index = attrib_index;
+         LLVMValueRef swiz_chan_index = swizzle_index;
          LLVMValueRef channel_vec;
 
          if (is_vindex_indirect) {
@@ -3762,10 +3776,14 @@ draw_tes_llvm_fetch_vertex_input(const struct lp_build_tes_iface *tes_iface,
             attr_chan_index = LLVMBuildExtractElement(builder,
                                                       attrib_index, idx, "");
          }
+         if (is_sindex_indirect) {
+            swiz_chan_index = LLVMBuildExtractElement(builder,
+                                                      swizzle_index, idx, "");
+         }
 
          indices[0] = vert_chan_index;
          indices[1] = attr_chan_index;
-         indices[2] = swizzle_index;
+         indices[2] = swiz_chan_index;
 
          channel_vec = LLVMBuildGEP(builder, tes->input, indices, 3, "");
          channel_vec = LLVMBuildLoad(builder, channel_vec, "");