diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/auxiliary/draw/draw_llvm.c | 23 | ||||
-rw-r--r-- | src/gallium/auxiliary/gallivm/lp_bld_tgsi.h | 3 | ||||
-rw-r--r-- | src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c | 4 |
3 files changed, 22 insertions, 8 deletions
diff --git a/src/gallium/auxiliary/draw/draw_llvm.c b/src/gallium/auxiliary/draw/draw_llvm.c index 820d6b0..03668d9 100644 --- a/src/gallium/auxiliary/draw/draw_llvm.c +++ b/src/gallium/auxiliary/draw/draw_llvm.c @@ -1360,8 +1360,9 @@ clipmask_booli32(struct gallivm_state *gallivm, static LLVMValueRef draw_gs_llvm_fetch_input(const struct lp_build_tgsi_gs_iface *gs_iface, struct lp_build_tgsi_context * bld_base, - boolean is_indirect, + boolean is_vindex_indirect, LLVMValueRef vertex_index, + boolean is_aindex_indirect, LLVMValueRef attrib_index, LLVMValueRef swizzle_index) { @@ -1372,18 +1373,28 @@ draw_gs_llvm_fetch_input(const struct lp_build_tgsi_gs_iface *gs_iface, LLVMValueRef res; struct lp_type type = bld_base->base.type; - if (is_indirect) { + if (is_vindex_indirect || is_aindex_indirect) { int i; res = bld_base->base.zero; for (i = 0; i < type.length; ++i) { LLVMValueRef idx = lp_build_const_int32(gallivm, i); - LLVMValueRef vert_chan_index = LLVMBuildExtractElement(builder, - vertex_index, idx, ""); + LLVMValueRef vert_chan_index = vertex_index; + LLVMValueRef attr_chan_index = attrib_index; LLVMValueRef channel_vec, value; + + if (is_vindex_indirect) { + vert_chan_index = LLVMBuildExtractElement(builder, + vertex_index, idx, ""); + } + if (is_aindex_indirect) { + attr_chan_index = LLVMBuildExtractElement(builder, + attrib_index, idx, ""); + } + indices[0] = vert_chan_index; - indices[1] = attrib_index; + indices[1] = attr_chan_index; indices[2] = swizzle_index; - + channel_vec = LLVMBuildGEP(builder, gs->input, indices, 3, ""); channel_vec = LLVMBuildLoad(builder, channel_vec, ""); value = LLVMBuildExtractElement(builder, channel_vec, idx, ""); diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h index 522302e..8bcdbc8 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h @@ -395,8 +395,9 @@ struct lp_build_tgsi_gs_iface { LLVMValueRef (*fetch_input)(const struct lp_build_tgsi_gs_iface *gs_iface, struct lp_build_tgsi_context * bld_base, - boolean is_indirect, + boolean is_vindex_indirect, LLVMValueRef vertex_index, + boolean is_aindex_indirect, LLVMValueRef attrib_index, LLVMValueRef swizzle_index); void (*emit_vertex)(const struct lp_build_tgsi_gs_iface *gs_iface, diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c index 4c6b6ec..e50f1d1 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c @@ -1135,7 +1135,9 @@ emit_fetch_gs_input( res = bld->gs_iface->fetch_input(bld->gs_iface, bld_base, reg->Dimension.Indirect, - vertex_index, attrib_index, + vertex_index, + reg->Register.Indirect, + attrib_index, swizzle_index); assert(res); |