1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**************************************************************************
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2010 VMware, Inc.
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved.
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish,
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software.
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw/draw_private.h"
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw/draw_vs.h"
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw/draw_context.h"
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw/draw_vbuf.h"
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw/draw_vertex.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw/draw_pt.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_state.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_math.h"
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h"
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct pt_so_emit {
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct draw_context *draw;
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned input_vertex_stride;
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const float (*inputs)[4];
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean has_so;
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned emitted_primitives;
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned emitted_vertices;
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned generated_primitives;
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid draw_pt_so_emit_prepare(struct pt_so_emit *emit)
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct draw_context *draw = emit->draw;
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit->has_so = (draw->vs.vertex_shader->state.stream_output.num_outputs > 0);
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* if we have a state with outputs make sure we have
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * buffers to output to */
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (emit->has_so) {
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      boolean has_valid_buffer = FALSE;
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned i;
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < draw->so.num_targets; ++i) {
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (draw->so.targets[i]) {
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            has_valid_buffer = TRUE;
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emit->has_so = has_valid_buffer;
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!emit->has_so)
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* XXX: need to flush to get prim_vbuf.c to release its allocation??
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw_do_flush( draw, DRAW_FLUSH_BACKEND );
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void so_emit_prim(struct pt_so_emit *so,
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         unsigned *indices,
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         unsigned num_vertices)
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned slot, i;
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned input_vertex_stride = so->input_vertex_stride;
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct draw_context *draw = so->draw;
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const float (*input_ptr)[4];
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct pipe_stream_output_info *state =
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      &draw->vs.vertex_shader->state.stream_output;
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float *buffer;
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int buffer_total_bytes[PIPE_MAX_SO_BUFFERS];
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   input_ptr = so->inputs;
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ++so->generated_primitives;
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < draw->so.num_targets; i++) {
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct draw_so_target *target = draw->so.targets[i];
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      buffer_total_bytes[i] = target->internal_offset;
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* check have we space to emit prim first - if not don't do anything */
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < num_vertices; ++i) {
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (slot = 0; slot < state->num_outputs; ++slot) {
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         unsigned num_comps = state->output[slot].num_components;
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         int ob = state->output[slot].output_buffer;
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if ((buffer_total_bytes[ob] + num_comps * sizeof(float)) >
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             draw->so.targets[ob]->target.buffer_size) {
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return;
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         buffer_total_bytes[ob] += num_comps * sizeof(float);
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < num_vertices; ++i) {
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const float (*input)[4];
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned total_written_compos = 0;
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /*debug_printf("%d) vertex index = %d (prim idx = %d)\n", i, indices[i], prim_idx);*/
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      input = (const float (*)[4])(
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         (const char *)input_ptr + (indices[i] * input_vertex_stride));
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (slot = 0; slot < state->num_outputs; ++slot) {
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         unsigned idx = state->output[slot].register_index;
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         unsigned start_comp = state->output[slot].start_component;
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         unsigned num_comps = state->output[slot].num_components;
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         int ob = state->output[slot].output_buffer;
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         buffer = (float *)((char *)draw->so.targets[ob]->mapping +
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            draw->so.targets[ob]->target.buffer_offset +
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            draw->so.targets[ob]->internal_offset);
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         memcpy(buffer, &input[idx][start_comp], num_comps * sizeof(float));
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         draw->so.targets[ob]->internal_offset += num_comps * sizeof(float);
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         total_written_compos += num_comps;
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   so->emitted_vertices += num_vertices;
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ++so->emitted_primitives;
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void so_point(struct pt_so_emit *so, int idx)
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned indices[1];
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   indices[0] = idx;
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   so_emit_prim(so, indices, 1);
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void so_line(struct pt_so_emit *so, int i0, int i1)
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned indices[2];
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   indices[0] = i0;
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   indices[1] = i1;
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   so_emit_prim(so, indices, 2);
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void so_tri(struct pt_so_emit *so, int i0, int i1, int i2)
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned indices[3];
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   indices[0] = i0;
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   indices[1] = i1;
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   indices[2] = i2;
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   so_emit_prim(so, indices, 3);
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FUNC         so_run_linear
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GET_ELT(idx) (start + (idx))
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw_so_emit_tmp.h"
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FUNC         so_run_elts
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define LOCAL_VARS   const ushort *elts = input_prims->elts;
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GET_ELT(idx) (elts[start + (idx)])
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw_so_emit_tmp.h"
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid draw_pt_so_emit( struct pt_so_emit *emit,
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      const struct draw_vertex_info *input_verts,
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      const struct draw_prim_info *input_prims )
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct draw_context *draw = emit->draw;
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbuf_render *render = draw->render;
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned start, i;
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!emit->has_so)
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit->emitted_vertices = 0;
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit->emitted_primitives = 0;
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit->generated_primitives = 0;
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit->input_vertex_stride = input_verts->stride;
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit->inputs = (const float (*)[4])input_verts->verts->data;
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* XXX: need to flush to get prim_vbuf.c to release its allocation??*/
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw_do_flush( draw, DRAW_FLUSH_BACKEND );
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (start = i = 0; i < input_prims->primitive_count;
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        start += input_prims->primitive_lengths[i], i++)
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned count = input_prims->primitive_lengths[i];
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (input_prims->linear) {
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         so_run_linear(emit, input_prims, input_verts,
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       start, count);
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         so_run_elts(emit, input_prims, input_verts,
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     start, count);
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   render->set_stream_output_info(render,
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  emit->emitted_primitives,
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  emit->emitted_vertices,
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  emit->generated_primitives);
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct pt_so_emit *draw_pt_so_emit_create( struct draw_context *draw )
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pt_so_emit *emit = CALLOC_STRUCT(pt_so_emit);
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!emit)
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit->draw = draw;
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return emit;
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid draw_pt_so_emit_destroy( struct pt_so_emit *emit )
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FREE(emit);
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
241