draw_vs_variant.c revision 7c99d7fe60e7bb0b7cf103a851aeef4614278ca6
17c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell/**************************************************************************
27c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell *
37c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
47c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell * All Rights Reserved.
57c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell *
67c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a
77c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell * copy of this software and associated documentation files (the
87c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell * "Software"), to deal in the Software without restriction, including
97c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell * without limitation the rights to use, copy, modify, merge, publish,
107c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell * distribute, sub license, and/or sell copies of the Software, and to
117c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell * permit persons to whom the Software is furnished to do so, subject to
127c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell * the following conditions:
137c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell *
147c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell * The above copyright notice and this permission notice (including the
157c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell * next paragraph) shall be included in all copies or substantial portions
167c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell * of the Software.
177c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell *
187c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
197c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
207c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
217c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
227c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
237c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
247c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
257c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell *
267c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell **************************************************************************/
277c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
287c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell /*
297c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell  * Authors:
307c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell  *   Keith Whitwell <keith@tungstengraphics.com>
317c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell  */
327c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
337c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell#include "pipe/p_util.h"
347c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell#include "draw/draw_context.h"
357c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell#include "draw/draw_private.h"
367c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell#include "draw/draw_vbuf.h"
377c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell#include "draw/draw_vertex.h"
387c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell#include "draw/draw_vs.h"
397c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell#include "translate/translate.h"
407c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell#include "translate/translate_cache.h"
417c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
427c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell/* A first pass at incorporating vertex fetch/emit functionality into
437c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell */
447c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwellstruct draw_vs_varient_generic {
457c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   struct draw_vs_varient base;
467c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
477c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
487c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
497c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   struct draw_vertex_shader *shader;
507c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   struct draw_context *draw;
517c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
527c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   /* Basic plan is to run these two translate functions before/after
537c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell    * the vertex shader's existing run_linear() routine to simulate
547c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell    * the inclusion of this functionality into the shader...
557c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell    *
567c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell    * Next will look at actually including it.
577c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell    */
587c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   struct translate *fetch;
597c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   struct translate *emit;
607c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
617c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   const float (*constants)[4];
627c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell};
637c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
647c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
657c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
667c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
677c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwellstatic void vsvg_set_constants( struct draw_vs_varient *varient,
687c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                                const float (*constants)[4] )
697c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell{
707c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   struct draw_vs_varient_generic *vsvg = (struct draw_vs_varient_generic *)varient;
717c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
727c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   vsvg->constants = constants;
737c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell}
747c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
757c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
767c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwellstatic void vsvg_set_input( struct draw_vs_varient *varient,
777c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                            unsigned buffer,
787c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                            const void *ptr,
797c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                            unsigned stride )
807c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell{
817c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   struct draw_vs_varient_generic *vsvg = (struct draw_vs_varient_generic *)varient;
827c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
837c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   vsvg->fetch->set_buffer(vsvg->fetch,
847c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                           buffer,
857c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                           ptr,
867c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                           stride);
877c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell}
887c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
897c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
907c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwellstatic void vsvg_run_elts( struct draw_vs_varient *varient,
917c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                           const unsigned *elts,
927c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                           unsigned count,
937c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                           void *output_buffer)
947c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell{
957c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   struct draw_vs_varient_generic *vsvg = (struct draw_vs_varient_generic *)varient;
967c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
977c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   /* Want to do this in small batches for cache locality?
987c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell    */
997c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
1007c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   vsvg->fetch->run_elts( vsvg->fetch,
1017c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                          elts,
1027c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                          count,
1037c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                          output_buffer );
1047c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
1057c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   //if (!vsvg->base.vs->is_passthrough)
1067c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   {
1077c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell      vsvg->base.vs->run_linear( vsvg->base.vs,
1087c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                                 output_buffer,
1097c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                                 output_buffer,
1107c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                                 vsvg->constants,
1117c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                                 count,
1127c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                                 vsvg->base.key.output_stride,
1137c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                                 vsvg->base.key.output_stride);
1147c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
1157c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell      //if (!vsvg->already_in_emit_format)
1167c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
1177c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell      vsvg->emit->set_buffer( vsvg->emit,
1187c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                              0,
1197c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                              output_buffer,
1207c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                              vsvg->base.key.output_stride );
1217c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
1227c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
1237c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell      vsvg->emit->run( vsvg->emit,
1247c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                       0, count,
1257c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                       output_buffer );
1267c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   }
1277c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell}
1287c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
1297c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
1307c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwellstatic void vsvg_run_linear( struct draw_vs_varient *varient,
1317c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                                   unsigned start,
1327c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                                   unsigned count,
1337c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                                   void *output_buffer )
1347c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell{
1357c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   struct draw_vs_varient_generic *vsvg = (struct draw_vs_varient_generic *)varient;
1367c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
1377c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   //debug_printf("%s %d %d\n", __FUNCTION__, start, count);
1387c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
1397c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
1407c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   vsvg->fetch->run( vsvg->fetch,
1417c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                     start,
1427c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                     count,
1437c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                     output_buffer );
1447c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
1457c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   //if (!vsvg->base.vs->is_passthrough)
1467c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   {
1477c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell      vsvg->base.vs->run_linear( vsvg->base.vs,
1487c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                                 output_buffer,
1497c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                                 output_buffer,
1507c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                                 vsvg->constants,
1517c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                                 count,
1527c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                                 vsvg->base.key.output_stride,
1537c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                                 vsvg->base.key.output_stride);
1547c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
1557c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell      //if (!vsvg->already_in_emit_format)
1567c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell      vsvg->emit->set_buffer( vsvg->emit,
1577c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                              0,
1587c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                              output_buffer,
1597c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                              vsvg->base.key.output_stride );
1607c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
1617c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
1627c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell      vsvg->emit->run( vsvg->emit,
1637c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                       0, count,
1647c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                       output_buffer );
1657c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   }
1667c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell}
1677c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
1687c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
1697c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
1707c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwellstatic void vsvg_destroy( struct draw_vs_varient *varient )
1717c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell{
1727c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   FREE(varient);
1737c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell}
1747c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
1757c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
1767c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwellstruct draw_vs_varient *draw_vs_varient_generic( struct draw_vertex_shader *vs,
1777c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell                                                 const struct draw_vs_varient_key *key )
1787c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell{
1797c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   unsigned i;
1807c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   struct translate_key fetch, emit;
1817c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
1827c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   struct draw_vs_varient_generic *vsvg = CALLOC_STRUCT( draw_vs_varient_generic );
1837c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   if (vsvg == NULL)
1847c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell      return NULL;
1857c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
1867c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   vsvg->base.key = *key;
1877c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   vsvg->base.vs = vs;
1887c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   vsvg->base.set_input     = vsvg_set_input;
1897c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   vsvg->base.set_constants = vsvg_set_constants;
1907c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   vsvg->base.run_elts      = vsvg_run_elts;
1917c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   vsvg->base.run_linear    = vsvg_run_linear;
1927c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   vsvg->base.destroy       = vsvg_destroy;
1937c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
1947c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
1957c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
1967c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   /* OK, have to build a new one:
1977c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell    */
1987c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   fetch.nr_elements = vs->info.num_inputs;
1997c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   fetch.output_stride = 0;
2007c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   for (i = 0; i < vs->info.num_inputs; i++) {
2017c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell      fetch.element[i].input_format = key->element[i].in.format;
2027c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell      fetch.element[i].input_buffer = key->element[i].in.buffer;
2037c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell      fetch.element[i].input_offset = key->element[i].in.offset;
2047c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell      fetch.element[i].output_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
2057c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell      fetch.element[i].output_offset = fetch.output_stride;
2067c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell      fetch.output_stride += 4 * sizeof(float);
2077c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   }
2087c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
2097c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
2107c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   emit.nr_elements = vs->info.num_outputs;
2117c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   emit.output_stride = key->output_stride;
2127c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   for (i = 0; i < vs->info.num_outputs; i++) {
2137c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell      emit.element[i].input_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
2147c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell      emit.element[i].input_buffer = 0;
2157c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell      emit.element[i].input_offset = i * 4 * sizeof(float);
2167c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell      emit.element[i].output_format = key->element[i].out.format;
2177c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell      emit.element[i].output_offset = key->element[i].out.offset;
2187c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   }
2197c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
2207c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   vsvg->fetch = draw_vs_get_fetch( vs->draw, &fetch );
2217c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   vsvg->emit = draw_vs_get_emit( vs->draw, &emit );
2227c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
2237c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell   return &vsvg->base;
2247c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell}
2257c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
2267c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
2277c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
2287c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
2297c99d7fe60e7bb0b7cf103a851aeef4614278ca6Keith Whitwell
230