1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 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 TUNGSTEN GRAPHICS 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 "util/u_math.h" 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h" 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_prim.h" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw/draw_context.h" 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw/draw_vbuf.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw/draw_vertex.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw/draw_pt.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw/draw_vs.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw/draw_gs.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct fetch_pipeline_middle_end { 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct draw_pt_middle_end base; 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct draw_context *draw; 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pt_emit *emit; 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pt_so_emit *so_emit; 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pt_fetch *fetch; 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pt_post_vs *post_vs; 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned vertex_data_offset; 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned vertex_size; 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned input_prim; 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned opt; 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void fetch_pipeline_prepare( struct draw_pt_middle_end *middle, 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned prim, 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned opt, 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned *max_vertices ) 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct fetch_pipeline_middle_end *fpme = (struct fetch_pipeline_middle_end *)middle; 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct draw_context *draw = fpme->draw; 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct draw_vertex_shader *vs = draw->vs.vertex_shader; 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned instance_id_index = ~0; 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned gs_out_prim = (draw->gs.geometry_shader ? 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->gs.geometry_shader->output_primitive : 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim); 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Add one to num_outputs because the pipeline occasionally tags on 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * an additional texcoord, eg for AA lines. 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned nr = MAX2( vs->info.num_inputs, 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vs->info.num_outputs + 1 ); 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Scan for instanceID system value. 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < vs->info.num_inputs; i++) { 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vs->info.input_semantic_name[i] == TGSI_SEMANTIC_INSTANCEID) { 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org instance_id_index = i; 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fpme->input_prim = prim; 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fpme->opt = opt; 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Always leave room for the vertex header whether we need it or 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * not. It's hard to get rid of it in particular because of the 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * viewport code in draw_pt_post_vs.c. 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fpme->vertex_size = sizeof(struct vertex_header) + nr * 4 * sizeof(float); 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_pt_fetch_prepare( fpme->fetch, 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vs->info.num_inputs, 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fpme->vertex_size, 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org instance_id_index ); 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX: it's not really gl rasterization rules we care about here, 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * but gl vs dx9 clip spaces. 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_pt_post_vs_prepare( fpme->post_vs, 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->clip_xy, 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->clip_z, 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->clip_user, 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->guard_band_xy, 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->identity_viewport, 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (boolean)draw->rasterizer->gl_rasterization_rules, 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (draw->vs.edgeflag_output ? TRUE : FALSE) ); 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_pt_so_emit_prepare( fpme->so_emit ); 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(opt & PT_PIPELINE)) { 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_pt_emit_prepare( fpme->emit, 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gs_out_prim, 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org max_vertices ); 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *max_vertices = MAX2( *max_vertices, 4096 ); 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* limit max fetches by limiting max_vertices */ 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *max_vertices = 4096; 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* No need to prepare the shader. 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vs->prepare(vs, draw); 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void fetch( struct pt_fetch *fetch, 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct draw_fetch_info *fetch_info, 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org char *output) 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fetch_info->linear) { 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_pt_fetch_run_linear( fetch, 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fetch_info->start, 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fetch_info->count, 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output ); 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_pt_fetch_run( fetch, 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fetch_info->elts, 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fetch_info->count, 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output ); 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void pipeline(struct fetch_pipeline_middle_end *fpme, 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct draw_vertex_info *vert_info, 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct draw_prim_info *prim_info) 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (prim_info->linear) 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_pipeline_run_linear( fpme->draw, 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vert_info, 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim_info); 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_pipeline_run( fpme->draw, 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vert_info, 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim_info ); 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void emit(struct pt_emit *emit, 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct draw_vertex_info *vert_info, 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct draw_prim_info *prim_info) 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (prim_info->linear) { 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_pt_emit_linear(emit, vert_info, prim_info); 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_pt_emit(emit, vert_info, prim_info); 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void draw_vertex_shader_run(struct draw_vertex_shader *vshader, 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const void *constants[PIPE_MAX_CONSTANT_BUFFERS], 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned const_size[PIPE_MAX_CONSTANT_BUFFERS], 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct draw_vertex_info *input_verts, 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct draw_vertex_info *output_verts ) 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output_verts->vertex_size = input_verts->vertex_size; 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output_verts->stride = input_verts->vertex_size; 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output_verts->count = input_verts->count; 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output_verts->verts = 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (struct vertex_header *)MALLOC(output_verts->vertex_size * 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org align(output_verts->count, 4)); 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vshader->run_linear(vshader, 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (const float (*)[4])input_verts->verts->data, 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ( float (*)[4])output_verts->verts->data, 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org constants, 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const_size, 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org input_verts->count, 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org input_verts->vertex_size, 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org input_verts->vertex_size); 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void fetch_pipeline_generic( struct draw_pt_middle_end *middle, 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct draw_fetch_info *fetch_info, 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct draw_prim_info *prim_info ) 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct fetch_pipeline_middle_end *fpme = (struct fetch_pipeline_middle_end *)middle; 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct draw_context *draw = fpme->draw; 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct draw_vertex_shader *vshader = draw->vs.vertex_shader; 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct draw_geometry_shader *gshader = draw->gs.geometry_shader; 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct draw_prim_info gs_prim_info; 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct draw_vertex_info fetched_vert_info; 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct draw_vertex_info vs_vert_info; 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct draw_vertex_info gs_vert_info; 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct draw_vertex_info *vert_info; 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned opt = fpme->opt; 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fetched_vert_info.count = fetch_info->count; 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fetched_vert_info.vertex_size = fpme->vertex_size; 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fetched_vert_info.stride = fpme->vertex_size; 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fetched_vert_info.verts = 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (struct vertex_header *)MALLOC(fpme->vertex_size * 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org align(fetch_info->count, 4)); 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!fetched_vert_info.verts) { 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Fetch into our vertex buffer. 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fetch( fpme->fetch, fetch_info, (char *)fetched_vert_info.verts ); 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Finished with fetch: 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fetch_info = NULL; 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vert_info = &fetched_vert_info; 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Run the shader, note that this overwrites the data[] parts of 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the pipeline verts. 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fpme->opt & PT_SHADE) { 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_vertex_shader_run(vshader, 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.user.vs_constants, 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.user.vs_constants_size, 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vert_info, 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &vs_vert_info); 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(vert_info->verts); 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vert_info = &vs_vert_info; 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((fpme->opt & PT_SHADE) && gshader) { 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_geometry_shader_run(gshader, 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.user.gs_constants, 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.user.gs_constants_size, 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vert_info, 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim_info, 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &gs_vert_info, 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &gs_prim_info); 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(vert_info->verts); 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vert_info = &gs_vert_info; 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim_info = &gs_prim_info; 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Stream output needs to be done before clipping. 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * XXX: Stream output surely needs to respect the prim_info->elt 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * lists. 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_pt_so_emit( fpme->so_emit, 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vert_info, 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim_info ); 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (draw_pt_post_vs_run( fpme->post_vs, 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vert_info )) 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opt |= PT_PIPELINE; 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Do we need to run the pipeline? 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (opt & PT_PIPELINE) { 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipeline( fpme, 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vert_info, 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim_info ); 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit( fpme->emit, 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vert_info, 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim_info ); 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(vert_info->verts); 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void fetch_pipeline_run( struct draw_pt_middle_end *middle, 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned *fetch_elts, 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned fetch_count, 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const ushort *draw_elts, 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned draw_count, 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned prim_flags ) 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct fetch_pipeline_middle_end *fpme = (struct fetch_pipeline_middle_end *)middle; 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct draw_fetch_info fetch_info; 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct draw_prim_info prim_info; 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fetch_info.linear = FALSE; 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fetch_info.start = 0; 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fetch_info.elts = fetch_elts; 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fetch_info.count = fetch_count; 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim_info.linear = FALSE; 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim_info.start = 0; 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim_info.count = draw_count; 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim_info.elts = draw_elts; 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim_info.prim = fpme->input_prim; 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim_info.flags = prim_flags; 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim_info.primitive_count = 1; 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim_info.primitive_lengths = &draw_count; 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fetch_pipeline_generic( middle, &fetch_info, &prim_info ); 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void fetch_pipeline_linear_run( struct draw_pt_middle_end *middle, 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned start, 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned count, 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned prim_flags) 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct fetch_pipeline_middle_end *fpme = (struct fetch_pipeline_middle_end *)middle; 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct draw_fetch_info fetch_info; 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct draw_prim_info prim_info; 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fetch_info.linear = TRUE; 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fetch_info.start = start; 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fetch_info.count = count; 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fetch_info.elts = NULL; 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim_info.linear = TRUE; 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim_info.start = 0; 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim_info.count = count; 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim_info.elts = NULL; 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim_info.prim = fpme->input_prim; 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim_info.flags = prim_flags; 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim_info.primitive_count = 1; 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim_info.primitive_lengths = &count; 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fetch_pipeline_generic( middle, &fetch_info, &prim_info ); 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean fetch_pipeline_linear_run_elts( struct draw_pt_middle_end *middle, 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned start, 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned count, 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const ushort *draw_elts, 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned draw_count, 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned prim_flags ) 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct fetch_pipeline_middle_end *fpme = (struct fetch_pipeline_middle_end *)middle; 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct draw_fetch_info fetch_info; 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct draw_prim_info prim_info; 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fetch_info.linear = TRUE; 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fetch_info.start = start; 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fetch_info.count = count; 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fetch_info.elts = NULL; 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim_info.linear = FALSE; 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim_info.start = 0; 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim_info.count = draw_count; 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim_info.elts = draw_elts; 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim_info.prim = fpme->input_prim; 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim_info.flags = prim_flags; 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim_info.primitive_count = 1; 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim_info.primitive_lengths = &draw_count; 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fetch_pipeline_generic( middle, &fetch_info, &prim_info ); 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void fetch_pipeline_finish( struct draw_pt_middle_end *middle ) 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* nothing to do */ 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void fetch_pipeline_destroy( struct draw_pt_middle_end *middle ) 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct fetch_pipeline_middle_end *fpme = (struct fetch_pipeline_middle_end *)middle; 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fpme->fetch) 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_pt_fetch_destroy( fpme->fetch ); 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fpme->emit) 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_pt_emit_destroy( fpme->emit ); 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fpme->so_emit) 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_pt_so_emit_destroy( fpme->so_emit ); 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fpme->post_vs) 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_pt_post_vs_destroy( fpme->post_vs ); 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(middle); 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct draw_pt_middle_end *draw_pt_fetch_pipeline_or_emit( struct draw_context *draw ) 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct fetch_pipeline_middle_end *fpme = CALLOC_STRUCT( fetch_pipeline_middle_end ); 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!fpme) 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fpme->base.prepare = fetch_pipeline_prepare; 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fpme->base.run = fetch_pipeline_run; 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fpme->base.run_linear = fetch_pipeline_linear_run; 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fpme->base.run_linear_elts = fetch_pipeline_linear_run_elts; 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fpme->base.finish = fetch_pipeline_finish; 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fpme->base.destroy = fetch_pipeline_destroy; 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fpme->draw = draw; 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fpme->fetch = draw_pt_fetch_create( draw ); 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!fpme->fetch) 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fpme->post_vs = draw_pt_post_vs_create( draw ); 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!fpme->post_vs) 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fpme->emit = draw_pt_emit_create( draw ); 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!fpme->emit) 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fpme->so_emit = draw_pt_so_emit_create( draw ); 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!fpme->so_emit) 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &fpme->base; 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fail: 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fpme) 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fetch_pipeline_destroy( &fpme->base ); 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 447