diff options
-rw-r--r-- | src/gallium/auxiliary/draw/draw_llvm.c | 59 | ||||
-rw-r--r-- | src/gallium/auxiliary/draw/draw_llvm.h | 58 | ||||
-rw-r--r-- | src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c | 6 |
3 files changed, 56 insertions, 67 deletions
diff --git a/src/gallium/auxiliary/draw/draw_llvm.c b/src/gallium/auxiliary/draw/draw_llvm.c index 3a4e14c7a21..be73a678482 100644 --- a/src/gallium/auxiliary/draw/draw_llvm.c +++ b/src/gallium/auxiliary/draw/draw_llvm.c @@ -90,6 +90,29 @@ init_globals(struct draw_llvm *llvm) LLVMTypeRef buffer_ptr = LLVMPointerType(LLVMIntType(8), 0); llvm->buffer_ptr_type = LLVMPointerType(buffer_ptr, 0); } + /* struct pipe_vertex_buffer */ + { + LLVMTypeRef elem_types[4]; + LLVMTypeRef vb_type; + + elem_types[0] = LLVMInt32Type(); + elem_types[1] = LLVMInt32Type(); + elem_types[2] = LLVMInt32Type(); + elem_types[3] = LLVMPointerType(LLVMOpaqueType(), 0); /* vs_constants */ + + vb_type = LLVMStructType(elem_types, Elements(elem_types), 0); + + LP_CHECK_MEMBER_OFFSET(struct pipe_vertex_buffer, stride, + llvm->target, vb_type, 0); + LP_CHECK_MEMBER_OFFSET(struct pipe_vertex_buffer, buffer_offset, + llvm->target, vb_type, 2); + LP_CHECK_STRUCT_SIZE(struct pipe_vertex_buffer, + llvm->target, vb_type); + + LLVMAddTypeName(llvm->module, "pipe_vertex_buffer", vb_type); + + llvm->vb_ptr_type = LLVMPointerType(vb_type, 0); + } } static LLVMTypeRef @@ -241,7 +264,7 @@ generate_vs(struct draw_llvm *llvm, num_vs = 4; /* number of vertices per block */ #endif - tgsi_dump(tokens, 0); + /*tgsi_dump(tokens, 0);*/ lp_build_tgsi_soa(builder, tokens, vs_type, @@ -276,20 +299,22 @@ generate_fetch(LLVMBuilderRef builder, LLVMValueRef vbuffers_ptr, LLVMValueRef *res, struct pipe_vertex_element *velem, - struct pipe_vertex_buffer *vbuf, + LLVMValueRef vbuf, LLVMValueRef index) { LLVMValueRef indices = LLVMConstInt(LLVMInt64Type(), velem->vertex_buffer_index, 0); LLVMValueRef vbuffer_ptr = LLVMBuildGEP(builder, vbuffers_ptr, &indices, 1, ""); + LLVMValueRef vb_stride = draw_jit_vbuffer_stride(builder, vbuf); + LLVMValueRef vb_buffer_offset = draw_jit_vbuffer_offset(builder, vbuf); LLVMValueRef stride = LLVMBuildMul(builder, - LLVMConstInt(LLVMInt32Type(), vbuf->stride, 0), + vb_stride, index, ""); vbuffer_ptr = LLVMBuildLoad(builder, vbuffer_ptr, "vbuffer"); stride = LLVMBuildAdd(builder, stride, - LLVMConstInt(LLVMInt32Type(), vbuf->buffer_offset, 0), + vb_buffer_offset, ""); stride = LLVMBuildAdd(builder, stride, LLVMConstInt(LLVMInt32Type(), velem->src_offset, 0), @@ -549,13 +574,13 @@ convert_to_aos(LLVMBuilderRef builder, static void draw_llvm_generate(struct draw_llvm *llvm, struct draw_llvm_variant *variant) { - LLVMTypeRef arg_types[6]; + LLVMTypeRef arg_types[7]; LLVMTypeRef func_type; LLVMValueRef context_ptr; LLVMBasicBlockRef block; LLVMBuilderRef builder; LLVMValueRef start, end, count, stride, step, io_itr; - LLVMValueRef io_ptr, vbuffers_ptr; + LLVMValueRef io_ptr, vbuffers_ptr, vb_ptr; struct draw_context *draw = llvm->draw; unsigned i, j; struct lp_build_context bld; @@ -570,6 +595,7 @@ draw_llvm_generate(struct draw_llvm *llvm, struct draw_llvm_variant *variant) arg_types[3] = LLVMInt32Type(); /* start */ arg_types[4] = LLVMInt32Type(); /* count */ arg_types[5] = LLVMInt32Type(); /* stride */ + arg_types[6] = llvm->vb_ptr_type; /* pipe_vertex_buffer's */ func_type = LLVMFunctionType(LLVMVoidType(), arg_types, Elements(arg_types), 0); @@ -585,6 +611,7 @@ draw_llvm_generate(struct draw_llvm *llvm, struct draw_llvm_variant *variant) start = LLVMGetParam(variant->function, 3); count = LLVMGetParam(variant->function, 4); stride = LLVMGetParam(variant->function, 5); + vb_ptr = LLVMGetParam(variant->function, 6); lp_build_name(context_ptr, "context"); lp_build_name(io_ptr, "io"); @@ -592,6 +619,7 @@ draw_llvm_generate(struct draw_llvm *llvm, struct draw_llvm_variant *variant) lp_build_name(start, "start"); lp_build_name(count, "count"); lp_build_name(stride, "stride"); + lp_build_name(vb_ptr, "vb"); /* * Function body @@ -631,10 +659,13 @@ draw_llvm_generate(struct draw_llvm *llvm, struct draw_llvm_variant *variant) LLVMConstInt(LLVMInt32Type(), i, 0), ""); for (j = 0; j < draw->pt.nr_vertex_elements; ++j) { struct pipe_vertex_element *velem = &draw->pt.vertex_element[j]; - struct pipe_vertex_buffer *vbuf = &draw->pt.vertex_buffer[ - velem->vertex_buffer_index]; + LLVMValueRef vb_index = LLVMConstInt(LLVMInt32Type(), + velem->vertex_buffer_index, + 0); + LLVMValueRef vb = LLVMBuildGEP(builder, vb_ptr, + &vb_index, 0, ""); generate_fetch(builder, vbuffers_ptr, - &aos_attribs[j][i], velem, vbuf, true_index); + &aos_attribs[j][i], velem, vb, true_index); } } convert_to_soa(builder, aos_attribs, inputs, @@ -660,7 +691,6 @@ draw_llvm_generate(struct draw_llvm *llvm, struct draw_llvm_variant *variant) /* * Translate the LLVM IR into machine code. */ - #ifdef DEBUG if(LLVMVerifyFunction(variant->function, LLVMPrintMessageAction)) { LLVMDumpValue(variant->function); @@ -684,16 +714,13 @@ void draw_llvm_make_variant_key(struct draw_llvm *llvm, struct draw_llvm_variant_key *key) { - key->nr_vertex_buffers = llvm->draw->pt.nr_vertex_buffers; - key->nr_vertex_elements = llvm->draw->pt.nr_vertex_elements; + memset(key, 0, sizeof(struct draw_llvm_variant_key)); - memcpy(key->vertex_buffer, - llvm->draw->pt.vertex_buffer, - sizeof(struct pipe_vertex_buffer) * PIPE_MAX_ATTRIBS); + key->nr_vertex_elements = llvm->draw->pt.nr_vertex_elements; memcpy(key->vertex_element, llvm->draw->pt.vertex_element, - sizeof(struct pipe_vertex_element) * PIPE_MAX_ATTRIBS); + sizeof(struct pipe_vertex_element) * key->nr_vertex_elements); memcpy(&key->vs, &llvm->draw->vs.vertex_shader->state, diff --git a/src/gallium/auxiliary/draw/draw_llvm.h b/src/gallium/auxiliary/draw/draw_llvm.h index 774eb16d90c..d1cbac4af97 100644 --- a/src/gallium/auxiliary/draw/draw_llvm.h +++ b/src/gallium/auxiliary/draw/draw_llvm.h @@ -74,54 +74,13 @@ struct draw_jit_context #define draw_jit_header_data(_builder, _ptr) \ lp_build_struct_get_ptr(_builder, _ptr, 2, "data") -/* we are construction a function of the form: -struct vertex_header { - uint32 vertex_id; +#define draw_jit_vbuffer_stride(_builder, _ptr) \ + lp_build_struct_get(_builder, _ptr, 0, "stride") - float clip[4]; - float data[][4]; -}; - -struct draw_jit_context -{ - const float *vs_constants; - const float *gs_constants; +#define draw_jit_vbuffer_offset(_builder, _ptr) \ + lp_build_struct_get(_builder, _ptr, 2, "buffer_offset") - struct draw_jit_texture textures[PIPE_MAX_SAMPLERS]; -}; - -void -draw_shader(struct draw_jit_context *context, - struct vertex_header *io, - const void *vbuffers[PIPE_MAX_ATTRIBS], - unsigned start, - unsigned count, - unsigned stride) -{ - // do a fetch and a run vertex shader - for (int i = 0; i < count; ++i) { - struct vertex_header *header = &io[i]; - header->vertex_id = 0xffff; - // follows code-genarted fetch/translate section - // for each vertex_element ... - codegened_translate(header->data[num_element], - context->vertex_elements[num_element], - context->vertex_buffers, - context->vbuffers); - - codegened_vertex_shader(header->data, context->vs_constants); - } - - for (int i = 0; i < count; i += context->primitive_size) { - struct vertex_header *prim[MAX_PRIMITIVE_SIZE]; - for (int j = 0; j < context->primitive_size; ++j) { - header[j] = &io[i + j]; - } - codegened_geometry_shader(prim, gs_constants); - } -} -*/ typedef void (*draw_jit_vert_func)(struct draw_jit_context *context, @@ -129,7 +88,8 @@ typedef void const char *vbuffers[PIPE_MAX_ATTRIBS], unsigned start, unsigned count, - unsigned stride); + unsigned stride, + struct pipe_vertex_buffer *vertex_buffers); struct draw_llvm { struct draw_context *draw; @@ -145,15 +105,13 @@ struct draw_llvm { LLVMTypeRef context_ptr_type; LLVMTypeRef vertex_header_ptr_type; LLVMTypeRef buffer_ptr_type; + LLVMTypeRef vb_ptr_type; }; - struct draw_llvm_variant_key { - struct pipe_vertex_buffer vertex_buffer[PIPE_MAX_ATTRIBS]; - unsigned nr_vertex_buffers; struct pipe_vertex_element vertex_element[PIPE_MAX_ATTRIBS]; - unsigned nr_vertex_elements; + unsigned nr_vertex_elements; struct pipe_shader_state vs; }; diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c index aa34a3ea5fd..42dcc0886f3 100644 --- a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c +++ b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c @@ -53,6 +53,7 @@ struct llvm_middle_end { struct draw_llvm *llvm; struct draw_llvm_variant *variants; struct draw_llvm_variant *current_variant; + int nr_variants; }; @@ -145,6 +146,7 @@ llvm_middle_end_prepare( struct draw_pt_middle_end *middle, variant = draw_llvm_prepare(fpme->llvm, nr); variant->next = fpme->variants; fpme->variants = variant; + ++fpme->nr_variants; } fpme->current_variant = variant; @@ -271,7 +273,8 @@ static void llvm_middle_end_linear_run( struct draw_pt_middle_end *middle, (const char **)draw->pt.user.vbuffer, start, count, - fpme->vertex_size ); + fpme->vertex_size, + draw->pt.vertex_buffer ); if (draw_pt_post_vs_run( fpme->post_vs, pipeline_verts, @@ -451,6 +454,7 @@ struct draw_pt_middle_end *draw_pt_fetch_pipeline_or_emit_llvm( struct draw_cont fpme->variants = NULL; fpme->current_variant = NULL; + fpme->nr_variants = 0; return &fpme->base; |