X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fauxiliary%2Fdraw%2Fdraw_vs.c;h=266cca713e1591f30f3614955e0237cde107ba85;hb=f313b0c8502868dab2a87237af295a34ec0dea26;hp=3553689532687ffaa326a5c93863d91f1e7f7c35;hpb=a0127b6ced257919180ba3a1bf534b68d9c750be;p=mesa.git diff --git a/src/gallium/auxiliary/draw/draw_vs.c b/src/gallium/auxiliary/draw/draw_vs.c index 35536895326..266cca713e1 100644 --- a/src/gallium/auxiliary/draw/draw_vs.c +++ b/src/gallium/auxiliary/draw/draw_vs.c @@ -43,36 +43,15 @@ #include "translate/translate.h" #include "translate/translate_cache.h" +#include "tgsi/tgsi_dump.h" #include "tgsi/tgsi_exec.h" - - - -void draw_vs_set_constants( struct draw_context *draw, - const float (*constants)[4], - unsigned size ) -{ - if (((uintptr_t)constants) & 0xf) { - if (size > draw->vs.const_storage_size) { - if (draw->vs.aligned_constant_storage) - align_free((void *)draw->vs.aligned_constant_storage); - draw->vs.aligned_constant_storage = align_malloc( size, 16 ); - } - memcpy( (void*)draw->vs.aligned_constant_storage, - constants, - size ); - constants = draw->vs.aligned_constant_storage; - } - - draw->vs.aligned_constants = constants; - draw_vs_aos_machine_constants( draw->vs.aos_machine, constants ); -} +DEBUG_GET_ONCE_BOOL_OPTION(gallium_dump_vs, "GALLIUM_DUMP_VS", FALSE) void draw_vs_set_viewport( struct draw_context *draw, const struct pipe_viewport_state *viewport ) { - draw_vs_aos_machine_viewport( draw->vs.aos_machine, viewport ); } @@ -81,22 +60,27 @@ struct draw_vertex_shader * draw_create_vertex_shader(struct draw_context *draw, const struct pipe_shader_state *shader) { - struct draw_vertex_shader *vs; + struct draw_vertex_shader *vs = NULL; + + if (draw->dump_vs) { + tgsi_dump(shader->tokens, 0); + } + +#if HAVE_LLVM + if (draw->pt.middle.llvm) { + vs = draw_create_vs_llvm(draw, shader); + } +#endif - vs = draw_create_vs_llvm( draw, shader ); if (!vs) { - vs = draw_create_vs_sse( draw, shader ); - if (!vs) { - vs = draw_create_vs_ppc( draw, shader ); - if (!vs) { - vs = draw_create_vs_exec( draw, shader ); - } - } + vs = draw_create_vs_exec( draw, shader ); } if (vs) { uint i; + bool found_clipvertex = FALSE; + vs->position_output = -1; for (i = 0; i < vs->info.num_outputs; i++) { if (vs->info.output_semantic_name[i] == TGSI_SEMANTIC_POSITION && vs->info.output_semantic_index[i] == 0) @@ -104,7 +88,19 @@ draw_create_vertex_shader(struct draw_context *draw, else if (vs->info.output_semantic_name[i] == TGSI_SEMANTIC_EDGEFLAG && vs->info.output_semantic_index[i] == 0) vs->edgeflag_output = i; + else if (vs->info.output_semantic_name[i] == TGSI_SEMANTIC_CLIPVERTEX && + vs->info.output_semantic_index[i] == 0) { + found_clipvertex = TRUE; + vs->clipvertex_output = i; + } else if (vs->info.output_semantic_name[i] == TGSI_SEMANTIC_CLIPDIST) { + if (vs->info.output_semantic_index[i] == 0) + vs->clipdistance_output[0] = i; + else + vs->clipdistance_output[1] = i; + } } + if (!found_clipvertex) + vs->clipvertex_output = vs->position_output; } assert(vs); @@ -124,6 +120,9 @@ draw_bind_vertex_shader(struct draw_context *draw, draw->vs.num_vs_outputs = dvs->info.num_outputs; draw->vs.position_output = dvs->position_output; draw->vs.edgeflag_output = dvs->edgeflag_output; + draw->vs.clipvertex_output = dvs->clipvertex_output; + draw->vs.clipdistance_output[0] = dvs->clipdistance_output[0]; + draw->vs.clipdistance_output[1] = dvs->clipdistance_output[1]; dvs->prepare( dvs, draw ); } else { @@ -139,10 +138,10 @@ draw_delete_vertex_shader(struct draw_context *draw, { unsigned i; - for (i = 0; i < dvs->nr_varients; i++) - dvs->varient[i]->destroy( dvs->varient[i] ); + for (i = 0; i < dvs->nr_variants; i++) + dvs->variant[i]->destroy( dvs->variant[i] ); - dvs->nr_varients = 0; + dvs->nr_variants = 0; dvs->delete( dvs ); } @@ -152,8 +151,10 @@ draw_delete_vertex_shader(struct draw_context *draw, boolean draw_vs_init( struct draw_context *draw ) { - draw->vs.machine = tgsi_exec_machine_create(); - if (!draw->vs.machine) + draw->dump_vs = debug_get_option_gallium_dump_vs(); + + draw->vs.tgsi.machine = tgsi_exec_machine_create(); + if (!draw->vs.tgsi.machine) return FALSE; draw->vs.emit_cache = translate_cache_create(); @@ -164,12 +165,6 @@ draw_vs_init( struct draw_context *draw ) if (!draw->vs.fetch_cache) return FALSE; - draw->vs.aos_machine = draw_vs_aos_machine(); -#ifdef PIPE_ARCH_X86 - if (!draw->vs.aos_machine) - return FALSE; -#endif - return TRUE; } @@ -182,50 +177,44 @@ draw_vs_destroy( struct draw_context *draw ) if (draw->vs.emit_cache) translate_cache_destroy(draw->vs.emit_cache); - if (draw->vs.aos_machine) - draw_vs_aos_machine_destroy(draw->vs.aos_machine); - - if (draw->vs.aligned_constant_storage) - align_free((void*)draw->vs.aligned_constant_storage); - - tgsi_exec_machine_destroy(draw->vs.machine); + tgsi_exec_machine_destroy(draw->vs.tgsi.machine); } -struct draw_vs_varient * -draw_vs_lookup_varient( struct draw_vertex_shader *vs, - const struct draw_vs_varient_key *key ) +struct draw_vs_variant * +draw_vs_lookup_variant( struct draw_vertex_shader *vs, + const struct draw_vs_variant_key *key ) { - struct draw_vs_varient *varient; + struct draw_vs_variant *variant; unsigned i; - /* Lookup existing varient: + /* Lookup existing variant: */ - for (i = 0; i < vs->nr_varients; i++) - if (draw_vs_varient_key_compare(key, &vs->varient[i]->key) == 0) - return vs->varient[i]; + for (i = 0; i < vs->nr_variants; i++) + if (draw_vs_variant_key_compare(key, &vs->variant[i]->key) == 0) + return vs->variant[i]; /* Else have to create a new one: */ - varient = vs->create_varient( vs, key ); - if (varient == NULL) + variant = vs->create_variant( vs, key ); + if (variant == NULL) return NULL; /* Add it to our list, could be smarter: */ - if (vs->nr_varients < Elements(vs->varient)) { - vs->varient[vs->nr_varients++] = varient; + if (vs->nr_variants < Elements(vs->variant)) { + vs->variant[vs->nr_variants++] = variant; } else { - vs->last_varient++; - vs->last_varient %= Elements(vs->varient); - vs->varient[vs->last_varient]->destroy(vs->varient[vs->last_varient]); - vs->varient[vs->last_varient] = varient; + vs->last_variant++; + vs->last_variant %= Elements(vs->variant); + vs->variant[vs->last_variant]->destroy(vs->variant[vs->last_variant]); + vs->variant[vs->last_variant] = variant; } /* Done */ - return varient; + return variant; }