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