diff --git a/src/gallium/auxiliary/draw/draw_vs_variant.c b/src/gallium/auxiliary/draw/draw_vs_variant.c index bc320cb1cd8..354a694c38f 100644 --- a/src/gallium/auxiliary/draw/draw_vs_variant.c +++ b/src/gallium/auxiliary/draw/draw_vs_variant.c @@ -1,8 +1,8 @@ /************************************************************************** - * + * * 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 @@ -10,11 +10,11 @@ * 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. @@ -22,7 +22,7 @@ * 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. - * + * **************************************************************************/ /* @@ -39,18 +39,19 @@ #include "draw/draw_vs.h" #include "translate/translate.h" -/* A first pass at incorporating vertex fetch/emit functionality into + +/* A first pass at incorporating vertex fetch/emit functionality into */ struct draw_vs_variant_generic { struct draw_vs_variant base; struct draw_vertex_shader *shader; struct draw_context *draw; - + /* Basic plan is to run these two translate functions before/after * the vertex shader's existing run_linear() routine to simulate - * the inclusion of this functionality into the shader... - * + * the inclusion of this functionality into the shader... + * * Next will look at actually including it. */ struct translate *fetch; @@ -61,23 +62,19 @@ struct draw_vs_variant_generic { - - -static void vsvg_set_buffer( struct draw_vs_variant *variant, - unsigned buffer, - const void *ptr, - unsigned stride, - unsigned max_index ) +static void +vsvg_set_buffer(struct draw_vs_variant *variant, + unsigned buffer, + const void *ptr, + unsigned stride, + unsigned max_index) { struct draw_vs_variant_generic *vsvg = (struct draw_vs_variant_generic *)variant; - vsvg->fetch->set_buffer(vsvg->fetch, - buffer, - ptr, - stride, - max_index ); + vsvg->fetch->set_buffer(vsvg->fetch, buffer, ptr, stride, max_index); } + static const struct pipe_viewport_state * find_viewport(struct draw_context *draw, char *buffer, @@ -86,8 +83,8 @@ find_viewport(struct draw_context *draw, { int viewport_index_output = draw_current_shader_viewport_index_output(draw); - char *ptr = buffer + vertex_idx * stride; - unsigned *data = (unsigned *)ptr; + const char *ptr = buffer + vertex_idx * stride; + const unsigned *data = (const unsigned *) ptr; int viewport_index = draw_current_shader_uses_viewport_index(draw) ? data[viewport_index_output * 4] : 0; @@ -96,21 +93,21 @@ find_viewport(struct draw_context *draw, return &draw->viewports[viewport_index]; } - + /* Mainly for debug at this stage: */ -static void do_rhw_viewport( struct draw_vs_variant_generic *vsvg, - unsigned count, - void *output_buffer ) +static void +do_rhw_viewport(struct draw_vs_variant_generic *vsvg, + unsigned count, + void *output_buffer) { char *ptr = (char *)output_buffer; unsigned stride = vsvg->temp_vertex_stride; - unsigned j; ptr += vsvg->base.vs->position_output * 4 * sizeof(float); - for (j = 0; j < count; j++, ptr += stride) { + for (unsigned j = 0; j < count; j++, ptr += stride) { const struct pipe_viewport_state *viewport = find_viewport(vsvg->base.vs->draw, (char*)output_buffer, j, stride); @@ -126,17 +123,18 @@ static void do_rhw_viewport( struct draw_vs_variant_generic *vsvg, } } -static void do_viewport( struct draw_vs_variant_generic *vsvg, - unsigned count, - void *output_buffer ) + +static void +do_viewport(struct draw_vs_variant_generic *vsvg, + unsigned count, + void *output_buffer) { char *ptr = (char *)output_buffer; unsigned stride = vsvg->temp_vertex_stride; - unsigned j; ptr += vsvg->base.vs->position_output * 4 * sizeof(float); - for (j = 0; j < count; j++, ptr += stride) { + for (unsigned j = 0; j < count; j++, ptr += stride) { const struct pipe_viewport_state *viewport = find_viewport(vsvg->base.vs->draw, (char*)output_buffer, j, stride); @@ -149,38 +147,39 @@ static void do_viewport( struct draw_vs_variant_generic *vsvg, data[2] = data[2] * scale[2] + trans[2]; } } - -static void PIPE_CDECL vsvg_run_elts( struct draw_vs_variant *variant, - const unsigned *elts, - unsigned count, - void *output_buffer) + +static void PIPE_CDECL +vsvg_run_elts(struct draw_vs_variant *variant, + const unsigned *elts, + unsigned count, + void *output_buffer) { struct draw_vs_variant_generic *vsvg = (struct draw_vs_variant_generic *)variant; unsigned temp_vertex_stride = vsvg->temp_vertex_stride; - void *temp_buffer = MALLOC( align(count,4) * temp_vertex_stride + - DRAW_EXTRA_VERTICES_PADDING ); - + void *temp_buffer = MALLOC(align(count,4) * temp_vertex_stride + + DRAW_EXTRA_VERTICES_PADDING); + if (0) debug_printf("%s %d \n", __FUNCTION__, count); - + /* Want to do this in small batches for cache locality? */ - - vsvg->fetch->run_elts( vsvg->fetch, - elts, - count, - vsvg->draw->start_instance, - vsvg->draw->instance_id, - temp_buffer ); - vsvg->base.vs->run_linear( vsvg->base.vs, - temp_buffer, - temp_buffer, - vsvg->base.vs->draw->pt.user.vs_constants, - vsvg->base.vs->draw->pt.user.vs_constants_size, - count, - temp_vertex_stride, - temp_vertex_stride, NULL); + vsvg->fetch->run_elts(vsvg->fetch, + elts, + count, + vsvg->draw->start_instance, + vsvg->draw->instance_id, + temp_buffer); + + vsvg->base.vs->run_linear(vsvg->base.vs, + temp_buffer, + temp_buffer, + vsvg->base.vs->draw->pt.user.vs_constants, + vsvg->base.vs->draw->pt.user.vs_constants_size, + count, + temp_vertex_stride, + temp_vertex_stride, NULL); /* FIXME: geometry shading? */ @@ -188,122 +187,107 @@ static void PIPE_CDECL vsvg_run_elts( struct draw_vs_variant *variant, /* not really handling clipping, just do the rhw so we can * see the results... */ - do_rhw_viewport( vsvg, - count, - temp_buffer ); - } - else if (vsvg->base.key.viewport) { - do_viewport( vsvg, - count, - temp_buffer ); + do_rhw_viewport(vsvg, count, temp_buffer); + } else if (vsvg->base.key.viewport) { + do_viewport(vsvg, count, temp_buffer); } + vsvg->emit->set_buffer(vsvg->emit, + 0, + temp_buffer, + temp_vertex_stride, + ~0); - vsvg->emit->set_buffer( vsvg->emit, - 0, - temp_buffer, - temp_vertex_stride, - ~0 ); + vsvg->emit->set_buffer(vsvg->emit, + 1, + &vsvg->draw->rasterizer->point_size, + 0, + ~0); - vsvg->emit->set_buffer( vsvg->emit, - 1, - &vsvg->draw->rasterizer->point_size, - 0, - ~0 ); - - vsvg->emit->run( vsvg->emit, - 0, count, - vsvg->draw->start_instance, - vsvg->draw->instance_id, - output_buffer ); + vsvg->emit->run(vsvg->emit, + 0, count, + vsvg->draw->start_instance, + vsvg->draw->instance_id, + output_buffer); FREE(temp_buffer); } -static void PIPE_CDECL vsvg_run_linear( struct draw_vs_variant *variant, - unsigned start, - unsigned count, - void *output_buffer ) +static void PIPE_CDECL +vsvg_run_linear(struct draw_vs_variant *variant, + unsigned start, + unsigned count, + void *output_buffer) { struct draw_vs_variant_generic *vsvg = (struct draw_vs_variant_generic *)variant; unsigned temp_vertex_stride = vsvg->temp_vertex_stride; - void *temp_buffer = MALLOC( align(count,4) * temp_vertex_stride + - DRAW_EXTRA_VERTICES_PADDING ); - + void *temp_buffer = MALLOC(align(count,4) * temp_vertex_stride + + DRAW_EXTRA_VERTICES_PADDING); + if (0) debug_printf("%s %d %d (sz %d, %d)\n", __FUNCTION__, start, count, vsvg->base.key.output_stride, temp_vertex_stride); - vsvg->fetch->run( vsvg->fetch, - start, - count, - vsvg->draw->start_instance, - vsvg->draw->instance_id, - temp_buffer ); + vsvg->fetch->run(vsvg->fetch, + start, + count, + vsvg->draw->start_instance, + vsvg->draw->instance_id, + temp_buffer); - vsvg->base.vs->run_linear( vsvg->base.vs, - temp_buffer, - temp_buffer, - vsvg->base.vs->draw->pt.user.vs_constants, - vsvg->base.vs->draw->pt.user.vs_constants_size, - count, - temp_vertex_stride, - temp_vertex_stride, NULL); + vsvg->base.vs->run_linear(vsvg->base.vs, + temp_buffer, + temp_buffer, + vsvg->base.vs->draw->pt.user.vs_constants, + vsvg->base.vs->draw->pt.user.vs_constants_size, + count, + temp_vertex_stride, + temp_vertex_stride, NULL); if (vsvg->base.key.clip) { /* not really handling clipping, just do the rhw so we can * see the results... */ - do_rhw_viewport( vsvg, - count, - temp_buffer ); - } - else if (vsvg->base.key.viewport) { - do_viewport( vsvg, - count, - temp_buffer ); + do_rhw_viewport(vsvg, count, temp_buffer); + } else if (vsvg->base.key.viewport) { + do_viewport(vsvg, count, temp_buffer); } - vsvg->emit->set_buffer( vsvg->emit, - 0, - temp_buffer, - temp_vertex_stride, - ~0 ); - - vsvg->emit->set_buffer( vsvg->emit, - 1, - &vsvg->draw->rasterizer->point_size, - 0, - ~0 ); - - vsvg->emit->run( vsvg->emit, - 0, count, - vsvg->draw->start_instance, - vsvg->draw->instance_id, - output_buffer ); + vsvg->emit->set_buffer(vsvg->emit, + 0, + temp_buffer, + temp_vertex_stride, + ~0); + + vsvg->emit->set_buffer(vsvg->emit, + 1, + &vsvg->draw->rasterizer->point_size, + 0, + ~0); + + vsvg->emit->run(vsvg->emit, + 0, count, + vsvg->draw->start_instance, + vsvg->draw->instance_id, + output_buffer); FREE(temp_buffer); } - - - -static void vsvg_destroy( struct draw_vs_variant *variant ) +static void +vsvg_destroy(struct draw_vs_variant *variant) { FREE(variant); } struct draw_vs_variant * -draw_vs_create_variant_generic( struct draw_vertex_shader *vs, - const struct draw_vs_variant_key *key ) +draw_vs_create_variant_generic(struct draw_vertex_shader *vs, + const struct draw_vs_variant_key *key) { - unsigned i; - struct translate_key fetch, emit; - - struct draw_vs_variant_generic *vsvg = CALLOC_STRUCT( draw_vs_variant_generic ); + struct draw_vs_variant_generic *vsvg = CALLOC_STRUCT(draw_vs_variant_generic); if (!vsvg) return NULL; @@ -321,9 +305,10 @@ draw_vs_create_variant_generic( struct draw_vertex_shader *vs, /* Build free-standing fetch and emit functions: */ + struct translate_key fetch; fetch.nr_elements = key->nr_inputs; fetch.output_stride = vsvg->temp_vertex_stride; - for (i = 0; i < key->nr_inputs; i++) { + for (unsigned i = 0; i < key->nr_inputs; i++) { fetch.element[i].type = TRANSLATE_ELEMENT_NORMAL; fetch.element[i].input_format = key->element[i].in.format; fetch.element[i].input_buffer = key->element[i].in.buffer; @@ -334,12 +319,11 @@ draw_vs_create_variant_generic( struct draw_vertex_shader *vs, assert(fetch.element[i].output_offset < fetch.output_stride); } - + struct translate_key emit; emit.nr_elements = key->nr_outputs; emit.output_stride = key->output_stride; - for (i = 0; i < key->nr_outputs; i++) { - if (key->element[i].out.format != EMIT_1F_PSIZE) - { + for (unsigned i = 0; i < key->nr_outputs; i++) { + if (key->element[i].out.format != EMIT_1F_PSIZE) { emit.element[i].type = TRANSLATE_ELEMENT_NORMAL; emit.element[i].input_format = PIPE_FORMAT_R32G32B32A32_FLOAT; emit.element[i].input_buffer = 0; @@ -348,8 +332,7 @@ draw_vs_create_variant_generic( struct draw_vertex_shader *vs, emit.element[i].output_format = draw_translate_vinfo_format(key->element[i].out.format); emit.element[i].output_offset = key->element[i].out.offset; assert(emit.element[i].input_offset <= fetch.output_stride); - } - else { + } else { emit.element[i].type = TRANSLATE_ELEMENT_NORMAL; emit.element[i].input_format = PIPE_FORMAT_R32_FLOAT; emit.element[i].input_buffer = 1; @@ -360,13 +343,8 @@ draw_vs_create_variant_generic( struct draw_vertex_shader *vs, } } - vsvg->fetch = draw_vs_get_fetch( vs->draw, &fetch ); - vsvg->emit = draw_vs_get_emit( vs->draw, &emit ); + vsvg->fetch = draw_vs_get_fetch(vs->draw, &fetch); + vsvg->emit = draw_vs_get_emit(vs->draw, &emit); return &vsvg->base; } - - - - -