1f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell/************************************************************************** 2f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell * 3f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 4f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell * All Rights Reserved. 5f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell * 6f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a 7f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell * copy of this software and associated documentation files (the 8f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell * "Software"), to deal in the Software without restriction, including 9f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell * without limitation the rights to use, copy, modify, merge, publish, 10f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell * distribute, sub license, and/or sell copies of the Software, and to 11f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell * permit persons to whom the Software is furnished to do so, subject to 12f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell * the following conditions: 13f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell * 14f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell * The above copyright notice and this permission notice (including the 15f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell * next paragraph) shall be included in all copies or substantial portions 16f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell * of the Software. 17f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell * 18f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell * 26f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell **************************************************************************/ 27f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell 28f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell /* 29f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell * Authors: 30f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell * Keith Whitwell <keith@tungstengraphics.com> 31f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell */ 32f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell 33f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell#include "draw/draw_context.h" 34d4ef0f6c67aefe06d8dd647acf8d9005df39a709Zack Rusin#include "draw/draw_gs.h" 35f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell#include "draw/draw_private.h" 36f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell#include "draw/draw_pt.h" 3780e07c41907cc0ac43d68aeb3abf9de8435e70fdBrian Paul#include "draw/draw_vs.h" 3805a17f83b0a6549fde41540f9075505e81ab08d3Brian Paul#include "tgsi/tgsi_dump.h" 390ee92d6ed9c6aae47d990c9ac004034ded5003f1Michal Krol#include "util/u_math.h" 40d2e4643767ce2a1f30e6ef1c86c2aa225c025c32Brian Paul#include "util/u_prim.h" 4180e07c41907cc0ac43d68aeb3abf9de8435e70fdBrian Paul#include "util/u_format.h" 424f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu#include "util/u_draw.h" 43f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell 441820d240cd0b517ca1d73f1e8e0a528ca8d5b092Jakob Bornecrantz 450e4f0e8725cd93fc1e51e4caa09aadf340add11aBrian PaulDEBUG_GET_ONCE_BOOL_OPTION(draw_fse, "DRAW_FSE", FALSE) 460e4f0e8725cd93fc1e51e4caa09aadf340add11aBrian PaulDEBUG_GET_ONCE_BOOL_OPTION(draw_no_fse, "DRAW_NO_FSE", FALSE) 471820d240cd0b517ca1d73f1e8e0a528ca8d5b092Jakob Bornecrantz 48a8582efaca35d09c8ca18918a243a9284583356dKeith Whitwell/* Overall we split things into: 495a085c623faebf957be3fae2f82dc89ef6214585Chia-I Wu * - frontend -- prepare fetch_elts, draw_elts - eg vsplit 50a8582efaca35d09c8ca18918a243a9284583356dKeith Whitwell * - middle -- fetch, shade, cliptest, viewport 51a8582efaca35d09c8ca18918a243a9284583356dKeith Whitwell * - pipeline -- the prim pipeline: clipping, wide lines, etc 52a8582efaca35d09c8ca18918a243a9284583356dKeith Whitwell * - backend -- the vbuf_render provided by the driver. 53a8582efaca35d09c8ca18918a243a9284583356dKeith Whitwell */ 541246d06313f443c91dea07239b43a88ba2b86ddeKeith Whitwellstatic boolean 55b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantzdraw_pt_arrays(struct draw_context *draw, 56f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell unsigned prim, 57f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell unsigned start, 58f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell unsigned count) 59f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell{ 60f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell struct draw_pt_front_end *frontend = NULL; 61f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell struct draw_pt_middle_end *middle = NULL; 62a8582efaca35d09c8ca18918a243a9284583356dKeith Whitwell unsigned opt = 0; 63f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell 641529a2c983f70ed7ff661ae6e8995cdfbca6d9cfKeith Whitwell /* Sanitize primitive length: 651529a2c983f70ed7ff661ae6e8995cdfbca6d9cfKeith Whitwell */ 661529a2c983f70ed7ff661ae6e8995cdfbca6d9cfKeith Whitwell { 671529a2c983f70ed7ff661ae6e8995cdfbca6d9cfKeith Whitwell unsigned first, incr; 681529a2c983f70ed7ff661ae6e8995cdfbca6d9cfKeith Whitwell draw_pt_split_prim(prim, &first, &incr); 6956213a64fe9e4270fd7886675b1e8224b2d88794Chia-I Wu count = draw_pt_trim_count(count, first, incr); 701529a2c983f70ed7ff661ae6e8995cdfbca6d9cfKeith Whitwell if (count < first) 711529a2c983f70ed7ff661ae6e8995cdfbca6d9cfKeith Whitwell return TRUE; 721529a2c983f70ed7ff661ae6e8995cdfbca6d9cfKeith Whitwell } 731529a2c983f70ed7ff661ae6e8995cdfbca6d9cfKeith Whitwell 74c48da7d78b4e7bdbe056b3c9668756d49019be06Keith Whitwell if (!draw->force_passthrough) { 7564682da8ab7aff7b4ce651db99a32ed1fd8b178cKeith Whitwell unsigned gs_out_prim = (draw->gs.geometry_shader ? 7664682da8ab7aff7b4ce651db99a32ed1fd8b178cKeith Whitwell draw->gs.geometry_shader->output_primitive : 7764682da8ab7aff7b4ce651db99a32ed1fd8b178cKeith Whitwell prim); 7864682da8ab7aff7b4ce651db99a32ed1fd8b178cKeith Whitwell 79c48da7d78b4e7bdbe056b3c9668756d49019be06Keith Whitwell if (!draw->render) { 80c48da7d78b4e7bdbe056b3c9668756d49019be06Keith Whitwell opt |= PT_PIPELINE; 81c48da7d78b4e7bdbe056b3c9668756d49019be06Keith Whitwell } 82d4ef0f6c67aefe06d8dd647acf8d9005df39a709Zack Rusin 83c48da7d78b4e7bdbe056b3c9668756d49019be06Keith Whitwell if (draw_need_pipeline(draw, 84c48da7d78b4e7bdbe056b3c9668756d49019be06Keith Whitwell draw->rasterizer, 8564682da8ab7aff7b4ce651db99a32ed1fd8b178cKeith Whitwell gs_out_prim)) { 86c48da7d78b4e7bdbe056b3c9668756d49019be06Keith Whitwell opt |= PT_PIPELINE; 87c48da7d78b4e7bdbe056b3c9668756d49019be06Keith Whitwell } 88c48da7d78b4e7bdbe056b3c9668756d49019be06Keith Whitwell 896c0dc4bafbdbdc0cb4b6e5934fe064226dbd47ecKeith Whitwell if ((draw->clip_xy || 906c0dc4bafbdbdc0cb4b6e5934fe064226dbd47ecKeith Whitwell draw->clip_z || 916c0dc4bafbdbdc0cb4b6e5934fe064226dbd47ecKeith Whitwell draw->clip_user) && !draw->pt.test_fse) { 92c48da7d78b4e7bdbe056b3c9668756d49019be06Keith Whitwell opt |= PT_CLIPTEST; 93c48da7d78b4e7bdbe056b3c9668756d49019be06Keith Whitwell } 94d4ef0f6c67aefe06d8dd647acf8d9005df39a709Zack Rusin 9563cb6f59eac91ba34cf80ff3736568e40b094fe1Michal Krol opt |= PT_SHADE; 96a8582efaca35d09c8ca18918a243a9284583356dKeith Whitwell } 97d4ef0f6c67aefe06d8dd647acf8d9005df39a709Zack Rusin 98425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin if (draw->pt.middle.llvm) { 996ecbbc3c056d177174c97ac4d1a57abed3ac3177José Fonseca middle = draw->pt.middle.llvm; 1006ecbbc3c056d177174c97ac4d1a57abed3ac3177José Fonseca } else { 1016ecbbc3c056d177174c97ac4d1a57abed3ac3177José Fonseca if (opt == 0) 1026ecbbc3c056d177174c97ac4d1a57abed3ac3177José Fonseca middle = draw->pt.middle.fetch_emit; 1036ecbbc3c056d177174c97ac4d1a57abed3ac3177José Fonseca else if (opt == PT_SHADE && !draw->pt.no_fse) 1046ecbbc3c056d177174c97ac4d1a57abed3ac3177José Fonseca middle = draw->pt.middle.fetch_shade_emit; 1056ecbbc3c056d177174c97ac4d1a57abed3ac3177José Fonseca else 1066ecbbc3c056d177174c97ac4d1a57abed3ac3177José Fonseca middle = draw->pt.middle.general; 1076ecbbc3c056d177174c97ac4d1a57abed3ac3177José Fonseca } 108f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell 109b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz frontend = draw->pt.frontend; 110b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz 111b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz if (frontend ) { 112b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz if (draw->pt.prim != prim || draw->pt.opt != opt) { 113b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz /* In certain conditions switching primitives requires us to flush 114b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz * and validate the different stages. One example is when smooth 115b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz * lines are active but first drawn with triangles and then with 116b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz * lines. 117b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz */ 118b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE ); 119b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz frontend = NULL; 120b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz } else if (draw->pt.eltSize != draw->pt.user.eltSize) { 121b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz /* Flush draw state if eltSize changed. 122b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz * This could be improved so only the frontend is flushed since it 123b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz * converts all indices to ushorts and the fetch part of the middle 124b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz * always perpares both linear and indexed. 125b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz */ 126b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz frontend->flush( frontend, DRAW_FLUSH_STATE_CHANGE ); 127b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz frontend = NULL; 128b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz } 129b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz } 130f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell 131b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz if (!frontend) { 132b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz frontend = draw->pt.front.vsplit; 133f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell 134b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz frontend->prepare( frontend, prim, middle, opt ); 135f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell 136b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz draw->pt.frontend = frontend; 137b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz draw->pt.eltSize = draw->pt.user.eltSize; 138b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz draw->pt.prim = prim; 139b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz draw->pt.opt = opt; 140b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz } 141b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz 142b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz frontend->run( frontend, start, count ); 143f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell 144f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell return TRUE; 145f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell} 146f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell 147b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantzvoid draw_pt_flush( struct draw_context *draw, unsigned flags ) 148b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz{ 149b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz if (draw->pt.frontend) { 150b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz draw->pt.frontend->flush( draw->pt.frontend, flags ); 151b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz 152b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz /* don't prepare if we only are flushing the backend */ 153b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz if (!(flags & DRAW_FLUSH_BACKEND)) 154b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz draw->pt.frontend = NULL; 155b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz } 156b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz} 157b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz 158b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz 159f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell 160f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwellboolean draw_pt_init( struct draw_context *draw ) 161f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell{ 1621820d240cd0b517ca1d73f1e8e0a528ca8d5b092Jakob Bornecrantz draw->pt.test_fse = debug_get_option_draw_fse(); 1631820d240cd0b517ca1d73f1e8e0a528ca8d5b092Jakob Bornecrantz draw->pt.no_fse = debug_get_option_draw_no_fse(); 164bbda45ec769120324f44febf00c6bb170f594f23Keith Whitwell 1655b6bf799e637e9020af3a4bebe514b53d7c38ecaChia-I Wu draw->pt.front.vsplit = draw_pt_vsplit(draw); 1665b6bf799e637e9020af3a4bebe514b53d7c38ecaChia-I Wu if (!draw->pt.front.vsplit) 167992d0b997f8f7e965e56852b81e01c290f8c13deZack Rusin return FALSE; 168992d0b997f8f7e965e56852b81e01c290f8c13deZack Rusin 1691246d06313f443c91dea07239b43a88ba2b86ddeKeith Whitwell draw->pt.middle.fetch_emit = draw_pt_fetch_emit( draw ); 1701246d06313f443c91dea07239b43a88ba2b86ddeKeith Whitwell if (!draw->pt.middle.fetch_emit) 1711246d06313f443c91dea07239b43a88ba2b86ddeKeith Whitwell return FALSE; 1720c1cb54923f3ab31caa2821e095685277174dd2fZack Rusin 173728d1f7f43b6db9f4f42c2d16ba223c492d1147dKeith Whitwell draw->pt.middle.fetch_shade_emit = draw_pt_middle_fse( draw ); 174728d1f7f43b6db9f4f42c2d16ba223c492d1147dKeith Whitwell if (!draw->pt.middle.fetch_shade_emit) 175728d1f7f43b6db9f4f42c2d16ba223c492d1147dKeith Whitwell return FALSE; 176b5e5369da5fc50d63a6ece931fac44b555eb0314Keith Whitwell 1776ecbbc3c056d177174c97ac4d1a57abed3ac3177José Fonseca draw->pt.middle.general = draw_pt_fetch_pipeline_or_emit( draw ); 1781246d06313f443c91dea07239b43a88ba2b86ddeKeith Whitwell if (!draw->pt.middle.general) 179f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell return FALSE; 180f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell 1816ecbbc3c056d177174c97ac4d1a57abed3ac3177José Fonseca#if HAVE_LLVM 182f201217c1d87919572a3b1cf7de94f580f20e5f0Luca Barbieri if (draw->llvm) 1836ecbbc3c056d177174c97ac4d1a57abed3ac3177José Fonseca draw->pt.middle.llvm = draw_pt_fetch_pipeline_or_emit_llvm( draw ); 1846ecbbc3c056d177174c97ac4d1a57abed3ac3177José Fonseca#endif 1856ecbbc3c056d177174c97ac4d1a57abed3ac3177José Fonseca 186f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell return TRUE; 187f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell} 188f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell 189f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell 190f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwellvoid draw_pt_destroy( struct draw_context *draw ) 191f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell{ 1926ecbbc3c056d177174c97ac4d1a57abed3ac3177José Fonseca if (draw->pt.middle.llvm) { 1936ecbbc3c056d177174c97ac4d1a57abed3ac3177José Fonseca draw->pt.middle.llvm->destroy( draw->pt.middle.llvm ); 1946ecbbc3c056d177174c97ac4d1a57abed3ac3177José Fonseca draw->pt.middle.llvm = NULL; 1956ecbbc3c056d177174c97ac4d1a57abed3ac3177José Fonseca } 1966ecbbc3c056d177174c97ac4d1a57abed3ac3177José Fonseca 1971246d06313f443c91dea07239b43a88ba2b86ddeKeith Whitwell if (draw->pt.middle.general) { 1981246d06313f443c91dea07239b43a88ba2b86ddeKeith Whitwell draw->pt.middle.general->destroy( draw->pt.middle.general ); 1991246d06313f443c91dea07239b43a88ba2b86ddeKeith Whitwell draw->pt.middle.general = NULL; 2001246d06313f443c91dea07239b43a88ba2b86ddeKeith Whitwell } 201f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell 2021246d06313f443c91dea07239b43a88ba2b86ddeKeith Whitwell if (draw->pt.middle.fetch_emit) { 2031246d06313f443c91dea07239b43a88ba2b86ddeKeith Whitwell draw->pt.middle.fetch_emit->destroy( draw->pt.middle.fetch_emit ); 2041246d06313f443c91dea07239b43a88ba2b86ddeKeith Whitwell draw->pt.middle.fetch_emit = NULL; 2051246d06313f443c91dea07239b43a88ba2b86ddeKeith Whitwell } 2060c1cb54923f3ab31caa2821e095685277174dd2fZack Rusin 207bbda45ec769120324f44febf00c6bb170f594f23Keith Whitwell if (draw->pt.middle.fetch_shade_emit) { 208bbda45ec769120324f44febf00c6bb170f594f23Keith Whitwell draw->pt.middle.fetch_shade_emit->destroy( draw->pt.middle.fetch_shade_emit ); 209bbda45ec769120324f44febf00c6bb170f594f23Keith Whitwell draw->pt.middle.fetch_shade_emit = NULL; 210bbda45ec769120324f44febf00c6bb170f594f23Keith Whitwell } 211bbda45ec769120324f44febf00c6bb170f594f23Keith Whitwell 2125b6bf799e637e9020af3a4bebe514b53d7c38ecaChia-I Wu if (draw->pt.front.vsplit) { 2135b6bf799e637e9020af3a4bebe514b53d7c38ecaChia-I Wu draw->pt.front.vsplit->destroy( draw->pt.front.vsplit ); 2145b6bf799e637e9020af3a4bebe514b53d7c38ecaChia-I Wu draw->pt.front.vsplit = NULL; 215992d0b997f8f7e965e56852b81e01c290f8c13deZack Rusin } 216f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell} 217b11d89dc6d230f7f945f9eb420d39921c648ec20Keith Whitwell 218b11d89dc6d230f7f945f9eb420d39921c648ec20Keith Whitwell 2196c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul/** 2206c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul * Debug- print the first 'count' vertices. 2216c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul */ 2226c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paulstatic void 2236c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Pauldraw_print_arrays(struct draw_context *draw, uint prim, int start, uint count) 2246c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul{ 2256c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul uint i; 2266c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul 2276c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul debug_printf("Draw arrays(prim = %u, start = %u, count = %u)\n", 2286c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul prim, start, count); 2296c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul 2306c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul for (i = 0; i < count; i++) { 231ea98e9820d7117f7a187f355445796b1ef5d9e0cVinson Lee uint ii = 0; 232ea98e9820d7117f7a187f355445796b1ef5d9e0cVinson Lee uint j; 2336c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul 2344f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu if (draw->pt.user.eltSize) { 2356c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul /* indexed arrays */ 2364f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu 2376c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul switch (draw->pt.user.eltSize) { 2386c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul case 1: 2396c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul { 240185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Paul const ubyte *elem = (const ubyte *) draw->pt.user.elts; 2416c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul ii = elem[start + i]; 2426c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul } 2436c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul break; 2446c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul case 2: 2456c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul { 246185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Paul const ushort *elem = (const ushort *) draw->pt.user.elts; 2476c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul ii = elem[start + i]; 2486c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul } 2496c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul break; 2506c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul case 4: 2516c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul { 252185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Paul const uint *elem = (const uint *) draw->pt.user.elts; 2536c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul ii = elem[start + i]; 2546c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul } 2556c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul break; 2566c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul default: 2576c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul assert(0); 2582197fac47cb1f87387820678357cc67c9a2536b9José Fonseca return; 2596c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul } 2602197fac47cb1f87387820678357cc67c9a2536b9José Fonseca ii += draw->pt.user.eltBias; 2612197fac47cb1f87387820678357cc67c9a2536b9José Fonseca debug_printf("Element[%u + %u] + %i -> Vertex %u:\n", start, i, 2622197fac47cb1f87387820678357cc67c9a2536b9José Fonseca draw->pt.user.eltBias, ii); 2636c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul } 2646c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul else { 2656c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul /* non-indexed arrays */ 2666c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul ii = start + i; 2676c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul debug_printf("Vertex %u:\n", ii); 2686c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul } 2696c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul 2706c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul for (j = 0; j < draw->pt.nr_vertex_elements; j++) { 2716c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul uint buf = draw->pt.vertex_element[j].vertex_buffer_index; 2726c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul ubyte *ptr = (ubyte *) draw->pt.user.vbuffer[buf]; 2730e7b53c75be6051b2a935e65f4dbc02449714ee1Brian Paul 2740e7b53c75be6051b2a935e65f4dbc02449714ee1Brian Paul if (draw->pt.vertex_element[j].instance_divisor) { 2750e7b53c75be6051b2a935e65f4dbc02449714ee1Brian Paul ii = draw->instance_id / draw->pt.vertex_element[j].instance_divisor; 2760e7b53c75be6051b2a935e65f4dbc02449714ee1Brian Paul } 2770e7b53c75be6051b2a935e65f4dbc02449714ee1Brian Paul 2788a2933f3663177f32f5ee45bb696463b8549dcbbBrian Paul ptr += draw->pt.vertex_buffer[buf].buffer_offset; 279872b515e8f0bb1be5bad85fd9d01529c71f07ba2Zack Rusin ptr += draw->pt.vertex_buffer[buf].stride * ii; 2806c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul ptr += draw->pt.vertex_element[j].src_offset; 2816c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul 2826c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul debug_printf(" Attr %u: ", j); 2836c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul switch (draw->pt.vertex_element[j].src_format) { 2846c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul case PIPE_FORMAT_R32_FLOAT: 2856c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul { 2866c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul float *v = (float *) ptr; 28780e07c41907cc0ac43d68aeb3abf9de8435e70fdBrian Paul debug_printf("R %f @ %p\n", v[0], (void *) v); 2886c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul } 2896c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul break; 2906c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul case PIPE_FORMAT_R32G32_FLOAT: 2916c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul { 2926c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul float *v = (float *) ptr; 29380e07c41907cc0ac43d68aeb3abf9de8435e70fdBrian Paul debug_printf("RG %f %f @ %p\n", v[0], v[1], (void *) v); 2946c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul } 2956c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul break; 2966c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul case PIPE_FORMAT_R32G32B32_FLOAT: 2976c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul { 2986c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul float *v = (float *) ptr; 29980e07c41907cc0ac43d68aeb3abf9de8435e70fdBrian Paul debug_printf("RGB %f %f %f @ %p\n", v[0], v[1], v[2], (void *) v); 3006c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul } 3016c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul break; 3026c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul case PIPE_FORMAT_R32G32B32A32_FLOAT: 3036c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul { 3046c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul float *v = (float *) ptr; 30580e07c41907cc0ac43d68aeb3abf9de8435e70fdBrian Paul debug_printf("RGBA %f %f %f %f @ %p\n", v[0], v[1], v[2], v[3], 3066c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul (void *) v); 3076c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul } 3086c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul break; 30980e07c41907cc0ac43d68aeb3abf9de8435e70fdBrian Paul case PIPE_FORMAT_B8G8R8A8_UNORM: 31080e07c41907cc0ac43d68aeb3abf9de8435e70fdBrian Paul { 31180e07c41907cc0ac43d68aeb3abf9de8435e70fdBrian Paul ubyte *u = (ubyte *) ptr; 31280e07c41907cc0ac43d68aeb3abf9de8435e70fdBrian Paul debug_printf("BGRA %d %d %d %d @ %p\n", u[0], u[1], u[2], u[3], 31380e07c41907cc0ac43d68aeb3abf9de8435e70fdBrian Paul (void *) u); 31480e07c41907cc0ac43d68aeb3abf9de8435e70fdBrian Paul } 31580e07c41907cc0ac43d68aeb3abf9de8435e70fdBrian Paul break; 3166c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul default: 31780e07c41907cc0ac43d68aeb3abf9de8435e70fdBrian Paul debug_printf("other format %s (fix me)\n", 31880e07c41907cc0ac43d68aeb3abf9de8435e70fdBrian Paul util_format_name(draw->pt.vertex_element[j].src_format)); 3196c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul } 3206c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul } 3216c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul } 3226c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul} 323b11d89dc6d230f7f945f9eb420d39921c648ec20Keith Whitwell 324b11d89dc6d230f7f945f9eb420d39921c648ec20Keith Whitwell 3250eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul/** Helper code for below */ 3260eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul#define PRIM_RESTART_LOOP(elements) \ 3270eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul do { \ 3280eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul for (i = start; i < end; i++) { \ 3290eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul if (elements[i] == info->restart_index) { \ 3300eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul if (cur_count > 0) { \ 3310eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul /* draw elts up to prev pos */ \ 3320eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul draw_pt_arrays(draw, prim, cur_start, cur_count); \ 3330eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul } \ 3340eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul /* begin new prim at next elt */ \ 3350eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul cur_start = i + 1; \ 3360eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul cur_count = 0; \ 3370eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul } \ 3380eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul else { \ 3390eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul cur_count++; \ 3400eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul } \ 3410eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul } \ 3420eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul if (cur_count > 0) { \ 3430eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul draw_pt_arrays(draw, prim, cur_start, cur_count); \ 3440eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul } \ 3450eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul } while (0) 3460eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul 3470eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul 3480eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul/** 3490eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul * For drawing prims with primitive restart enabled. 3500eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul * Scan for restart indexes and draw the runs of elements/vertices between 3510eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul * the restarts. 3520eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul */ 3530eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paulstatic void 3540eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Pauldraw_pt_arrays_restart(struct draw_context *draw, 3550eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul const struct pipe_draw_info *info) 3560eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul{ 3570eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul const unsigned prim = info->mode; 3580eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul const unsigned start = info->start; 3590eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul const unsigned count = info->count; 3600eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul const unsigned end = start + count; 3610eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul unsigned i, cur_start, cur_count; 3620eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul 3630eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul assert(info->primitive_restart); 3640eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul 36538d1191f4133dc427fccdbaec61bef33201c2dccMarek Olšák if (draw->pt.user.eltSize) { 3660eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul /* indexed prims (draw_elements) */ 3670eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul cur_start = start; 3680eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul cur_count = 0; 3690eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul 3700eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul switch (draw->pt.user.eltSize) { 3710eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul case 1: 3720eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul { 373185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Paul const ubyte *elt_ub = (const ubyte *) draw->pt.user.elts; 3740eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul PRIM_RESTART_LOOP(elt_ub); 3750eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul } 3760eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul break; 3770eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul case 2: 3780eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul { 379185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Paul const ushort *elt_us = (const ushort *) draw->pt.user.elts; 3800eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul PRIM_RESTART_LOOP(elt_us); 3810eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul } 3820eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul break; 3830eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul case 4: 3840eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul { 385185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Paul const uint *elt_ui = (const uint *) draw->pt.user.elts; 3860eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul PRIM_RESTART_LOOP(elt_ui); 3870eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul } 3880eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul break; 3890eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul default: 3900eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul assert(0 && "bad eltSize in draw_arrays()"); 3910eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul } 3920eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul } 3930eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul else { 3940eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul /* Non-indexed prims (draw_arrays). 3950eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul * Primitive restart should have been handled in the state tracker. 3960eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul */ 3970eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul draw_pt_arrays(draw, prim, start, count); 3980eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul } 3990eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul} 4000eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul 4010eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul 4020eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul 403b11d89dc6d230f7f945f9eb420d39921c648ec20Keith Whitwell/** 404839608a8be2dbcb759626b629f98176e4125e0a2Brian Paul * Non-instanced drawing. 405839608a8be2dbcb759626b629f98176e4125e0a2Brian Paul * \sa draw_arrays_instanced 406b11d89dc6d230f7f945f9eb420d39921c648ec20Keith Whitwell */ 407b11d89dc6d230f7f945f9eb420d39921c648ec20Keith Whitwellvoid 408b11d89dc6d230f7f945f9eb420d39921c648ec20Keith Whitwelldraw_arrays(struct draw_context *draw, unsigned prim, 409b11d89dc6d230f7f945f9eb420d39921c648ec20Keith Whitwell unsigned start, unsigned count) 410b11d89dc6d230f7f945f9eb420d39921c648ec20Keith Whitwell{ 4116481f40eec0a6c5dea4a74a11b83415478f2c814Michal Krol draw_arrays_instanced(draw, prim, start, count, 0, 1); 4126481f40eec0a6c5dea4a74a11b83415478f2c814Michal Krol} 4136481f40eec0a6c5dea4a74a11b83415478f2c814Michal Krol 414839608a8be2dbcb759626b629f98176e4125e0a2Brian Paul 415839608a8be2dbcb759626b629f98176e4125e0a2Brian Paul/** 4164f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu * Instanced drawing. 4174f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu * \sa draw_vbo 418839608a8be2dbcb759626b629f98176e4125e0a2Brian Paul */ 4196481f40eec0a6c5dea4a74a11b83415478f2c814Michal Krolvoid 4206481f40eec0a6c5dea4a74a11b83415478f2c814Michal Kroldraw_arrays_instanced(struct draw_context *draw, 4216481f40eec0a6c5dea4a74a11b83415478f2c814Michal Krol unsigned mode, 4226481f40eec0a6c5dea4a74a11b83415478f2c814Michal Krol unsigned start, 4236481f40eec0a6c5dea4a74a11b83415478f2c814Michal Krol unsigned count, 4246481f40eec0a6c5dea4a74a11b83415478f2c814Michal Krol unsigned startInstance, 4256481f40eec0a6c5dea4a74a11b83415478f2c814Michal Krol unsigned instanceCount) 4266481f40eec0a6c5dea4a74a11b83415478f2c814Michal Krol{ 4274f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu struct pipe_draw_info info; 4284f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu 4294f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu util_draw_init_info(&info); 4304f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu 4314f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu info.mode = mode; 4324f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu info.start = start; 4334f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu info.count = count; 4344f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu info.start_instance = startInstance; 4354f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu info.instance_count = instanceCount; 43638d1191f4133dc427fccdbaec61bef33201c2dccMarek Olšák info.min_index = start; 43738d1191f4133dc427fccdbaec61bef33201c2dccMarek Olšák info.max_index = start + count - 1; 4384f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu 4394f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu draw_vbo(draw, &info); 4404f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu} 4414f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu 4424f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu 4434f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu/** 4444f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu * Draw vertex arrays. 4454f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu * This is the main entrypoint into the drawing module. If drawing an indexed 4464f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu * primitive, the draw_set_index_buffer() and draw_set_mapped_index_buffer() 4474f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu * functions should have already been called to specify the element/index 4484f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu * buffer information. 4494f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu */ 4504f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wuvoid 4514f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wudraw_vbo(struct draw_context *draw, 4524f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu const struct pipe_draw_info *info) 4534f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu{ 4546481f40eec0a6c5dea4a74a11b83415478f2c814Michal Krol unsigned instance; 455438d7ac146dc89d1c2943610c662c57e11a47382Brian Paul unsigned index_limit; 4566481f40eec0a6c5dea4a74a11b83415478f2c814Michal Krol 4574f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu assert(info->instance_count > 0); 4584f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu if (info->indexed) 4594f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu assert(draw->pt.user.elts); 4604f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu 4614f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu draw->pt.user.eltBias = info->index_bias; 4624f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu draw->pt.user.min_index = info->min_index; 4634f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu draw->pt.user.max_index = info->max_index; 46438d1191f4133dc427fccdbaec61bef33201c2dccMarek Olšák draw->pt.user.eltSize = info->indexed ? draw->pt.user.eltSizeIB : 0; 465f94e7e25d101a8691a5276a5aa0eb97d2f4eebbcBrian Paul 4666c3e7365d5245cfad597cd69e2f8f689e62546b9Brian Paul if (0) 4674f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu debug_printf("draw_vbo(mode=%u start=%u count=%u):\n", 4684f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu info->mode, info->start, info->count); 469f94e7e25d101a8691a5276a5aa0eb97d2f4eebbcBrian Paul 470f94e7e25d101a8691a5276a5aa0eb97d2f4eebbcBrian Paul if (0) 47105a17f83b0a6549fde41540f9075505e81ab08d3Brian Paul tgsi_dump(draw->vs.vertex_shader->state.tokens, 0); 472f94e7e25d101a8691a5276a5aa0eb97d2f4eebbcBrian Paul 473f94e7e25d101a8691a5276a5aa0eb97d2f4eebbcBrian Paul if (0) { 474f94e7e25d101a8691a5276a5aa0eb97d2f4eebbcBrian Paul unsigned int i; 47505a17f83b0a6549fde41540f9075505e81ab08d3Brian Paul debug_printf("Elements:\n"); 47605a17f83b0a6549fde41540f9075505e81ab08d3Brian Paul for (i = 0; i < draw->pt.nr_vertex_elements; i++) { 47780e07c41907cc0ac43d68aeb3abf9de8435e70fdBrian Paul debug_printf(" %u: src_offset=%u inst_div=%u vbuf=%u format=%s\n", 47880e07c41907cc0ac43d68aeb3abf9de8435e70fdBrian Paul i, 47980e07c41907cc0ac43d68aeb3abf9de8435e70fdBrian Paul draw->pt.vertex_element[i].src_offset, 48080e07c41907cc0ac43d68aeb3abf9de8435e70fdBrian Paul draw->pt.vertex_element[i].instance_divisor, 48180e07c41907cc0ac43d68aeb3abf9de8435e70fdBrian Paul draw->pt.vertex_element[i].vertex_buffer_index, 482464a72dd4154f314e08c9d0c4d07417e2bf255f0Roland Scheidegger util_format_name(draw->pt.vertex_element[i].src_format)); 48305a17f83b0a6549fde41540f9075505e81ab08d3Brian Paul } 48405a17f83b0a6549fde41540f9075505e81ab08d3Brian Paul debug_printf("Buffers:\n"); 48505a17f83b0a6549fde41540f9075505e81ab08d3Brian Paul for (i = 0; i < draw->pt.nr_vertex_buffers; i++) { 486cdca3c58aa2d9549f5188910e2a77b438516714fMarek Olšák debug_printf(" %u: stride=%u offset=%u ptr=%p\n", 48780e07c41907cc0ac43d68aeb3abf9de8435e70fdBrian Paul i, 488872b515e8f0bb1be5bad85fd9d01529c71f07ba2Zack Rusin draw->pt.vertex_buffer[i].stride, 48905a17f83b0a6549fde41540f9075505e81ab08d3Brian Paul draw->pt.vertex_buffer[i].buffer_offset, 49005a17f83b0a6549fde41540f9075505e81ab08d3Brian Paul draw->pt.user.vbuffer[i]); 49105a17f83b0a6549fde41540f9075505e81ab08d3Brian Paul } 49205a17f83b0a6549fde41540f9075505e81ab08d3Brian Paul } 49305a17f83b0a6549fde41540f9075505e81ab08d3Brian Paul 494f94e7e25d101a8691a5276a5aa0eb97d2f4eebbcBrian Paul if (0) 4954f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu draw_print_arrays(draw, info->mode, info->start, MIN2(info->count, 20)); 496f94e7e25d101a8691a5276a5aa0eb97d2f4eebbcBrian Paul 497438d7ac146dc89d1c2943610c662c57e11a47382Brian Paul index_limit = util_draw_max_index(draw->pt.vertex_buffer, 498438d7ac146dc89d1c2943610c662c57e11a47382Brian Paul draw->pt.vertex_element, 499438d7ac146dc89d1c2943610c662c57e11a47382Brian Paul draw->pt.nr_vertex_elements, 500438d7ac146dc89d1c2943610c662c57e11a47382Brian Paul info); 501438d7ac146dc89d1c2943610c662c57e11a47382Brian Paul 502438d7ac146dc89d1c2943610c662c57e11a47382Brian Paul if (index_limit == 0) { 503438d7ac146dc89d1c2943610c662c57e11a47382Brian Paul /* one of the buffers is too small to do any valid drawing */ 504438d7ac146dc89d1c2943610c662c57e11a47382Brian Paul debug_warning("draw: VBO too small to draw anything\n"); 505438d7ac146dc89d1c2943610c662c57e11a47382Brian Paul return; 506438d7ac146dc89d1c2943610c662c57e11a47382Brian Paul } 507438d7ac146dc89d1c2943610c662c57e11a47382Brian Paul 508438d7ac146dc89d1c2943610c662c57e11a47382Brian Paul draw->pt.max_index = index_limit - 1; 509438d7ac146dc89d1c2943610c662c57e11a47382Brian Paul 5103733da31e8b4405b65e1b6ca3b6599ecc5af5fe7José Fonseca 5113733da31e8b4405b65e1b6ca3b6599ecc5af5fe7José Fonseca /* 5123733da31e8b4405b65e1b6ca3b6599ecc5af5fe7José Fonseca * TODO: We could use draw->pt.max_index to further narrow 5133733da31e8b4405b65e1b6ca3b6599ecc5af5fe7José Fonseca * the min_index/max_index hints given by the state tracker. 5143733da31e8b4405b65e1b6ca3b6599ecc5af5fe7José Fonseca */ 5153733da31e8b4405b65e1b6ca3b6599ecc5af5fe7José Fonseca 5164f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu for (instance = 0; instance < info->instance_count; instance++) { 5174f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu draw->instance_id = instance + info->start_instance; 5180eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul 5190eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul if (info->primitive_restart) { 5200eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul draw_pt_arrays_restart(draw, info); 5210eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul } 5220eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul else { 5230eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul draw_pt_arrays(draw, info->mode, info->start, info->count); 5240eaaceb218b2cfdb3fcfb420eca3220e74e53d4aBrian Paul } 5257ca0ce38340144794267609646048b3820d594abMichal Krol } 5267ca0ce38340144794267609646048b3820d594abMichal Krol} 527