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