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 /* 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Authors: 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Keith Whitwell <keith@tungstengraphics.com> 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw/draw_context.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw/draw_gs.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw/draw_private.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw/draw_pt.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw/draw_vs.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi/tgsi_dump.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_math.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_prim.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_format.h" 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_draw.h" 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDEBUG_GET_ONCE_BOOL_OPTION(draw_fse, "DRAW_FSE", FALSE) 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDEBUG_GET_ONCE_BOOL_OPTION(draw_no_fse, "DRAW_NO_FSE", FALSE) 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Overall we split things into: 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - frontend -- prepare fetch_elts, draw_elts - eg vsplit 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - middle -- fetch, shade, cliptest, viewport 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - pipeline -- the prim pipeline: clipping, wide lines, etc 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - backend -- the vbuf_render provided by the driver. 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdraw_pt_arrays(struct draw_context *draw, 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned prim, 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned start, 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned count) 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct draw_pt_front_end *frontend = NULL; 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct draw_pt_middle_end *middle = NULL; 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned opt = 0; 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Sanitize primitive length: 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned first, incr; 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_pt_split_prim(prim, &first, &incr); 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count = draw_pt_trim_count(count, first, incr); 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (count < first) 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!draw->force_passthrough) { 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned gs_out_prim = (draw->gs.geometry_shader ? 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->gs.geometry_shader->output_primitive : 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim); 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!draw->render) { 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opt |= PT_PIPELINE; 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (draw_need_pipeline(draw, 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->rasterizer, 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gs_out_prim)) { 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opt |= PT_PIPELINE; 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((draw->clip_xy || 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->clip_z || 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->clip_user) && !draw->pt.test_fse) { 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opt |= PT_CLIPTEST; 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opt |= PT_SHADE; 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (draw->pt.middle.llvm) { 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org middle = draw->pt.middle.llvm; 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (opt == 0) 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org middle = draw->pt.middle.fetch_emit; 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (opt == PT_SHADE && !draw->pt.no_fse) 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org middle = draw->pt.middle.fetch_shade_emit; 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org middle = draw->pt.middle.general; 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org frontend = draw->pt.frontend; 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (frontend ) { 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (draw->pt.prim != prim || draw->pt.opt != opt) { 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* In certain conditions switching primitives requires us to flush 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and validate the different stages. One example is when smooth 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * lines are active but first drawn with triangles and then with 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * lines. 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE ); 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org frontend = NULL; 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (draw->pt.eltSize != draw->pt.user.eltSize) { 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Flush draw state if eltSize changed. 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This could be improved so only the frontend is flushed since it 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * converts all indices to ushorts and the fetch part of the middle 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * always perpares both linear and indexed. 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org frontend->flush( frontend, DRAW_FLUSH_STATE_CHANGE ); 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org frontend = NULL; 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!frontend) { 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org frontend = draw->pt.front.vsplit; 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org frontend->prepare( frontend, prim, middle, opt ); 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.frontend = frontend; 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.eltSize = draw->pt.user.eltSize; 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.prim = prim; 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.opt = opt; 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org frontend->run( frontend, start, count ); 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid draw_pt_flush( struct draw_context *draw, unsigned flags ) 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (draw->pt.frontend) { 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.frontend->flush( draw->pt.frontend, flags ); 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* don't prepare if we only are flushing the backend */ 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(flags & DRAW_FLUSH_BACKEND)) 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.frontend = NULL; 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean draw_pt_init( struct draw_context *draw ) 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.test_fse = debug_get_option_draw_fse(); 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.no_fse = debug_get_option_draw_no_fse(); 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.front.vsplit = draw_pt_vsplit(draw); 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!draw->pt.front.vsplit) 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.middle.fetch_emit = draw_pt_fetch_emit( draw ); 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!draw->pt.middle.fetch_emit) 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.middle.fetch_shade_emit = draw_pt_middle_fse( draw ); 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!draw->pt.middle.fetch_shade_emit) 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.middle.general = draw_pt_fetch_pipeline_or_emit( draw ); 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!draw->pt.middle.general) 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if HAVE_LLVM 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (draw->llvm) 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.middle.llvm = draw_pt_fetch_pipeline_or_emit_llvm( draw ); 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid draw_pt_destroy( struct draw_context *draw ) 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (draw->pt.middle.llvm) { 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.middle.llvm->destroy( draw->pt.middle.llvm ); 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.middle.llvm = NULL; 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (draw->pt.middle.general) { 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.middle.general->destroy( draw->pt.middle.general ); 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.middle.general = NULL; 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (draw->pt.middle.fetch_emit) { 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.middle.fetch_emit->destroy( draw->pt.middle.fetch_emit ); 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.middle.fetch_emit = NULL; 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (draw->pt.middle.fetch_shade_emit) { 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.middle.fetch_shade_emit->destroy( draw->pt.middle.fetch_shade_emit ); 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.middle.fetch_shade_emit = NULL; 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (draw->pt.front.vsplit) { 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.front.vsplit->destroy( draw->pt.front.vsplit ); 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.front.vsplit = NULL; 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Debug- print the first 'count' vertices. 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdraw_print_arrays(struct draw_context *draw, uint prim, int start, uint count) 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint i; 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("Draw arrays(prim = %u, start = %u, count = %u)\n", 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prim, start, count); 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < count; i++) { 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint ii = 0; 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint j; 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (draw->pt.user.eltSize) { 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* indexed arrays */ 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (draw->pt.user.eltSize) { 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const ubyte *elem = (const ubyte *) draw->pt.user.elts; 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ii = elem[start + i]; 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const ushort *elem = (const ushort *) draw->pt.user.elts; 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ii = elem[start + i]; 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint *elem = (const uint *) draw->pt.user.elts; 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ii = elem[start + i]; 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ii += draw->pt.user.eltBias; 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("Element[%u + %u] + %i -> Vertex %u:\n", start, i, 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.user.eltBias, ii); 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* non-indexed arrays */ 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ii = start + i; 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("Vertex %u:\n", ii); 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < draw->pt.nr_vertex_elements; j++) { 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint buf = draw->pt.vertex_element[j].vertex_buffer_index; 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ubyte *ptr = (ubyte *) draw->pt.user.vbuffer[buf]; 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (draw->pt.vertex_element[j].instance_divisor) { 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ii = draw->instance_id / draw->pt.vertex_element[j].instance_divisor; 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ptr += draw->pt.vertex_buffer[buf].buffer_offset; 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ptr += draw->pt.vertex_buffer[buf].stride * ii; 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ptr += draw->pt.vertex_element[j].src_offset; 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf(" Attr %u: ", j); 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (draw->pt.vertex_element[j].src_format) { 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R32_FLOAT: 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float *v = (float *) ptr; 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("R %f @ %p\n", v[0], (void *) v); 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R32G32_FLOAT: 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float *v = (float *) ptr; 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("RG %f %f @ %p\n", v[0], v[1], (void *) v); 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R32G32B32_FLOAT: 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float *v = (float *) ptr; 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("RGB %f %f %f @ %p\n", v[0], v[1], v[2], (void *) v); 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R32G32B32A32_FLOAT: 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float *v = (float *) ptr; 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("RGBA %f %f %f %f @ %p\n", v[0], v[1], v[2], v[3], 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void *) v); 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_B8G8R8A8_UNORM: 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ubyte *u = (ubyte *) ptr; 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("BGRA %d %d %d %d @ %p\n", u[0], u[1], u[2], u[3], 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void *) u); 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("other format %s (fix me)\n", 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_format_name(draw->pt.vertex_element[j].src_format)); 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Helper code for below */ 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define PRIM_RESTART_LOOP(elements) \ 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org do { \ 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = start; i < end; i++) { \ 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (elements[i] == info->restart_index) { \ 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cur_count > 0) { \ 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* draw elts up to prev pos */ \ 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_pt_arrays(draw, prim, cur_start, cur_count); \ 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* begin new prim at next elt */ \ 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur_start = i + 1; \ 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur_count = 0; \ 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { \ 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur_count++; \ 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cur_count > 0) { \ 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_pt_arrays(draw, prim, cur_start, cur_count); \ 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } while (0) 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For drawing prims with primitive restart enabled. 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Scan for restart indexes and draw the runs of elements/vertices between 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the restarts. 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdraw_pt_arrays_restart(struct draw_context *draw, 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_draw_info *info) 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned prim = info->mode; 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned start = info->start; 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned count = info->count; 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned end = start + count; 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i, cur_start, cur_count; 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(info->primitive_restart); 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (draw->pt.user.eltSize) { 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* indexed prims (draw_elements) */ 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur_start = start; 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur_count = 0; 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (draw->pt.user.eltSize) { 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const ubyte *elt_ub = (const ubyte *) draw->pt.user.elts; 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRIM_RESTART_LOOP(elt_ub); 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const ushort *elt_us = (const ushort *) draw->pt.user.elts; 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRIM_RESTART_LOOP(elt_us); 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint *elt_ui = (const uint *) draw->pt.user.elts; 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PRIM_RESTART_LOOP(elt_ui); 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0 && "bad eltSize in draw_arrays()"); 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Non-indexed prims (draw_arrays). 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Primitive restart should have been handled in the state tracker. 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_pt_arrays(draw, prim, start, count); 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Non-instanced drawing. 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \sa draw_arrays_instanced 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdraw_arrays(struct draw_context *draw, unsigned prim, 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned start, unsigned count) 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_arrays_instanced(draw, prim, start, count, 0, 1); 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Instanced drawing. 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \sa draw_vbo 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdraw_arrays_instanced(struct draw_context *draw, 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned mode, 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned start, 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned count, 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned startInstance, 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned instanceCount) 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_draw_info info; 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_draw_init_info(&info); 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info.mode = mode; 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info.start = start; 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info.count = count; 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info.start_instance = startInstance; 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info.instance_count = instanceCount; 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info.min_index = start; 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info.max_index = start + count - 1; 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_vbo(draw, &info); 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Draw vertex arrays. 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is the main entrypoint into the drawing module. If drawing an indexed 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * primitive, the draw_set_index_buffer() and draw_set_mapped_index_buffer() 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * functions should have already been called to specify the element/index 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * buffer information. 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdraw_vbo(struct draw_context *draw, 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_draw_info *info) 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned instance; 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned index_limit; 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(info->instance_count > 0); 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (info->indexed) 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(draw->pt.user.elts); 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.user.eltBias = info->index_bias; 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.user.min_index = info->min_index; 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.user.max_index = info->max_index; 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.user.eltSize = info->indexed ? draw->pt.user.eltSizeIB : 0; 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (0) 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("draw_vbo(mode=%u start=%u count=%u):\n", 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->mode, info->start, info->count); 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (0) 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dump(draw->vs.vertex_shader->state.tokens, 0); 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (0) { 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int i; 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("Elements:\n"); 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < draw->pt.nr_vertex_elements; i++) { 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf(" %u: src_offset=%u inst_div=%u vbuf=%u format=%s\n", 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i, 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.vertex_element[i].src_offset, 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.vertex_element[i].instance_divisor, 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.vertex_element[i].vertex_buffer_index, 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_format_name(draw->pt.vertex_element[i].src_format)); 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("Buffers:\n"); 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < draw->pt.nr_vertex_buffers; i++) { 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf(" %u: stride=%u offset=%u ptr=%p\n", 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i, 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.vertex_buffer[i].stride, 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.vertex_buffer[i].buffer_offset, 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.user.vbuffer[i]); 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (0) 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_print_arrays(draw, info->mode, info->start, MIN2(info->count, 20)); 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index_limit = util_draw_max_index(draw->pt.vertex_buffer, 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.vertex_element, 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.nr_vertex_elements, 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info); 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index_limit == 0) { 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* one of the buffers is too small to do any valid drawing */ 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_warning("draw: VBO too small to draw anything\n"); 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->pt.max_index = index_limit - 1; 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TODO: We could use draw->pt.max_index to further narrow 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the min_index/max_index hints given by the state tracker. 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (instance = 0; instance < info->instance_count; instance++) { 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw->instance_id = instance + info->start_instance; 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (info->primitive_restart) { 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_pt_arrays_restart(draw, info); 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_pt_arrays(draw, info->mode, info->start, info->count); 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 527