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