diff options
Diffstat (limited to 'lib/mesa/src/gallium/auxiliary/draw')
-rw-r--r-- | lib/mesa/src/gallium/auxiliary/draw/draw_context.c | 134 | ||||
-rw-r--r-- | lib/mesa/src/gallium/auxiliary/draw/draw_context.h | 28 | ||||
-rw-r--r-- | lib/mesa/src/gallium/auxiliary/draw/draw_gs_tmp.h | 1 | ||||
-rw-r--r-- | lib/mesa/src/gallium/auxiliary/draw/draw_llvm.c | 1399 | ||||
-rw-r--r-- | lib/mesa/src/gallium/auxiliary/draw/draw_llvm.h | 302 | ||||
-rw-r--r-- | lib/mesa/src/gallium/auxiliary/draw/draw_pipe_user_cull.c | 197 | ||||
-rw-r--r-- | lib/mesa/src/gallium/auxiliary/draw/draw_pipe_validate.c | 11 | ||||
-rw-r--r-- | lib/mesa/src/gallium/auxiliary/draw/draw_private.h | 41 | ||||
-rw-r--r-- | lib/mesa/src/gallium/auxiliary/draw/draw_pt.c | 21 | ||||
-rw-r--r-- | lib/mesa/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c | 264 | ||||
-rw-r--r-- | lib/mesa/src/gallium/auxiliary/draw/draw_tess.c | 644 | ||||
-rw-r--r-- | lib/mesa/src/gallium/auxiliary/draw/draw_tess.h | 130 |
12 files changed, 63 insertions, 3109 deletions
diff --git a/lib/mesa/src/gallium/auxiliary/draw/draw_context.c b/lib/mesa/src/gallium/auxiliary/draw/draw_context.c index 3b2b2d030..fb0b22eae 100644 --- a/lib/mesa/src/gallium/auxiliary/draw/draw_context.c +++ b/lib/mesa/src/gallium/auxiliary/draw/draw_context.c @@ -44,7 +44,6 @@ #include "draw_prim_assembler.h" #include "draw_vs.h" #include "draw_gs.h" -#include "draw_tess.h" #ifdef LLVM_AVAILABLE #include "gallivm/lp_bld_init.h" @@ -455,9 +454,7 @@ draw_set_mapped_constant_buffer(struct draw_context *draw, unsigned size ) { debug_assert(shader_type == PIPE_SHADER_VERTEX || - shader_type == PIPE_SHADER_GEOMETRY || - shader_type == PIPE_SHADER_TESS_CTRL || - shader_type == PIPE_SHADER_TESS_EVAL); + shader_type == PIPE_SHADER_GEOMETRY); debug_assert(slot < PIPE_MAX_CONSTANT_BUFFERS); draw_do_flush(draw, DRAW_FLUSH_PARAMETER_CHANGE); @@ -471,14 +468,6 @@ draw_set_mapped_constant_buffer(struct draw_context *draw, draw->pt.user.gs_constants[slot] = buffer; draw->pt.user.gs_constants_size[slot] = size; break; - case PIPE_SHADER_TESS_CTRL: - draw->pt.user.tcs_constants[slot] = buffer; - draw->pt.user.tcs_constants_size[slot] = size; - break; - case PIPE_SHADER_TESS_EVAL: - draw->pt.user.tes_constants[slot] = buffer; - draw->pt.user.tes_constants_size[slot] = size; - break; default: assert(0 && "invalid shader type in draw_set_mapped_constant_buffer"); } @@ -492,9 +481,7 @@ draw_set_mapped_shader_buffer(struct draw_context *draw, unsigned size ) { debug_assert(shader_type == PIPE_SHADER_VERTEX || - shader_type == PIPE_SHADER_GEOMETRY || - shader_type == PIPE_SHADER_TESS_CTRL || - shader_type == PIPE_SHADER_TESS_EVAL); + shader_type == PIPE_SHADER_GEOMETRY); debug_assert(slot < PIPE_MAX_SHADER_BUFFERS); draw_do_flush(draw, DRAW_FLUSH_PARAMETER_CHANGE); @@ -508,14 +495,6 @@ draw_set_mapped_shader_buffer(struct draw_context *draw, draw->pt.user.gs_ssbos[slot] = buffer; draw->pt.user.gs_ssbos_size[slot] = size; break; - case PIPE_SHADER_TESS_CTRL: - draw->pt.user.tcs_ssbos[slot] = buffer; - draw->pt.user.tcs_ssbos_size[slot] = size; - break; - case PIPE_SHADER_TESS_EVAL: - draw->pt.user.tes_ssbos[slot] = buffer; - draw->pt.user.tes_ssbos_size[slot] = size; - break; default: assert(0 && "invalid shader type in draw_set_mapped_shader_buffer"); } @@ -643,8 +622,6 @@ draw_get_shader_info(const struct draw_context *draw) if (draw->gs.geometry_shader) { return &draw->gs.geometry_shader->info; - } else if (draw->tes.tess_eval_shader) { - return &draw->tes.tess_eval_shader->info; } else { return &draw->vs.vertex_shader->info; } @@ -769,37 +746,6 @@ draw_total_gs_outputs(const struct draw_context *draw) return info->num_outputs + draw->extra_shader_outputs.num; } -/** - * Return total number of the tess ctrl shader outputs. - */ -uint -draw_total_tcs_outputs(const struct draw_context *draw) -{ - const struct tgsi_shader_info *info; - - if (!draw->tcs.tess_ctrl_shader) - return 0; - - info = &draw->tcs.tess_ctrl_shader->info; - - return info->num_outputs; -} - -/** - * Return total number of the tess eval shader outputs. - */ -uint -draw_total_tes_outputs(const struct draw_context *draw) -{ - const struct tgsi_shader_info *info; - - if (!draw->tes.tess_eval_shader) - return 0; - - info = &draw->tes.tess_eval_shader->info; - - return info->num_outputs + draw->extra_shader_outputs.num; -} /** * Provide TGSI sampler objects for vertex/geometry shaders that use @@ -811,22 +757,11 @@ draw_texture_sampler(struct draw_context *draw, enum pipe_shader_type shader, struct tgsi_sampler *sampler) { - switch (shader) { - case PIPE_SHADER_VERTEX: + if (shader == PIPE_SHADER_VERTEX) { draw->vs.tgsi.sampler = sampler; - break; - case PIPE_SHADER_GEOMETRY: + } else { + debug_assert(shader == PIPE_SHADER_GEOMETRY); draw->gs.tgsi.sampler = sampler; - break; - case PIPE_SHADER_TESS_CTRL: - draw->tcs.tgsi.sampler = sampler; - break; - case PIPE_SHADER_TESS_EVAL: - draw->tes.tgsi.sampler = sampler; - break; - default: - assert(0); - break; } } @@ -840,22 +775,11 @@ draw_image(struct draw_context *draw, enum pipe_shader_type shader, struct tgsi_image *image) { - switch (shader) { - case PIPE_SHADER_VERTEX: + if (shader == PIPE_SHADER_VERTEX) { draw->vs.tgsi.image = image; - break; - case PIPE_SHADER_GEOMETRY: + } else { + debug_assert(shader == PIPE_SHADER_GEOMETRY); draw->gs.tgsi.image = image; - break; - case PIPE_SHADER_TESS_CTRL: - draw->tcs.tgsi.image = image; - break; - case PIPE_SHADER_TESS_EVAL: - draw->tes.tgsi.image = image; - break; - default: - assert(0); - break; } } @@ -869,22 +793,11 @@ draw_buffer(struct draw_context *draw, enum pipe_shader_type shader, struct tgsi_buffer *buffer) { - switch (shader) { - case PIPE_SHADER_VERTEX: + if (shader == PIPE_SHADER_VERTEX) { draw->vs.tgsi.buffer = buffer; - break; - case PIPE_SHADER_GEOMETRY: + } else { + debug_assert(shader == PIPE_SHADER_GEOMETRY); draw->gs.tgsi.buffer = buffer; - break; - case PIPE_SHADER_TESS_CTRL: - draw->tcs.tgsi.buffer = buffer; - break; - case PIPE_SHADER_TESS_EVAL: - draw->tes.tgsi.buffer = buffer; - break; - default: - assert(0); - break; } } @@ -961,8 +874,6 @@ draw_current_shader_position_output(const struct draw_context *draw) { if (draw->gs.geometry_shader) return draw->gs.position_output; - if (draw->tes.tess_eval_shader) - return draw->tes.position_output; return draw->vs.position_output; } @@ -976,8 +887,6 @@ draw_current_shader_viewport_index_output(const struct draw_context *draw) { if (draw->gs.geometry_shader) return draw->gs.geometry_shader->viewport_index_output; - else if (draw->tes.tess_eval_shader) - return draw->tes.tess_eval_shader->viewport_index_output; return draw->vs.vertex_shader->viewport_index_output; } @@ -1005,8 +914,6 @@ draw_current_shader_clipvertex_output(const struct draw_context *draw) { if (draw->gs.geometry_shader) return draw->gs.position_output; - if (draw->tes.tess_eval_shader) - return draw->tes.position_output; return draw->vs.clipvertex_output; } @@ -1016,8 +923,6 @@ draw_current_shader_ccdistance_output(const struct draw_context *draw, int index debug_assert(index < PIPE_MAX_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT); if (draw->gs.geometry_shader) return draw->gs.geometry_shader->ccdistance_output[index]; - if (draw->tes.tess_eval_shader) - return draw->tes.tess_eval_shader->ccdistance_output[index]; return draw->vs.ccdistance_output[index]; } @@ -1027,8 +932,6 @@ draw_current_shader_num_written_clipdistances(const struct draw_context *draw) { if (draw->gs.geometry_shader) return draw->gs.geometry_shader->info.num_written_clipdistance; - if (draw->tes.tess_eval_shader) - return draw->tes.tess_eval_shader->info.num_written_clipdistance; return draw->vs.vertex_shader->info.num_written_clipdistance; } @@ -1037,8 +940,6 @@ draw_current_shader_num_written_culldistances(const struct draw_context *draw) { if (draw->gs.geometry_shader) return draw->gs.geometry_shader->info.num_written_culldistance; - if (draw->tes.tess_eval_shader) - return draw->tes.tess_eval_shader->info.num_written_culldistance; return draw->vs.vertex_shader->info.num_written_culldistance; } @@ -1236,8 +1137,6 @@ draw_get_shader_param(enum pipe_shader_type shader, enum pipe_shader_cap param) switch(shader) { case PIPE_SHADER_VERTEX: case PIPE_SHADER_GEOMETRY: - case PIPE_SHADER_TESS_CTRL: - case PIPE_SHADER_TESS_EVAL: return gallivm_get_shader_param(param); default: return 0; @@ -1320,14 +1219,3 @@ draw_will_inject_frontface(const struct draw_context *draw) (rast->fill_front != PIPE_POLYGON_MODE_FILL || rast->fill_back != PIPE_POLYGON_MODE_FILL)); } - -void -draw_set_tess_state(struct draw_context *draw, - const float default_outer_level[4], - const float default_inner_level[2]) -{ - for (unsigned i = 0; i < 4; i++) - draw->default_outer_tess_level[i] = default_outer_level[i]; - for (unsigned i = 0; i < 2; i++) - draw->default_inner_tess_level[i] = default_inner_level[i]; -} diff --git a/lib/mesa/src/gallium/auxiliary/draw/draw_context.h b/lib/mesa/src/gallium/auxiliary/draw/draw_context.h index 659b81fd0..c58c12cc4 100644 --- a/lib/mesa/src/gallium/auxiliary/draw/draw_context.h +++ b/lib/mesa/src/gallium/auxiliary/draw/draw_context.h @@ -45,8 +45,6 @@ struct draw_context; struct draw_stage; struct draw_vertex_shader; struct draw_geometry_shader; -struct draw_tess_ctrl_shader; -struct draw_tess_eval_shader; struct draw_fragment_shader; struct tgsi_sampler; struct tgsi_image; @@ -154,12 +152,6 @@ draw_total_vs_outputs(const struct draw_context *draw); uint draw_total_gs_outputs(const struct draw_context *draw); -uint -draw_total_tcs_outputs(const struct draw_context *draw); - -uint -draw_total_tes_outputs(const struct draw_context *draw); - void draw_texture_sampler(struct draw_context *draw, enum pipe_shader_type shader_type, @@ -250,26 +242,6 @@ void draw_bind_geometry_shader(struct draw_context *draw, void draw_delete_geometry_shader(struct draw_context *draw, struct draw_geometry_shader *dvs); -/* - * Tess shader functions - */ -struct draw_tess_ctrl_shader * -draw_create_tess_ctrl_shader(struct draw_context *draw, - const struct pipe_shader_state *shader); -void draw_bind_tess_ctrl_shader(struct draw_context *draw, - struct draw_tess_ctrl_shader *dvs); -void draw_delete_tess_ctrl_shader(struct draw_context *draw, - struct draw_tess_ctrl_shader *dvs); -struct draw_tess_eval_shader * -draw_create_tess_eval_shader(struct draw_context *draw, - const struct pipe_shader_state *shader); -void draw_bind_tess_eval_shader(struct draw_context *draw, - struct draw_tess_eval_shader *dvs); -void draw_delete_tess_eval_shader(struct draw_context *draw, - struct draw_tess_eval_shader *dvs); -void draw_set_tess_state(struct draw_context *draw, - const float default_outer_level[4], - const float default_inner_level[2]); /* * Vertex data functions diff --git a/lib/mesa/src/gallium/auxiliary/draw/draw_gs_tmp.h b/lib/mesa/src/gallium/auxiliary/draw/draw_gs_tmp.h index 5a5b9e22a..bf276d382 100644 --- a/lib/mesa/src/gallium/auxiliary/draw/draw_gs_tmp.h +++ b/lib/mesa/src/gallium/auxiliary/draw/draw_gs_tmp.h @@ -12,6 +12,7 @@ const boolean quads_flatshade_last = FALSE; \ const boolean last_vertex_last = !gs->draw->rasterizer->flatshade_first; \ do { \ + debug_assert(input_prims->primitive_count == 1); \ switch (prim) { \ case PIPE_PRIM_QUADS: \ case PIPE_PRIM_QUAD_STRIP: \ diff --git a/lib/mesa/src/gallium/auxiliary/draw/draw_llvm.c b/lib/mesa/src/gallium/auxiliary/draw/draw_llvm.c index 2fdbd5571..ca5cd6a37 100644 --- a/lib/mesa/src/gallium/auxiliary/draw/draw_llvm.c +++ b/lib/mesa/src/gallium/auxiliary/draw/draw_llvm.c @@ -37,7 +37,6 @@ #include "gallivm/lp_bld_gather.h" #include "gallivm/lp_bld_logic.h" #include "gallivm/lp_bld_const.h" -#include "gallivm/lp_bld_coro.h" #include "gallivm/lp_bld_swizzle.h" #include "gallivm/lp_bld_struct.h" #include "gallivm/lp_bld_type.h" @@ -81,33 +80,6 @@ draw_gs_llvm_iface(const struct lp_build_gs_iface *iface) return (const struct draw_gs_llvm_iface *)iface; } -struct draw_tcs_llvm_iface { - struct lp_build_tcs_iface base; - - struct draw_tcs_llvm_variant *variant; - LLVMValueRef input; - LLVMValueRef output; -}; - -static inline const struct draw_tcs_llvm_iface * -draw_tcs_llvm_iface(const struct lp_build_tcs_iface *iface) -{ - return (const struct draw_tcs_llvm_iface *)iface; -} - -struct draw_tes_llvm_iface { - struct lp_build_tes_iface base; - - struct draw_tes_llvm_variant *variant; - LLVMValueRef input; -}; - -static inline const struct draw_tes_llvm_iface * -draw_tes_llvm_iface(const struct lp_build_tes_iface *iface) -{ - return (const struct draw_tes_llvm_iface *)iface; -} - /** * Create LLVM type for draw_vertex_buffer. */ @@ -525,166 +497,6 @@ create_jit_vertex_header(struct gallivm_state *gallivm, int data_elems) return vertex_header; } -/** - * Create LLVM type for struct draw_tcs_jit_context - */ -static LLVMTypeRef -create_tcs_jit_context_type(struct gallivm_state *gallivm, - unsigned vector_length, - LLVMTypeRef texture_type, LLVMTypeRef sampler_type, - LLVMTypeRef image_type, - const char *struct_name) -{ - LLVMTargetDataRef target = gallivm->target; - LLVMTypeRef float_type = LLVMFloatTypeInContext(gallivm->context); - LLVMTypeRef int_type = LLVMInt32TypeInContext(gallivm->context); - LLVMTypeRef elem_types[DRAW_TCS_JIT_CTX_NUM_FIELDS]; - LLVMTypeRef context_type; - - elem_types[0] = LLVMArrayType(LLVMPointerType(float_type, 0), /* constants */ - LP_MAX_TGSI_CONST_BUFFERS); - elem_types[1] = LLVMArrayType(int_type, /* num_constants */ - LP_MAX_TGSI_CONST_BUFFERS); - elem_types[2] = LLVMInt32TypeInContext(gallivm->context); - elem_types[3] = LLVMInt32TypeInContext(gallivm->context); - - elem_types[4] = LLVMArrayType(texture_type, - PIPE_MAX_SHADER_SAMPLER_VIEWS); /* textures */ - elem_types[5] = LLVMArrayType(sampler_type, - PIPE_MAX_SAMPLERS); /* samplers */ - elem_types[6] = LLVMArrayType(image_type, - PIPE_MAX_SHADER_IMAGES); /* images */ - - elem_types[7] = LLVMArrayType(LLVMPointerType(int_type, 0), /* ssbos */ - LP_MAX_TGSI_SHADER_BUFFERS); - elem_types[8] = LLVMArrayType(int_type, /* num_ssbos */ - LP_MAX_TGSI_SHADER_BUFFERS); - - context_type = LLVMStructTypeInContext(gallivm->context, elem_types, - ARRAY_SIZE(elem_types), 0); - - (void) target; /* silence unused var warning for non-debug build */ - LP_CHECK_MEMBER_OFFSET(struct draw_tcs_jit_context, constants, - target, context_type, DRAW_TCS_JIT_CTX_CONSTANTS); - LP_CHECK_MEMBER_OFFSET(struct draw_tcs_jit_context, num_constants, - target, context_type, DRAW_TCS_JIT_CTX_NUM_CONSTANTS); - LP_CHECK_MEMBER_OFFSET(struct draw_tcs_jit_context, textures, - target, context_type, - DRAW_TCS_JIT_CTX_TEXTURES); - LP_CHECK_MEMBER_OFFSET(struct draw_tcs_jit_context, samplers, - target, context_type, - DRAW_TCS_JIT_CTX_SAMPLERS); - LP_CHECK_MEMBER_OFFSET(struct draw_tcs_jit_context, ssbos, - target, context_type, DRAW_TCS_JIT_CTX_SSBOS); - LP_CHECK_MEMBER_OFFSET(struct draw_tcs_jit_context, num_ssbos, - target, context_type, DRAW_TCS_JIT_CTX_NUM_SSBOS); - LP_CHECK_MEMBER_OFFSET(struct draw_tcs_jit_context, images, - target, context_type, DRAW_TCS_JIT_CTX_IMAGES); - LP_CHECK_STRUCT_SIZE(struct draw_tcs_jit_context, - target, context_type); - - return context_type; -} - -static LLVMTypeRef -create_tcs_jit_input_type(struct gallivm_state *gallivm) -{ - LLVMTypeRef float_type = LLVMFloatTypeInContext(gallivm->context); - LLVMTypeRef input_array; - - input_array = LLVMArrayType(float_type, TGSI_NUM_CHANNELS); /* num channels */ - input_array = LLVMArrayType(input_array, NUM_TCS_INPUTS); /* num attrs per vertex */ - input_array = LLVMPointerType(input_array, 0); /* num vertices per prim */ - - return input_array; -} - -static LLVMTypeRef -create_tcs_jit_output_type(struct gallivm_state *gallivm) -{ - LLVMTypeRef float_type = LLVMFloatTypeInContext(gallivm->context); - LLVMTypeRef output_array; - - output_array = LLVMArrayType(float_type, TGSI_NUM_CHANNELS); /* num channels */ - output_array = LLVMArrayType(output_array, PIPE_MAX_SHADER_INPUTS); /* num attrs per vertex */ - output_array = LLVMPointerType(output_array, 0); /* num vertices per prim */ - - return output_array; -} - -static LLVMTypeRef -create_tes_jit_input_type(struct gallivm_state *gallivm) -{ - LLVMTypeRef float_type = LLVMFloatTypeInContext(gallivm->context); - LLVMTypeRef input_array; - - input_array = LLVMArrayType(float_type, TGSI_NUM_CHANNELS); /* num channels */ - input_array = LLVMArrayType(input_array, PIPE_MAX_SHADER_INPUTS); /* num attrs per vertex */ - input_array = LLVMPointerType(input_array, 0); /* num vertices per prim */ - - return input_array; -} - -/** - * Create LLVM type for struct draw_tes_jit_context - */ -static LLVMTypeRef -create_tes_jit_context_type(struct gallivm_state *gallivm, - unsigned vector_length, - LLVMTypeRef texture_type, LLVMTypeRef sampler_type, - LLVMTypeRef image_type, - const char *struct_name) -{ - LLVMTargetDataRef target = gallivm->target; - LLVMTypeRef float_type = LLVMFloatTypeInContext(gallivm->context); - LLVMTypeRef int_type = LLVMInt32TypeInContext(gallivm->context); - LLVMTypeRef elem_types[DRAW_TCS_JIT_CTX_NUM_FIELDS]; - LLVMTypeRef context_type; - - elem_types[0] = LLVMArrayType(LLVMPointerType(float_type, 0), /* constants */ - LP_MAX_TGSI_CONST_BUFFERS); - elem_types[1] = LLVMArrayType(int_type, /* num_constants */ - LP_MAX_TGSI_CONST_BUFFERS); - elem_types[2] = LLVMInt32TypeInContext(gallivm->context); - elem_types[3] = LLVMInt32TypeInContext(gallivm->context); - - elem_types[4] = LLVMArrayType(texture_type, - PIPE_MAX_SHADER_SAMPLER_VIEWS); /* textures */ - elem_types[5] = LLVMArrayType(sampler_type, - PIPE_MAX_SAMPLERS); /* samplers */ - elem_types[6] = LLVMArrayType(image_type, - PIPE_MAX_SHADER_IMAGES); /* images */ - - elem_types[7] = LLVMArrayType(LLVMPointerType(int_type, 0), /* ssbos */ - LP_MAX_TGSI_SHADER_BUFFERS); - elem_types[8] = LLVMArrayType(int_type, /* num_ssbos */ - LP_MAX_TGSI_SHADER_BUFFERS); - - context_type = LLVMStructTypeInContext(gallivm->context, elem_types, - ARRAY_SIZE(elem_types), 0); - - (void) target; /* silence unused var warning for non-debug build */ - LP_CHECK_MEMBER_OFFSET(struct draw_tes_jit_context, constants, - target, context_type, DRAW_TCS_JIT_CTX_CONSTANTS); - LP_CHECK_MEMBER_OFFSET(struct draw_tes_jit_context, num_constants, - target, context_type, DRAW_TCS_JIT_CTX_NUM_CONSTANTS); - LP_CHECK_MEMBER_OFFSET(struct draw_tes_jit_context, textures, - target, context_type, - DRAW_TCS_JIT_CTX_TEXTURES); - LP_CHECK_MEMBER_OFFSET(struct draw_tes_jit_context, samplers, - target, context_type, - DRAW_TCS_JIT_CTX_SAMPLERS); - LP_CHECK_MEMBER_OFFSET(struct draw_tes_jit_context, ssbos, - target, context_type, DRAW_TCS_JIT_CTX_SSBOS); - LP_CHECK_MEMBER_OFFSET(struct draw_tes_jit_context, num_ssbos, - target, context_type, DRAW_TCS_JIT_CTX_NUM_SSBOS); - LP_CHECK_MEMBER_OFFSET(struct draw_tes_jit_context, images, - target, context_type, DRAW_TCS_JIT_CTX_IMAGES); - LP_CHECK_STRUCT_SIZE(struct draw_tes_jit_context, - target, context_type); - - return context_type; -} /** * Create LLVM types for various structures. @@ -779,12 +591,6 @@ draw_llvm_create(struct draw_context *draw, LLVMContextRef context) llvm->nr_gs_variants = 0; make_empty_list(&llvm->gs_variants_list); - llvm->nr_tcs_variants = 0; - make_empty_list(&llvm->tcs_variants_list); - - llvm->nr_tes_variants = 0; - make_empty_list(&llvm->tes_variants_list); - return llvm; fail: @@ -1070,7 +876,7 @@ fetch_vector(struct gallivm_state *gallivm, } /* out-of-bound fetches return all zeros */ - for (i = 0; i < format_desc->nr_channels; i++) { + for (i = 0; i < TGSI_NUM_CHANNELS; i++) { inputs[i] = LLVMBuildBitCast(builder, inputs[i], blduivec.vec_type, ""); inputs[i] = LLVMBuildAnd(builder, inputs[i], valid_mask, ""); inputs[i] = LLVMBuildBitCast(builder, inputs[i], @@ -1123,8 +929,8 @@ store_aos(struct gallivm_state *gallivm, * { * return (x >> 16) | // vertex_id * ((x & 0x3fff) << 18) | // clipmask - * ((x & 0x4000) << 3) | // edgeflag - * ((x & 0x8000) << 1); // pad + * ((x & 0x4000) << 3) | // pad + * ((x & 0x8000) << 1); // edgeflag * } */ static LLVMValueRef @@ -1142,11 +948,11 @@ adjust_mask(struct gallivm_state *gallivm, clipmask = LLVMBuildAnd(builder, mask, lp_build_const_int32(gallivm, 0x3fff), ""); clipmask = LLVMBuildShl(builder, clipmask, lp_build_const_int32(gallivm, 18), ""); if (0) { - pad = LLVMBuildAnd(builder, mask, lp_build_const_int32(gallivm, 0x8000), ""); - pad = LLVMBuildShl(builder, pad, lp_build_const_int32(gallivm, 1), ""); + pad = LLVMBuildAnd(builder, mask, lp_build_const_int32(gallivm, 0x4000), ""); + pad = LLVMBuildShl(builder, pad, lp_build_const_int32(gallivm, 3), ""); } - edgeflag = LLVMBuildAnd(builder, mask, lp_build_const_int32(gallivm, 0x4000), ""); - edgeflag = LLVMBuildShl(builder, edgeflag, lp_build_const_int32(gallivm, 3), ""); + edgeflag = LLVMBuildAnd(builder, mask, lp_build_const_int32(gallivm, 0x8000), ""); + edgeflag = LLVMBuildShl(builder, edgeflag, lp_build_const_int32(gallivm, 1), ""); mask = LLVMBuildOr(builder, vertex_id, clipmask, ""); if (0) { @@ -1751,17 +1557,10 @@ draw_gs_llvm_emit_vertex(const struct lp_build_gs_iface *gs_base, indices[i] = LLVMBuildAdd(builder, indices[i], currently_emitted, ""); } - LLVMValueRef stream_idx = LLVMBuildExtractElement(builder, stream_id, lp_build_const_int32(gallivm, 0), ""); - LLVMValueRef cnd = LLVMBuildICmp(builder, LLVMIntULT, stream_idx, lp_build_const_int32(gallivm, variant->shader->base.num_vertex_streams), ""); - struct lp_build_if_state if_ctx; - lp_build_if(&if_ctx, gallivm, cnd); - io = lp_build_pointer_get(builder, io, LLVMBuildExtractElement(builder, stream_id, lp_build_const_int32(gallivm, 0), "")); - convert_to_aos(gallivm, io, indices, outputs, clipmask, gs_info->num_outputs, gs_type, FALSE); - lp_build_endif(&if_ctx); } static void @@ -1798,7 +1597,7 @@ draw_gs_llvm_end_primitive(const struct lp_build_gs_iface *gs_base, static void draw_gs_llvm_epilogue(const struct lp_build_gs_iface *gs_base, LLVMValueRef total_emitted_vertices_vec, - LLVMValueRef emitted_prims_vec, unsigned stream) + LLVMValueRef emitted_prims_vec) { const struct draw_gs_llvm_iface *gs_iface = draw_gs_llvm_iface(gs_base); struct draw_gs_llvm_variant *variant = gs_iface->variant; @@ -1808,10 +1607,10 @@ draw_gs_llvm_epilogue(const struct lp_build_gs_iface *gs_base, draw_gs_jit_emitted_vertices(gallivm, variant->context_ptr); LLVMValueRef emitted_prims_ptr = draw_gs_jit_emitted_prims(gallivm, variant->context_ptr); - LLVMValueRef stream_val = lp_build_const_int32(gallivm, stream); + LLVMValueRef zero = lp_build_const_int32(gallivm, 0); - emitted_verts_ptr = LLVMBuildGEP(builder, emitted_verts_ptr, &stream_val, 1, ""); - emitted_prims_ptr = LLVMBuildGEP(builder, emitted_prims_ptr, &stream_val, 1, ""); + emitted_verts_ptr = LLVMBuildGEP(builder, emitted_verts_ptr, &zero, 0, ""); + emitted_prims_ptr = LLVMBuildGEP(builder, emitted_prims_ptr, &zero, 0, ""); LLVMBuildStore(builder, total_emitted_vertices_vec, emitted_verts_ptr); LLVMBuildStore(builder, emitted_prims_vec, emitted_prims_ptr); @@ -1861,9 +1660,9 @@ draw_llvm_generate(struct draw_llvm *llvm, struct draw_llvm_variant *variant) * (though this would be fixable here, but couldn't just broadcast * the values). */ - const boolean bypass_viewport = key->has_gs_or_tes || key->bypass_viewport || + const boolean bypass_viewport = key->has_gs || key->bypass_viewport || vs_info->writes_viewport_index; - const boolean enable_cliptest = !key->has_gs_or_tes && (key->clip_xy || + const boolean enable_cliptest = !key->has_gs && (key->clip_xy || key->clip_z || key->clip_user || key->need_edgeflags); @@ -2299,7 +2098,7 @@ draw_llvm_make_variant_key(struct draw_llvm *llvm, char *store) /* XXX assumes edgeflag output not at 0 */ key->need_edgeflags = (llvm->draw->vs.edgeflag_output ? TRUE : FALSE); key->ucp_enable = llvm->draw->rasterizer->clip_plane_enable; - key->has_gs_or_tes = llvm->draw->gs.geometry_shader != NULL || llvm->draw->tes.tess_eval_shader != NULL; + key->has_gs = llvm->draw->gs.geometry_shader != NULL; key->num_outputs = draw_total_vs_outputs(llvm->draw); /* All variants of this shader will have the same value for @@ -2379,7 +2178,7 @@ draw_llvm_dump_variant_key(struct draw_llvm_variant_key *key) debug_printf("bypass_viewport = %u\n", key->bypass_viewport); debug_printf("clip_halfz = %u\n", key->clip_halfz); debug_printf("need_edgeflags = %u\n", key->need_edgeflags); - debug_printf("has_gs_or_tes = %u\n", key->has_gs_or_tes); + debug_printf("has_gs = %u\n", key->has_gs); debug_printf("ucp_enable = %u\n", key->ucp_enable); for (i = 0 ; i < key->nr_vertex_elements; i++) { @@ -2412,24 +2211,18 @@ draw_llvm_set_mapped_texture(struct draw_context *draw, unsigned j; struct draw_jit_texture *jit_tex; - switch (shader_stage) { - case PIPE_SHADER_VERTEX: + assert(shader_stage == PIPE_SHADER_VERTEX || + shader_stage == PIPE_SHADER_GEOMETRY); + + if (shader_stage == PIPE_SHADER_VERTEX) { assert(sview_idx < ARRAY_SIZE(draw->llvm->jit_context.textures)); + jit_tex = &draw->llvm->jit_context.textures[sview_idx]; - break; - case PIPE_SHADER_GEOMETRY: + } else if (shader_stage == PIPE_SHADER_GEOMETRY) { assert(sview_idx < ARRAY_SIZE(draw->llvm->gs_jit_context.textures)); + jit_tex = &draw->llvm->gs_jit_context.textures[sview_idx]; - break; - case PIPE_SHADER_TESS_CTRL: - assert(sview_idx < ARRAY_SIZE(draw->llvm->tcs_jit_context.textures)); - jit_tex = &draw->llvm->tcs_jit_context.textures[sview_idx]; - break; - case PIPE_SHADER_TESS_EVAL: - assert(sview_idx < ARRAY_SIZE(draw->llvm->tes_jit_context.textures)); - jit_tex = &draw->llvm->tes_jit_context.textures[sview_idx]; - break; - default: + } else { assert(0); return; } @@ -2459,24 +2252,18 @@ draw_llvm_set_mapped_image(struct draw_context *draw, { struct draw_jit_image *jit_image; - switch (shader_stage) { - case PIPE_SHADER_VERTEX: + assert(shader_stage == PIPE_SHADER_VERTEX || + shader_stage == PIPE_SHADER_GEOMETRY); + + if (shader_stage == PIPE_SHADER_VERTEX) { assert(idx < ARRAY_SIZE(draw->llvm->jit_context.images)); + jit_image = &draw->llvm->jit_context.images[idx]; - break; - case PIPE_SHADER_GEOMETRY: + } else if (shader_stage == PIPE_SHADER_GEOMETRY) { assert(idx < ARRAY_SIZE(draw->llvm->gs_jit_context.images)); + jit_image = &draw->llvm->gs_jit_context.images[idx]; - break; - case PIPE_SHADER_TESS_CTRL: - assert(idx < ARRAY_SIZE(draw->llvm->tcs_jit_context.images)); - jit_image = &draw->llvm->tcs_jit_context.images[idx]; - break; - case PIPE_SHADER_TESS_EVAL: - assert(idx < ARRAY_SIZE(draw->llvm->tes_jit_context.images)); - jit_image = &draw->llvm->tes_jit_context.images[idx]; - break; - default: + } else { assert(0); return; } @@ -2497,8 +2284,7 @@ draw_llvm_set_sampler_state(struct draw_context *draw, { unsigned i; - switch (shader_type) { - case PIPE_SHADER_VERTEX: + if (shader_type == PIPE_SHADER_VERTEX) { for (i = 0; i < draw->num_samplers[PIPE_SHADER_VERTEX]; i++) { struct draw_jit_sampler *jit_sam = &draw->llvm->jit_context.samplers[i]; @@ -2511,8 +2297,7 @@ draw_llvm_set_sampler_state(struct draw_context *draw, COPY_4V(jit_sam->border_color, s->border_color.f); } } - break; - case PIPE_SHADER_GEOMETRY: + } else if (shader_type == PIPE_SHADER_GEOMETRY) { for (i = 0; i < draw->num_samplers[PIPE_SHADER_GEOMETRY]; i++) { struct draw_jit_sampler *jit_sam = &draw->llvm->gs_jit_context.samplers[i]; @@ -2525,38 +2310,6 @@ draw_llvm_set_sampler_state(struct draw_context *draw, COPY_4V(jit_sam->border_color, s->border_color.f); } } - break; - case PIPE_SHADER_TESS_CTRL: - for (i = 0; i < draw->num_samplers[PIPE_SHADER_TESS_CTRL]; i++) { - struct draw_jit_sampler *jit_sam = &draw->llvm->tcs_jit_context.samplers[i]; - - if (draw->samplers[PIPE_SHADER_TESS_CTRL][i]) { - const struct pipe_sampler_state *s - = draw->samplers[PIPE_SHADER_TESS_CTRL][i]; - jit_sam->min_lod = s->min_lod; - jit_sam->max_lod = s->max_lod; - jit_sam->lod_bias = s->lod_bias; - COPY_4V(jit_sam->border_color, s->border_color.f); - } - } - break; - case PIPE_SHADER_TESS_EVAL: - for (i = 0; i < draw->num_samplers[PIPE_SHADER_TESS_EVAL]; i++) { - struct draw_jit_sampler *jit_sam = &draw->llvm->tes_jit_context.samplers[i]; - - if (draw->samplers[PIPE_SHADER_TESS_EVAL][i]) { - const struct pipe_sampler_state *s - = draw->samplers[PIPE_SHADER_TESS_EVAL][i]; - jit_sam->min_lod = s->min_lod; - jit_sam->max_lod = s->max_lod; - jit_sam->lod_bias = s->lod_bias; - COPY_4V(jit_sam->border_color, s->border_color.f); - } - } - break; - default: - assert(0); - break; } } @@ -2676,7 +2429,7 @@ draw_gs_llvm_generate(struct draw_llvm *llvm, arg_types[0] = get_gs_context_ptr_type(variant); /* context */ arg_types[1] = variant->input_array_type; /* input */ - arg_types[2] = LLVMPointerType(variant->vertex_header_ptr_type, 0); /* vertex_header */ + arg_types[2] = variant->vertex_header_ptr_type; /* vertex_header */ arg_types[3] = int32_type; /* num_prims */ arg_types[4] = int32_type; /* instance_id */ arg_types[5] = LLVMPointerType( @@ -2939,1087 +2692,3 @@ draw_gs_llvm_dump_variant_key(struct draw_gs_llvm_variant_key *key) debug_printf("images[%i].format = %s\n", i, util_format_name(image[i].image_state.format)); } - -static void -create_tcs_jit_types(struct draw_tcs_llvm_variant *var) -{ - struct gallivm_state *gallivm = var->gallivm; - LLVMTypeRef texture_type, sampler_type, image_type, context_type; - - texture_type = create_jit_texture_type(gallivm, "texture"); - sampler_type = create_jit_sampler_type(gallivm, "sampler"); - image_type = create_jit_image_type(gallivm, "image"); - - context_type = create_tcs_jit_context_type(gallivm, - 0, - texture_type, sampler_type, - image_type, - "draw_tcs_jit_context"); - var->input_array_type = create_tcs_jit_input_type(gallivm); - var->output_array_type = create_tcs_jit_output_type(gallivm); - var->context_ptr_type = LLVMPointerType(context_type, 0); -} - -static LLVMTypeRef -get_tcs_context_ptr_type(struct draw_tcs_llvm_variant *variant) -{ - if (!variant->context_ptr_type) - create_tcs_jit_types(variant); - return variant->context_ptr_type; -} - -static LLVMValueRef -draw_tcs_llvm_emit_fetch_input(const struct lp_build_tcs_iface *tes_iface, - struct lp_build_context *bld, - boolean is_vindex_indirect, - LLVMValueRef vertex_index, - boolean is_aindex_indirect, - LLVMValueRef attrib_index, - LLVMValueRef swizzle_index) -{ - const struct draw_tcs_llvm_iface *tcs = draw_tcs_llvm_iface(tes_iface); - struct gallivm_state *gallivm = bld->gallivm; - LLVMBuilderRef builder = gallivm->builder; - LLVMValueRef indices[3]; - LLVMValueRef res; - struct lp_type type = bld->type; - - if (is_vindex_indirect || is_aindex_indirect) { - int i; - - res = bld->zero; - for (i = 0; i < type.length; ++i) { - LLVMValueRef idx = lp_build_const_int32(gallivm, i); - LLVMValueRef vert_chan_index = vertex_index; - LLVMValueRef attr_chan_index = attrib_index; - LLVMValueRef channel_vec; - - 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] = attr_chan_index; - indices[2] = swizzle_index; - - channel_vec = LLVMBuildGEP(builder, tcs->input, indices, 3, ""); - channel_vec = LLVMBuildLoad(builder, channel_vec, ""); - - res = LLVMBuildInsertElement(builder, res, channel_vec, idx, ""); - } - } else { - indices[0] = vertex_index; - indices[1] = attrib_index; - indices[2] = swizzle_index; - - res = LLVMBuildGEP(builder, tcs->input, indices, 3, ""); - res = LLVMBuildLoad(builder, res, ""); - res = lp_build_broadcast_scalar(bld, res); - } - return res; -} - -static LLVMValueRef -draw_tcs_llvm_emit_fetch_output(const struct lp_build_tcs_iface *tes_iface, - struct lp_build_context *bld, - boolean is_vindex_indirect, - LLVMValueRef vertex_index, - boolean is_aindex_indirect, - LLVMValueRef attrib_index, - LLVMValueRef swizzle_index, - uint32_t name) -{ - const struct draw_tcs_llvm_iface *tcs = draw_tcs_llvm_iface(tes_iface); - struct gallivm_state *gallivm = bld->gallivm; - LLVMBuilderRef builder = gallivm->builder; - LLVMValueRef indices[3]; - LLVMValueRef res; - struct lp_type type = bld->type; - - if (is_vindex_indirect || is_aindex_indirect) { - int i; - - res = bld->zero; - for (i = 0; i < type.length; ++i) { - LLVMValueRef idx = lp_build_const_int32(gallivm, i); - LLVMValueRef vert_chan_index = vertex_index; - LLVMValueRef attr_chan_index = attrib_index; - LLVMValueRef channel_vec; - - 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] = attr_chan_index; - indices[2] = swizzle_index; - - channel_vec = LLVMBuildGEP(builder, tcs->output, indices, 3, ""); - channel_vec = LLVMBuildLoad(builder, channel_vec, ""); - - res = LLVMBuildInsertElement(builder, res, channel_vec, idx, ""); - } - } else { - indices[0] = vertex_index ? vertex_index : lp_build_const_int32(gallivm, 0); - indices[1] = attrib_index; - indices[2] = swizzle_index; - - res = LLVMBuildGEP(builder, tcs->output, indices, 3, ""); - res = LLVMBuildLoad(builder, res, ""); - res = lp_build_broadcast_scalar(bld, res); - } - return res; -} - -static void -draw_tcs_llvm_emit_store_output(const struct lp_build_tcs_iface *tes_iface, - struct lp_build_context *bld, - unsigned name, - boolean is_vindex_indirect, - LLVMValueRef vertex_index, - boolean is_aindex_indirect, - LLVMValueRef attrib_index, - LLVMValueRef swizzle_index, - LLVMValueRef value, - LLVMValueRef mask_vec) -{ - const struct draw_tcs_llvm_iface *tcs = draw_tcs_llvm_iface(tes_iface); - struct gallivm_state *gallivm = bld->gallivm; - LLVMBuilderRef builder = gallivm->builder; - LLVMValueRef indices[3]; - LLVMValueRef res; - struct lp_type type = bld->type; - - if (is_vindex_indirect || is_aindex_indirect) { - int i; - - for (i = 0; i < type.length; ++i) { - LLVMValueRef idx = lp_build_const_int32(gallivm, i); - LLVMValueRef vert_chan_index = vertex_index ? vertex_index : lp_build_const_int32(gallivm, 0); - LLVMValueRef attr_chan_index = attrib_index; - LLVMValueRef channel_vec; - - 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] = attr_chan_index; - indices[2] = swizzle_index; - - channel_vec = LLVMBuildGEP(builder, tcs->output, indices, 3, ""); - - res = LLVMBuildExtractElement(builder, value, idx, ""); - - struct lp_build_if_state ifthen; - LLVMValueRef cond = LLVMBuildICmp(gallivm->builder, LLVMIntNE, mask_vec, lp_build_const_int_vec(gallivm, bld->type, 0), ""); - cond = LLVMBuildExtractElement(gallivm->builder, cond, idx, ""); - lp_build_if(&ifthen, gallivm, cond); - LLVMBuildStore(builder, res, channel_vec); - lp_build_endif(&ifthen); - } - } else { - indices[0] = vertex_index ? vertex_index : lp_build_const_int32(gallivm, 0); - indices[1] = attrib_index; - indices[2] = swizzle_index; - - res = LLVMBuildGEP(builder, tcs->output, indices, 3, ""); - for (unsigned i = 0; i < type.length; ++i) { - LLVMValueRef idx = lp_build_const_int32(gallivm, i); - LLVMValueRef val = LLVMBuildExtractElement(builder, value, idx, ""); - - struct lp_build_if_state ifthen; - LLVMValueRef cond = LLVMBuildICmp(gallivm->builder, LLVMIntNE, mask_vec, lp_build_const_int_vec(gallivm, bld->type, 0), ""); - cond = LLVMBuildExtractElement(gallivm->builder, cond, idx, ""); - lp_build_if(&ifthen, gallivm, cond); - LLVMBuildStore(builder, val, res); - lp_build_endif(&ifthen); - } - } -} - - -static LLVMValueRef -generate_tcs_mask_value(struct draw_tcs_llvm_variant *variant, - struct lp_type tcs_type, LLVMValueRef limit, LLVMValueRef loop_counter) -{ - struct gallivm_state *gallivm = variant->gallivm; - LLVMBuilderRef builder = gallivm->builder; - struct lp_type mask_type = lp_int_type(tcs_type); - LLVMValueRef num_vecs; - LLVMValueRef mask_val = lp_build_const_vec(gallivm, mask_type, 0); - unsigned i; - - num_vecs = lp_build_broadcast(gallivm, lp_build_vec_type(gallivm, mask_type), limit); - for (i = 0; i < tcs_type.length; i++) { - LLVMValueRef idx = lp_build_const_int32(gallivm, i); - mask_val = LLVMBuildInsertElement(builder, mask_val, LLVMBuildAdd(builder, loop_counter, idx, ""), idx, ""); - } - mask_val = lp_build_compare(gallivm, mask_type, - PIPE_FUNC_GREATER, num_vecs, mask_val); - - return mask_val; -} - -static void -draw_tcs_llvm_generate(struct draw_llvm *llvm, - struct draw_tcs_llvm_variant *variant) -{ - struct gallivm_state *gallivm = variant->gallivm; - LLVMContextRef context = gallivm->context; - LLVMTypeRef int32_type = LLVMInt32TypeInContext(context); - LLVMTypeRef arg_types[6]; - LLVMTypeRef func_type, coro_func_type; - LLVMValueRef variant_func, variant_coro; - LLVMValueRef context_ptr; - LLVMValueRef input_array, output_array, prim_id, patch_vertices_in; - LLVMValueRef mask_val; - LLVMBasicBlockRef block; - LLVMBuilderRef builder; - struct lp_build_context bld, bldvec; - struct lp_build_sampler_soa *sampler = 0; - struct lp_build_image_soa *image = NULL; - struct lp_bld_tgsi_system_values system_values; - char func_name[64], func_name_coro[64]; - unsigned i; - struct draw_tcs_llvm_iface tcs_iface; - struct lp_build_mask_context mask; - LLVMValueRef consts_ptr, num_consts_ptr; - LLVMValueRef ssbos_ptr, num_ssbos_ptr; - struct lp_type tcs_type; - unsigned vector_length = variant->shader->base.vector_length; - - memset(&system_values, 0, sizeof(system_values)); - - snprintf(func_name, sizeof(func_name), "draw_llvm_tcs_variant%u", - variant->shader->variants_cached); - - snprintf(func_name_coro, sizeof(func_name_coro), "draw_llvm_tcs_coro_variant%u", - variant->shader->variants_cached); - - arg_types[0] = get_tcs_context_ptr_type(variant); /* context */ - arg_types[1] = variant->input_array_type; /* input */ - arg_types[2] = variant->output_array_type; - arg_types[3] = int32_type; - arg_types[4] = int32_type; - arg_types[5] = int32_type; /* coroutine only */ - - func_type = LLVMFunctionType(int32_type, arg_types, ARRAY_SIZE(arg_types) - 1, 0); - - coro_func_type = LLVMFunctionType(LLVMPointerType(LLVMInt8TypeInContext(gallivm->context), 0), arg_types, ARRAY_SIZE(arg_types), 0); - - variant_func = LLVMAddFunction(gallivm->module, func_name, func_type); - - variant_coro = LLVMAddFunction(gallivm->module, func_name_coro, coro_func_type); - - variant->function = variant_func; - LLVMSetFunctionCallConv(variant_func, LLVMCCallConv); - - LLVMSetFunctionCallConv(variant_coro, LLVMCCallConv); - - for (i = 0; i < ARRAY_SIZE(arg_types); ++i) { - if (LLVMGetTypeKind(arg_types[i]) == LLVMPointerTypeKind) { - lp_add_function_attr(variant_coro, i + 1, LP_FUNC_ATTR_NOALIAS); - lp_add_function_attr(variant_func, i + 1, LP_FUNC_ATTR_NOALIAS); - } - } - - context_ptr = LLVMGetParam(variant_func, 0); - input_array = LLVMGetParam(variant_func, 1); - output_array = LLVMGetParam(variant_func, 2); - prim_id = LLVMGetParam(variant_func, 3); - patch_vertices_in = LLVMGetParam(variant_func, 4); - - lp_build_name(context_ptr, "context"); - lp_build_name(input_array, "input"); - lp_build_name(output_array, "output"); - lp_build_name(prim_id, "prim_id"); - lp_build_name(patch_vertices_in, "patch_vertices_in"); - - block = LLVMAppendBasicBlockInContext(gallivm->context, variant_func, "entry"); - builder = gallivm->builder; - LLVMPositionBuilderAtEnd(builder, block); - - lp_build_context_init(&bld, gallivm, lp_type_int(32)); - - memset(&tcs_type, 0, sizeof tcs_type); - tcs_type.floating = TRUE; /* floating point values */ - tcs_type.sign = TRUE; /* values are signed */ - tcs_type.norm = FALSE; /* values are not limited to [0,1] or [-1,1] */ - tcs_type.width = 32; /* 32-bit float */ - tcs_type.length = vector_length; - - lp_build_context_init(&bldvec, variant->gallivm, lp_int_type(tcs_type)); - - LLVMValueRef count = lp_build_const_int32(gallivm, variant->shader->base.vertices_out); - LLVMValueRef step = lp_build_const_int32(gallivm, vector_length); - - struct lp_build_loop_state loop_state[2]; - LLVMValueRef num_inner_loop; - unsigned count_align = util_align_npot(variant->shader->base.vertices_out, tcs_type.length); - num_inner_loop = lp_build_const_int32(gallivm, count_align / tcs_type.length); - LLVMTypeRef hdl_ptr_type = LLVMPointerType(LLVMInt8TypeInContext(gallivm->context), 0); - LLVMValueRef coro_hdls = LLVMBuildArrayAlloca(gallivm->builder, hdl_ptr_type, num_inner_loop, "coro_hdls"); - unsigned end_coroutine = INT_MAX; - lp_build_loop_begin(&loop_state[1], gallivm, - lp_build_const_int32(gallivm, 0)); /* coroutine reentry loop */ - lp_build_loop_begin(&loop_state[0], gallivm, - lp_build_const_int32(gallivm, 0)); /* inner loop */ - { - LLVMValueRef args[6]; - args[0] = context_ptr; - args[1] = input_array; - args[2] = output_array; - args[3] = prim_id; - args[4] = patch_vertices_in; - args[5] = loop_state[0].counter; - LLVMValueRef coro_entry = LLVMBuildGEP(builder, coro_hdls, &loop_state[0].counter, 1, ""); - LLVMValueRef coro_hdl = LLVMBuildLoad(builder, coro_entry, "coro_hdl"); - - struct lp_build_if_state ifstate; - LLVMValueRef cmp = LLVMBuildICmp(builder, LLVMIntEQ, loop_state[1].counter, - lp_build_const_int32(gallivm, 0), ""); - /* first time here - call the coroutine function entry point */ - lp_build_if(&ifstate, gallivm, cmp); - LLVMValueRef coro_ret = LLVMBuildCall(builder, variant_coro, args, 6, ""); - LLVMBuildStore(builder, coro_ret, coro_entry); - lp_build_else(&ifstate); - /* subsequent calls for this invocation - check if done. */ - LLVMValueRef coro_done = lp_build_coro_done(gallivm, coro_hdl); - struct lp_build_if_state ifstate2; - lp_build_if(&ifstate2, gallivm, coro_done); - /* if done destroy and force loop exit */ - lp_build_coro_destroy(gallivm, coro_hdl); - lp_build_loop_force_set_counter(&loop_state[1], lp_build_const_int32(gallivm, end_coroutine - 1)); - lp_build_else(&ifstate2); - /* otherwise resume the coroutine */ - lp_build_coro_resume(gallivm, coro_hdl); - lp_build_endif(&ifstate2); - lp_build_endif(&ifstate); - lp_build_loop_force_reload_counter(&loop_state[1]); - } - lp_build_loop_end_cond(&loop_state[0], - num_inner_loop, - NULL, LLVMIntUGE); - lp_build_loop_end_cond(&loop_state[1], - lp_build_const_int32(gallivm, end_coroutine), - NULL, LLVMIntEQ); - LLVMBuildRet(builder, lp_build_zero(gallivm, lp_type_uint(32))); - - block = LLVMAppendBasicBlockInContext(gallivm->context, variant_coro, "entry"); - LLVMPositionBuilderAtEnd(builder, block); - - context_ptr = LLVMGetParam(variant_coro, 0); - input_array = LLVMGetParam(variant_coro, 1); - output_array = LLVMGetParam(variant_coro, 2); - prim_id = LLVMGetParam(variant_coro, 3); - patch_vertices_in = LLVMGetParam(variant_coro, 4); - - consts_ptr = draw_tcs_jit_context_constants(variant->gallivm, context_ptr); - num_consts_ptr = - draw_tcs_jit_context_num_constants(variant->gallivm, context_ptr); - - ssbos_ptr = draw_tcs_jit_context_ssbos(variant->gallivm, context_ptr); - num_ssbos_ptr = - draw_tcs_jit_context_num_ssbos(variant->gallivm, context_ptr); - sampler = draw_llvm_sampler_soa_create(variant->key.samplers); - image = draw_llvm_image_soa_create(draw_tcs_llvm_variant_key_images(&variant->key)); - - LLVMValueRef counter = LLVMGetParam(variant_coro, 5); - LLVMValueRef invocvec = LLVMGetUndef(LLVMVectorType(int32_type, vector_length)); - for (i = 0; i < vector_length; i++) { - LLVMValueRef idx = LLVMBuildAdd(builder, LLVMBuildMul(builder, counter, step, ""), lp_build_const_int32(gallivm, i), ""); - invocvec = LLVMBuildInsertElement(builder, invocvec, idx, idx, ""); - } - - system_values.invocation_id = invocvec; - system_values.prim_id = lp_build_broadcast_scalar(&bldvec, prim_id); - system_values.vertices_in = lp_build_broadcast_scalar(&bldvec, patch_vertices_in); - tcs_iface.input = input_array; - tcs_iface.output = output_array; - tcs_iface.base.emit_fetch_input = draw_tcs_llvm_emit_fetch_input; - tcs_iface.base.emit_fetch_output = draw_tcs_llvm_emit_fetch_output; - tcs_iface.base.emit_store_output = draw_tcs_llvm_emit_store_output; - - - { - LLVMValueRef coro_id = lp_build_coro_id(gallivm); - LLVMValueRef coro_hdl = lp_build_coro_begin_alloc_mem(gallivm, coro_id); - - mask_val = generate_tcs_mask_value(variant, tcs_type, count, LLVMBuildMul(builder, counter, step, "")); - lp_build_mask_begin(&mask, gallivm, tcs_type, mask_val); - - struct lp_build_coro_suspend_info coro_info; - - LLVMBasicBlockRef sus_block = LLVMAppendBasicBlockInContext(gallivm->context, variant_coro, "suspend"); - LLVMBasicBlockRef clean_block = LLVMAppendBasicBlockInContext(gallivm->context, variant_coro, "cleanup"); - - coro_info.suspend = sus_block; - coro_info.cleanup = clean_block; - - struct lp_build_tgsi_params params; - memset(¶ms, 0, sizeof(params)); - - params.type = tcs_type; - params.mask = &mask; - params.consts_ptr = consts_ptr; - params.const_sizes_ptr = num_consts_ptr; - params.system_values = &system_values; - params.context_ptr = context_ptr; - params.sampler = sampler; - params.info = &llvm->draw->tcs.tess_ctrl_shader->info; - params.ssbo_ptr = ssbos_ptr; - params.ssbo_sizes_ptr = num_ssbos_ptr; - params.image = image; - params.coro = &coro_info; - params.tcs_iface = &tcs_iface.base; - - lp_build_nir_soa(variant->gallivm, - llvm->draw->tcs.tess_ctrl_shader->state.ir.nir, - ¶ms, NULL); - - lp_build_mask_end(&mask); - - lp_build_coro_suspend_switch(gallivm, &coro_info, NULL, true); - LLVMPositionBuilderAtEnd(builder, clean_block); - - lp_build_coro_free_mem(gallivm, coro_id, coro_hdl); - - LLVMBuildBr(builder, sus_block); - LLVMPositionBuilderAtEnd(builder, sus_block); - - lp_build_coro_end(gallivm, coro_hdl); - LLVMBuildRet(builder, coro_hdl); - } - - sampler->destroy(sampler); - image->destroy(image); - gallivm_verify_function(gallivm, variant_func); - gallivm_verify_function(gallivm, variant_coro); -} - -struct draw_tcs_llvm_variant * -draw_tcs_llvm_create_variant(struct draw_llvm *llvm, - unsigned num_outputs, - const struct draw_tcs_llvm_variant_key *key) -{ - struct draw_tcs_llvm_variant *variant; - struct llvm_tess_ctrl_shader *shader = llvm_tess_ctrl_shader(llvm->draw->tcs.tess_ctrl_shader); - char module_name[64]; - - variant = MALLOC(sizeof *variant + - shader->variant_key_size - sizeof variant->key); - if (!variant) - return NULL; - - variant->llvm = llvm; - variant->shader = shader; - - snprintf(module_name, sizeof(module_name), "draw_llvm_tcs_variant%u", - variant->shader->variants_cached); - - variant->gallivm = gallivm_create(module_name, llvm->context); - - create_tcs_jit_types(variant); - - memcpy(&variant->key, key, shader->variant_key_size); - - if (gallivm_debug & (GALLIVM_DEBUG_TGSI | GALLIVM_DEBUG_IR)) { - nir_print_shader(llvm->draw->tcs.tess_ctrl_shader->state.ir.nir, stderr); - draw_tcs_llvm_dump_variant_key(&variant->key); - } - - draw_tcs_llvm_generate(llvm, variant); - - gallivm_compile_module(variant->gallivm); - - variant->jit_func = (draw_tcs_jit_func) - gallivm_jit_function(variant->gallivm, variant->function); - - gallivm_free_ir(variant->gallivm); - - variant->list_item_global.base = variant; - variant->list_item_local.base = variant; - /*variant->no = */shader->variants_created++; - variant->list_item_global.base = variant; - - return variant; -} - -void -draw_tcs_llvm_destroy_variant(struct draw_tcs_llvm_variant *variant) -{ - struct draw_llvm *llvm = variant->llvm; - - if (gallivm_debug & (GALLIVM_DEBUG_TGSI | GALLIVM_DEBUG_IR)) { - debug_printf("Deleting TCS variant: %u tcs variants,\t%u total variants\n", - variant->shader->variants_cached, llvm->nr_tcs_variants); - } - - gallivm_destroy(variant->gallivm); - - remove_from_list(&variant->list_item_local); - variant->shader->variants_cached--; - remove_from_list(&variant->list_item_global); - llvm->nr_tcs_variants--; - FREE(variant); -} - -struct draw_tcs_llvm_variant_key * -draw_tcs_llvm_make_variant_key(struct draw_llvm *llvm, char *store) -{ - unsigned i; - struct draw_tcs_llvm_variant_key *key; - struct draw_sampler_static_state *draw_sampler; - struct draw_image_static_state *draw_image; - - key = (struct draw_tcs_llvm_variant_key *)store; - - memset(key, 0, offsetof(struct draw_tcs_llvm_variant_key, samplers[0])); - - /* All variants of this shader will have the same value for - * nr_samplers. Not yet trying to compact away holes in the - * sampler array. - */ - key->nr_samplers = llvm->draw->tcs.tess_ctrl_shader->info.file_max[TGSI_FILE_SAMPLER] + 1; - if (llvm->draw->tcs.tess_ctrl_shader->info.file_max[TGSI_FILE_SAMPLER_VIEW] != -1) { - key->nr_sampler_views = - llvm->draw->tcs.tess_ctrl_shader->info.file_max[TGSI_FILE_SAMPLER_VIEW] + 1; - } - else { - key->nr_sampler_views = key->nr_samplers; - } - - key->nr_images = llvm->draw->tcs.tess_ctrl_shader->info.file_max[TGSI_FILE_IMAGE] + 1; - - draw_sampler = key->samplers; - - memset(draw_sampler, 0, MAX2(key->nr_samplers, key->nr_sampler_views) * sizeof *draw_sampler); - - for (i = 0 ; i < key->nr_samplers; i++) { - lp_sampler_static_sampler_state(&draw_sampler[i].sampler_state, - llvm->draw->samplers[PIPE_SHADER_TESS_CTRL][i]); - } - for (i = 0 ; i < key->nr_sampler_views; i++) { - lp_sampler_static_texture_state(&draw_sampler[i].texture_state, - llvm->draw->sampler_views[PIPE_SHADER_TESS_CTRL][i]); - } - - draw_image = draw_tcs_llvm_variant_key_images(key); - memset(draw_image, 0, - key->nr_images * sizeof *draw_image); - for (i = 0; i < key->nr_images; i++) { - lp_sampler_static_texture_state_image(&draw_image[i].image_state, - llvm->draw->images[PIPE_SHADER_TESS_CTRL][i]); - } - return key; -} - -void -draw_tcs_llvm_dump_variant_key(struct draw_tcs_llvm_variant_key *key) -{ - unsigned i; - struct draw_sampler_static_state *sampler = key->samplers; - struct draw_image_static_state *image = draw_tcs_llvm_variant_key_images(key); - for (i = 0 ; i < key->nr_sampler_views; i++) { - debug_printf("sampler[%i].src_format = %s\n", i, - util_format_name(sampler[i].texture_state.format)); - } - - for (i = 0 ; i < key->nr_images; i++) - debug_printf("images[%i].format = %s\n", i, util_format_name(image[i].image_state.format)); - -} - -static void -create_tes_jit_types(struct draw_tes_llvm_variant *var) -{ - struct gallivm_state *gallivm = var->gallivm; - LLVMTypeRef texture_type, sampler_type, image_type, context_type; - - texture_type = create_jit_texture_type(gallivm, "texture"); - sampler_type = create_jit_sampler_type(gallivm, "sampler"); - image_type = create_jit_image_type(gallivm, "image"); - - context_type = create_tes_jit_context_type(gallivm, - 0, - texture_type, sampler_type, - image_type, - "draw_tes_jit_context"); - var->context_ptr_type = LLVMPointerType(context_type, 0); - - var->input_array_type = create_tes_jit_input_type(gallivm); -} - -static LLVMTypeRef -get_tes_context_ptr_type(struct draw_tes_llvm_variant *variant) -{ - if (!variant->context_ptr_type) - create_tes_jit_types(variant); - return variant->context_ptr_type; -} - -static LLVMValueRef -generate_tes_mask_value(struct draw_tes_llvm_variant *variant, - struct lp_type tes_type, LLVMValueRef limit, LLVMValueRef loop_counter) -{ - struct gallivm_state *gallivm = variant->gallivm; - LLVMBuilderRef builder = gallivm->builder; - struct lp_type mask_type = lp_int_type(tes_type); - LLVMValueRef num_prims; - LLVMValueRef mask_val = lp_build_const_vec(gallivm, mask_type, 0); - unsigned i; - - num_prims = lp_build_broadcast(gallivm, lp_build_vec_type(gallivm, mask_type), limit); - for (i = 0; i < tes_type.length; i++) { - LLVMValueRef idx = lp_build_const_int32(gallivm, i); - mask_val = LLVMBuildInsertElement(builder, mask_val, LLVMBuildAdd(builder, loop_counter, idx, ""), idx, ""); - } - mask_val = lp_build_compare(gallivm, mask_type, - PIPE_FUNC_GREATER, num_prims, mask_val); - - return mask_val; -} - -static LLVMValueRef -draw_tes_llvm_fetch_vertex_input(const struct lp_build_tes_iface *tes_iface, - struct lp_build_context *bld, - boolean is_vindex_indirect, - LLVMValueRef vertex_index, - boolean is_aindex_indirect, - LLVMValueRef attrib_index, - LLVMValueRef swizzle_index) -{ - const struct draw_tes_llvm_iface *tes = draw_tes_llvm_iface(tes_iface); - struct gallivm_state *gallivm = bld->gallivm; - LLVMBuilderRef builder = gallivm->builder; - LLVMValueRef indices[3]; - LLVMValueRef res; - struct lp_type type = bld->type; - - if (is_vindex_indirect || is_aindex_indirect) { - int i; - - res = bld->zero; - - for (i = 0; i < type.length; ++i) { - LLVMValueRef idx = lp_build_const_int32(gallivm, i); - LLVMValueRef vert_chan_index = vertex_index; - LLVMValueRef attr_chan_index = attrib_index; - LLVMValueRef channel_vec; - - 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] = attr_chan_index; - indices[2] = swizzle_index; - - channel_vec = LLVMBuildGEP(builder, tes->input, indices, 3, ""); - channel_vec = LLVMBuildLoad(builder, channel_vec, ""); - - res = LLVMBuildInsertElement(builder, res, channel_vec, idx, ""); - } - } else { - indices[0] = vertex_index; - indices[1] = attrib_index; - indices[2] = swizzle_index; - - res = LLVMBuildGEP(builder, tes->input, indices, 3, ""); - res = LLVMBuildLoad(builder, res, ""); - res = lp_build_broadcast_scalar(bld, res); - } - return res; -} - -static LLVMValueRef -draw_tes_llvm_fetch_patch_input(const struct lp_build_tes_iface *tes_iface, - struct lp_build_context *bld, - boolean is_aindex_indirect, - LLVMValueRef attrib_index, - LLVMValueRef swizzle_index) -{ - const struct draw_tes_llvm_iface *tes = draw_tes_llvm_iface(tes_iface); - struct gallivm_state *gallivm = bld->gallivm; - LLVMBuilderRef builder = gallivm->builder; - LLVMValueRef indices[3]; - LLVMValueRef res; - struct lp_type type = bld->type; - - if (is_aindex_indirect) { - int i; - - res = bld->zero; - - for (i = 0; i < type.length; ++i) { - LLVMValueRef idx = lp_build_const_int32(gallivm, i); - LLVMValueRef attr_chan_index = attrib_index; - LLVMValueRef channel_vec; - - if (is_aindex_indirect) { - attr_chan_index = LLVMBuildExtractElement(builder, - attrib_index, idx, ""); - } - - indices[0] = lp_build_const_int32(gallivm, 0); - indices[1] = attr_chan_index; - indices[2] = swizzle_index; - - channel_vec = LLVMBuildGEP(builder, tes->input, indices, 3, ""); - channel_vec = LLVMBuildLoad(builder, channel_vec, ""); - - res = LLVMBuildInsertElement(builder, res, channel_vec, idx, ""); - } - } else { - indices[0] = lp_build_const_int32(gallivm, 0); - indices[1] = attrib_index; - indices[2] = swizzle_index; - - res = LLVMBuildGEP(builder, tes->input, indices, 3, ""); - res = LLVMBuildLoad(builder, res, ""); - res = lp_build_broadcast_scalar(bld, res); - } - return res; -} - -static void -draw_tes_llvm_generate(struct draw_llvm *llvm, - struct draw_tes_llvm_variant *variant) -{ - struct gallivm_state *gallivm = variant->gallivm; - LLVMContextRef context = gallivm->context; - LLVMTypeRef int32_type = LLVMInt32TypeInContext(context); - LLVMTypeRef flt_type = LLVMFloatTypeInContext(context); - LLVMTypeRef arg_types[10]; - LLVMTypeRef func_type; - LLVMValueRef variant_func; - LLVMValueRef context_ptr; - LLVMValueRef tess_coord[2], io_ptr, input_array, num_tess_coord; - LLVMValueRef tess_inner, tess_outer, prim_id, patch_vertices_in; - LLVMBasicBlockRef block; - LLVMBuilderRef builder; - LLVMValueRef mask_val; - struct lp_build_context bld, bldvec; - struct lp_build_sampler_soa *sampler = 0; - struct lp_build_image_soa *image = NULL; - struct lp_bld_tgsi_system_values system_values; - char func_name[64]; - unsigned i; - struct draw_tes_llvm_iface tes_iface; - LLVMValueRef outputs[PIPE_MAX_SHADER_OUTPUTS][TGSI_NUM_CHANNELS]; - struct lp_build_mask_context mask; - LLVMValueRef consts_ptr, num_consts_ptr; - LLVMValueRef ssbos_ptr, num_ssbos_ptr; - LLVMValueRef step; - struct lp_type tes_type; - unsigned vector_length = variant->shader->base.vector_length; - - memset(&system_values, 0, sizeof(system_values)); - memset(&outputs, 0, sizeof(outputs)); - - snprintf(func_name, sizeof(func_name), "draw_llvm_tes_variant%u", - variant->shader->variants_cached); - - arg_types[0] = get_tes_context_ptr_type(variant); /* context */ - arg_types[1] = variant->input_array_type; /* input */ - arg_types[2] = variant->vertex_header_ptr_type; - arg_types[3] = int32_type; - arg_types[4] = int32_type; - arg_types[5] = LLVMPointerType(flt_type, 0); - arg_types[6] = LLVMPointerType(flt_type, 0); - arg_types[7] = LLVMPointerType(LLVMArrayType(flt_type, 4), 0); - arg_types[8] = LLVMPointerType(LLVMArrayType(flt_type, 2), 0); - arg_types[9] = int32_type; - - func_type = LLVMFunctionType(int32_type, arg_types, ARRAY_SIZE(arg_types), 0); - variant_func = LLVMAddFunction(gallivm->module, func_name, func_type); - - variant->function = variant_func; - LLVMSetFunctionCallConv(variant_func, LLVMCCallConv); - - for (i = 0; i < ARRAY_SIZE(arg_types); ++i) - if (LLVMGetTypeKind(arg_types[i]) == LLVMPointerTypeKind) - lp_add_function_attr(variant_func, i + 1, LP_FUNC_ATTR_NOALIAS); - - context_ptr = LLVMGetParam(variant_func, 0); - input_array = LLVMGetParam(variant_func, 1); - io_ptr = LLVMGetParam(variant_func, 2); - prim_id = LLVMGetParam(variant_func, 3); - num_tess_coord = LLVMGetParam(variant_func, 4); - tess_coord[0] = LLVMGetParam(variant_func, 5); - tess_coord[1] = LLVMGetParam(variant_func, 6); - tess_outer = LLVMGetParam(variant_func, 7); - tess_inner = LLVMGetParam(variant_func, 8); - patch_vertices_in = LLVMGetParam(variant_func, 9); - - lp_build_name(context_ptr, "context"); - lp_build_name(input_array, "input"); - lp_build_name(io_ptr, "io"); - lp_build_name(prim_id, "prim_id"); - lp_build_name(num_tess_coord, "num_tess_coord"); - lp_build_name(tess_coord[0], "tess_coord[0]"); - lp_build_name(tess_coord[1], "tess_coord[1]"); - lp_build_name(tess_outer, "tess_outer"); - lp_build_name(tess_inner, "tess_inner"); - lp_build_name(patch_vertices_in, "patch_vertices_in"); - - tes_iface.base.fetch_vertex_input = draw_tes_llvm_fetch_vertex_input; - tes_iface.base.fetch_patch_input = draw_tes_llvm_fetch_patch_input; - tes_iface.input = input_array; - tes_iface.variant = variant; - - block = LLVMAppendBasicBlockInContext(gallivm->context, variant_func, "entry"); - builder = gallivm->builder; - LLVMPositionBuilderAtEnd(builder, block); - - lp_build_context_init(&bld, gallivm, lp_type_int(32)); - - memset(&tes_type, 0, sizeof tes_type); - tes_type.floating = TRUE; /* floating point values */ - tes_type.sign = TRUE; /* values are signed */ - tes_type.norm = FALSE; /* values are not limited to [0,1] or [-1,1] */ - tes_type.width = 32; /* 32-bit float */ - tes_type.length = vector_length; - - lp_build_context_init(&bldvec, variant->gallivm, lp_int_type(tes_type)); - consts_ptr = draw_tes_jit_context_constants(variant->gallivm, context_ptr); - num_consts_ptr = - draw_tes_jit_context_num_constants(variant->gallivm, context_ptr); - - ssbos_ptr = draw_tes_jit_context_ssbos(variant->gallivm, context_ptr); - num_ssbos_ptr = - draw_tes_jit_context_num_ssbos(variant->gallivm, context_ptr); - sampler = draw_llvm_sampler_soa_create(variant->key.samplers); - image = draw_llvm_image_soa_create(draw_tes_llvm_variant_key_images(&variant->key)); - step = lp_build_const_int32(gallivm, vector_length); - - system_values.tess_outer = LLVMBuildLoad(builder, tess_outer, ""); - system_values.tess_inner = LLVMBuildLoad(builder, tess_inner, ""); - - system_values.prim_id = lp_build_broadcast_scalar(&bldvec, prim_id); - - system_values.vertices_in = lp_build_broadcast_scalar(&bldvec, patch_vertices_in); - struct lp_build_loop_state lp_loop; - lp_build_loop_begin(&lp_loop, gallivm, bld.zero); - { - LLVMValueRef io; - - io = LLVMBuildGEP(builder, io_ptr, &lp_loop.counter, 1, ""); - mask_val = generate_tes_mask_value(variant, tes_type, num_tess_coord, lp_loop.counter); - lp_build_mask_begin(&mask, gallivm, tes_type, mask_val); - - system_values.tess_coord = LLVMGetUndef(LLVMArrayType(LLVMVectorType(flt_type, vector_length), 3)); - for (i = 0; i < 3; i++) { - LLVMValueRef tess_coord_chan = LLVMGetUndef(LLVMVectorType(flt_type, vector_length)); - for (unsigned j = 0; j < vector_length; j++) { - LLVMValueRef idx = LLVMBuildAdd(builder, lp_loop.counter, lp_build_const_int32(gallivm, j), ""); - LLVMValueRef tc_val; - if (i == 2) { - if (variant->shader->base.prim_mode == PIPE_PRIM_TRIANGLES) { - tc_val = lp_build_const_float(gallivm, 1.0); - tc_val = LLVMBuildFSub(builder, tc_val, lp_build_pointer_get(builder, tess_coord[0], idx), ""); - tc_val = LLVMBuildFSub(builder, tc_val, lp_build_pointer_get(builder, tess_coord[1], idx), ""); - } else - tc_val = lp_build_const_float(gallivm, 0.0); - } else - tc_val = lp_build_pointer_get(builder, tess_coord[i], idx); - - tess_coord_chan = LLVMBuildInsertElement(builder, tess_coord_chan, tc_val, lp_build_const_int32(gallivm, j), ""); - } - system_values.tess_coord = LLVMBuildInsertValue(builder, system_values.tess_coord, tess_coord_chan, i, ""); - } - - struct lp_build_tgsi_params params; - memset(¶ms, 0, sizeof(params)); - - params.type = tes_type; - params.mask = &mask; - params.consts_ptr = consts_ptr; - params.const_sizes_ptr = num_consts_ptr; - params.system_values = &system_values; - params.context_ptr = context_ptr; - params.sampler = sampler; - params.info = &llvm->draw->tes.tess_eval_shader->info; - params.ssbo_ptr = ssbos_ptr; - params.ssbo_sizes_ptr = num_ssbos_ptr; - params.image = image; - params.tes_iface = &tes_iface.base; - - lp_build_nir_soa(variant->gallivm, - llvm->draw->tes.tess_eval_shader->state.ir.nir, - ¶ms, - outputs); - - lp_build_mask_end(&mask); - LLVMValueRef clipmask = lp_build_const_int_vec(gallivm, - lp_int_type(tes_type), 0); - - convert_to_aos(gallivm, io, NULL, outputs, clipmask, - params.info->num_outputs, tes_type, FALSE); - } - lp_build_loop_end_cond(&lp_loop, num_tess_coord, step, LLVMIntUGE); - sampler->destroy(sampler); - image->destroy(image); - - LLVMBuildRet(builder, lp_build_zero(gallivm, lp_type_uint(32))); - gallivm_verify_function(gallivm, variant_func); -} - -struct draw_tes_llvm_variant * -draw_tes_llvm_create_variant(struct draw_llvm *llvm, - unsigned num_outputs, - const struct draw_tes_llvm_variant_key *key) -{ - struct draw_tes_llvm_variant *variant; - struct llvm_tess_eval_shader *shader = llvm_tess_eval_shader(llvm->draw->tes.tess_eval_shader); - LLVMTypeRef vertex_header; - char module_name[64]; - - variant = MALLOC(sizeof *variant + - shader->variant_key_size - sizeof variant->key); - if (!variant) - return NULL; - - variant->llvm = llvm; - variant->shader = shader; - - snprintf(module_name, sizeof(module_name), "draw_llvm_tes_variant%u", - variant->shader->variants_cached); - - variant->gallivm = gallivm_create(module_name, llvm->context); - - create_tes_jit_types(variant); - - memcpy(&variant->key, key, shader->variant_key_size); - - vertex_header = create_jit_vertex_header(variant->gallivm, num_outputs); - - variant->vertex_header_ptr_type = LLVMPointerType(vertex_header, 0); - - if (gallivm_debug & (GALLIVM_DEBUG_TGSI | GALLIVM_DEBUG_IR)) { - nir_print_shader(llvm->draw->tes.tess_eval_shader->state.ir.nir, stderr); - draw_tes_llvm_dump_variant_key(&variant->key); - } - - draw_tes_llvm_generate(llvm, variant); - - gallivm_compile_module(variant->gallivm); - - variant->jit_func = (draw_tes_jit_func) - gallivm_jit_function(variant->gallivm, variant->function); - - gallivm_free_ir(variant->gallivm); - - variant->list_item_global.base = variant; - variant->list_item_local.base = variant; - /*variant->no = */shader->variants_created++; - variant->list_item_global.base = variant; - - return variant; -} - -void -draw_tes_llvm_destroy_variant(struct draw_tes_llvm_variant *variant) -{ - struct draw_llvm *llvm = variant->llvm; - - if (gallivm_debug & (GALLIVM_DEBUG_TGSI | GALLIVM_DEBUG_IR)) { - debug_printf("Deleting TES variant: %u tes variants,\t%u total variants\n", - variant->shader->variants_cached, llvm->nr_tes_variants); - } - - gallivm_destroy(variant->gallivm); - - remove_from_list(&variant->list_item_local); - variant->shader->variants_cached--; - remove_from_list(&variant->list_item_global); - llvm->nr_tes_variants--; - FREE(variant); -} - -struct draw_tes_llvm_variant_key * -draw_tes_llvm_make_variant_key(struct draw_llvm *llvm, char *store) -{ - unsigned i; - struct draw_tes_llvm_variant_key *key; - struct draw_sampler_static_state *draw_sampler; - struct draw_image_static_state *draw_image; - - key = (struct draw_tes_llvm_variant_key *)store; - - memset(key, 0, offsetof(struct draw_tes_llvm_variant_key, samplers[0])); - - /* All variants of this shader will have the same value for - * nr_samplers. Not yet trying to compact away holes in the - * sampler array. - */ - key->nr_samplers = llvm->draw->tes.tess_eval_shader->info.file_max[TGSI_FILE_SAMPLER] + 1; - if (llvm->draw->tes.tess_eval_shader->info.file_max[TGSI_FILE_SAMPLER_VIEW] != -1) { - key->nr_sampler_views = - llvm->draw->tes.tess_eval_shader->info.file_max[TGSI_FILE_SAMPLER_VIEW] + 1; - } - else { - key->nr_sampler_views = key->nr_samplers; - } - - key->nr_images = llvm->draw->tes.tess_eval_shader->info.file_max[TGSI_FILE_IMAGE] + 1; - - draw_sampler = key->samplers; - - memset(draw_sampler, 0, MAX2(key->nr_samplers, key->nr_sampler_views) * sizeof *draw_sampler); - - for (i = 0 ; i < key->nr_samplers; i++) { - lp_sampler_static_sampler_state(&draw_sampler[i].sampler_state, - llvm->draw->samplers[PIPE_SHADER_TESS_EVAL][i]); - } - for (i = 0 ; i < key->nr_sampler_views; i++) { - lp_sampler_static_texture_state(&draw_sampler[i].texture_state, - llvm->draw->sampler_views[PIPE_SHADER_TESS_EVAL][i]); - } - - draw_image = draw_tes_llvm_variant_key_images(key); - memset(draw_image, 0, - key->nr_images * sizeof *draw_image); - for (i = 0; i < key->nr_images; i++) { - lp_sampler_static_texture_state_image(&draw_image[i].image_state, - llvm->draw->images[PIPE_SHADER_TESS_EVAL][i]); - } - return key; -} - -void -draw_tes_llvm_dump_variant_key(struct draw_tes_llvm_variant_key *key) -{ - unsigned i; - struct draw_sampler_static_state *sampler = key->samplers; - struct draw_image_static_state *image = draw_tes_llvm_variant_key_images(key); - for (i = 0 ; i < key->nr_sampler_views; i++) { - debug_printf("sampler[%i].src_format = %s\n", i, - util_format_name(sampler[i].texture_state.format)); - } - - for (i = 0 ; i < key->nr_images; i++) - debug_printf("images[%i].format = %s\n", i, util_format_name(image[i].image_state.format)); - -} diff --git a/lib/mesa/src/gallium/auxiliary/draw/draw_llvm.h b/lib/mesa/src/gallium/auxiliary/draw/draw_llvm.h index b1c498631..6edc89b63 100644 --- a/lib/mesa/src/gallium/auxiliary/draw/draw_llvm.h +++ b/lib/mesa/src/gallium/auxiliary/draw/draw_llvm.h @@ -32,7 +32,6 @@ #include "draw/draw_vs.h" #include "draw/draw_gs.h" -#include "draw/draw_tess.h" #include "gallivm/lp_bld_sample.h" #include "gallivm/lp_bld_limits.h" @@ -44,8 +43,6 @@ struct draw_llvm; struct llvm_vertex_shader; struct llvm_geometry_shader; -struct llvm_tess_ctrl_shader; -struct llvm_tess_eval_shader; struct draw_jit_texture { @@ -320,103 +317,6 @@ enum { #define draw_gs_jit_context_num_ssbos(_gallivm, _ptr) \ lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_GS_JIT_CTX_NUM_SSBOS, "num_ssbos") - -struct draw_tcs_jit_context { - const float *constants[LP_MAX_TGSI_CONST_BUFFERS]; - int num_constants[LP_MAX_TGSI_CONST_BUFFERS]; - - int dummy1; - int dummy2; - /* There two need to be exactly at DRAW_JIT_CTX_TEXTURES and - * DRAW_JIT_CTX_SAMPLERS positions in the struct */ - struct draw_jit_texture textures[PIPE_MAX_SHADER_SAMPLER_VIEWS]; - struct draw_jit_sampler samplers[PIPE_MAX_SAMPLERS]; - struct draw_jit_image images[PIPE_MAX_SHADER_IMAGES]; - - const uint32_t *ssbos[LP_MAX_TGSI_SHADER_BUFFERS]; - int num_ssbos[LP_MAX_TGSI_SHADER_BUFFERS]; -}; - -enum { - DRAW_TCS_JIT_CTX_CONSTANTS = 0, - DRAW_TCS_JIT_CTX_NUM_CONSTANTS = 1, - DRAW_TCS_JIT_CTX_TEXTURES = DRAW_JIT_CTX_TEXTURES, - DRAW_TCS_JIT_CTX_SAMPLERS = DRAW_JIT_CTX_SAMPLERS, - DRAW_TCS_JIT_CTX_IMAGES = DRAW_JIT_CTX_IMAGES, - DRAW_TCS_JIT_CTX_SSBOS = 7, - DRAW_TCS_JIT_CTX_NUM_SSBOS = 8, - DRAW_TCS_JIT_CTX_NUM_FIELDS = 9, -}; - -#define draw_tcs_jit_context_constants(_gallivm, _ptr) \ - lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_TCS_JIT_CTX_CONSTANTS, "constants") - -#define draw_tcs_jit_context_num_constants(_gallivm, _ptr) \ - lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_TCS_JIT_CTX_NUM_CONSTANTS, "num_constants") - -#define draw_tcs_jit_context_textures(_gallivm, _ptr) \ - lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_TCS_JIT_CTX_TEXTURES, "textures") - -#define draw_tcs_jit_context_samplers(_gallivm, _ptr) \ - lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_TCS_JIT_CTX_SAMPLERS, "samplers") - -#define draw_tcs_jit_context_images(_gallivm, _ptr) \ - lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_TCS_JIT_CTX_IMAGES, "images") - -#define draw_tcs_jit_context_ssbos(_gallivm, _ptr) \ - lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_TCS_JIT_CTX_SSBOS, "ssbos") - -#define draw_tcs_jit_context_num_ssbos(_gallivm, _ptr) \ - lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_TCS_JIT_CTX_NUM_SSBOS, "num_ssbos") - -struct draw_tes_jit_context { - const float *constants[LP_MAX_TGSI_CONST_BUFFERS]; - int num_constants[LP_MAX_TGSI_CONST_BUFFERS]; - - int dummy1; - int dummy2; - /* There two need to be exactly at DRAW_JIT_CTX_TEXTURES and - * DRAW_JIT_CTX_SAMPLERS positions in the struct */ - struct draw_jit_texture textures[PIPE_MAX_SHADER_SAMPLER_VIEWS]; - struct draw_jit_sampler samplers[PIPE_MAX_SAMPLERS]; - struct draw_jit_image images[PIPE_MAX_SHADER_IMAGES]; - - const uint32_t *ssbos[LP_MAX_TGSI_SHADER_BUFFERS]; - int num_ssbos[LP_MAX_TGSI_SHADER_BUFFERS]; -}; - -enum { - DRAW_TES_JIT_CTX_CONSTANTS = 0, - DRAW_TES_JIT_CTX_NUM_CONSTANTS = 1, - DRAW_TES_JIT_CTX_TEXTURES = DRAW_JIT_CTX_TEXTURES, - DRAW_TES_JIT_CTX_SAMPLERS = DRAW_JIT_CTX_SAMPLERS, - DRAW_TES_JIT_CTX_IMAGES = DRAW_JIT_CTX_IMAGES, - DRAW_TES_JIT_CTX_SSBOS = 7, - DRAW_TES_JIT_CTX_NUM_SSBOS = 8, - DRAW_TES_JIT_CTX_NUM_FIELDS = 9, -}; - -#define draw_tes_jit_context_constants(_gallivm, _ptr) \ - lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_TES_JIT_CTX_CONSTANTS, "constants") - -#define draw_tes_jit_context_num_constants(_gallivm, _ptr) \ - lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_TES_JIT_CTX_NUM_CONSTANTS, "num_constants") - -#define draw_tes_jit_context_textures(_gallivm, _ptr) \ - lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_TES_JIT_CTX_TEXTURES, "textures") - -#define draw_tes_jit_context_samplers(_gallivm, _ptr) \ - lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_TES_JIT_CTX_SAMPLERS, "samplers") - -#define draw_tes_jit_context_images(_gallivm, _ptr) \ - lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_TES_JIT_CTX_IMAGES, "images") - -#define draw_tes_jit_context_ssbos(_gallivm, _ptr) \ - lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_TES_JIT_CTX_SSBOS, "ssbos") - -#define draw_tes_jit_context_num_ssbos(_gallivm, _ptr) \ - lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_TES_JIT_CTX_NUM_SSBOS, "num_ssbos") - typedef boolean (*draw_jit_vert_func)(struct draw_jit_context *context, struct vertex_header *io, @@ -435,27 +335,12 @@ typedef boolean typedef int (*draw_gs_jit_func)(struct draw_gs_jit_context *context, float inputs[6][PIPE_MAX_SHADER_INPUTS][TGSI_NUM_CHANNELS][TGSI_NUM_CHANNELS], - struct vertex_header **output, + struct vertex_header *output, unsigned num_prims, unsigned instance_id, int *prim_ids, unsigned invocation_id); -typedef int -(*draw_tcs_jit_func)(struct draw_tcs_jit_context *context, - float inputs[32][NUM_TCS_INPUTS][TGSI_NUM_CHANNELS], - float outputs[32][PIPE_MAX_SHADER_INPUTS][TGSI_NUM_CHANNELS], - uint32_t prim_id, uint32_t patch_vertices_in); - -typedef int -(*draw_tes_jit_func)(struct draw_tes_jit_context *context, - float inputs[32][PIPE_MAX_SHADER_INPUTS][TGSI_NUM_CHANNELS], - struct vertex_header *io, - uint32_t prim_id, uint32_t num_tess_coord, - float *tess_coord_x, float *tess_coord_y, float *tess_outer, - float *tess_inner, uint32_t patch_vertices_in); - - struct draw_llvm_variant_key { unsigned nr_vertex_elements:8; @@ -469,7 +354,7 @@ struct draw_llvm_variant_key unsigned clip_halfz:1; unsigned bypass_viewport:1; unsigned need_edgeflags:1; - unsigned has_gs_or_tes:1; + unsigned has_gs:1; unsigned num_outputs:8; unsigned ucp_enable:PIPE_MAX_CLIP_PLANES; /* note padding here - must use memset */ @@ -497,24 +382,6 @@ struct draw_gs_llvm_variant_key /* Followed by variable number of images.*/ }; -struct draw_tcs_llvm_variant_key -{ - unsigned nr_samplers:8; - unsigned nr_sampler_views:8; - unsigned nr_images:8; - struct draw_sampler_static_state samplers[1]; - /* Followed by variable number of images.*/ -}; - -struct draw_tes_llvm_variant_key -{ - unsigned nr_samplers:8; - unsigned nr_sampler_views:8; - unsigned nr_images:8; - struct draw_sampler_static_state samplers[1]; - /* Followed by variable number of images.*/ -}; - #define DRAW_LLVM_MAX_VARIANT_KEY_SIZE \ (sizeof(struct draw_llvm_variant_key) + \ PIPE_MAX_SHADER_SAMPLER_VIEWS * sizeof(struct draw_sampler_static_state) + \ @@ -526,16 +393,6 @@ struct draw_tes_llvm_variant_key PIPE_MAX_SHADER_IMAGES * sizeof(struct draw_image_static_state) + \ PIPE_MAX_SHADER_SAMPLER_VIEWS * sizeof(struct draw_sampler_static_state)) -#define DRAW_TCS_LLVM_MAX_VARIANT_KEY_SIZE \ - (sizeof(struct draw_tcs_llvm_variant_key) + \ - PIPE_MAX_SHADER_IMAGES * sizeof(struct draw_image_static_state) + \ - PIPE_MAX_SHADER_SAMPLER_VIEWS * sizeof(struct draw_sampler_static_state)) - -#define DRAW_TES_LLVM_MAX_VARIANT_KEY_SIZE \ - (sizeof(struct draw_tes_llvm_variant_key) + \ - PIPE_MAX_SHADER_IMAGES * sizeof(struct draw_image_static_state) + \ - PIPE_MAX_SHADER_SAMPLER_VIEWS * sizeof(struct draw_sampler_static_state)) - static inline size_t draw_llvm_variant_key_size(unsigned nr_vertex_elements, @@ -556,21 +413,6 @@ draw_gs_llvm_variant_key_size(unsigned nr_samplers, unsigned nr_images) (nr_samplers - 1) * sizeof(struct draw_sampler_static_state)); } -static inline size_t -draw_tcs_llvm_variant_key_size(unsigned nr_samplers, unsigned nr_images) -{ - return (sizeof(struct draw_tcs_llvm_variant_key) + - (nr_images) * sizeof(struct draw_sampler_static_state) + - (nr_samplers - 1) * sizeof(struct draw_sampler_static_state)); -} - -static inline size_t -draw_tes_llvm_variant_key_size(unsigned nr_samplers, unsigned nr_images) -{ - return (sizeof(struct draw_tes_llvm_variant_key) + - (nr_images) * sizeof(struct draw_sampler_static_state) + - (nr_samplers - 1) * sizeof(struct draw_sampler_static_state)); -} static inline struct draw_sampler_static_state * draw_llvm_variant_key_samplers(struct draw_llvm_variant_key *key) @@ -595,20 +437,6 @@ draw_gs_llvm_variant_key_images(struct draw_gs_llvm_variant_key *key) &key->samplers[key->nr_samplers]; } -static inline struct draw_image_static_state * -draw_tcs_llvm_variant_key_images(struct draw_tcs_llvm_variant_key *key) -{ - return (struct draw_image_static_state *) - &key->samplers[key->nr_samplers]; -} - -static inline struct draw_image_static_state * -draw_tes_llvm_variant_key_images(struct draw_tes_llvm_variant_key *key) -{ - return (struct draw_image_static_state *) - &key->samplers[key->nr_samplers]; -} - struct draw_llvm_variant_list_item { struct draw_llvm_variant *base; @@ -621,17 +449,6 @@ struct draw_gs_llvm_variant_list_item struct draw_gs_llvm_variant_list_item *next, *prev; }; -struct draw_tcs_llvm_variant_list_item -{ - struct draw_tcs_llvm_variant *base; - struct draw_tcs_llvm_variant_list_item *next, *prev; -}; - -struct draw_tes_llvm_variant_list_item -{ - struct draw_tes_llvm_variant *base; - struct draw_tes_llvm_variant_list_item *next, *prev; -}; struct draw_llvm_variant { @@ -682,57 +499,6 @@ struct draw_gs_llvm_variant struct draw_gs_llvm_variant_key key; }; -struct draw_tcs_llvm_variant -{ - struct gallivm_state *gallivm; - - /* LLVM JIT builder types */ - LLVMTypeRef context_ptr_type; - LLVMTypeRef input_array_type; - LLVMTypeRef output_array_type; - - LLVMValueRef context_ptr; - LLVMValueRef io_ptr; - LLVMValueRef num_prims; - LLVMValueRef function; - draw_tcs_jit_func jit_func; - - struct llvm_tess_ctrl_shader *shader; - - struct draw_llvm *llvm; - struct draw_tcs_llvm_variant_list_item list_item_global; - struct draw_tcs_llvm_variant_list_item list_item_local; - - /* key is variable-sized, must be last */ - struct draw_tcs_llvm_variant_key key; -}; - -struct draw_tes_llvm_variant -{ - struct gallivm_state *gallivm; - - /* LLVM JIT builder types */ - LLVMTypeRef context_ptr_type; - LLVMTypeRef vertex_header_ptr_type; - LLVMTypeRef input_array_type; - LLVMTypeRef patch_input_array_type; - - LLVMValueRef context_ptr; - LLVMValueRef io_ptr; - LLVMValueRef num_prims; - LLVMValueRef function; - draw_tes_jit_func jit_func; - - struct llvm_tess_eval_shader *shader; - - struct draw_llvm *llvm; - struct draw_tes_llvm_variant_list_item list_item_global; - struct draw_tes_llvm_variant_list_item list_item_local; - - /* key is variable-sized, must be last */ - struct draw_tes_llvm_variant_key key; -}; - struct llvm_vertex_shader { struct draw_vertex_shader base; @@ -751,23 +517,6 @@ struct llvm_geometry_shader { unsigned variants_cached; }; -struct llvm_tess_ctrl_shader { - struct draw_tess_ctrl_shader base; - - unsigned variant_key_size; - struct draw_tcs_llvm_variant_list_item variants; - unsigned variants_created; - unsigned variants_cached; -}; - -struct llvm_tess_eval_shader { - struct draw_tess_eval_shader base; - - unsigned variant_key_size; - struct draw_tes_llvm_variant_list_item variants; - unsigned variants_created; - unsigned variants_cached; -}; struct draw_llvm { struct draw_context *draw; @@ -777,20 +526,12 @@ struct draw_llvm { struct draw_jit_context jit_context; struct draw_gs_jit_context gs_jit_context; - struct draw_tcs_jit_context tcs_jit_context; - struct draw_tes_jit_context tes_jit_context; struct draw_llvm_variant_list_item vs_variants_list; int nr_variants; struct draw_gs_llvm_variant_list_item gs_variants_list; int nr_gs_variants; - - struct draw_tcs_llvm_variant_list_item tcs_variants_list; - int nr_tcs_variants; - - struct draw_tes_llvm_variant_list_item tes_variants_list; - int nr_tes_variants; }; @@ -806,17 +547,8 @@ llvm_geometry_shader(struct draw_geometry_shader *gs) return (struct llvm_geometry_shader *)gs; } -static inline struct llvm_tess_ctrl_shader * -llvm_tess_ctrl_shader(struct draw_tess_ctrl_shader *tcs) -{ - return (struct llvm_tess_ctrl_shader *)tcs; -} -static inline struct llvm_tess_eval_shader * -llvm_tess_eval_shader(struct draw_tess_eval_shader *tes) -{ - return (struct llvm_tess_eval_shader *)tes; -} + struct draw_llvm * draw_llvm_create(struct draw_context *draw, LLVMContextRef llvm_context); @@ -853,34 +585,6 @@ draw_gs_llvm_make_variant_key(struct draw_llvm *llvm, char *store); void draw_gs_llvm_dump_variant_key(struct draw_gs_llvm_variant_key *key); -struct draw_tcs_llvm_variant * -draw_tcs_llvm_create_variant(struct draw_llvm *llvm, - unsigned num_vertex_header_attribs, - const struct draw_tcs_llvm_variant_key *key); - -void -draw_tcs_llvm_destroy_variant(struct draw_tcs_llvm_variant *variant); - -struct draw_tcs_llvm_variant_key * -draw_tcs_llvm_make_variant_key(struct draw_llvm *llvm, char *store); - -void -draw_tcs_llvm_dump_variant_key(struct draw_tcs_llvm_variant_key *key); - -struct draw_tes_llvm_variant * -draw_tes_llvm_create_variant(struct draw_llvm *llvm, - unsigned num_vertex_header_attribs, - const struct draw_tes_llvm_variant_key *key); - -void -draw_tes_llvm_destroy_variant(struct draw_tes_llvm_variant *variant); - -struct draw_tes_llvm_variant_key * -draw_tes_llvm_make_variant_key(struct draw_llvm *llvm, char *store); - -void -draw_tes_llvm_dump_variant_key(struct draw_tes_llvm_variant_key *key); - struct lp_build_sampler_soa * draw_llvm_sampler_soa_create(const struct draw_sampler_static_state *static_state); diff --git a/lib/mesa/src/gallium/auxiliary/draw/draw_pipe_user_cull.c b/lib/mesa/src/gallium/auxiliary/draw/draw_pipe_user_cull.c deleted file mode 100644 index fcc177e04..000000000 --- a/lib/mesa/src/gallium/auxiliary/draw/draw_pipe_user_cull.c +++ /dev/null @@ -1,197 +0,0 @@ -/************************************************************************** - * - * Copyright 2007 VMware, Inc. - * All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sub license, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice (including the - * next paragraph) shall be included in all copies or substantial portions - * of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. - * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR - * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - **************************************************************************/ - -/** - * \brief Drawing stage for user culling - */ - -#include "util/u_math.h" -#include "util/u_memory.h" -#include "pipe/p_defines.h" -#include "draw_pipe.h" - -struct user_cull_stage { - struct draw_stage stage; -}; - -static inline struct user_cull_stage *user_cull_stage( struct draw_stage *stage ) -{ - return (struct user_cull_stage *)stage; -} - -static inline boolean -cull_distance_is_out(float dist) -{ - return (dist < 0.0f) || util_is_inf_or_nan(dist); -} - -/* - * If the shader writes the culldistance then we can - * perform distance based culling. Distance based - * culling doesn't require a face and can be performed - * on primitives without faces (e.g. points and lines) - */ -static void user_cull_point( struct draw_stage *stage, - struct prim_header *header ) -{ - const unsigned num_written_culldistances = - draw_current_shader_num_written_culldistances(stage->draw); - const unsigned num_written_clipdistances = - draw_current_shader_num_written_clipdistances(stage->draw); - unsigned i; - - debug_assert(num_written_culldistances); - - for (i = 0; i < num_written_culldistances; ++i) { - unsigned cull_idx = (num_written_clipdistances + i) / 4; - unsigned out_idx = - draw_current_shader_ccdistance_output(stage->draw, cull_idx); - unsigned idx = (num_written_clipdistances + i) % 4; - float cull1 = header->v[0]->data[out_idx][idx]; - boolean vert1_out = cull_distance_is_out(cull1); - if (vert1_out) - return; - } - stage->next->point( stage->next, header ); -} - -/* - * If the shader writes the culldistance then we can - * perform distance based culling. Distance based - * culling doesn't require a face and can be performed - * on primitives without faces (e.g. points and lines) - */ -static void user_cull_line( struct draw_stage *stage, - struct prim_header *header ) -{ - const unsigned num_written_culldistances = - draw_current_shader_num_written_culldistances(stage->draw); - const unsigned num_written_clipdistances = - draw_current_shader_num_written_clipdistances(stage->draw); - unsigned i; - - debug_assert(num_written_culldistances); - - for (i = 0; i < num_written_culldistances; ++i) { - unsigned cull_idx = (num_written_clipdistances + i) / 4; - unsigned out_idx = - draw_current_shader_ccdistance_output(stage->draw, cull_idx); - unsigned idx = (num_written_clipdistances + i) % 4; - float cull1 = header->v[0]->data[out_idx][idx]; - float cull2 = header->v[1]->data[out_idx][idx]; - boolean vert1_out = cull_distance_is_out(cull1); - boolean vert2_out = cull_distance_is_out(cull2); - if (vert1_out && vert2_out) - return; - } - stage->next->line( stage->next, header ); -} - -/* - * Triangles can be culled either using the cull distance - * shader outputs or the regular face culling. If required - * this function performs both, starting with distance culling. - */ -static void user_cull_tri( struct draw_stage *stage, - struct prim_header *header ) -{ - const unsigned num_written_culldistances = - draw_current_shader_num_written_culldistances(stage->draw); - const unsigned num_written_clipdistances = - draw_current_shader_num_written_clipdistances(stage->draw); - unsigned i; - - debug_assert(num_written_culldistances); - - /* Do the distance culling */ - for (i = 0; i < num_written_culldistances; ++i) { - unsigned cull_idx = (num_written_clipdistances + i) / 4; - unsigned out_idx = - draw_current_shader_ccdistance_output(stage->draw, cull_idx); - unsigned idx = (num_written_clipdistances + i) % 4; - float cull1 = header->v[0]->data[out_idx][idx]; - float cull2 = header->v[1]->data[out_idx][idx]; - float cull3 = header->v[2]->data[out_idx][idx]; - boolean vert1_out = cull_distance_is_out(cull1); - boolean vert2_out = cull_distance_is_out(cull2); - boolean vert3_out = cull_distance_is_out(cull3); - if (vert1_out && vert2_out && vert3_out) { - return; - } - } - stage->next->tri( stage->next, header ); -} - -static void user_cull_flush( struct draw_stage *stage, unsigned flags ) -{ - stage->point = user_cull_point; - stage->line = user_cull_line; - stage->tri = user_cull_tri; - stage->next->flush( stage->next, flags ); -} - -static void user_cull_reset_stipple_counter( struct draw_stage *stage ) -{ - stage->next->reset_stipple_counter( stage->next ); -} - -static void user_cull_destroy( struct draw_stage *stage ) -{ - draw_free_temp_verts( stage ); - FREE( stage ); -} - -/** - * Create a new polygon culling stage. - */ -struct draw_stage *draw_user_cull_stage( struct draw_context *draw ) -{ - struct user_cull_stage *user_cull = CALLOC_STRUCT(user_cull_stage); - if (!user_cull) - goto fail; - - user_cull->stage.draw = draw; - user_cull->stage.name = "user_cull"; - user_cull->stage.next = NULL; - user_cull->stage.point = user_cull_point; - user_cull->stage.line = user_cull_line; - user_cull->stage.tri = user_cull_tri; - user_cull->stage.flush = user_cull_flush; - user_cull->stage.reset_stipple_counter = user_cull_reset_stipple_counter; - user_cull->stage.destroy = user_cull_destroy; - - if (!draw_alloc_temp_verts( &user_cull->stage, 0 )) - goto fail; - - return &user_cull->stage; - -fail: - if (user_cull) - user_cull->stage.destroy( &user_cull->stage ); - - return NULL; -} diff --git a/lib/mesa/src/gallium/auxiliary/draw/draw_pipe_validate.c b/lib/mesa/src/gallium/auxiliary/draw/draw_pipe_validate.c index 940ca5644..846cd4db3 100644 --- a/lib/mesa/src/gallium/auxiliary/draw/draw_pipe_validate.c +++ b/lib/mesa/src/gallium/auxiliary/draw/draw_pipe_validate.c @@ -100,9 +100,6 @@ draw_need_pipeline(const struct draw_context *draw, /* point sprites */ if (rasterizer->sprite_coord_enable && draw->pipeline.point_sprite) return TRUE; - - if (draw_current_shader_num_written_culldistances(draw)) - return TRUE; } else if (reduced_prim == PIPE_PRIM_TRIANGLES) { /* polygon stipple */ @@ -255,7 +252,8 @@ static struct draw_stage *validate_pipeline( struct draw_stage *stage ) * to less work emitting vertices, smaller vertex buffers, etc. * It's difficult to say whether this will be true in general. */ - if (need_det || rast->cull_face != PIPE_FACE_NONE) { + if (need_det || rast->cull_face != PIPE_FACE_NONE || + draw_current_shader_num_written_culldistances(draw)) { draw->pipeline.cull->next = next; next = draw->pipeline.cull; } @@ -268,11 +266,6 @@ static struct draw_stage *validate_pipeline( struct draw_stage *stage ) next = draw->pipeline.clip; } - if (draw_current_shader_num_written_culldistances(draw)) { - draw->pipeline.user_cull->next = next; - next = draw->pipeline.user_cull; - } - draw->pipeline.first = next; if (0) { diff --git a/lib/mesa/src/gallium/auxiliary/draw/draw_private.h b/lib/mesa/src/gallium/auxiliary/draw/draw_private.h index a5a1b4e9b..0fd0caab3 100644 --- a/lib/mesa/src/gallium/auxiliary/draw/draw_private.h +++ b/lib/mesa/src/gallium/auxiliary/draw/draw_private.h @@ -122,7 +122,6 @@ struct draw_context struct draw_stage *flatshade; struct draw_stage *clip; struct draw_stage *cull; - struct draw_stage *user_cull; struct draw_stage *twoside; struct draw_stage *offset; struct draw_stage *unfilled; @@ -158,7 +157,7 @@ struct draw_context unsigned prim; unsigned opt; /**< bitmask of PT_x flags */ unsigned eltSize; /* saved eltSize for flushing */ - ubyte vertices_per_patch; + boolean rebind_parameters; struct { @@ -207,20 +206,12 @@ struct draw_context unsigned vs_constants_size[PIPE_MAX_CONSTANT_BUFFERS]; const void *gs_constants[PIPE_MAX_CONSTANT_BUFFERS]; unsigned gs_constants_size[PIPE_MAX_CONSTANT_BUFFERS]; - const void *tcs_constants[PIPE_MAX_CONSTANT_BUFFERS]; - unsigned tcs_constants_size[PIPE_MAX_CONSTANT_BUFFERS]; - const void *tes_constants[PIPE_MAX_CONSTANT_BUFFERS]; - unsigned tes_constants_size[PIPE_MAX_CONSTANT_BUFFERS]; /** shader buffers (for vertex/geometry shader) */ const void *vs_ssbos[PIPE_MAX_SHADER_BUFFERS]; unsigned vs_ssbos_size[PIPE_MAX_SHADER_BUFFERS]; const void *gs_ssbos[PIPE_MAX_SHADER_BUFFERS]; unsigned gs_ssbos_size[PIPE_MAX_SHADER_BUFFERS]; - const void *tcs_ssbos[PIPE_MAX_SHADER_BUFFERS]; - unsigned tcs_ssbos_size[PIPE_MAX_SHADER_BUFFERS]; - const void *tes_ssbos[PIPE_MAX_SHADER_BUFFERS]; - unsigned tes_ssbos_size[PIPE_MAX_SHADER_BUFFERS]; /* pointer to planes */ float (*planes)[DRAW_TOTAL_CLIP_PLANES][4]; @@ -312,34 +303,6 @@ struct draw_context } gs; - /* Tessellation state */ - struct { - struct draw_tess_ctrl_shader *tess_ctrl_shader; - - /** Fields for TGSI interpreter / execution */ - struct { - struct tgsi_exec_machine *machine; - - struct tgsi_sampler *sampler; - struct tgsi_image *image; - struct tgsi_buffer *buffer; - } tgsi; - } tcs; - - struct { - struct draw_tess_eval_shader *tess_eval_shader; - uint position_output; - - /** Fields for TGSI interpreter / execution */ - struct { - struct tgsi_exec_machine *machine; - - struct tgsi_sampler *sampler; - struct tgsi_image *image; - struct tgsi_buffer *buffer; - } tgsi; - } tes; - /** Fragment shader state */ struct { struct draw_fragment_shader *fragment_shader; @@ -386,8 +349,6 @@ struct draw_context struct pipe_query_data_pipeline_statistics statistics; boolean collect_statistics; - float default_outer_tess_level[4]; - float default_inner_tess_level[2]; bool collect_primgen; struct draw_assembler *ia; diff --git a/lib/mesa/src/gallium/auxiliary/draw/draw_pt.c b/lib/mesa/src/gallium/auxiliary/draw/draw_pt.c index 986f87e01..24ac05427 100644 --- a/lib/mesa/src/gallium/auxiliary/draw/draw_pt.c +++ b/lib/mesa/src/gallium/auxiliary/draw/draw_pt.c @@ -32,7 +32,6 @@ #include "draw/draw_context.h" #include "draw/draw_gs.h" -#include "draw/draw_tess.h" #include "draw/draw_private.h" #include "draw/draw_pt.h" #include "draw/draw_vbuf.h" @@ -67,24 +66,16 @@ draw_pt_arrays(struct draw_context *draw, */ { unsigned first, incr; - - if (prim == PIPE_PRIM_PATCHES) { - first = draw->pt.vertices_per_patch; - incr = draw->pt.vertices_per_patch; - } else - draw_pt_split_prim(prim, &first, &incr); + draw_pt_split_prim(prim, &first, &incr); count = draw_pt_trim_count(count, first, incr); if (count < first) return TRUE; } if (!draw->force_passthrough) { - unsigned out_prim = prim; - - if (draw->gs.geometry_shader) - out_prim = draw->gs.geometry_shader->output_primitive; - else if (draw->tes.tess_eval_shader) - out_prim = get_tes_output_prim(draw->tes.tess_eval_shader); + unsigned gs_out_prim = (draw->gs.geometry_shader ? + draw->gs.geometry_shader->output_primitive : + prim); if (!draw->render) { opt |= PT_PIPELINE; @@ -92,7 +83,7 @@ draw_pt_arrays(struct draw_context *draw, if (draw_need_pipeline(draw, draw->rasterizer, - out_prim)) { + gs_out_prim)) { opt |= PT_PIPELINE; } @@ -496,8 +487,6 @@ draw_vbo(struct draw_context *draw, draw->pt.user.eltSize = info->index_size ? draw->pt.user.eltSizeIB : 0; draw->pt.user.drawid = info->drawid; - draw->pt.vertices_per_patch = info->vertices_per_patch; - if (0) debug_printf("draw_vbo(mode=%u start=%u count=%u):\n", info->mode, info->start, count); diff --git a/lib/mesa/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c b/lib/mesa/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c index d403e81c2..c19eda2ed 100644 --- a/lib/mesa/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c +++ b/lib/mesa/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c @@ -30,7 +30,6 @@ #include "util/u_prim.h" #include "draw/draw_context.h" #include "draw/draw_gs.h" -#include "draw/draw_tess.h" #include "draw/draw_vbuf.h" #include "draw/draw_vertex.h" #include "draw/draw_pt.h" @@ -139,146 +138,6 @@ llvm_middle_end_prepare_gs(struct llvm_middle_end *fpme) gs->current_variant = variant; } -static void -llvm_middle_end_prepare_tcs(struct llvm_middle_end *fpme) -{ - struct draw_context *draw = fpme->draw; - struct draw_llvm *llvm = fpme->llvm; - struct draw_tess_ctrl_shader *tcs = draw->tcs.tess_ctrl_shader; - struct draw_tcs_llvm_variant_key *key; - struct draw_tcs_llvm_variant *variant = NULL; - struct draw_tcs_llvm_variant_list_item *li; - struct llvm_tess_ctrl_shader *shader = llvm_tess_ctrl_shader(tcs); - char store[DRAW_TCS_LLVM_MAX_VARIANT_KEY_SIZE]; - unsigned i; - - key = draw_tcs_llvm_make_variant_key(llvm, store); - - /* Search shader's list of variants for the key */ - li = first_elem(&shader->variants); - while (!at_end(&shader->variants, li)) { - if (memcmp(&li->base->key, key, shader->variant_key_size) == 0) { - variant = li->base; - break; - } - li = next_elem(li); - } - - if (variant) { - /* found the variant, move to head of global list (for LRU) */ - move_to_head(&llvm->tcs_variants_list, &variant->list_item_global); - } - else { - /* Need to create new variant */ - - /* First check if we've created too many variants. If so, free - * 3.125% of the LRU to avoid using too much memory. - */ - if (llvm->nr_tcs_variants >= DRAW_MAX_SHADER_VARIANTS) { - if (gallivm_debug & GALLIVM_DEBUG_PERF) { - debug_printf("Evicting TCS: %u tcs variants,\t%u total variants\n", - shader->variants_cached, llvm->nr_tcs_variants); - } - - /* - * XXX: should we flush here ? - */ - for (i = 0; i < DRAW_MAX_SHADER_VARIANTS / 32; i++) { - struct draw_tcs_llvm_variant_list_item *item; - if (is_empty_list(&llvm->tcs_variants_list)) { - break; - } - item = last_elem(&llvm->tcs_variants_list); - assert(item); - assert(item->base); - draw_tcs_llvm_destroy_variant(item->base); - } - } - - variant = draw_tcs_llvm_create_variant(llvm, 0, key); - - if (variant) { - insert_at_head(&shader->variants, &variant->list_item_local); - insert_at_head(&llvm->tcs_variants_list, - &variant->list_item_global); - llvm->nr_tcs_variants++; - shader->variants_cached++; - } - } - - tcs->current_variant = variant; -} - -static void -llvm_middle_end_prepare_tes(struct llvm_middle_end *fpme) -{ - struct draw_context *draw = fpme->draw; - struct draw_llvm *llvm = fpme->llvm; - struct draw_tess_eval_shader *tes = draw->tes.tess_eval_shader; - struct draw_tes_llvm_variant_key *key; - struct draw_tes_llvm_variant *variant = NULL; - struct draw_tes_llvm_variant_list_item *li; - struct llvm_tess_eval_shader *shader = llvm_tess_eval_shader(tes); - char store[DRAW_TES_LLVM_MAX_VARIANT_KEY_SIZE]; - unsigned i; - - key = draw_tes_llvm_make_variant_key(llvm, store); - - /* Search shader's list of variants for the key */ - li = first_elem(&shader->variants); - while (!at_end(&shader->variants, li)) { - if (memcmp(&li->base->key, key, shader->variant_key_size) == 0) { - variant = li->base; - break; - } - li = next_elem(li); - } - - if (variant) { - /* found the variant, move to head of global list (for LRU) */ - move_to_head(&llvm->tes_variants_list, &variant->list_item_global); - } - else { - /* Need to create new variant */ - - /* First check if we've created too many variants. If so, free - * 3.125% of the LRU to avoid using too much memory. - */ - if (llvm->nr_tes_variants >= DRAW_MAX_SHADER_VARIANTS) { - if (gallivm_debug & GALLIVM_DEBUG_PERF) { - debug_printf("Evicting TES: %u tes variants,\t%u total variants\n", - shader->variants_cached, llvm->nr_tes_variants); - } - - /* - * XXX: should we flush here ? - */ - for (i = 0; i < DRAW_MAX_SHADER_VARIANTS / 32; i++) { - struct draw_tes_llvm_variant_list_item *item; - if (is_empty_list(&llvm->tes_variants_list)) { - break; - } - item = last_elem(&llvm->tes_variants_list); - assert(item); - assert(item->base); - draw_tes_llvm_destroy_variant(item->base); - } - } - - variant = draw_tes_llvm_create_variant(llvm, tes->info.num_outputs, key); - - if (variant) { - insert_at_head(&shader->variants, &variant->list_item_local); - insert_at_head(&llvm->tes_variants_list, - &variant->list_item_global); - llvm->nr_tes_variants++; - shader->variants_cached++; - } - } - - tes->current_variant = variant; -} - /** * Prepare/validate middle part of the vertex pipeline. * NOTE: if you change this function, also look at the non-LLVM @@ -295,9 +154,7 @@ llvm_middle_end_prepare( struct draw_pt_middle_end *middle, struct draw_llvm *llvm = fpme->llvm; struct draw_vertex_shader *vs = draw->vs.vertex_shader; struct draw_geometry_shader *gs = draw->gs.geometry_shader; - struct draw_tess_ctrl_shader *tcs = draw->tcs.tess_ctrl_shader; - struct draw_tess_eval_shader *tes = draw->tes.tess_eval_shader; - const unsigned out_prim = gs ? gs->output_primitive : tes ? get_tes_output_prim(tes) : + const unsigned out_prim = gs ? gs->output_primitive : u_assembled_prim(in_prim); unsigned point_clip = draw->rasterizer->fill_front == PIPE_POLYGON_MODE_POINT || out_prim == PIPE_PRIM_POINTS; @@ -413,12 +270,6 @@ llvm_middle_end_prepare( struct draw_pt_middle_end *middle, if (gs) { llvm_middle_end_prepare_gs(fpme); } - if (tcs) { - llvm_middle_end_prepare_tcs(fpme); - } - if (tes) { - llvm_middle_end_prepare_tes(fpme); - } } @@ -478,42 +329,6 @@ llvm_middle_end_bind_parameters(struct draw_pt_middle_end *middle) } } - for (i = 0; i < ARRAY_SIZE(llvm->tcs_jit_context.constants); ++i) { - int num_consts = - DIV_ROUND_UP(draw->pt.user.tcs_constants_size[i], (sizeof(float) * 4)); - llvm->tcs_jit_context.constants[i] = draw->pt.user.tcs_constants[i]; - llvm->tcs_jit_context.num_constants[i] = num_consts; - if (num_consts == 0) { - llvm->tcs_jit_context.constants[i] = fake_const_buf; - } - } - for (i = 0; i < ARRAY_SIZE(llvm->tcs_jit_context.ssbos); ++i) { - int num_ssbos = draw->pt.user.tcs_ssbos_size[i]; - llvm->tcs_jit_context.ssbos[i] = draw->pt.user.tcs_ssbos[i]; - llvm->tcs_jit_context.num_ssbos[i] = num_ssbos; - if (num_ssbos == 0) { - llvm->tcs_jit_context.ssbos[i] = (const uint32_t *)fake_const_buf; - } - } - - for (i = 0; i < ARRAY_SIZE(llvm->tes_jit_context.constants); ++i) { - int num_consts = - DIV_ROUND_UP(draw->pt.user.tes_constants_size[i], (sizeof(float) * 4)); - llvm->tes_jit_context.constants[i] = draw->pt.user.tes_constants[i]; - llvm->tes_jit_context.num_constants[i] = num_consts; - if (num_consts == 0) { - llvm->tes_jit_context.constants[i] = fake_const_buf; - } - } - for (i = 0; i < ARRAY_SIZE(llvm->tes_jit_context.ssbos); ++i) { - int num_ssbos = draw->pt.user.tes_ssbos_size[i]; - llvm->tes_jit_context.ssbos[i] = draw->pt.user.tes_ssbos[i]; - llvm->tes_jit_context.num_ssbos[i] = num_ssbos; - if (num_ssbos == 0) { - llvm->tes_jit_context.ssbos[i] = (const uint32_t *)fake_const_buf; - } - } - llvm->jit_context.planes = (float (*)[DRAW_TOTAL_CLIP_PLANES][4]) draw->pt.user.planes[0]; llvm->gs_jit_context.planes = @@ -562,14 +377,8 @@ llvm_pipeline_generic(struct draw_pt_middle_end *middle, struct llvm_middle_end *fpme = llvm_middle_end(middle); struct draw_context *draw = fpme->draw; struct draw_geometry_shader *gshader = draw->gs.geometry_shader; - struct draw_tess_ctrl_shader *tcs_shader = draw->tcs.tess_ctrl_shader; - struct draw_tess_eval_shader *tes_shader = draw->tes.tess_eval_shader; - struct draw_prim_info tcs_prim_info; - struct draw_prim_info tes_prim_info; struct draw_prim_info gs_prim_info[TGSI_MAX_VERTEX_STREAMS]; struct draw_vertex_info llvm_vert_info; - struct draw_vertex_info tcs_vert_info; - struct draw_vertex_info tes_vert_info; struct draw_vertex_info gs_vert_info[TGSI_MAX_VERTEX_STREAMS]; struct draw_vertex_info *vert_info; struct draw_prim_info ia_prim_info; @@ -580,7 +389,6 @@ llvm_pipeline_generic(struct draw_pt_middle_end *middle, boolean clipped = 0; unsigned start_or_maxelt, vid_base; const unsigned *elts; - ushort *tes_elts_out = NULL; assert(fetch_info->count > 0); llvm_vert_info.count = fetch_info->count; @@ -596,11 +404,8 @@ llvm_pipeline_generic(struct draw_pt_middle_end *middle, if (draw->collect_statistics) { draw->statistics.ia_vertices += prim_info->count; - if (prim_info->prim == PIPE_PRIM_PATCHES) - draw->statistics.ia_primitives += prim_info->count / draw->pt.vertices_per_patch; - else - draw->statistics.ia_primitives += - u_decomposed_prims_for_vertices(prim_info->prim, prim_info->count); + draw->statistics.ia_primitives += + u_decomposed_prims_for_vertices(prim_info->prim, prim_info->count); draw->statistics.vs_invocations += fetch_info->count; } @@ -631,56 +436,6 @@ llvm_pipeline_generic(struct draw_pt_middle_end *middle, fetch_info = NULL; vert_info = &llvm_vert_info; - if (opt & PT_SHADE) { - struct draw_vertex_shader *vshader = draw->vs.vertex_shader; - if (tcs_shader) { - draw_tess_ctrl_shader_run(tcs_shader, - draw->pt.user.tcs_constants, - draw->pt.user.tcs_constants_size, - vert_info, - prim_info, - &vshader->info, - &tcs_vert_info, - &tcs_prim_info); - FREE(vert_info->verts); - vert_info = &tcs_vert_info; - prim_info = &tcs_prim_info; - - } else if (tes_shader) { - unsigned num_prims = prim_info->count / draw->pt.vertices_per_patch; - tcs_prim_info = *prim_info; - tcs_prim_info.primitive_count = num_prims; - prim_info = &tcs_prim_info; - } - - if (tes_shader) { - draw_tess_eval_shader_run(tes_shader, - draw->pt.user.tes_constants, - draw->pt.user.tes_constants_size, - tcs_shader ? tcs_shader->vertices_out : draw->pt.vertices_per_patch, - vert_info, - prim_info, - tcs_shader ? &tcs_shader->info : &vshader->info, - &tes_vert_info, - &tes_prim_info, &tes_elts_out); - - FREE(vert_info->verts); - vert_info = &tes_vert_info; - prim_info = &tes_prim_info; - free_prim_info = TRUE; - - /* - * pt emit can only handle ushort number of vertices (see - * render->allocate_vertices). - * vsplit guarantees there's never more than 4096, however GS can - * easily blow this up (by a factor of 256 (or even 1024) max). - */ - if (vert_info->count > 65535) { - opt |= PT_PIPELINE; - } - } - } - if ((opt & PT_SHADE) && gshader) { struct draw_vertex_shader *vshader = draw->vs.vertex_shader; draw_geometry_shader_run(gshader, @@ -688,18 +443,13 @@ llvm_pipeline_generic(struct draw_pt_middle_end *middle, draw->pt.user.gs_constants_size, vert_info, prim_info, - tes_shader ? &tes_shader->info : &vshader->info, + &vshader->info, gs_vert_info, gs_prim_info); FREE(vert_info->verts); - if (free_prim_info) { - FREE(prim_info->primitive_lengths); - FREE(tes_elts_out); - } vert_info = &gs_vert_info[0]; prim_info = &gs_prim_info[0]; - free_prim_info = FALSE; /* * pt emit can only handle ushort number of vertices (see * render->allocate_vertices). @@ -727,14 +477,13 @@ llvm_pipeline_generic(struct draw_pt_middle_end *middle, FREE(vert_info->verts); if (free_prim_info) { - FREE(tes_elts_out); FREE(prim_info->primitive_lengths); } return; } /* stream output needs to be done before clipping */ - draw_pt_so_emit( fpme->so_emit, gshader ? gshader->num_vertex_streams : 1, vert_info, prim_info ); + draw_pt_so_emit( fpme->so_emit, 1, vert_info, prim_info ); draw_stats_clipper_primitives(draw, prim_info); @@ -743,7 +492,7 @@ llvm_pipeline_generic(struct draw_pt_middle_end *middle, * will try to access non-existent position output. */ if (draw_current_shader_position_output(draw) != -1) { - if ((opt & PT_SHADE) && (gshader || tes_shader || + if ((opt & PT_SHADE) && (gshader || draw->vs.vertex_shader->info.writes_viewport_index)) { clipped = draw_pt_post_vs_run( fpme->post_vs, vert_info, prim_info ); } @@ -763,7 +512,6 @@ llvm_pipeline_generic(struct draw_pt_middle_end *middle, } FREE(vert_info->verts); if (free_prim_info) { - FREE(tes_elts_out); FREE(prim_info->primitive_lengths); } } diff --git a/lib/mesa/src/gallium/auxiliary/draw/draw_tess.c b/lib/mesa/src/gallium/auxiliary/draw/draw_tess.c deleted file mode 100644 index 07d5ef960..000000000 --- a/lib/mesa/src/gallium/auxiliary/draw/draw_tess.c +++ /dev/null @@ -1,644 +0,0 @@ -/************************************************************************** - * - * Copyright 2020 Red Hat. - * All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - **************************************************************************/ -#include "draw_tess.h" -#ifdef LLVM_AVAILABLE -#include "draw_llvm.h" -#endif - -#include "tessellator/p_tessellator.h" -#include "nir/nir_to_tgsi_info.h" -#include "util/u_prim.h" -#include "util/u_math.h" -#include "util/u_memory.h" -#include "util/ralloc.h" -static inline int -draw_tes_get_input_index(int semantic, int index, - const struct tgsi_shader_info *input_info) -{ - int i; - const ubyte *input_semantic_names = input_info->output_semantic_name; - const ubyte *input_semantic_indices = input_info->output_semantic_index; - for (i = 0; i < PIPE_MAX_SHADER_OUTPUTS; i++) { - if (input_semantic_names[i] == semantic && - input_semantic_indices[i] == index) - return i; - } - return -1; -} - -#ifdef LLVM_AVAILABLE -#define DEBUG_INPUTS 0 -static void -llvm_fetch_tcs_input(struct draw_tess_ctrl_shader *shader, - const struct draw_prim_info *input_prim_info, - unsigned prim_id, - unsigned num_vertices) -{ - const float (*input_ptr)[4]; - float (*input_data)[32][NUM_TCS_INPUTS][TGSI_NUM_CHANNELS] = &shader->tcs_input->data; - unsigned slot, i; - int vs_slot; - unsigned input_vertex_stride = shader->input_vertex_stride; - - input_ptr = shader->input; - for (i = 0; i < num_vertices; i++) { - const float (*input)[4]; - int vertex_idx = prim_id * num_vertices + i; - if (input_prim_info->linear == FALSE) - vertex_idx = input_prim_info->elts[vertex_idx]; -#if DEBUG_INPUTS - debug_printf("%d) tcs vertex index = %d (prim idx = %d)\n", - i, prim_id, 0); -#endif - input = (const float (*)[4])((const char *)input_ptr + (vertex_idx * input_vertex_stride)); - for (slot = 0, vs_slot = 0; slot < shader->info.num_inputs; ++slot) { - vs_slot = draw_tes_get_input_index( - shader->info.input_semantic_name[slot], - shader->info.input_semantic_index[slot], - shader->input_info); - if (vs_slot < 0) { - debug_printf("VS/TCS signature mismatch!\n"); - (*input_data)[i][slot][0] = 0; - (*input_data)[i][slot][1] = 0; - (*input_data)[i][slot][2] = 0; - (*input_data)[i][slot][3] = 0; - } else { - (*input_data)[i][slot][0] = input[vs_slot][0]; - (*input_data)[i][slot][1] = input[vs_slot][1]; - (*input_data)[i][slot][2] = input[vs_slot][2]; - (*input_data)[i][slot][3] = input[vs_slot][3]; -#if DEBUG_INPUTS - debug_printf("\t\t%p = %f %f %f %f\n", &(*input_data)[i][slot][0], - (*input_data)[i][slot][0], - (*input_data)[i][slot][1], - (*input_data)[i][slot][2], - (*input_data)[i][slot][3]); -#endif - ++vs_slot; - } - } - } -} - -#define DEBUG_OUTPUTS 0 -static void -llvm_store_tcs_output(struct draw_tess_ctrl_shader *shader, - unsigned prim_id, - struct draw_vertex_info *output_verts, - unsigned vert_start) -{ - float (*output_ptr)[4]; - float (*output_data)[32][PIPE_MAX_SHADER_INPUTS][TGSI_NUM_CHANNELS] = &shader->tcs_output->data; - unsigned slot, i; - unsigned num_vertices = shader->vertices_out; - - char *output = (char *)output_verts->verts->data; - output += vert_start * output_verts->stride; - - for (i = 0; i < num_vertices; i++) { - -#if DEBUG_OUTPUTS - debug_printf("%d) tcs store vertex index = %d (prim idx = %d)\n", - i, prim_id, 0); -#endif - output_ptr = (float(*)[4])(output + (i * output_verts->stride)); - - for (slot = 0; slot < shader->info.num_outputs; ++slot) { - output_ptr[slot][0] = (*output_data)[i][slot][0]; - output_ptr[slot][1] = (*output_data)[i][slot][1]; - output_ptr[slot][2] = (*output_data)[i][slot][2]; - output_ptr[slot][3] = (*output_data)[i][slot][3]; -#if DEBUG_OUTPUTS - debug_printf("\t\t%p = %f %f %f %f\n", - &output_ptr[slot][0], - output_ptr[slot][0], - output_ptr[slot][1], - output_ptr[slot][2], - output_ptr[slot][3]); -#endif - } - } -} - -static void -llvm_tcs_run(struct draw_tess_ctrl_shader *shader, uint32_t prim_id) -{ - shader->current_variant->jit_func(shader->jit_context, shader->tcs_input->data, shader->tcs_output->data, prim_id, - shader->draw->pt.vertices_per_patch); -} -#endif - -/** - * Execute tess ctrl shader. - */ -int draw_tess_ctrl_shader_run(struct draw_tess_ctrl_shader *shader, - const void *constants[PIPE_MAX_CONSTANT_BUFFERS], - const unsigned constants_size[PIPE_MAX_CONSTANT_BUFFERS], - const struct draw_vertex_info *input_verts, - const struct draw_prim_info *input_prim, - const struct tgsi_shader_info *input_info, - struct draw_vertex_info *output_verts, - struct draw_prim_info *output_prims ) -{ - const float (*input)[4] = (const float (*)[4])input_verts->verts->data; - unsigned num_outputs = draw_total_tcs_outputs(shader->draw); - unsigned input_stride = input_verts->vertex_size; - unsigned vertex_size = sizeof(struct vertex_header) + num_outputs * 4 * sizeof(float); - unsigned num_patches = input_prim->count / shader->draw->pt.vertices_per_patch; - - output_verts->vertex_size = vertex_size; - output_verts->stride = output_verts->vertex_size; - output_verts->verts = NULL; - output_verts->count = 0; - shader->input = input; - shader->input_vertex_stride = input_stride; - shader->input_info = input_info; - - output_prims->linear = TRUE; - output_prims->start = 0; - output_prims->elts = NULL; - output_prims->count = 0; - output_prims->prim = PIPE_PRIM_PATCHES; - output_prims->flags = 0; - output_prims->primitive_lengths = NULL; - output_prims->primitive_count = 0; - - if (shader->draw->collect_statistics) { - shader->draw->statistics.hs_invocations += num_patches; - } -#ifdef LLVM_AVAILABLE - for (unsigned i = 0; i < num_patches; i++) { - uint32_t vert_start = output_verts->count; - - output_verts->count += shader->vertices_out; - - llvm_fetch_tcs_input(shader, input_prim, i, shader->draw->pt.vertices_per_patch); - - llvm_tcs_run(shader, i); - - uint32_t old_verts = util_align_npot(vert_start, 16); - uint32_t new_verts = util_align_npot(output_verts->count, 16); - uint32_t old_size = output_verts->vertex_size * old_verts; - uint32_t new_size = output_verts->vertex_size * new_verts; - output_verts->verts = REALLOC(output_verts->verts, old_size, new_size); - - llvm_store_tcs_output(shader, i, output_verts, vert_start); - } -#endif - - output_prims->primitive_count = num_patches; - return 0; -} - -#ifdef LLVM_AVAILABLE -#define DEBUG_INPUTS 0 -static void -llvm_fetch_tes_input(struct draw_tess_eval_shader *shader, - const struct draw_prim_info *input_prim_info, - unsigned prim_id, - unsigned num_vertices) -{ - const float (*input_ptr)[4]; - float (*input_data)[32][PIPE_MAX_SHADER_INPUTS][TGSI_NUM_CHANNELS] = &shader->tes_input->data; - unsigned slot, i; - int vs_slot; - unsigned input_vertex_stride = shader->input_vertex_stride; - - input_ptr = shader->input; - for (i = 0; i < num_vertices; i++) { - const float (*input)[4]; - int vertex_idx = prim_id * num_vertices + i; - - if (input_prim_info->linear == FALSE) - vertex_idx = input_prim_info->elts[vertex_idx]; -#if DEBUG_INPUTS - debug_printf("%d) tes vertex index = %d (prim idx = %d)\n", - i, prim_id, 0); -#endif - input = (const float (*)[4])((const char *)input_ptr + (vertex_idx * input_vertex_stride)); - for (slot = 0, vs_slot = 0; slot < shader->info.num_inputs; ++slot) { - vs_slot = draw_tes_get_input_index( - shader->info.input_semantic_name[slot], - shader->info.input_semantic_index[slot], - shader->input_info); - if (vs_slot < 0) { - debug_printf("TCS/TES signature mismatch!\n"); - (*input_data)[i][slot][0] = 0; - (*input_data)[i][slot][1] = 0; - (*input_data)[i][slot][2] = 0; - (*input_data)[i][slot][3] = 0; - } else { - (*input_data)[i][slot][0] = input[vs_slot][0]; - (*input_data)[i][slot][1] = input[vs_slot][1]; - (*input_data)[i][slot][2] = input[vs_slot][2]; - (*input_data)[i][slot][3] = input[vs_slot][3]; -#if DEBUG_INPUTS - debug_printf("\t\t%p = %f %f %f %f\n", - &input[vs_slot][0], - (*input_data)[i][slot][0], - (*input_data)[i][slot][1], - (*input_data)[i][slot][2], - (*input_data)[i][slot][3]); -#endif - ++vs_slot; - } - } - } -} - -static void -llvm_fetch_tess_factors(struct draw_tess_eval_shader *shader, - unsigned patch_id, - unsigned num_vertices, - struct pipe_tessellation_factors *factors) -{ - int outer_slot = draw_tes_get_input_index( - TGSI_SEMANTIC_TESSOUTER, 0, shader->input_info); - int inner_slot = draw_tes_get_input_index( - TGSI_SEMANTIC_TESSINNER, 0, shader->input_info); - const float (*input_ptr)[4]; - const float (*input)[4]; - input_ptr = shader->input; - input = (const float (*)[4])((const char *)input_ptr + ((patch_id * num_vertices) * shader->input_vertex_stride)); - - if (outer_slot != -1) { - for (unsigned i = 0; i < 4; i++) - factors->outer_tf[i] = input[outer_slot][i]; - } else { - for (unsigned i = 0; i < 4; i++) - factors->outer_tf[i] = shader->draw->default_outer_tess_level[i]; - } - if (inner_slot != -1) { - for (unsigned i = 0; i < 2; i++) - factors->inner_tf[i] = input[inner_slot][i]; - } else { - for (unsigned i = 0; i < 2; i++) - factors->inner_tf[i] = shader->draw->default_inner_tess_level[i]; - } -} - -static void -llvm_tes_run(struct draw_tess_eval_shader *shader, - uint32_t prim_id, - uint32_t patch_vertices_in, - struct pipe_tessellator_data *tess_data, - struct pipe_tessellation_factors *tess_factors, - struct vertex_header *output) -{ - shader->current_variant->jit_func(shader->jit_context, shader->tes_input->data, output, prim_id, - tess_data->num_domain_points, tess_data->domain_points_u, tess_data->domain_points_v, - tess_factors->outer_tf, tess_factors->inner_tf, patch_vertices_in); -} -#endif - -/** - * Execute tess eval shader. - */ -int draw_tess_eval_shader_run(struct draw_tess_eval_shader *shader, - const void *constants[PIPE_MAX_CONSTANT_BUFFERS], - const unsigned constants_size[PIPE_MAX_CONSTANT_BUFFERS], - unsigned num_input_vertices_per_patch, - const struct draw_vertex_info *input_verts, - const struct draw_prim_info *input_prim, - const struct tgsi_shader_info *input_info, - struct draw_vertex_info *output_verts, - struct draw_prim_info *output_prims, - ushort **elts_out) -{ - const float (*input)[4] = (const float (*)[4])input_verts->verts->data; - unsigned num_outputs = draw_total_tes_outputs(shader->draw); - unsigned input_stride = input_verts->vertex_size; - unsigned vertex_size = sizeof(struct vertex_header) + num_outputs * 4 * sizeof(float); - ushort *elts = NULL; - output_verts->vertex_size = vertex_size; - output_verts->stride = output_verts->vertex_size; - output_verts->count = 0; - output_verts->verts = NULL; - - output_prims->linear = FALSE; - output_prims->start = 0; - output_prims->elts = NULL; - output_prims->count = 0; - output_prims->prim = get_tes_output_prim(shader); - output_prims->flags = 0; - output_prims->primitive_lengths = NULL; - output_prims->primitive_count = 0; - - shader->input = input; - shader->input_vertex_stride = input_stride; - shader->input_info = input_info; - - if (shader->draw->collect_statistics) { - shader->draw->statistics.ds_invocations += input_prim->primitive_count; - } -#ifdef LLVM_AVAILABLE - struct pipe_tessellation_factors factors; - struct pipe_tessellator_data data = { 0 }; - struct pipe_tessellator *ptess = p_tess_init(shader->prim_mode, - shader->spacing, - !shader->vertex_order_cw, - shader->point_mode); - for (unsigned i = 0; i < input_prim->primitive_count; i++) { - uint32_t vert_start = output_verts->count; - uint32_t prim_start = output_prims->primitive_count; - uint32_t elt_start = output_prims->count; - - llvm_fetch_tess_factors(shader, i, num_input_vertices_per_patch, &factors); - - /* tessellate with the factors for this primitive */ - p_tessellate(ptess, &factors, &data); - - if (data.num_domain_points == 0) - continue; - - uint32_t old_verts = vert_start; - uint32_t new_verts = vert_start + util_align_npot(data.num_domain_points, 4); - uint32_t old_size = output_verts->vertex_size * old_verts; - uint32_t new_size = output_verts->vertex_size * new_verts; - output_verts->verts = REALLOC(output_verts->verts, old_size, new_size); - - output_verts->count += data.num_domain_points; - - output_prims->count += data.num_indices; - elts = REALLOC(elts, elt_start * sizeof(uint16_t), - output_prims->count * sizeof(uint16_t)); - - for (unsigned i = 0; i < data.num_indices; i++) - elts[elt_start + i] = vert_start + data.indices[i]; - - llvm_fetch_tes_input(shader, input_prim, i, num_input_vertices_per_patch); - /* run once per primitive? */ - char *output = (char *)output_verts->verts; - output += vert_start * vertex_size; - llvm_tes_run(shader, i, num_input_vertices_per_patch, &data, &factors, (struct vertex_header *)output); - - uint32_t prim_len = u_prim_vertex_count(output_prims->prim)->min; - output_prims->primitive_count += data.num_indices / prim_len; - output_prims->primitive_lengths = REALLOC(output_prims->primitive_lengths, prim_start * sizeof(uint32_t), - output_prims->primitive_count * sizeof(uint32_t)); - for (unsigned i = prim_start; i < output_prims->primitive_count; i++) { - output_prims->primitive_lengths[i] = prim_len; - } - } - p_tess_destroy(ptess); -#endif - - *elts_out = elts; - output_prims->elts = elts; - return 0; -} - -struct draw_tess_ctrl_shader * -draw_create_tess_ctrl_shader(struct draw_context *draw, - const struct pipe_shader_state *state) -{ -#ifdef LLVM_AVAILABLE - boolean use_llvm = draw->llvm != NULL; - struct llvm_tess_ctrl_shader *llvm_tcs = NULL; -#endif - struct draw_tess_ctrl_shader *tcs; - -#ifdef LLVM_AVAILABLE - if (use_llvm) { - llvm_tcs = CALLOC_STRUCT(llvm_tess_ctrl_shader); - - if (!llvm_tcs) - return NULL; - - tcs = &llvm_tcs->base; - - make_empty_list(&llvm_tcs->variants); - } else -#endif - { - tcs = CALLOC_STRUCT(draw_tess_ctrl_shader); - } - - if (!tcs) - return NULL; - - tcs->draw = draw; - tcs->state = *state; - - nir_tgsi_scan_shader(state->ir.nir, &tcs->info, true); - - tcs->vector_length = 4; - tcs->vertices_out = tcs->info.properties[TGSI_PROPERTY_TCS_VERTICES_OUT]; -#ifdef LLVM_AVAILABLE - if (use_llvm) { - - tcs->tcs_input = align_malloc(sizeof(struct draw_tcs_inputs), 16); - memset(tcs->tcs_input, 0, sizeof(struct draw_tcs_inputs)); - - tcs->tcs_output = align_malloc(sizeof(struct draw_tcs_outputs), 16); - memset(tcs->tcs_output, 0, sizeof(struct draw_tcs_outputs)); - - tcs->jit_context = &draw->llvm->tcs_jit_context; - llvm_tcs->variant_key_size = - draw_tcs_llvm_variant_key_size( - MAX2(tcs->info.file_max[TGSI_FILE_SAMPLER]+1, - tcs->info.file_max[TGSI_FILE_SAMPLER_VIEW]+1), - tcs->info.file_max[TGSI_FILE_IMAGE]+1); - } -#endif - return tcs; -} - -void draw_bind_tess_ctrl_shader(struct draw_context *draw, - struct draw_tess_ctrl_shader *dtcs) -{ - draw_do_flush(draw, DRAW_FLUSH_STATE_CHANGE); - if (dtcs) { - draw->tcs.tess_ctrl_shader = dtcs; - } else { - draw->tcs.tess_ctrl_shader = NULL; - } -} - -void draw_delete_tess_ctrl_shader(struct draw_context *draw, - struct draw_tess_ctrl_shader *dtcs) -{ - if (!dtcs) - return; - -#ifdef LLVM_AVAILABLE - if (draw->llvm) { - struct llvm_tess_ctrl_shader *shader = llvm_tess_ctrl_shader(dtcs); - - struct draw_tcs_llvm_variant_list_item *li; - - li = first_elem(&shader->variants); - while(!at_end(&shader->variants, li)) { - struct draw_tcs_llvm_variant_list_item *next = next_elem(li); - draw_tcs_llvm_destroy_variant(li->base); - li = next; - } - - assert(shader->variants_cached == 0); - align_free(dtcs->tcs_input); - align_free(dtcs->tcs_output); - } -#endif - - if (dtcs->state.ir.nir) - ralloc_free(dtcs->state.ir.nir); - FREE(dtcs); -} - -#ifdef LLVM_AVAILABLE -void draw_tcs_set_current_variant(struct draw_tess_ctrl_shader *shader, - struct draw_tcs_llvm_variant *variant) -{ - shader->current_variant = variant; -} -#endif - -struct draw_tess_eval_shader * -draw_create_tess_eval_shader(struct draw_context *draw, - const struct pipe_shader_state *state) -{ -#ifdef LLVM_AVAILABLE - boolean use_llvm = draw->llvm != NULL; - struct llvm_tess_eval_shader *llvm_tes = NULL; -#endif - struct draw_tess_eval_shader *tes; - -#ifdef LLVM_AVAILABLE - if (use_llvm) { - llvm_tes = CALLOC_STRUCT(llvm_tess_eval_shader); - - if (!llvm_tes) - return NULL; - - tes = &llvm_tes->base; - make_empty_list(&llvm_tes->variants); - } else -#endif - { - tes = CALLOC_STRUCT(draw_tess_eval_shader); - } - - if (!tes) - return NULL; - - tes->draw = draw; - tes->state = *state; - - nir_tgsi_scan_shader(state->ir.nir, &tes->info, true); - - tes->prim_mode = tes->info.properties[TGSI_PROPERTY_TES_PRIM_MODE]; - tes->spacing = tes->info.properties[TGSI_PROPERTY_TES_SPACING]; - tes->vertex_order_cw = tes->info.properties[TGSI_PROPERTY_TES_VERTEX_ORDER_CW]; - tes->point_mode = tes->info.properties[TGSI_PROPERTY_TES_POINT_MODE]; - - tes->vector_length = 4; - - tes->position_output = -1; - for (unsigned i = 0; i < tes->info.num_outputs; i++) { - if (tes->info.output_semantic_name[i] == TGSI_SEMANTIC_POSITION && - tes->info.output_semantic_index[i] == 0) - tes->position_output = i; - if (tes->info.output_semantic_name[i] == TGSI_SEMANTIC_VIEWPORT_INDEX) - tes->viewport_index_output = i; - if (tes->info.output_semantic_name[i] == TGSI_SEMANTIC_CLIPDIST) { - debug_assert(tes->info.output_semantic_index[i] < - PIPE_MAX_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT); - tes->ccdistance_output[tes->info.output_semantic_index[i]] = i; - } - } - -#ifdef LLVM_AVAILABLE - if (use_llvm) { - - tes->tes_input = align_malloc(sizeof(struct draw_tes_inputs), 16); - memset(tes->tes_input, 0, sizeof(struct draw_tes_inputs)); - - tes->jit_context = &draw->llvm->tes_jit_context; - llvm_tes->variant_key_size = - draw_tes_llvm_variant_key_size( - MAX2(tes->info.file_max[TGSI_FILE_SAMPLER]+1, - tes->info.file_max[TGSI_FILE_SAMPLER_VIEW]+1), - tes->info.file_max[TGSI_FILE_IMAGE]+1); - } -#endif - return tes; -} - -void draw_bind_tess_eval_shader(struct draw_context *draw, - struct draw_tess_eval_shader *dtes) -{ - draw_do_flush(draw, DRAW_FLUSH_STATE_CHANGE); - if (dtes) { - draw->tes.tess_eval_shader = dtes; - draw->tes.position_output = dtes->position_output; - } else { - draw->tes.tess_eval_shader = NULL; - } -} - -void draw_delete_tess_eval_shader(struct draw_context *draw, - struct draw_tess_eval_shader *dtes) -{ - if (!dtes) - return; - -#ifdef LLVM_AVAILABLE - if (draw->llvm) { - struct llvm_tess_eval_shader *shader = llvm_tess_eval_shader(dtes); - struct draw_tes_llvm_variant_list_item *li; - - li = first_elem(&shader->variants); - while(!at_end(&shader->variants, li)) { - struct draw_tes_llvm_variant_list_item *next = next_elem(li); - draw_tes_llvm_destroy_variant(li->base); - li = next; - } - - assert(shader->variants_cached == 0); - align_free(dtes->tes_input); - } -#endif - if (dtes->state.ir.nir) - ralloc_free(dtes->state.ir.nir); - FREE(dtes); -} - -#ifdef LLVM_AVAILABLE -void draw_tes_set_current_variant(struct draw_tess_eval_shader *shader, - struct draw_tes_llvm_variant *variant) -{ - shader->current_variant = variant; -} -#endif - -enum pipe_prim_type get_tes_output_prim(struct draw_tess_eval_shader *shader) -{ - if (shader->point_mode) - return PIPE_PRIM_POINTS; - else if (shader->prim_mode == PIPE_PRIM_LINES) - return PIPE_PRIM_LINES; - else - return PIPE_PRIM_TRIANGLES; -} diff --git a/lib/mesa/src/gallium/auxiliary/draw/draw_tess.h b/lib/mesa/src/gallium/auxiliary/draw/draw_tess.h deleted file mode 100644 index 29ae0847a..000000000 --- a/lib/mesa/src/gallium/auxiliary/draw/draw_tess.h +++ /dev/null @@ -1,130 +0,0 @@ -/************************************************************************** - * - * Copyright 2020 Red Hat. - * All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - **************************************************************************/ - -#ifndef DRAW_TESS_H -#define DRAW_TESS_H - -#include "draw_context.h" -#include "draw_private.h" - -struct draw_context; -#ifdef LLVM_AVAILABLE - -#define NUM_PATCH_INPUTS 32 -#define NUM_TCS_INPUTS (PIPE_MAX_SHADER_INPUTS - NUM_PATCH_INPUTS) - -struct draw_tcs_inputs { - /* num vertices per prim */ - float data[32][NUM_TCS_INPUTS][4]; -}; - -struct draw_tcs_outputs { - /* num vertices per prim */ - float data[32][PIPE_MAX_SHADER_INPUTS][4]; -}; - -struct draw_tes_inputs { - /* num vertices per prim */ - float data[32][PIPE_MAX_SHADER_INPUTS][4]; -}; - -#endif - -struct draw_tess_ctrl_shader { - struct draw_context *draw; - - struct pipe_shader_state state; - struct tgsi_shader_info info; - - unsigned vector_length; - unsigned vertices_out; - - unsigned input_vertex_stride; - const float (*input)[4]; - const struct tgsi_shader_info *input_info; -#ifdef LLVM_AVAILABLE - struct draw_tcs_inputs *tcs_input; - struct draw_tcs_outputs *tcs_output; - struct draw_tcs_jit_context *jit_context; - struct draw_tcs_llvm_variant *current_variant; -#endif -}; - -struct draw_tess_eval_shader { - struct draw_context *draw; - struct pipe_shader_state state; - struct tgsi_shader_info info; - - unsigned prim_mode; - unsigned spacing; - unsigned vertex_order_cw; - unsigned point_mode; - - unsigned position_output; - unsigned viewport_index_output; - unsigned ccdistance_output[PIPE_MAX_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT]; - unsigned vector_length; - - unsigned input_vertex_stride; - const float (*input)[4]; - const struct tgsi_shader_info *input_info; - -#ifdef LLVM_AVAILABLE - struct draw_tes_inputs *tes_input; - struct draw_tes_jit_context *jit_context; - struct draw_tes_llvm_variant *current_variant; -#endif -}; - -enum pipe_prim_type get_tes_output_prim(struct draw_tess_eval_shader *shader); - -int draw_tess_ctrl_shader_run(struct draw_tess_ctrl_shader *shader, - const void *constants[PIPE_MAX_CONSTANT_BUFFERS], - const unsigned constants_size[PIPE_MAX_CONSTANT_BUFFERS], - const struct draw_vertex_info *input_verts, - const struct draw_prim_info *input_prim, - const struct tgsi_shader_info *input_info, - struct draw_vertex_info *output_verts, - struct draw_prim_info *output_prims ); - -int draw_tess_eval_shader_run(struct draw_tess_eval_shader *shader, - const void *constants[PIPE_MAX_CONSTANT_BUFFERS], - const unsigned constants_size[PIPE_MAX_CONSTANT_BUFFERS], - unsigned num_input_vertices_per_patch, - const struct draw_vertex_info *input_verts, - const struct draw_prim_info *input_prim, - const struct tgsi_shader_info *input_info, - struct draw_vertex_info *output_verts, - struct draw_prim_info *output_prims, - ushort **elts_out); - -#ifdef LLVM_AVAILABLE -void draw_tcs_set_current_variant(struct draw_tess_ctrl_shader *shader, - struct draw_tcs_llvm_variant *variant); -void draw_tes_set_current_variant(struct draw_tess_eval_shader *shader, - struct draw_tes_llvm_variant *variant); -#endif - -#endif |