draw/llvm: adjust the instance id at run time
fixes instancing in draw llvm
This commit is contained in:
@@ -369,7 +369,7 @@ generate_fetch(LLVMBuilderRef builder,
|
||||
struct pipe_vertex_element *velem,
|
||||
LLVMValueRef vbuf,
|
||||
LLVMValueRef index,
|
||||
unsigned instance_id)
|
||||
LLVMValueRef instance_id)
|
||||
{
|
||||
LLVMValueRef indices = LLVMConstInt(LLVMInt64Type(), velem->vertex_buffer_index, 0);
|
||||
LLVMValueRef vbuffer_ptr = LLVMBuildGEP(builder, vbuffers_ptr,
|
||||
@@ -382,6 +382,10 @@ generate_fetch(LLVMBuilderRef builder,
|
||||
|
||||
cond = LLVMBuildICmp(builder, LLVMIntULE, index, vb_max_index, "");
|
||||
|
||||
if (velem->instance_divisor) {
|
||||
index = instance_id;
|
||||
}
|
||||
|
||||
index = LLVMBuildSelect(builder, cond, index, vb_max_index, "");
|
||||
|
||||
stride = LLVMBuildMul(builder, vb_stride, index, "");
|
||||
@@ -394,11 +398,6 @@ generate_fetch(LLVMBuilderRef builder,
|
||||
stride = LLVMBuildAdd(builder, stride,
|
||||
LLVMConstInt(LLVMInt32Type(), velem->src_offset, 0),
|
||||
"");
|
||||
if (velem->instance_divisor) {
|
||||
stride = LLVMBuildMul(builder, stride,
|
||||
LLVMConstInt(LLVMInt32Type(), instance_id, 0),
|
||||
"");
|
||||
}
|
||||
|
||||
/*lp_build_printf(builder, "vbuf index = %d, stride is %d\n", indices, stride);*/
|
||||
vbuffer_ptr = LLVMBuildGEP(builder, vbuffer_ptr, &stride, 1, "");
|
||||
@@ -654,13 +653,14 @@ convert_to_aos(LLVMBuilderRef builder,
|
||||
static void
|
||||
draw_llvm_generate(struct draw_llvm *llvm, struct draw_llvm_variant *variant)
|
||||
{
|
||||
LLVMTypeRef arg_types[7];
|
||||
LLVMTypeRef arg_types[8];
|
||||
LLVMTypeRef func_type;
|
||||
LLVMValueRef context_ptr;
|
||||
LLVMBasicBlockRef block;
|
||||
LLVMBuilderRef builder;
|
||||
LLVMValueRef start, end, count, stride, step, io_itr;
|
||||
LLVMValueRef io_ptr, vbuffers_ptr, vb_ptr;
|
||||
LLVMValueRef instance_id;
|
||||
struct draw_context *draw = llvm->draw;
|
||||
unsigned i, j;
|
||||
struct lp_build_context bld;
|
||||
@@ -678,6 +678,7 @@ draw_llvm_generate(struct draw_llvm *llvm, struct draw_llvm_variant *variant)
|
||||
arg_types[4] = LLVMInt32Type(); /* count */
|
||||
arg_types[5] = LLVMInt32Type(); /* stride */
|
||||
arg_types[6] = llvm->vb_ptr_type; /* pipe_vertex_buffer's */
|
||||
arg_types[7] = LLVMInt32Type(); /* instance_id */
|
||||
|
||||
func_type = LLVMFunctionType(LLVMVoidType(), arg_types, Elements(arg_types), 0);
|
||||
|
||||
@@ -694,6 +695,7 @@ draw_llvm_generate(struct draw_llvm *llvm, struct draw_llvm_variant *variant)
|
||||
count = LLVMGetParam(variant->function, 4);
|
||||
stride = LLVMGetParam(variant->function, 5);
|
||||
vb_ptr = LLVMGetParam(variant->function, 6);
|
||||
instance_id = LLVMGetParam(variant->function, 7);
|
||||
|
||||
lp_build_name(context_ptr, "context");
|
||||
lp_build_name(io_ptr, "io");
|
||||
@@ -702,6 +704,7 @@ draw_llvm_generate(struct draw_llvm *llvm, struct draw_llvm_variant *variant)
|
||||
lp_build_name(count, "count");
|
||||
lp_build_name(stride, "stride");
|
||||
lp_build_name(vb_ptr, "vb");
|
||||
lp_build_name(instance_id, "instance_id");
|
||||
|
||||
/*
|
||||
* Function body
|
||||
@@ -752,7 +755,7 @@ draw_llvm_generate(struct draw_llvm *llvm, struct draw_llvm_variant *variant)
|
||||
&vb_index, 1, "");
|
||||
generate_fetch(builder, vbuffers_ptr,
|
||||
&aos_attribs[j][i], velem, vb, true_index,
|
||||
draw->instance_id);
|
||||
instance_id);
|
||||
}
|
||||
}
|
||||
convert_to_soa(builder, aos_attribs, inputs,
|
||||
@@ -807,13 +810,14 @@ draw_llvm_generate(struct draw_llvm *llvm, struct draw_llvm_variant *variant)
|
||||
static void
|
||||
draw_llvm_generate_elts(struct draw_llvm *llvm, struct draw_llvm_variant *variant)
|
||||
{
|
||||
LLVMTypeRef arg_types[7];
|
||||
LLVMTypeRef arg_types[8];
|
||||
LLVMTypeRef func_type;
|
||||
LLVMValueRef context_ptr;
|
||||
LLVMBasicBlockRef block;
|
||||
LLVMBuilderRef builder;
|
||||
LLVMValueRef fetch_elts, fetch_count, stride, step, io_itr;
|
||||
LLVMValueRef io_ptr, vbuffers_ptr, vb_ptr;
|
||||
LLVMValueRef instance_id;
|
||||
struct draw_context *draw = llvm->draw;
|
||||
unsigned i, j;
|
||||
struct lp_build_context bld;
|
||||
@@ -833,14 +837,17 @@ draw_llvm_generate_elts(struct draw_llvm *llvm, struct draw_llvm_variant *varian
|
||||
arg_types[4] = LLVMInt32Type(); /* fetch_count */
|
||||
arg_types[5] = LLVMInt32Type(); /* stride */
|
||||
arg_types[6] = llvm->vb_ptr_type; /* pipe_vertex_buffer's */
|
||||
arg_types[7] = LLVMInt32Type(); /* instance_id */
|
||||
|
||||
func_type = LLVMFunctionType(LLVMVoidType(), arg_types, Elements(arg_types), 0);
|
||||
|
||||
variant->function_elts = LLVMAddFunction(llvm->module, "draw_llvm_shader_elts", func_type);
|
||||
variant->function_elts = LLVMAddFunction(llvm->module, "draw_llvm_shader_elts",
|
||||
func_type);
|
||||
LLVMSetFunctionCallConv(variant->function_elts, LLVMCCallConv);
|
||||
for(i = 0; i < Elements(arg_types); ++i)
|
||||
if(LLVMGetTypeKind(arg_types[i]) == LLVMPointerTypeKind)
|
||||
LLVMAddAttribute(LLVMGetParam(variant->function_elts, i), LLVMNoAliasAttribute);
|
||||
LLVMAddAttribute(LLVMGetParam(variant->function_elts, i),
|
||||
LLVMNoAliasAttribute);
|
||||
|
||||
context_ptr = LLVMGetParam(variant->function_elts, 0);
|
||||
io_ptr = LLVMGetParam(variant->function_elts, 1);
|
||||
@@ -849,6 +856,7 @@ draw_llvm_generate_elts(struct draw_llvm *llvm, struct draw_llvm_variant *varian
|
||||
fetch_count = LLVMGetParam(variant->function_elts, 4);
|
||||
stride = LLVMGetParam(variant->function_elts, 5);
|
||||
vb_ptr = LLVMGetParam(variant->function_elts, 6);
|
||||
instance_id = LLVMGetParam(variant->function_elts, 7);
|
||||
|
||||
lp_build_name(context_ptr, "context");
|
||||
lp_build_name(io_ptr, "io");
|
||||
@@ -857,6 +865,7 @@ draw_llvm_generate_elts(struct draw_llvm *llvm, struct draw_llvm_variant *varian
|
||||
lp_build_name(fetch_count, "fetch_count");
|
||||
lp_build_name(stride, "stride");
|
||||
lp_build_name(vb_ptr, "vb");
|
||||
lp_build_name(instance_id, "instance_id");
|
||||
|
||||
/*
|
||||
* Function body
|
||||
@@ -916,7 +925,7 @@ draw_llvm_generate_elts(struct draw_llvm *llvm, struct draw_llvm_variant *varian
|
||||
&vb_index, 1, "");
|
||||
generate_fetch(builder, vbuffers_ptr,
|
||||
&aos_attribs[j][i], velem, vb, true_index,
|
||||
draw->instance_id);
|
||||
instance_id);
|
||||
}
|
||||
}
|
||||
convert_to_soa(builder, aos_attribs, inputs,
|
||||
|
||||
@@ -135,7 +135,8 @@ typedef void
|
||||
unsigned start,
|
||||
unsigned count,
|
||||
unsigned stride,
|
||||
struct pipe_vertex_buffer *vertex_buffers);
|
||||
struct pipe_vertex_buffer *vertex_buffers,
|
||||
unsigned instance_id);
|
||||
|
||||
|
||||
typedef void
|
||||
@@ -145,7 +146,8 @@ typedef void
|
||||
const unsigned *fetch_elts,
|
||||
unsigned fetch_count,
|
||||
unsigned stride,
|
||||
struct pipe_vertex_buffer *vertex_buffers);
|
||||
struct pipe_vertex_buffer *vertex_buffers,
|
||||
unsigned instance_id);
|
||||
|
||||
struct draw_llvm_variant_key
|
||||
{
|
||||
|
||||
@@ -233,7 +233,8 @@ llvm_pipeline_generic( struct draw_pt_middle_end *middle,
|
||||
fetch_info->start,
|
||||
fetch_info->count,
|
||||
fpme->vertex_size,
|
||||
draw->pt.vertex_buffer );
|
||||
draw->pt.vertex_buffer,
|
||||
draw->instance_id);
|
||||
else
|
||||
fpme->current_variant->jit_func_elts( &fpme->llvm->jit_context,
|
||||
llvm_vert_info.verts,
|
||||
@@ -241,7 +242,8 @@ llvm_pipeline_generic( struct draw_pt_middle_end *middle,
|
||||
fetch_info->elts,
|
||||
fetch_info->count,
|
||||
fpme->vertex_size,
|
||||
draw->pt.vertex_buffer);
|
||||
draw->pt.vertex_buffer,
|
||||
draw->instance_id);
|
||||
|
||||
/* Finished with fetch and vs:
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user