boolean elts);
+struct draw_gs_llvm_iface {
+ struct lp_build_tgsi_gs_iface base;
+
+ struct draw_gs_llvm_variant *variant;
+ LLVMValueRef input;
+};
+
+static INLINE const struct draw_gs_llvm_iface *
+draw_gs_llvm_iface(const struct lp_build_tgsi_gs_iface *iface)
+{
+ return (const struct draw_gs_llvm_iface *)iface;
+}
+
/**
* Create LLVM type for struct draw_jit_texture
*/
return ret;
}
+static LLVMValueRef
+draw_gs_llvm_fetch_input(const struct lp_build_tgsi_gs_iface *gs_iface,
+ struct lp_build_tgsi_context * bld_base,
+ LLVMValueRef vertex_index,
+ LLVMValueRef attrib_index,
+ LLVMValueRef swizzle_index)
+{
+ const struct draw_gs_llvm_iface *gs = draw_gs_llvm_iface(gs_iface);
+ struct gallivm_state *gallivm = bld_base->base.gallivm;
+ LLVMBuilderRef builder = gallivm->builder;
+ LLVMValueRef indices[3];
+ LLVMValueRef res;
+
+ indices[0] = vertex_index;
+ indices[1] = attrib_index;
+ indices[2] = swizzle_index;
+
+ res = LLVMBuildGEP(builder, gs->input, indices, 3, "");
+ res = LLVMBuildLoad(builder, res, "");
+
+ return res;
+}
+
static void
-draw_gs_llvm_emit_vertex(struct lp_build_tgsi_context * bld_base,
+draw_gs_llvm_emit_vertex(const struct lp_build_tgsi_gs_iface *gs_base,
+ struct lp_build_tgsi_context * bld_base,
LLVMValueRef (*outputs)[4],
- LLVMValueRef emitted_vertices_vec,
- void *user_data)
+ LLVMValueRef emitted_vertices_vec)
{
- struct draw_gs_llvm_variant *variant =
- (struct draw_gs_llvm_variant *)user_data;
+ const struct draw_gs_llvm_iface *gs_iface = draw_gs_llvm_iface(gs_base);
+ struct draw_gs_llvm_variant *variant = gs_iface->variant;
struct gallivm_state *gallivm = variant->gallivm;
LLVMBuilderRef builder = gallivm->builder;
struct lp_type gs_type = bld_base->base.type;
}
static void
-draw_gs_llvm_end_primitive(struct lp_build_tgsi_context * bld_base,
+draw_gs_llvm_end_primitive(const struct lp_build_tgsi_gs_iface *gs_base,
+ struct lp_build_tgsi_context * bld_base,
LLVMValueRef verts_per_prim_vec,
- LLVMValueRef emitted_prims_vec,
- void *user_data)
+ LLVMValueRef emitted_prims_vec)
{
- struct draw_gs_llvm_variant *variant =
- (struct draw_gs_llvm_variant *)user_data;
+ const struct draw_gs_llvm_iface *gs_iface = draw_gs_llvm_iface(gs_base);
+ struct draw_gs_llvm_variant *variant = gs_iface->variant;
struct gallivm_state *gallivm = variant->gallivm;
LLVMBuilderRef builder = gallivm->builder;
LLVMValueRef prim_lengts_ptr =
}
static void
-draw_gs_llvm_epilogue(struct lp_build_tgsi_context * bld_base,
+draw_gs_llvm_epilogue(const struct lp_build_tgsi_gs_iface *gs_base,
+ struct lp_build_tgsi_context * bld_base,
LLVMValueRef total_emitted_vertices_vec,
- LLVMValueRef emitted_prims_vec,
- void *user_data)
+ LLVMValueRef emitted_prims_vec)
{
- struct draw_gs_llvm_variant *variant =
- (struct draw_gs_llvm_variant *)user_data;
+ const struct draw_gs_llvm_iface *gs_iface = draw_gs_llvm_iface(gs_base);
+ struct draw_gs_llvm_variant *variant = gs_iface->variant;
struct gallivm_state *gallivm = variant->gallivm;
LLVMBuilderRef builder = gallivm->builder;
LLVMValueRef emitted_verts_ptr =
struct lp_bld_tgsi_system_values system_values;
struct lp_type gs_type;
unsigned i;
- struct lp_build_tgsi_gs_iface gs_iface;
+ struct draw_gs_llvm_iface gs_iface;
const struct tgsi_token *tokens = variant->shader->base.state.tokens;
LLVMValueRef consts_ptr;
LLVMValueRef outputs[PIPE_MAX_SHADER_OUTPUTS][TGSI_NUM_CHANNELS];
variant->io_ptr = io_ptr;
variant->num_prims = num_prims;
+ gs_iface.base.fetch_input = draw_gs_llvm_fetch_input;
+ gs_iface.base.emit_vertex = draw_gs_llvm_emit_vertex;
+ gs_iface.base.end_primitive = draw_gs_llvm_end_primitive;
+ gs_iface.base.gs_epilogue = draw_gs_llvm_epilogue;
gs_iface.input = input_array;
- gs_iface.emit_vertex = draw_gs_llvm_emit_vertex;
- gs_iface.end_primitive = draw_gs_llvm_end_primitive;
- gs_iface.gs_epilogue = draw_gs_llvm_epilogue;
- gs_iface.user_data = variant;
+ gs_iface.variant = variant;
/*
* Function body
outputs,
sampler,
&llvm->draw->gs.geometry_shader->info,
- &gs_iface);
+ (const struct lp_build_tgsi_gs_iface *)&gs_iface);
sampler->destroy(sampler);
struct lp_build_tgsi_gs_iface
{
- LLVMValueRef input;
- void (*emit_vertex)(struct lp_build_tgsi_context * bld_base,
+ LLVMValueRef (*fetch_input)(const struct lp_build_tgsi_gs_iface *gs_iface,
+ struct lp_build_tgsi_context * bld_base,
+ LLVMValueRef vertex_index,
+ LLVMValueRef attrib_index,
+ LLVMValueRef swizzle_index);
+ void (*emit_vertex)(const struct lp_build_tgsi_gs_iface *gs_iface,
+ struct lp_build_tgsi_context * bld_base,
LLVMValueRef (*outputs)[4],
- LLVMValueRef emitted_vertices_vec,
- void *user_data);
- void (*end_primitive)(struct lp_build_tgsi_context * bld_base,
+ LLVMValueRef emitted_vertices_vec);
+ void (*end_primitive)(const struct lp_build_tgsi_gs_iface *gs_iface,
+ struct lp_build_tgsi_context * bld_base,
LLVMValueRef verts_per_prim_vec,
- LLVMValueRef emitted_prims_vec,
- void *user_data);
- void (*gs_epilogue)(struct lp_build_tgsi_context * bld_base,
+ LLVMValueRef emitted_prims_vec);
+ void (*gs_epilogue)(const struct lp_build_tgsi_gs_iface *gs_iface,
+ struct lp_build_tgsi_context * bld_base,
LLVMValueRef total_emitted_vertices_vec,
- LLVMValueRef emitted_prims_vec,
- void *user_data);
- void *user_data;
+ LLVMValueRef emitted_prims_vec);
};
struct lp_build_tgsi_soa_context
struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base);
struct gallivm_state *gallivm = bld->bld_base.base.gallivm;
LLVMBuilderRef builder = gallivm->builder;
- //struct lp_build_context *uint_bld = &bld_base->uint_bld;
LLVMValueRef attrib_index = NULL;
LLVMValueRef vertex_index = NULL;
LLVMValueRef swizzle_index = lp_build_const_int32(gallivm, swizzle);
- LLVMValueRef indices[3];
LLVMValueRef res;
if (reg->Register.Indirect) {
vertex_index = lp_build_const_int32(gallivm, reg->Dimension.Index);
}
- indices[0] = vertex_index;
- indices[1] = attrib_index;
- indices[2] = swizzle_index;
- res = LLVMBuildGEP(builder, bld->gs_iface->input, indices, 3, "");
- res = LLVMBuildLoad(builder, res, "");
+ res = bld->gs_iface->fetch_input(bld->gs_iface, bld_base,
+ vertex_index, attrib_index,
+ swizzle_index);
assert(res);
if (bld->gs_iface->emit_vertex) {
LLVMValueRef masked_ones = mask_to_one_vec(bld_base);
gather_outputs(bld);
- bld->gs_iface->emit_vertex(&bld->bld_base, bld->outputs,
- bld->total_emitted_vertices_vec,
- bld->gs_iface->user_data);
+ bld->gs_iface->emit_vertex(bld->gs_iface, &bld->bld_base,
+ bld->outputs,
+ bld->total_emitted_vertices_vec);
bld->emitted_vertices_vec =
LLVMBuildAdd(builder, bld->emitted_vertices_vec, masked_ones, "");
bld->total_emitted_vertices_vec =
if (bld->gs_iface->end_primitive) {
LLVMValueRef masked_ones = mask_to_one_vec(bld_base);
- bld->gs_iface->end_primitive(&bld->bld_base,
- bld->emitted_vertices_vec,
- bld->emitted_prims_vec,
- bld->gs_iface->user_data);
+ bld->gs_iface->end_primitive(bld->gs_iface, &bld->bld_base,
+ bld->emitted_vertices_vec,
+ bld->emitted_prims_vec);
bld->emitted_prims_vec =
LLVMBuildAdd(builder, bld->emitted_prims_vec, masked_ones, "");
bld->emitted_vertices_vec = bld_base->uint_bld.zero;
bld->pending_end_primitive = FALSE;
}
- bld->gs_iface->gs_epilogue(&bld->bld_base,
- bld->total_emitted_vertices_vec,
- bld->emitted_prims_vec,
- bld->gs_iface->user_data);
+ bld->gs_iface->gs_epilogue(bld->gs_iface,
+ &bld->bld_base,
+ bld->total_emitted_vertices_vec,
+ bld->emitted_prims_vec);
} else {
gather_outputs(bld);
}