draw_context.c revision b609cfc7c9c38f26e7e6d6f7dd5dd6d38f4ed209
19fbdf500788e78d63247a17226a75f7a079ae315Brian/**************************************************************************
29fbdf500788e78d63247a17226a75f7a079ae315Brian *
39fbdf500788e78d63247a17226a75f7a079ae315Brian * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
49fbdf500788e78d63247a17226a75f7a079ae315Brian * All Rights Reserved.
59fbdf500788e78d63247a17226a75f7a079ae315Brian *
69fbdf500788e78d63247a17226a75f7a079ae315Brian * Permission is hereby granted, free of charge, to any person obtaining a
79fbdf500788e78d63247a17226a75f7a079ae315Brian * copy of this software and associated documentation files (the
89fbdf500788e78d63247a17226a75f7a079ae315Brian * "Software"), to deal in the Software without restriction, including
99fbdf500788e78d63247a17226a75f7a079ae315Brian * without limitation the rights to use, copy, modify, merge, publish,
109fbdf500788e78d63247a17226a75f7a079ae315Brian * distribute, sub license, and/or sell copies of the Software, and to
119fbdf500788e78d63247a17226a75f7a079ae315Brian * permit persons to whom the Software is furnished to do so, subject to
129fbdf500788e78d63247a17226a75f7a079ae315Brian * the following conditions:
139fbdf500788e78d63247a17226a75f7a079ae315Brian *
149fbdf500788e78d63247a17226a75f7a079ae315Brian * The above copyright notice and this permission notice (including the
159fbdf500788e78d63247a17226a75f7a079ae315Brian * next paragraph) shall be included in all copies or substantial portions
169fbdf500788e78d63247a17226a75f7a079ae315Brian * of the Software.
179fbdf500788e78d63247a17226a75f7a079ae315Brian *
189fbdf500788e78d63247a17226a75f7a079ae315Brian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
199fbdf500788e78d63247a17226a75f7a079ae315Brian * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
209fbdf500788e78d63247a17226a75f7a079ae315Brian * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
219fbdf500788e78d63247a17226a75f7a079ae315Brian * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
229fbdf500788e78d63247a17226a75f7a079ae315Brian * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
239fbdf500788e78d63247a17226a75f7a079ae315Brian * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
249fbdf500788e78d63247a17226a75f7a079ae315Brian * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
259fbdf500788e78d63247a17226a75f7a079ae315Brian *
269fbdf500788e78d63247a17226a75f7a079ae315Brian **************************************************************************/
279fbdf500788e78d63247a17226a75f7a079ae315Brian
289fbdf500788e78d63247a17226a75f7a079ae315Brian /*
299fbdf500788e78d63247a17226a75f7a079ae315Brian  * Authors:
309fbdf500788e78d63247a17226a75f7a079ae315Brian  *   Keith Whitwell <keith@tungstengraphics.com>
319fbdf500788e78d63247a17226a75f7a079ae315Brian  */
329fbdf500788e78d63247a17226a75f7a079ae315Brian
339fbdf500788e78d63247a17226a75f7a079ae315Brian
344f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_memory.h"
354f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_math.h"
369fbdf500788e78d63247a17226a75f7a079ae315Brian#include "draw_context.h"
37280bcff1fa200b790d8712946a4ffbaa47a67433Keith Whitwell#include "draw_vs.h"
3889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin#include "draw_gs.h"
399fbdf500788e78d63247a17226a75f7a079ae315Brian
409d9e838974d1b9ab35235387bdfda5d99cb19d38Brian
419fbdf500788e78d63247a17226a75f7a079ae315Brianstruct draw_context *draw_create( void )
429fbdf500788e78d63247a17226a75f7a079ae315Brian{
439fbdf500788e78d63247a17226a75f7a079ae315Brian   struct draw_context *draw = CALLOC_STRUCT( draw_context );
44f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell   if (draw == NULL)
45f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell      goto fail;
469fbdf500788e78d63247a17226a75f7a079ae315Brian
47c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin   if (!draw_init(draw))
48c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin      goto fail;
49c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin
50c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin   return draw;
51c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin
52c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusinfail:
53c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin   draw_destroy( draw );
54c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin   return NULL;
55c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin}
56c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin
57c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusinboolean draw_init(struct draw_context *draw)
58c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin{
59b609cfc7c9c38f26e7e6d6f7dd5dd6d38f4ed209José Fonseca   /*
60b609cfc7c9c38f26e7e6d6f7dd5dd6d38f4ed209José Fonseca    * Note that several functions compute the clipmask of the predefined
61b609cfc7c9c38f26e7e6d6f7dd5dd6d38f4ed209José Fonseca    * formats with hardcoded formulas instead of using these. So modifications
62b609cfc7c9c38f26e7e6d6f7dd5dd6d38f4ed209José Fonseca    * here must be reflected there too.
63b609cfc7c9c38f26e7e6d6f7dd5dd6d38f4ed209José Fonseca    */
64b609cfc7c9c38f26e7e6d6f7dd5dd6d38f4ed209José Fonseca
659fbdf500788e78d63247a17226a75f7a079ae315Brian   ASSIGN_4V( draw->plane[0], -1,  0,  0, 1 );
669fbdf500788e78d63247a17226a75f7a079ae315Brian   ASSIGN_4V( draw->plane[1],  1,  0,  0, 1 );
679fbdf500788e78d63247a17226a75f7a079ae315Brian   ASSIGN_4V( draw->plane[2],  0, -1,  0, 1 );
689fbdf500788e78d63247a17226a75f7a079ae315Brian   ASSIGN_4V( draw->plane[3],  0,  1,  0, 1 );
699fbdf500788e78d63247a17226a75f7a079ae315Brian   ASSIGN_4V( draw->plane[4],  0,  0,  1, 1 ); /* yes these are correct */
709fbdf500788e78d63247a17226a75f7a079ae315Brian   ASSIGN_4V( draw->plane[5],  0,  0, -1, 1 ); /* mesa's a bit wonky */
719fbdf500788e78d63247a17226a75f7a079ae315Brian   draw->nr_planes = 6;
729fbdf500788e78d63247a17226a75f7a079ae315Brian
73f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian
741603a33fb276d7e78a2e872dfa05aa0093d1329aBrian   draw->reduced_prim = ~0; /* != any of PIPE_PRIM_x */
753fb88639af09af2f77203fd633c19ea736a7c0e5Brian
76a773f06e969a3992451dd7fe6fd55ea96b2774faKeith Whitwell
77507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   if (!draw_pipeline_init( draw ))
78c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin      return FALSE;
79a773f06e969a3992451dd7fe6fd55ea96b2774faKeith Whitwell
80f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell   if (!draw_pt_init( draw ))
81c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin      return FALSE;
82f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell
832f0d1396e4c1626b3b1ac799bd29e86a9530369eKeith Whitwell   if (!draw_vs_init( draw ))
84c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin      return FALSE;
852f0d1396e4c1626b3b1ac799bd29e86a9530369eKeith Whitwell
8689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin   if (!draw_gs_init( draw ))
87c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin      return FALSE;
8889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin
89c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin   return TRUE;
909fbdf500788e78d63247a17226a75f7a079ae315Brian}
919fbdf500788e78d63247a17226a75f7a079ae315Brian
929fbdf500788e78d63247a17226a75f7a079ae315Brian
939fbdf500788e78d63247a17226a75f7a079ae315Brianvoid draw_destroy( struct draw_context *draw )
949fbdf500788e78d63247a17226a75f7a079ae315Brian{
95f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell   if (!draw)
96f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell      return;
97f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell
98f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell
99a773f06e969a3992451dd7fe6fd55ea96b2774faKeith Whitwell
1005038c20795cb2e49d72c1f43a8b705056592356cKeith Whitwell   /* Not so fast -- we're just borrowing this at the moment.
1015038c20795cb2e49d72c1f43a8b705056592356cKeith Whitwell    *
102297b3be25a7f097fb9b1a79e332acddc12dcc3feKeith Whitwell   if (draw->render)
103297b3be25a7f097fb9b1a79e332acddc12dcc3feKeith Whitwell      draw->render->destroy( draw->render );
1045038c20795cb2e49d72c1f43a8b705056592356cKeith Whitwell   */
105297b3be25a7f097fb9b1a79e332acddc12dcc3feKeith Whitwell
106507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   draw_pipeline_destroy( draw );
107f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell   draw_pt_destroy( draw );
1082f0d1396e4c1626b3b1ac799bd29e86a9530369eKeith Whitwell   draw_vs_destroy( draw );
109a5c03bd6f16517bf35c273741080492d70d64c29Jakob Bornecrantz   draw_gs_destroy( draw );
110f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell
111ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol   FREE( draw );
1129fbdf500788e78d63247a17226a75f7a079ae315Brian}
1139fbdf500788e78d63247a17226a75f7a079ae315Brian
1149fbdf500788e78d63247a17226a75f7a079ae315Brian
11563a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian
11608589f71051e588b0bb7d0c8b529976c85398dd1Keith Whitwellvoid draw_flush( struct draw_context *draw )
11708589f71051e588b0bb7d0c8b529976c85398dd1Keith Whitwell{
1181603a33fb276d7e78a2e872dfa05aa0093d1329aBrian   draw_do_flush( draw, DRAW_FLUSH_BACKEND );
1199fbdf500788e78d63247a17226a75f7a079ae315Brian}
1209fbdf500788e78d63247a17226a75f7a079ae315Brian
1219fbdf500788e78d63247a17226a75f7a079ae315Brian
122d0bc5293d6e1e9c34fa822b7c2928932ed22462cBrian Paul/**
123d0bc5293d6e1e9c34fa822b7c2928932ed22462cBrian Paul * Specify the Minimum Resolvable Depth factor for polygon offset.
124d0bc5293d6e1e9c34fa822b7c2928932ed22462cBrian Paul * This factor potentially depends on the number of Z buffer bits,
125d0bc5293d6e1e9c34fa822b7c2928932ed22462cBrian Paul * the rasterization algorithm and the arithmetic performed on Z
126d0bc5293d6e1e9c34fa822b7c2928932ed22462cBrian Paul * values between vertex shading and rasterization.  It will vary
127d0bc5293d6e1e9c34fa822b7c2928932ed22462cBrian Paul * from one driver to another.
128d0bc5293d6e1e9c34fa822b7c2928932ed22462cBrian Paul */
129d0bc5293d6e1e9c34fa822b7c2928932ed22462cBrian Paulvoid draw_set_mrd(struct draw_context *draw, double mrd)
130d0bc5293d6e1e9c34fa822b7c2928932ed22462cBrian Paul{
131d0bc5293d6e1e9c34fa822b7c2928932ed22462cBrian Paul   draw->mrd = mrd;
132d0bc5293d6e1e9c34fa822b7c2928932ed22462cBrian Paul}
133d0bc5293d6e1e9c34fa822b7c2928932ed22462cBrian Paul
134d56a3adc30c19c8f00cb7dc585e86babfd3a79a7Brian
1359fbdf500788e78d63247a17226a75f7a079ae315Brian/**
136de69fc1703f79e5c97e66b654de7a93b7abce8f0Zack Rusin * Register new primitive rasterization/rendering state.
1379fbdf500788e78d63247a17226a75f7a079ae315Brian * This causes the drawing pipeline to be rebuilt.
1389fbdf500788e78d63247a17226a75f7a079ae315Brian */
139de69fc1703f79e5c97e66b654de7a93b7abce8f0Zack Rusinvoid draw_set_rasterizer_state( struct draw_context *draw,
140de69fc1703f79e5c97e66b654de7a93b7abce8f0Zack Rusin                                const struct pipe_rasterizer_state *raster )
1419fbdf500788e78d63247a17226a75f7a079ae315Brian{
1421603a33fb276d7e78a2e872dfa05aa0093d1329aBrian   draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
1431603a33fb276d7e78a2e872dfa05aa0093d1329aBrian
144294401814d1d89cc731de1c22c25333aa5d59374Zack Rusin   draw->rasterizer = raster;
14563cb6f59eac91ba34cf80ff3736568e40b094fe1Michal Krol   draw->bypass_clipping = draw->driver.bypass_clipping;
1460588858702d1a5c9c08573ea6817e2e149473cf6Keith Whitwell}
1470588858702d1a5c9c08573ea6817e2e149473cf6Keith Whitwell
1480588858702d1a5c9c08573ea6817e2e149473cf6Keith Whitwell
1490588858702d1a5c9c08573ea6817e2e149473cf6Keith Whitwellvoid draw_set_driver_clipping( struct draw_context *draw,
1500588858702d1a5c9c08573ea6817e2e149473cf6Keith Whitwell                               boolean bypass_clipping )
1510588858702d1a5c9c08573ea6817e2e149473cf6Keith Whitwell{
1520588858702d1a5c9c08573ea6817e2e149473cf6Keith Whitwell   draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
1530588858702d1a5c9c08573ea6817e2e149473cf6Keith Whitwell
1540588858702d1a5c9c08573ea6817e2e149473cf6Keith Whitwell   draw->driver.bypass_clipping = bypass_clipping;
15563cb6f59eac91ba34cf80ff3736568e40b094fe1Michal Krol   draw->bypass_clipping = draw->driver.bypass_clipping;
1569fbdf500788e78d63247a17226a75f7a079ae315Brian}
1579fbdf500788e78d63247a17226a75f7a079ae315Brian
1589fbdf500788e78d63247a17226a75f7a079ae315Brian
1599fbdf500788e78d63247a17226a75f7a079ae315Brian/**
160193c85ec7a1aec44eebc67c6224fb6ecbb4607a5Brian * Plug in the primitive rendering/rasterization stage (which is the last
161193c85ec7a1aec44eebc67c6224fb6ecbb4607a5Brian * stage in the drawing pipeline).
1629fbdf500788e78d63247a17226a75f7a079ae315Brian * This is provided by the device driver.
1639fbdf500788e78d63247a17226a75f7a079ae315Brian */
164de69fc1703f79e5c97e66b654de7a93b7abce8f0Zack Rusinvoid draw_set_rasterize_stage( struct draw_context *draw,
165de69fc1703f79e5c97e66b654de7a93b7abce8f0Zack Rusin                               struct draw_stage *stage )
1669fbdf500788e78d63247a17226a75f7a079ae315Brian{
1671603a33fb276d7e78a2e872dfa05aa0093d1329aBrian   draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
1681603a33fb276d7e78a2e872dfa05aa0093d1329aBrian
169de69fc1703f79e5c97e66b654de7a93b7abce8f0Zack Rusin   draw->pipeline.rasterize = stage;
1709fbdf500788e78d63247a17226a75f7a079ae315Brian}
1719fbdf500788e78d63247a17226a75f7a079ae315Brian
1729fbdf500788e78d63247a17226a75f7a079ae315Brian
1739fbdf500788e78d63247a17226a75f7a079ae315Brian/**
1749fbdf500788e78d63247a17226a75f7a079ae315Brian * Set the draw module's clipping state.
1759fbdf500788e78d63247a17226a75f7a079ae315Brian */
1769fbdf500788e78d63247a17226a75f7a079ae315Brianvoid draw_set_clip_state( struct draw_context *draw,
1779fbdf500788e78d63247a17226a75f7a079ae315Brian                          const struct pipe_clip_state *clip )
1789fbdf500788e78d63247a17226a75f7a079ae315Brian{
1791603a33fb276d7e78a2e872dfa05aa0093d1329aBrian   draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
18008589f71051e588b0bb7d0c8b529976c85398dd1Keith Whitwell
181f9a77a3080598d03c484fa5d04c213b8a06d43d3Brian   assert(clip->nr <= PIPE_MAX_CLIP_PLANES);
1829fbdf500788e78d63247a17226a75f7a079ae315Brian   memcpy(&draw->plane[6], clip->ucp, clip->nr * sizeof(clip->ucp[0]));
1839fbdf500788e78d63247a17226a75f7a079ae315Brian   draw->nr_planes = 6 + clip->nr;
1849fbdf500788e78d63247a17226a75f7a079ae315Brian}
1859fbdf500788e78d63247a17226a75f7a079ae315Brian
1869fbdf500788e78d63247a17226a75f7a079ae315Brian
1879fbdf500788e78d63247a17226a75f7a079ae315Brian/**
1889fbdf500788e78d63247a17226a75f7a079ae315Brian * Set the draw module's viewport state.
1899fbdf500788e78d63247a17226a75f7a079ae315Brian */
1909fbdf500788e78d63247a17226a75f7a079ae315Brianvoid draw_set_viewport_state( struct draw_context *draw,
1919fbdf500788e78d63247a17226a75f7a079ae315Brian                              const struct pipe_viewport_state *viewport )
1929fbdf500788e78d63247a17226a75f7a079ae315Brian{
1931603a33fb276d7e78a2e872dfa05aa0093d1329aBrian   draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
1949fbdf500788e78d63247a17226a75f7a079ae315Brian   draw->viewport = *viewport; /* struct copy */
195594dab4769533afaeb30a588e1731a6753a93f0dBrian   draw->identity_viewport = (viewport->scale[0] == 1.0f &&
196594dab4769533afaeb30a588e1731a6753a93f0dBrian                              viewport->scale[1] == 1.0f &&
197594dab4769533afaeb30a588e1731a6753a93f0dBrian                              viewport->scale[2] == 1.0f &&
198594dab4769533afaeb30a588e1731a6753a93f0dBrian                              viewport->scale[3] == 1.0f &&
199594dab4769533afaeb30a588e1731a6753a93f0dBrian                              viewport->translate[0] == 0.0f &&
200594dab4769533afaeb30a588e1731a6753a93f0dBrian                              viewport->translate[1] == 0.0f &&
201594dab4769533afaeb30a588e1731a6753a93f0dBrian                              viewport->translate[2] == 0.0f &&
202594dab4769533afaeb30a588e1731a6753a93f0dBrian                              viewport->translate[3] == 0.0f);
20362628c4d3d497cbca73fde869c9069fa90e6453eKeith Whitwell
20462628c4d3d497cbca73fde869c9069fa90e6453eKeith Whitwell   draw_vs_set_viewport( draw, viewport );
2059fbdf500788e78d63247a17226a75f7a079ae315Brian}
2060a262998ef2813d19e9fee01d3e5808416e9cb04Brian
2070a262998ef2813d19e9fee01d3e5808416e9cb04Brian
20863a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian
20963a51aee86f76ae54fb1ce572d584fb0f01aaec5Brianvoid
210a52c0416d1f2105960b4646e2e268aed26814689Brian Pauldraw_set_vertex_buffers(struct draw_context *draw,
211a52c0416d1f2105960b4646e2e268aed26814689Brian Paul                        unsigned count,
212a52c0416d1f2105960b4646e2e268aed26814689Brian Paul                        const struct pipe_vertex_buffer *buffers)
2130a262998ef2813d19e9fee01d3e5808416e9cb04Brian{
214a52c0416d1f2105960b4646e2e268aed26814689Brian Paul   assert(count <= PIPE_MAX_ATTRIBS);
215a52c0416d1f2105960b4646e2e268aed26814689Brian Paul
2167d72607e142c0412b88183b849fd701e698b8f79Keith Whitwell   memcpy(draw->pt.vertex_buffer, buffers, count * sizeof(buffers[0]));
2177d72607e142c0412b88183b849fd701e698b8f79Keith Whitwell   draw->pt.nr_vertex_buffers = count;
2180a262998ef2813d19e9fee01d3e5808416e9cb04Brian}
2190a262998ef2813d19e9fee01d3e5808416e9cb04Brian
2200a262998ef2813d19e9fee01d3e5808416e9cb04Brian
2210a262998ef2813d19e9fee01d3e5808416e9cb04Brianvoid
222a52c0416d1f2105960b4646e2e268aed26814689Brian Pauldraw_set_vertex_elements(struct draw_context *draw,
223a52c0416d1f2105960b4646e2e268aed26814689Brian Paul                         unsigned count,
224a52c0416d1f2105960b4646e2e268aed26814689Brian Paul                         const struct pipe_vertex_element *elements)
2250a262998ef2813d19e9fee01d3e5808416e9cb04Brian{
226a52c0416d1f2105960b4646e2e268aed26814689Brian Paul   assert(count <= PIPE_MAX_ATTRIBS);
227a52c0416d1f2105960b4646e2e268aed26814689Brian Paul
2287d72607e142c0412b88183b849fd701e698b8f79Keith Whitwell   memcpy(draw->pt.vertex_element, elements, count * sizeof(elements[0]));
2297d72607e142c0412b88183b849fd701e698b8f79Keith Whitwell   draw->pt.nr_vertex_elements = count;
2300a262998ef2813d19e9fee01d3e5808416e9cb04Brian}
2310a262998ef2813d19e9fee01d3e5808416e9cb04Brian
2320a262998ef2813d19e9fee01d3e5808416e9cb04Brian
23363a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian/**
23463a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian * Tell drawing context where to find mapped vertex buffers.
23563a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian */
2360a262998ef2813d19e9fee01d3e5808416e9cb04Brianvoid
23763a51aee86f76ae54fb1ce572d584fb0f01aaec5Briandraw_set_mapped_vertex_buffer(struct draw_context *draw,
23863a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian                              unsigned attr, const void *buffer)
2390a262998ef2813d19e9fee01d3e5808416e9cb04Brian{
2407d72607e142c0412b88183b849fd701e698b8f79Keith Whitwell   draw->pt.user.vbuffer[attr] = buffer;
24163a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian}
24263a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian
24363a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian
24463a51aee86f76ae54fb1ce572d584fb0f01aaec5Brianvoid
24563a51aee86f76ae54fb1ce572d584fb0f01aaec5Briandraw_set_mapped_constant_buffer(struct draw_context *draw,
24689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin                                unsigned shader_type,
2479851644435f991a1a1bbb145333a97601627b37dMichal Krol                                unsigned slot,
24889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin                                const void *buffer,
249bb2e13b9e82b68ec3b9fc56a4c35e7ead8fd138fKeith Whitwell                                unsigned size )
25063a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian{
25189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin   debug_assert(shader_type == PIPE_SHADER_VERTEX ||
25289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin                shader_type == PIPE_SHADER_GEOMETRY);
2537c5f255201f42303188137f56ea8acc030444f0eMichal Krol   debug_assert(slot < PIPE_MAX_CONSTANT_BUFFERS);
2549851644435f991a1a1bbb145333a97601627b37dMichal Krol
25589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin   if (shader_type == PIPE_SHADER_VERTEX) {
2569851644435f991a1a1bbb145333a97601627b37dMichal Krol      draw->pt.user.vs_constants[slot] = buffer;
2579851644435f991a1a1bbb145333a97601627b37dMichal Krol      draw_vs_set_constants(draw, slot, buffer, size);
25889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin   } else if (shader_type == PIPE_SHADER_GEOMETRY) {
2599851644435f991a1a1bbb145333a97601627b37dMichal Krol      draw->pt.user.gs_constants[slot] = buffer;
2609851644435f991a1a1bbb145333a97601627b37dMichal Krol      draw_gs_set_constants(draw, slot, buffer, size);
26189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin   }
2620a262998ef2813d19e9fee01d3e5808416e9cb04Brian}
26363a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian
26463a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian
265f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian/**
2665e29aab1752c3e07ae2ebde4cb00e6550dab0eb2Brian * Tells the draw module to draw points with triangles if their size
2675e29aab1752c3e07ae2ebde4cb00e6550dab0eb2Brian * is greater than this threshold.
268f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian */
269f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrianvoid
2705e29aab1752c3e07ae2ebde4cb00e6550dab0eb2Briandraw_wide_point_threshold(struct draw_context *draw, float threshold)
271f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian{
2721603a33fb276d7e78a2e872dfa05aa0093d1329aBrian   draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
273507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   draw->pipeline.wide_point_threshold = threshold;
274f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian}
275f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian
276f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian
277f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian/**
278a1a13954885cd469faab49633b5386e5c889e3dfBrian Paul * Tells the draw module to draw lines with triangles if their width
279a1a13954885cd469faab49633b5386e5c889e3dfBrian Paul * is greater than this threshold.
280f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian */
281f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrianvoid
282a1a13954885cd469faab49633b5386e5c889e3dfBrian Pauldraw_wide_line_threshold(struct draw_context *draw, float threshold)
283f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian{
2841603a33fb276d7e78a2e872dfa05aa0093d1329aBrian   draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
285507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   draw->pipeline.wide_line_threshold = threshold;
286f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian}
28708589f71051e588b0bb7d0c8b529976c85398dd1Keith Whitwell
28808589f71051e588b0bb7d0c8b529976c85398dd1Keith Whitwell
28908589f71051e588b0bb7d0c8b529976c85398dd1Keith Whitwell/**
2908b8c9acdb747499149e633179a8ad10b0e4206b1Brian * Tells the draw module whether or not to implement line stipple.
2918b8c9acdb747499149e633179a8ad10b0e4206b1Brian */
2928b8c9acdb747499149e633179a8ad10b0e4206b1Brianvoid
2938b8c9acdb747499149e633179a8ad10b0e4206b1Briandraw_enable_line_stipple(struct draw_context *draw, boolean enable)
2948b8c9acdb747499149e633179a8ad10b0e4206b1Brian{
2958b8c9acdb747499149e633179a8ad10b0e4206b1Brian   draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
296507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   draw->pipeline.line_stipple = enable;
2978b8c9acdb747499149e633179a8ad10b0e4206b1Brian}
2988b8c9acdb747499149e633179a8ad10b0e4206b1Brian
2998b8c9acdb747499149e633179a8ad10b0e4206b1Brian
3008b8c9acdb747499149e633179a8ad10b0e4206b1Brian/**
3015a09ad8248ce452136ed96a3d46532b03c877618Brian * Tells draw module whether to convert points to quads for sprite mode.
3025a09ad8248ce452136ed96a3d46532b03c877618Brian */
3035a09ad8248ce452136ed96a3d46532b03c877618Brianvoid
3045a09ad8248ce452136ed96a3d46532b03c877618Briandraw_enable_point_sprites(struct draw_context *draw, boolean enable)
3055a09ad8248ce452136ed96a3d46532b03c877618Brian{
3065a09ad8248ce452136ed96a3d46532b03c877618Brian   draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
307507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   draw->pipeline.point_sprite = enable;
3085a09ad8248ce452136ed96a3d46532b03c877618Brian}
3095a09ad8248ce452136ed96a3d46532b03c877618Brian
3105a09ad8248ce452136ed96a3d46532b03c877618Brian
311c48da7d78b4e7bdbe056b3c9668756d49019be06Keith Whitwellvoid
312c48da7d78b4e7bdbe056b3c9668756d49019be06Keith Whitwelldraw_set_force_passthrough( struct draw_context *draw, boolean enable )
313c48da7d78b4e7bdbe056b3c9668756d49019be06Keith Whitwell{
314c48da7d78b4e7bdbe056b3c9668756d49019be06Keith Whitwell   draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
315c48da7d78b4e7bdbe056b3c9668756d49019be06Keith Whitwell   draw->force_passthrough = enable;
316c48da7d78b4e7bdbe056b3c9668756d49019be06Keith Whitwell}
317c48da7d78b4e7bdbe056b3c9668756d49019be06Keith Whitwell
318c48da7d78b4e7bdbe056b3c9668756d49019be06Keith Whitwell
3195a09ad8248ce452136ed96a3d46532b03c877618Brian/**
320d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian * Ask the draw module for the location/slot of the given vertex attribute in
321d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian * a post-transformed vertex.
322d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian *
323d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian * With this function, drivers that use the draw module should have no reason
32489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin * to track the current vertex/geometry shader.
325d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian *
326d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian * Note that the draw module may sometimes generate vertices with extra
327d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian * attributes (such as texcoords for AA lines).  The driver can call this
328d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian * function to find those attributes.
329d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian *
330d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian * Zero is returned if the attribute is not found since this is
331d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian * a don't care / undefined situtation.  Returning -1 would be a bit more
332d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian * work for the drivers.
333aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian */
334aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brianint
33589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusindraw_find_shader_output(const struct draw_context *draw,
33689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin                        uint semantic_name, uint semantic_index)
337aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian{
3382f0d1396e4c1626b3b1ac799bd29e86a9530369eKeith Whitwell   const struct draw_vertex_shader *vs = draw->vs.vertex_shader;
33989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin   const struct draw_geometry_shader *gs = draw->gs.geometry_shader;
340d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian   uint i;
34189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin   const struct tgsi_shader_info *info = &vs->info;
34289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin
34389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin   if (gs)
34489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin      info = &gs->info;
34589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin
34689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin   for (i = 0; i < info->num_outputs; i++) {
34789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin      if (info->output_semantic_name[i] == semantic_name &&
34889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin          info->output_semantic_index[i] == semantic_index)
349d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian         return i;
350d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian   }
351d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian
352aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian   /* XXX there may be more than one extra vertex attrib.
353aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian    * For example, simulated gl_FragCoord and gl_PointCoord.
354aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian    */
35589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin   if (draw->extra_shader_outputs.semantic_name == semantic_name &&
35689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin       draw->extra_shader_outputs.semantic_index == semantic_index) {
35789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin      return draw->extra_shader_outputs.slot;
358aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian   }
35989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin
360aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian   return 0;
361aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian}
362aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian
363aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian
364aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian/**
365c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul * Return total number of the shader outputs.  This function is similar to
366c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul * draw_current_shader_outputs() but this function also counts any extra
367c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul * vertex/geometry output attributes that may be filled in by some draw
368c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul * stages (such as AA point, AA line).
36989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin *
37089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin * If geometry shader is present, its output will be returned,
37189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin * if not vertex shader is used.
3721774b177b858f9f87d00e54b0bf00e9634e375e9Brian */
3731774b177b858f9f87d00e54b0bf00e9634e375e9Brianuint
37489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusindraw_num_shader_outputs(const struct draw_context *draw)
3751774b177b858f9f87d00e54b0bf00e9634e375e9Brian{
3762f0d1396e4c1626b3b1ac799bd29e86a9530369eKeith Whitwell   uint count = draw->vs.vertex_shader->info.num_outputs;
37789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin
378c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul   /* If a geometry shader is present, its outputs go to the
379c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul    * driver, else the vertex shader's outputs.
380c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul    */
38189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin   if (draw->gs.geometry_shader)
38289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin      count = draw->gs.geometry_shader->info.num_outputs;
38389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin
38489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin   if (draw->extra_shader_outputs.slot > 0)
3851774b177b858f9f87d00e54b0bf00e9634e375e9Brian      count++;
3861774b177b858f9f87d00e54b0bf00e9634e375e9Brian   return count;
3871774b177b858f9f87d00e54b0bf00e9634e375e9Brian}
3881774b177b858f9f87d00e54b0bf00e9634e375e9Brian
3891774b177b858f9f87d00e54b0bf00e9634e375e9Brian
390f2bccfd3c806a879abf0c40858806ec3825d0628Brian/**
391c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul * Provide TGSI sampler objects for vertex/geometry shaders that use
392c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul * texture fetches.
393f2bccfd3c806a879abf0c40858806ec3825d0628Brian * This might only be used by software drivers for the time being.
394f2bccfd3c806a879abf0c40858806ec3825d0628Brian */
395f2bccfd3c806a879abf0c40858806ec3825d0628Brianvoid
396f2bccfd3c806a879abf0c40858806ec3825d0628Briandraw_texture_samplers(struct draw_context *draw,
397f2bccfd3c806a879abf0c40858806ec3825d0628Brian                      uint num_samplers,
398f2bccfd3c806a879abf0c40858806ec3825d0628Brian                      struct tgsi_sampler **samplers)
399f2bccfd3c806a879abf0c40858806ec3825d0628Brian{
400f2bccfd3c806a879abf0c40858806ec3825d0628Brian   draw->vs.num_samplers = num_samplers;
401f2bccfd3c806a879abf0c40858806ec3825d0628Brian   draw->vs.samplers = samplers;
40289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin   draw->gs.num_samplers = num_samplers;
40389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin   draw->gs.samplers = samplers;
404f2bccfd3c806a879abf0c40858806ec3825d0628Brian}
405f2bccfd3c806a879abf0c40858806ec3825d0628Brian
406f2bccfd3c806a879abf0c40858806ec3825d0628Brian
407f2bccfd3c806a879abf0c40858806ec3825d0628Brian
4083e22180fc893bb09bf6b990bc4e858fd85f522abJosé Fonseca
409297b3be25a7f097fb9b1a79e332acddc12dcc3feKeith Whitwellvoid draw_set_render( struct draw_context *draw,
410297b3be25a7f097fb9b1a79e332acddc12dcc3feKeith Whitwell		      struct vbuf_render *render )
411297b3be25a7f097fb9b1a79e332acddc12dcc3feKeith Whitwell{
412297b3be25a7f097fb9b1a79e332acddc12dcc3feKeith Whitwell   draw->render = render;
413297b3be25a7f097fb9b1a79e332acddc12dcc3feKeith Whitwell}
41484501e68f6294370d6f2f6aec4e7eab57bcc0e72Keith Whitwell
415280bcff1fa200b790d8712946a4ffbaa47a67433Keith Whitwell
41666891826421d5b774e081f7a2a85580cd0523fabKeith Whitwell
41766891826421d5b774e081f7a2a85580cd0523fabKeith Whitwell/**
41866891826421d5b774e081f7a2a85580cd0523fabKeith Whitwell * Tell the drawing context about the index/element buffer to use
41966891826421d5b774e081f7a2a85580cd0523fabKeith Whitwell * (ala glDrawElements)
42066891826421d5b774e081f7a2a85580cd0523fabKeith Whitwell * If no element buffer is to be used (i.e. glDrawArrays) then this
42166891826421d5b774e081f7a2a85580cd0523fabKeith Whitwell * should be called with eltSize=0 and elements=NULL.
42266891826421d5b774e081f7a2a85580cd0523fabKeith Whitwell *
42366891826421d5b774e081f7a2a85580cd0523fabKeith Whitwell * \param draw  the drawing context
42466891826421d5b774e081f7a2a85580cd0523fabKeith Whitwell * \param eltSize  size of each element (1, 2 or 4 bytes)
42566891826421d5b774e081f7a2a85580cd0523fabKeith Whitwell * \param elements  the element buffer ptr
42666891826421d5b774e081f7a2a85580cd0523fabKeith Whitwell */
42766891826421d5b774e081f7a2a85580cd0523fabKeith Whitwellvoid
42882605d7bcd533d7c96cc619c45970efd7229dc3bKeith Whitwelldraw_set_mapped_element_buffer_range( struct draw_context *draw,
42982605d7bcd533d7c96cc619c45970efd7229dc3bKeith Whitwell                                      unsigned eltSize,
43082605d7bcd533d7c96cc619c45970efd7229dc3bKeith Whitwell                                      unsigned min_index,
43182605d7bcd533d7c96cc619c45970efd7229dc3bKeith Whitwell                                      unsigned max_index,
4327519107a9787970f9b3b8ec317a2b4526e217290Keith Whitwell                                      const void *elements )
43366891826421d5b774e081f7a2a85580cd0523fabKeith Whitwell{
4347d72607e142c0412b88183b849fd701e698b8f79Keith Whitwell   draw->pt.user.elts = elements;
4357d72607e142c0412b88183b849fd701e698b8f79Keith Whitwell   draw->pt.user.eltSize = eltSize;
43682605d7bcd533d7c96cc619c45970efd7229dc3bKeith Whitwell   draw->pt.user.min_index = min_index;
43782605d7bcd533d7c96cc619c45970efd7229dc3bKeith Whitwell   draw->pt.user.max_index = max_index;
43866891826421d5b774e081f7a2a85580cd0523fabKeith Whitwell}
439507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
440507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
44182605d7bcd533d7c96cc619c45970efd7229dc3bKeith Whitwellvoid
44282605d7bcd533d7c96cc619c45970efd7229dc3bKeith Whitwelldraw_set_mapped_element_buffer( struct draw_context *draw,
44382605d7bcd533d7c96cc619c45970efd7229dc3bKeith Whitwell                                unsigned eltSize,
4447519107a9787970f9b3b8ec317a2b4526e217290Keith Whitwell                                const void *elements )
44582605d7bcd533d7c96cc619c45970efd7229dc3bKeith Whitwell{
44682605d7bcd533d7c96cc619c45970efd7229dc3bKeith Whitwell   draw->pt.user.elts = elements;
44782605d7bcd533d7c96cc619c45970efd7229dc3bKeith Whitwell   draw->pt.user.eltSize = eltSize;
44882605d7bcd533d7c96cc619c45970efd7229dc3bKeith Whitwell   draw->pt.user.min_index = 0;
44982605d7bcd533d7c96cc619c45970efd7229dc3bKeith Whitwell   draw->pt.user.max_index = 0xffffffff;
45082605d7bcd533d7c96cc619c45970efd7229dc3bKeith Whitwell}
45182605d7bcd533d7c96cc619c45970efd7229dc3bKeith Whitwell
452507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
453507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell/* Revamp me please:
454507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell */
455507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwellvoid draw_do_flush( struct draw_context *draw, unsigned flags )
456507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell{
45714d1ca8d867d6e44c756cb759f92421107118b2eBrian Paul   if (!draw->suspend_flushing)
458507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   {
45914d1ca8d867d6e44c756cb759f92421107118b2eBrian Paul      assert(!draw->flushing); /* catch inadvertant recursion */
46014d1ca8d867d6e44c756cb759f92421107118b2eBrian Paul
461507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell      draw->flushing = TRUE;
462507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
463e7bac4276634ea1ee81ac71f6f6869f87e689872Keith Whitwell      draw_pipeline_flush( draw, flags );
464e7bac4276634ea1ee81ac71f6f6869f87e689872Keith Whitwell
465e7bac4276634ea1ee81ac71f6f6869f87e689872Keith Whitwell      draw->reduced_prim = ~0; /* is reduced_prim needed any more? */
466507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
467507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell      draw->flushing = FALSE;
468507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   }
469507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell}
47089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin
47189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin
472c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul/**
473c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul * Return the number of output attributes produced by the geometry
474c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul * shader, if present.  If no geometry shader, return the number of
475c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul * outputs from the vertex shader.
476c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul * \sa draw_num_shader_outputs
477c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul */
478256f7f5ab2123bae9549e4f572276e200dc1ae76Brian Pauluint
479256f7f5ab2123bae9549e4f572276e200dc1ae76Brian Pauldraw_current_shader_outputs(const struct draw_context *draw)
48089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin{
48189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin   if (draw->gs.geometry_shader)
48289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin      return draw->gs.num_gs_outputs;
48389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin   return draw->vs.num_vs_outputs;
48489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin}
48589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin
486c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul
487c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul/**
488c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul * Return the index of the shader output which will contain the
489c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul * vertex position.
490c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul */
491256f7f5ab2123bae9549e4f572276e200dc1ae76Brian Pauluint
492256f7f5ab2123bae9549e4f572276e200dc1ae76Brian Pauldraw_current_shader_position_output(const struct draw_context *draw)
49389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin{
49489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin   if (draw->gs.geometry_shader)
49589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin      return draw->gs.position_output;
49689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin   return draw->vs.position_output;
49789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin}
498