mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 11:18:08 +02:00
gallivm: support indirect registers on both dimensions
We support indirect addressing only on the vertex index, but some shaders also use indirect addressing on attributes. This patch adds support for indirect addressing on both dimensions inside gs arrays. Signed-off-by: Zack Rusin <zackr@vmware.com> Reviewed-by: Brian Paul <brianp@vmware.com> Reviewed-by: José Fonseca <jfonseca@vmware.com>
This commit is contained in:
parent
f9b37f7183
commit
e9f1f6ab42
3 changed files with 22 additions and 8 deletions
|
|
@ -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, "");
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue