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
34e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul#include "pipe/p_context.h"
354f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_memory.h"
364f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_math.h"
37f201217c1d87919572a3b1cf7de94f580f20e5f0Luca Barbieri#include "util/u_cpu_detect.h"
383c9aa3a7b12cfe178c14fea93cfb64a32db0b8adMarek Olšák#include "util/u_inlines.h"
399fbdf500788e78d63247a17226a75f7a079ae315Brian#include "draw_context.h"
40280bcff1fa200b790d8712946a4ffbaa47a67433Keith Whitwell#include "draw_vs.h"
4189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin#include "draw_gs.h"
429fbdf500788e78d63247a17226a75f7a079ae315Brian
437c4208c3a0f48955720f41b3cb320a120c505ba6Zack Rusin#if HAVE_LLVM
447c4208c3a0f48955720f41b3cb320a120c505ba6Zack Rusin#include "gallivm/lp_bld_init.h"
456dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca#include "gallivm/lp_bld_limits.h"
4601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin#include "draw_llvm.h"
47f201217c1d87919572a3b1cf7de94f580f20e5f0Luca Barbieri
48f201217c1d87919572a3b1cf7de94f580f20e5f0Luca Barbieristatic boolean
49f201217c1d87919572a3b1cf7de94f580f20e5f0Luca Barbieridraw_get_option_use_llvm(void)
50f201217c1d87919572a3b1cf7de94f580f20e5f0Luca Barbieri{
51f201217c1d87919572a3b1cf7de94f580f20e5f0Luca Barbieri   static boolean first = TRUE;
52f201217c1d87919572a3b1cf7de94f580f20e5f0Luca Barbieri   static boolean value;
53f201217c1d87919572a3b1cf7de94f580f20e5f0Luca Barbieri   if (first) {
54f201217c1d87919572a3b1cf7de94f580f20e5f0Luca Barbieri      first = FALSE;
55f201217c1d87919572a3b1cf7de94f580f20e5f0Luca Barbieri      value = debug_get_bool_option("DRAW_USE_LLVM", TRUE);
56f201217c1d87919572a3b1cf7de94f580f20e5f0Luca Barbieri
57f201217c1d87919572a3b1cf7de94f580f20e5f0Luca Barbieri#ifdef PIPE_ARCH_X86
58f201217c1d87919572a3b1cf7de94f580f20e5f0Luca Barbieri      util_cpu_detect();
59f201217c1d87919572a3b1cf7de94f580f20e5f0Luca Barbieri      /* require SSE2 due to LLVM PR6960. */
60f201217c1d87919572a3b1cf7de94f580f20e5f0Luca Barbieri      if (!util_cpu_caps.has_sse2)
61f201217c1d87919572a3b1cf7de94f580f20e5f0Luca Barbieri         value = FALSE;
62f201217c1d87919572a3b1cf7de94f580f20e5f0Luca Barbieri#endif
63f201217c1d87919572a3b1cf7de94f580f20e5f0Luca Barbieri   }
64f201217c1d87919572a3b1cf7de94f580f20e5f0Luca Barbieri   return value;
65f201217c1d87919572a3b1cf7de94f580f20e5f0Luca Barbieri}
667c4208c3a0f48955720f41b3cb320a120c505ba6Zack Rusin#endif
679d9e838974d1b9ab35235387bdfda5d99cb19d38Brian
68efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul
69efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul/**
70efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul * Create new draw module context with gallivm state for LLVM JIT.
71efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul */
723e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantzstatic struct draw_context *
733469715a8a171512cf9b528702e70393f01c6041José Fonsecadraw_create_context(struct pipe_context *pipe, boolean try_llvm)
749fbdf500788e78d63247a17226a75f7a079ae315Brian{
759fbdf500788e78d63247a17226a75f7a079ae315Brian   struct draw_context *draw = CALLOC_STRUCT( draw_context );
76f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell   if (draw == NULL)
77f4863f3923152448e27ea68d0cd04411bbe3f4c7Jakob Bornecrantz      goto err_out;
789fbdf500788e78d63247a17226a75f7a079ae315Brian
797c4208c3a0f48955720f41b3cb320a120c505ba6Zack Rusin#if HAVE_LLVM
803e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantz   if (try_llvm && draw_get_option_use_llvm()) {
813469715a8a171512cf9b528702e70393f01c6041José Fonseca      draw->llvm = draw_llvm_create(draw);
82f4863f3923152448e27ea68d0cd04411bbe3f4c7Jakob Bornecrantz      if (!draw->llvm)
83f4863f3923152448e27ea68d0cd04411bbe3f4c7Jakob Bornecrantz         goto err_destroy;
84f201217c1d87919572a3b1cf7de94f580f20e5f0Luca Barbieri   }
857c4208c3a0f48955720f41b3cb320a120c505ba6Zack Rusin#endif
867c4208c3a0f48955720f41b3cb320a120c505ba6Zack Rusin
878b4f7b0672d663273310fffa9490ad996f5b914aChristoph Bumiller   draw->pipe = pipe;
888b4f7b0672d663273310fffa9490ad996f5b914aChristoph Bumiller
89c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin   if (!draw_init(draw))
90f4863f3923152448e27ea68d0cd04411bbe3f4c7Jakob Bornecrantz      goto err_destroy;
91c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin
92c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin   return draw;
93c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin
94f4863f3923152448e27ea68d0cd04411bbe3f4c7Jakob Bornecrantzerr_destroy:
95c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin   draw_destroy( draw );
96f4863f3923152448e27ea68d0cd04411bbe3f4c7Jakob Bornecrantzerr_out:
97c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin   return NULL;
98c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin}
99c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin
100efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul
1013e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantz/**
1023e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantz * Create new draw module context, with LLVM JIT.
1033e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantz */
1043e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantzstruct draw_context *
1053e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantzdraw_create(struct pipe_context *pipe)
1063e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantz{
1073469715a8a171512cf9b528702e70393f01c6041José Fonseca   return draw_create_context(pipe, TRUE);
1083e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantz}
1093e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantz
1103e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantz
1113e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantz/**
1123e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantz * Create a new draw context, without LLVM JIT.
1133e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantz */
1143e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantzstruct draw_context *
1153e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantzdraw_create_no_llvm(struct pipe_context *pipe)
1163e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantz{
1173469715a8a171512cf9b528702e70393f01c6041José Fonseca   return draw_create_context(pipe, FALSE);
1183e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantz}
1193e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantz
120efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul
121c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusinboolean draw_init(struct draw_context *draw)
122c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin{
123b609cfc7c9c38f26e7e6d6f7dd5dd6d38f4ed209José Fonseca   /*
124b609cfc7c9c38f26e7e6d6f7dd5dd6d38f4ed209José Fonseca    * Note that several functions compute the clipmask of the predefined
125b609cfc7c9c38f26e7e6d6f7dd5dd6d38f4ed209José Fonseca    * formats with hardcoded formulas instead of using these. So modifications
126b609cfc7c9c38f26e7e6d6f7dd5dd6d38f4ed209José Fonseca    * here must be reflected there too.
127b609cfc7c9c38f26e7e6d6f7dd5dd6d38f4ed209José Fonseca    */
128b609cfc7c9c38f26e7e6d6f7dd5dd6d38f4ed209José Fonseca
1299fbdf500788e78d63247a17226a75f7a079ae315Brian   ASSIGN_4V( draw->plane[0], -1,  0,  0, 1 );
1309fbdf500788e78d63247a17226a75f7a079ae315Brian   ASSIGN_4V( draw->plane[1],  1,  0,  0, 1 );
1319fbdf500788e78d63247a17226a75f7a079ae315Brian   ASSIGN_4V( draw->plane[2],  0, -1,  0, 1 );
1329fbdf500788e78d63247a17226a75f7a079ae315Brian   ASSIGN_4V( draw->plane[3],  0,  1,  0, 1 );
1339fbdf500788e78d63247a17226a75f7a079ae315Brian   ASSIGN_4V( draw->plane[4],  0,  0,  1, 1 ); /* yes these are correct */
1349fbdf500788e78d63247a17226a75f7a079ae315Brian   ASSIGN_4V( draw->plane[5],  0,  0, -1, 1 ); /* mesa's a bit wonky */
13557f2f84f0e2a06313d30b3d9341229f6643683a1Brian Paul   draw->clip_xy = TRUE;
13657f2f84f0e2a06313d30b3d9341229f6643683a1Brian Paul   draw->clip_z = TRUE;
1379fbdf500788e78d63247a17226a75f7a079ae315Brian
138dc4c821f0817a3db716f965692fb701079f66340Marek Olšák   draw->pt.user.planes = (float (*) [DRAW_TOTAL_CLIP_PLANES][4]) &(draw->plane[0]);
139a773f06e969a3992451dd7fe6fd55ea96b2774faKeith Whitwell
140507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   if (!draw_pipeline_init( draw ))
141c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin      return FALSE;
142a773f06e969a3992451dd7fe6fd55ea96b2774faKeith Whitwell
143f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell   if (!draw_pt_init( draw ))
144c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin      return FALSE;
145f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell
1462f0d1396e4c1626b3b1ac799bd29e86a9530369eKeith Whitwell   if (!draw_vs_init( draw ))
147c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin      return FALSE;
1482f0d1396e4c1626b3b1ac799bd29e86a9530369eKeith Whitwell
14989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin   if (!draw_gs_init( draw ))
150c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin      return FALSE;
15189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin
1528b4f7b0672d663273310fffa9490ad996f5b914aChristoph Bumiller   draw->quads_always_flatshade_last = !draw->pipe->screen->get_param(
1538b4f7b0672d663273310fffa9490ad996f5b914aChristoph Bumiller      draw->pipe->screen, PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION);
1548b4f7b0672d663273310fffa9490ad996f5b914aChristoph Bumiller
155c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin   return TRUE;
1569fbdf500788e78d63247a17226a75f7a079ae315Brian}
1579fbdf500788e78d63247a17226a75f7a079ae315Brian
1589fbdf500788e78d63247a17226a75f7a079ae315Brian
1599fbdf500788e78d63247a17226a75f7a079ae315Brianvoid draw_destroy( struct draw_context *draw )
1609fbdf500788e78d63247a17226a75f7a079ae315Brian{
16149ba607abab17cc07e9f163f5415636474fd7940Vinson Lee   struct pipe_context *pipe;
162e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul   int i, j;
163e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul
164f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell   if (!draw)
165f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell      return;
166f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell
16749ba607abab17cc07e9f163f5415636474fd7940Vinson Lee   pipe = draw->pipe;
16849ba607abab17cc07e9f163f5415636474fd7940Vinson Lee
169e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul   /* free any rasterizer CSOs that we may have created.
170e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul    */
171e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul   for (i = 0; i < 2; i++) {
172e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul      for (j = 0; j < 2; j++) {
173e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul         if (draw->rasterizer_no_cull[i][j]) {
174e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul            pipe->delete_rasterizer_state(pipe, draw->rasterizer_no_cull[i][j]);
175e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul         }
176e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul      }
177e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul   }
178a773f06e969a3992451dd7fe6fd55ea96b2774faKeith Whitwell
1793c9aa3a7b12cfe178c14fea93cfb64a32db0b8adMarek Olšák   for (i = 0; i < draw->pt.nr_vertex_buffers; i++) {
1803c9aa3a7b12cfe178c14fea93cfb64a32db0b8adMarek Olšák      pipe_resource_reference(&draw->pt.vertex_buffer[i].buffer, NULL);
1813c9aa3a7b12cfe178c14fea93cfb64a32db0b8adMarek Olšák   }
1823c9aa3a7b12cfe178c14fea93cfb64a32db0b8adMarek Olšák
1835038c20795cb2e49d72c1f43a8b705056592356cKeith Whitwell   /* Not so fast -- we're just borrowing this at the moment.
1845038c20795cb2e49d72c1f43a8b705056592356cKeith Whitwell    *
185297b3be25a7f097fb9b1a79e332acddc12dcc3feKeith Whitwell   if (draw->render)
186297b3be25a7f097fb9b1a79e332acddc12dcc3feKeith Whitwell      draw->render->destroy( draw->render );
1875038c20795cb2e49d72c1f43a8b705056592356cKeith Whitwell   */
188297b3be25a7f097fb9b1a79e332acddc12dcc3feKeith Whitwell
189507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   draw_pipeline_destroy( draw );
190f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell   draw_pt_destroy( draw );
1912f0d1396e4c1626b3b1ac799bd29e86a9530369eKeith Whitwell   draw_vs_destroy( draw );
192a5c03bd6f16517bf35c273741080492d70d64c29Jakob Bornecrantz   draw_gs_destroy( draw );
19301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin#ifdef HAVE_LLVM
1944c73030d47f39441d718157f7d9a59c136bbfac0Jakob Bornecrantz   if (draw->llvm)
195f201217c1d87919572a3b1cf7de94f580f20e5f0Luca Barbieri      draw_llvm_destroy( draw->llvm );
19601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin#endif
197f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell
198ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol   FREE( draw );
1999fbdf500788e78d63247a17226a75f7a079ae315Brian}
2009fbdf500788e78d63247a17226a75f7a079ae315Brian
2019fbdf500788e78d63247a17226a75f7a079ae315Brian
20263a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian
20308589f71051e588b0bb7d0c8b529976c85398dd1Keith Whitwellvoid draw_flush( struct draw_context *draw )
20408589f71051e588b0bb7d0c8b529976c85398dd1Keith Whitwell{
2051603a33fb276d7e78a2e872dfa05aa0093d1329aBrian   draw_do_flush( draw, DRAW_FLUSH_BACKEND );
2069fbdf500788e78d63247a17226a75f7a079ae315Brian}
2079fbdf500788e78d63247a17226a75f7a079ae315Brian
2089fbdf500788e78d63247a17226a75f7a079ae315Brian
209d0bc5293d6e1e9c34fa822b7c2928932ed22462cBrian Paul/**
210d0bc5293d6e1e9c34fa822b7c2928932ed22462cBrian Paul * Specify the Minimum Resolvable Depth factor for polygon offset.
211d0bc5293d6e1e9c34fa822b7c2928932ed22462cBrian Paul * This factor potentially depends on the number of Z buffer bits,
212d0bc5293d6e1e9c34fa822b7c2928932ed22462cBrian Paul * the rasterization algorithm and the arithmetic performed on Z
213d0bc5293d6e1e9c34fa822b7c2928932ed22462cBrian Paul * values between vertex shading and rasterization.  It will vary
214d0bc5293d6e1e9c34fa822b7c2928932ed22462cBrian Paul * from one driver to another.
215d0bc5293d6e1e9c34fa822b7c2928932ed22462cBrian Paul */
216d0bc5293d6e1e9c34fa822b7c2928932ed22462cBrian Paulvoid draw_set_mrd(struct draw_context *draw, double mrd)
217d0bc5293d6e1e9c34fa822b7c2928932ed22462cBrian Paul{
218d0bc5293d6e1e9c34fa822b7c2928932ed22462cBrian Paul   draw->mrd = mrd;
219d0bc5293d6e1e9c34fa822b7c2928932ed22462cBrian Paul}
220d0bc5293d6e1e9c34fa822b7c2928932ed22462cBrian Paul
221d56a3adc30c19c8f00cb7dc585e86babfd3a79a7Brian
2226c0dc4bafbdbdc0cb4b6e5934fe064226dbd47ecKeith Whitwellstatic void update_clip_flags( struct draw_context *draw )
2236c0dc4bafbdbdc0cb4b6e5934fe064226dbd47ecKeith Whitwell{
2246c0dc4bafbdbdc0cb4b6e5934fe064226dbd47ecKeith Whitwell   draw->clip_xy = !draw->driver.bypass_clip_xy;
2254465efc3bf8d755a9afb7a4bb5382e2f5bf113e1Brian Paul   draw->guard_band_xy = (!draw->driver.bypass_clip_xy &&
2264465efc3bf8d755a9afb7a4bb5382e2f5bf113e1Brian Paul                          draw->driver.guard_band_xy);
2276c0dc4bafbdbdc0cb4b6e5934fe064226dbd47ecKeith Whitwell   draw->clip_z = (!draw->driver.bypass_clip_z &&
228dc4c821f0817a3db716f965692fb701079f66340Marek Olšák                   draw->rasterizer && draw->rasterizer->depth_clip);
229dc4c821f0817a3db716f965692fb701079f66340Marek Olšák   draw->clip_user = draw->rasterizer &&
230dc4c821f0817a3db716f965692fb701079f66340Marek Olšák                     draw->rasterizer->clip_plane_enable != 0;
2316c0dc4bafbdbdc0cb4b6e5934fe064226dbd47ecKeith Whitwell}
2326c0dc4bafbdbdc0cb4b6e5934fe064226dbd47ecKeith Whitwell
2339fbdf500788e78d63247a17226a75f7a079ae315Brian/**
234de69fc1703f79e5c97e66b654de7a93b7abce8f0Zack Rusin * Register new primitive rasterization/rendering state.
2359fbdf500788e78d63247a17226a75f7a079ae315Brian * This causes the drawing pipeline to be rebuilt.
2369fbdf500788e78d63247a17226a75f7a079ae315Brian */
237de69fc1703f79e5c97e66b654de7a93b7abce8f0Zack Rusinvoid draw_set_rasterizer_state( struct draw_context *draw,
238e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul                                const struct pipe_rasterizer_state *raster,
239e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul                                void *rast_handle )
2409fbdf500788e78d63247a17226a75f7a079ae315Brian{
241e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul   if (!draw->suspend_flushing) {
242e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul      draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
2431603a33fb276d7e78a2e872dfa05aa0093d1329aBrian
244e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul      draw->rasterizer = raster;
245e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul      draw->rast_handle = rast_handle;
246dc4c821f0817a3db716f965692fb701079f66340Marek Olšák      update_clip_flags(draw);
247dc4c821f0817a3db716f965692fb701079f66340Marek Olšák   }
2480588858702d1a5c9c08573ea6817e2e149473cf6Keith Whitwell}
2490588858702d1a5c9c08573ea6817e2e149473cf6Keith Whitwell
2506c0dc4bafbdbdc0cb4b6e5934fe064226dbd47ecKeith Whitwell/* With a little more work, llvmpipe will be able to turn this off and
2516c0dc4bafbdbdc0cb4b6e5934fe064226dbd47ecKeith Whitwell * do its own x/y clipping.
2526c0dc4bafbdbdc0cb4b6e5934fe064226dbd47ecKeith Whitwell *
2536c0dc4bafbdbdc0cb4b6e5934fe064226dbd47ecKeith Whitwell * Some hardware can turn off clipping altogether - in particular any
2546c0dc4bafbdbdc0cb4b6e5934fe064226dbd47ecKeith Whitwell * hardware with a TNL unit can do its own clipping, even if it is
2556c0dc4bafbdbdc0cb4b6e5934fe064226dbd47ecKeith Whitwell * relying on the draw module for some other reason.
2566c0dc4bafbdbdc0cb4b6e5934fe064226dbd47ecKeith Whitwell */
2570588858702d1a5c9c08573ea6817e2e149473cf6Keith Whitwellvoid draw_set_driver_clipping( struct draw_context *draw,
2586c0dc4bafbdbdc0cb4b6e5934fe064226dbd47ecKeith Whitwell                               boolean bypass_clip_xy,
2594465efc3bf8d755a9afb7a4bb5382e2f5bf113e1Brian Paul                               boolean bypass_clip_z,
2604465efc3bf8d755a9afb7a4bb5382e2f5bf113e1Brian Paul                               boolean guard_band_xy)
2610588858702d1a5c9c08573ea6817e2e149473cf6Keith Whitwell{
2620588858702d1a5c9c08573ea6817e2e149473cf6Keith Whitwell   draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
2630588858702d1a5c9c08573ea6817e2e149473cf6Keith Whitwell
2646c0dc4bafbdbdc0cb4b6e5934fe064226dbd47ecKeith Whitwell   draw->driver.bypass_clip_xy = bypass_clip_xy;
2656c0dc4bafbdbdc0cb4b6e5934fe064226dbd47ecKeith Whitwell   draw->driver.bypass_clip_z = bypass_clip_z;
2664465efc3bf8d755a9afb7a4bb5382e2f5bf113e1Brian Paul   draw->driver.guard_band_xy = guard_band_xy;
2676c0dc4bafbdbdc0cb4b6e5934fe064226dbd47ecKeith Whitwell   update_clip_flags(draw);
2689fbdf500788e78d63247a17226a75f7a079ae315Brian}
2699fbdf500788e78d63247a17226a75f7a079ae315Brian
2709fbdf500788e78d63247a17226a75f7a079ae315Brian
2719fbdf500788e78d63247a17226a75f7a079ae315Brian/**
272193c85ec7a1aec44eebc67c6224fb6ecbb4607a5Brian * Plug in the primitive rendering/rasterization stage (which is the last
273193c85ec7a1aec44eebc67c6224fb6ecbb4607a5Brian * stage in the drawing pipeline).
2749fbdf500788e78d63247a17226a75f7a079ae315Brian * This is provided by the device driver.
2759fbdf500788e78d63247a17226a75f7a079ae315Brian */
276de69fc1703f79e5c97e66b654de7a93b7abce8f0Zack Rusinvoid draw_set_rasterize_stage( struct draw_context *draw,
277de69fc1703f79e5c97e66b654de7a93b7abce8f0Zack Rusin                               struct draw_stage *stage )
2789fbdf500788e78d63247a17226a75f7a079ae315Brian{
2791603a33fb276d7e78a2e872dfa05aa0093d1329aBrian   draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
2801603a33fb276d7e78a2e872dfa05aa0093d1329aBrian
281de69fc1703f79e5c97e66b654de7a93b7abce8f0Zack Rusin   draw->pipeline.rasterize = stage;
2829fbdf500788e78d63247a17226a75f7a079ae315Brian}
2839fbdf500788e78d63247a17226a75f7a079ae315Brian
2849fbdf500788e78d63247a17226a75f7a079ae315Brian
2859fbdf500788e78d63247a17226a75f7a079ae315Brian/**
2869fbdf500788e78d63247a17226a75f7a079ae315Brian * Set the draw module's clipping state.
2879fbdf500788e78d63247a17226a75f7a079ae315Brian */
2889fbdf500788e78d63247a17226a75f7a079ae315Brianvoid draw_set_clip_state( struct draw_context *draw,
2899fbdf500788e78d63247a17226a75f7a079ae315Brian                          const struct pipe_clip_state *clip )
2909fbdf500788e78d63247a17226a75f7a079ae315Brian{
2911603a33fb276d7e78a2e872dfa05aa0093d1329aBrian   draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
29208589f71051e588b0bb7d0c8b529976c85398dd1Keith Whitwell
293dc4c821f0817a3db716f965692fb701079f66340Marek Olšák   memcpy(&draw->plane[6], clip->ucp, sizeof(clip->ucp));
2949fbdf500788e78d63247a17226a75f7a079ae315Brian}
2959fbdf500788e78d63247a17226a75f7a079ae315Brian
2969fbdf500788e78d63247a17226a75f7a079ae315Brian
2979fbdf500788e78d63247a17226a75f7a079ae315Brian/**
2989fbdf500788e78d63247a17226a75f7a079ae315Brian * Set the draw module's viewport state.
2999fbdf500788e78d63247a17226a75f7a079ae315Brian */
3009fbdf500788e78d63247a17226a75f7a079ae315Brianvoid draw_set_viewport_state( struct draw_context *draw,
3019fbdf500788e78d63247a17226a75f7a079ae315Brian                              const struct pipe_viewport_state *viewport )
3029fbdf500788e78d63247a17226a75f7a079ae315Brian{
3031603a33fb276d7e78a2e872dfa05aa0093d1329aBrian   draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
3049fbdf500788e78d63247a17226a75f7a079ae315Brian   draw->viewport = *viewport; /* struct copy */
305594dab4769533afaeb30a588e1731a6753a93f0dBrian   draw->identity_viewport = (viewport->scale[0] == 1.0f &&
306594dab4769533afaeb30a588e1731a6753a93f0dBrian                              viewport->scale[1] == 1.0f &&
307594dab4769533afaeb30a588e1731a6753a93f0dBrian                              viewport->scale[2] == 1.0f &&
308594dab4769533afaeb30a588e1731a6753a93f0dBrian                              viewport->scale[3] == 1.0f &&
309594dab4769533afaeb30a588e1731a6753a93f0dBrian                              viewport->translate[0] == 0.0f &&
310594dab4769533afaeb30a588e1731a6753a93f0dBrian                              viewport->translate[1] == 0.0f &&
311594dab4769533afaeb30a588e1731a6753a93f0dBrian                              viewport->translate[2] == 0.0f &&
312594dab4769533afaeb30a588e1731a6753a93f0dBrian                              viewport->translate[3] == 0.0f);
31362628c4d3d497cbca73fde869c9069fa90e6453eKeith Whitwell
31462628c4d3d497cbca73fde869c9069fa90e6453eKeith Whitwell   draw_vs_set_viewport( draw, viewport );
3159fbdf500788e78d63247a17226a75f7a079ae315Brian}
3160a262998ef2813d19e9fee01d3e5808416e9cb04Brian
3170a262998ef2813d19e9fee01d3e5808416e9cb04Brian
31863a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian
31963a51aee86f76ae54fb1ce572d584fb0f01aaec5Brianvoid
320a52c0416d1f2105960b4646e2e268aed26814689Brian Pauldraw_set_vertex_buffers(struct draw_context *draw,
321a52c0416d1f2105960b4646e2e268aed26814689Brian Paul                        unsigned count,
322a52c0416d1f2105960b4646e2e268aed26814689Brian Paul                        const struct pipe_vertex_buffer *buffers)
3230a262998ef2813d19e9fee01d3e5808416e9cb04Brian{
324a52c0416d1f2105960b4646e2e268aed26814689Brian Paul   assert(count <= PIPE_MAX_ATTRIBS);
325a52c0416d1f2105960b4646e2e268aed26814689Brian Paul
3263c9aa3a7b12cfe178c14fea93cfb64a32db0b8adMarek Olšák   util_copy_vertex_buffers(draw->pt.vertex_buffer,
3273c9aa3a7b12cfe178c14fea93cfb64a32db0b8adMarek Olšák                            &draw->pt.nr_vertex_buffers,
3283c9aa3a7b12cfe178c14fea93cfb64a32db0b8adMarek Olšák                            buffers, count);
3290a262998ef2813d19e9fee01d3e5808416e9cb04Brian}
3300a262998ef2813d19e9fee01d3e5808416e9cb04Brian
3310a262998ef2813d19e9fee01d3e5808416e9cb04Brian
3320a262998ef2813d19e9fee01d3e5808416e9cb04Brianvoid
333a52c0416d1f2105960b4646e2e268aed26814689Brian Pauldraw_set_vertex_elements(struct draw_context *draw,
334a52c0416d1f2105960b4646e2e268aed26814689Brian Paul                         unsigned count,
335a52c0416d1f2105960b4646e2e268aed26814689Brian Paul                         const struct pipe_vertex_element *elements)
3360a262998ef2813d19e9fee01d3e5808416e9cb04Brian{
337a52c0416d1f2105960b4646e2e268aed26814689Brian Paul   assert(count <= PIPE_MAX_ATTRIBS);
338a52c0416d1f2105960b4646e2e268aed26814689Brian Paul
339b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz   /* We could improve this by only flushing the frontend and the fetch part
340b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz    * of the middle. This would avoid recalculating the emit keys.*/
341b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz   draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
342b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz
3437d72607e142c0412b88183b849fd701e698b8f79Keith Whitwell   memcpy(draw->pt.vertex_element, elements, count * sizeof(elements[0]));
3447d72607e142c0412b88183b849fd701e698b8f79Keith Whitwell   draw->pt.nr_vertex_elements = count;
3450a262998ef2813d19e9fee01d3e5808416e9cb04Brian}
3460a262998ef2813d19e9fee01d3e5808416e9cb04Brian
3470a262998ef2813d19e9fee01d3e5808416e9cb04Brian
34863a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian/**
34963a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian * Tell drawing context where to find mapped vertex buffers.
35063a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian */
3510a262998ef2813d19e9fee01d3e5808416e9cb04Brianvoid
35263a51aee86f76ae54fb1ce572d584fb0f01aaec5Briandraw_set_mapped_vertex_buffer(struct draw_context *draw,
35363a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian                              unsigned attr, const void *buffer)
3540a262998ef2813d19e9fee01d3e5808416e9cb04Brian{
3557d72607e142c0412b88183b849fd701e698b8f79Keith Whitwell   draw->pt.user.vbuffer[attr] = buffer;
35663a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian}
35763a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian
35863a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian
35963a51aee86f76ae54fb1ce572d584fb0f01aaec5Brianvoid
36063a51aee86f76ae54fb1ce572d584fb0f01aaec5Briandraw_set_mapped_constant_buffer(struct draw_context *draw,
36189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin                                unsigned shader_type,
3629851644435f991a1a1bbb145333a97601627b37dMichal Krol                                unsigned slot,
36389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin                                const void *buffer,
364bb2e13b9e82b68ec3b9fc56a4c35e7ead8fd138fKeith Whitwell                                unsigned size )
36563a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian{
36689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin   debug_assert(shader_type == PIPE_SHADER_VERTEX ||
36789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin                shader_type == PIPE_SHADER_GEOMETRY);
3687c5f255201f42303188137f56ea8acc030444f0eMichal Krol   debug_assert(slot < PIPE_MAX_CONSTANT_BUFFERS);
3699851644435f991a1a1bbb145333a97601627b37dMichal Krol
370ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul   switch (shader_type) {
371ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul   case PIPE_SHADER_VERTEX:
3729851644435f991a1a1bbb145333a97601627b37dMichal Krol      draw->pt.user.vs_constants[slot] = buffer;
373ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul      draw->pt.user.vs_constants_size[slot] = size;
3749851644435f991a1a1bbb145333a97601627b37dMichal Krol      draw_vs_set_constants(draw, slot, buffer, size);
375ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul      break;
376ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul   case PIPE_SHADER_GEOMETRY:
3779851644435f991a1a1bbb145333a97601627b37dMichal Krol      draw->pt.user.gs_constants[slot] = buffer;
378ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul      draw->pt.user.gs_constants_size[slot] = size;
3799851644435f991a1a1bbb145333a97601627b37dMichal Krol      draw_gs_set_constants(draw, slot, buffer, size);
380ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul      break;
381ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul   default:
382ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul      assert(0 && "invalid shader type in draw_set_mapped_constant_buffer");
38389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin   }
3840a262998ef2813d19e9fee01d3e5808416e9cb04Brian}
38563a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian
38663a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian
387f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian/**
3885e29aab1752c3e07ae2ebde4cb00e6550dab0eb2Brian * Tells the draw module to draw points with triangles if their size
3895e29aab1752c3e07ae2ebde4cb00e6550dab0eb2Brian * is greater than this threshold.
390f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian */
391f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrianvoid
3925e29aab1752c3e07ae2ebde4cb00e6550dab0eb2Briandraw_wide_point_threshold(struct draw_context *draw, float threshold)
393f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian{
3941603a33fb276d7e78a2e872dfa05aa0093d1329aBrian   draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
395507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   draw->pipeline.wide_point_threshold = threshold;
396f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian}
397f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian
398f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian
399f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian/**
4008cb223eb020560d59c8f73e09b832cef477933b7Brian Paul * Should the draw module handle point->quad conversion for drawing sprites?
4018cb223eb020560d59c8f73e09b832cef477933b7Brian Paul */
4028cb223eb020560d59c8f73e09b832cef477933b7Brian Paulvoid
4038cb223eb020560d59c8f73e09b832cef477933b7Brian Pauldraw_wide_point_sprites(struct draw_context *draw, boolean draw_sprite)
4048cb223eb020560d59c8f73e09b832cef477933b7Brian Paul{
4058cb223eb020560d59c8f73e09b832cef477933b7Brian Paul   draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
4068cb223eb020560d59c8f73e09b832cef477933b7Brian Paul   draw->pipeline.wide_point_sprites = draw_sprite;
4078cb223eb020560d59c8f73e09b832cef477933b7Brian Paul}
4088cb223eb020560d59c8f73e09b832cef477933b7Brian Paul
4098cb223eb020560d59c8f73e09b832cef477933b7Brian Paul
4108cb223eb020560d59c8f73e09b832cef477933b7Brian Paul/**
411a1a13954885cd469faab49633b5386e5c889e3dfBrian Paul * Tells the draw module to draw lines with triangles if their width
412a1a13954885cd469faab49633b5386e5c889e3dfBrian Paul * is greater than this threshold.
413f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian */
414f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrianvoid
415a1a13954885cd469faab49633b5386e5c889e3dfBrian Pauldraw_wide_line_threshold(struct draw_context *draw, float threshold)
416f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian{
4171603a33fb276d7e78a2e872dfa05aa0093d1329aBrian   draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
4184586e6c8cb5b391536a370faa0c419c3fd541693José Fonseca   draw->pipeline.wide_line_threshold = roundf(threshold);
419f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian}
42008589f71051e588b0bb7d0c8b529976c85398dd1Keith Whitwell
42108589f71051e588b0bb7d0c8b529976c85398dd1Keith Whitwell
42208589f71051e588b0bb7d0c8b529976c85398dd1Keith Whitwell/**
4238b8c9acdb747499149e633179a8ad10b0e4206b1Brian * Tells the draw module whether or not to implement line stipple.
4248b8c9acdb747499149e633179a8ad10b0e4206b1Brian */
4258b8c9acdb747499149e633179a8ad10b0e4206b1Brianvoid
4268b8c9acdb747499149e633179a8ad10b0e4206b1Briandraw_enable_line_stipple(struct draw_context *draw, boolean enable)
4278b8c9acdb747499149e633179a8ad10b0e4206b1Brian{
4288b8c9acdb747499149e633179a8ad10b0e4206b1Brian   draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
429507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   draw->pipeline.line_stipple = enable;
4308b8c9acdb747499149e633179a8ad10b0e4206b1Brian}
4318b8c9acdb747499149e633179a8ad10b0e4206b1Brian
4328b8c9acdb747499149e633179a8ad10b0e4206b1Brian
4338b8c9acdb747499149e633179a8ad10b0e4206b1Brian/**
4345a09ad8248ce452136ed96a3d46532b03c877618Brian * Tells draw module whether to convert points to quads for sprite mode.
4355a09ad8248ce452136ed96a3d46532b03c877618Brian */
4365a09ad8248ce452136ed96a3d46532b03c877618Brianvoid
4375a09ad8248ce452136ed96a3d46532b03c877618Briandraw_enable_point_sprites(struct draw_context *draw, boolean enable)
4385a09ad8248ce452136ed96a3d46532b03c877618Brian{
4395a09ad8248ce452136ed96a3d46532b03c877618Brian   draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
440507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   draw->pipeline.point_sprite = enable;
4415a09ad8248ce452136ed96a3d46532b03c877618Brian}
4425a09ad8248ce452136ed96a3d46532b03c877618Brian
4435a09ad8248ce452136ed96a3d46532b03c877618Brian
444c48da7d78b4e7bdbe056b3c9668756d49019be06Keith Whitwellvoid
445c48da7d78b4e7bdbe056b3c9668756d49019be06Keith Whitwelldraw_set_force_passthrough( struct draw_context *draw, boolean enable )
446c48da7d78b4e7bdbe056b3c9668756d49019be06Keith Whitwell{
447c48da7d78b4e7bdbe056b3c9668756d49019be06Keith Whitwell   draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
448c48da7d78b4e7bdbe056b3c9668756d49019be06Keith Whitwell   draw->force_passthrough = enable;
449c48da7d78b4e7bdbe056b3c9668756d49019be06Keith Whitwell}
450c48da7d78b4e7bdbe056b3c9668756d49019be06Keith Whitwell
451c48da7d78b4e7bdbe056b3c9668756d49019be06Keith Whitwell
452e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul
453e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul/**
454102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca * Allocate an extra vertex/geometry shader vertex attribute, if it doesn't
455102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca * exist already.
456102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca *
457e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul * This is used by some of the optional draw module stages such
458e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul * as wide_point which may need to allocate additional generic/texcoord
459e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul * attributes.
460e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul */
461e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paulint
462e22e3927b056806e9bbb089734132ad0bcb98df1Brian Pauldraw_alloc_extra_vertex_attrib(struct draw_context *draw,
463e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul                               uint semantic_name, uint semantic_index)
464e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul{
465102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca   int slot;
466102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca   uint num_outputs;
467102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca   uint n;
468102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca
469102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca   slot = draw_find_shader_output(draw, semantic_name, semantic_index);
470102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca   if (slot > 0) {
471102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca      return slot;
472102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca   }
473102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca
474102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca   num_outputs = draw_current_shader_outputs(draw);
475102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca   n = draw->extra_shader_outputs.num;
476e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul
477e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul   assert(n < Elements(draw->extra_shader_outputs.semantic_name));
478e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul
479e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul   draw->extra_shader_outputs.semantic_name[n] = semantic_name;
480e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul   draw->extra_shader_outputs.semantic_index[n] = semantic_index;
481e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul   draw->extra_shader_outputs.slot[n] = num_outputs + n;
482e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul   draw->extra_shader_outputs.num++;
483e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul
484e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul   return draw->extra_shader_outputs.slot[n];
485e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul}
486e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul
487e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul
488e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul/**
489e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul * Remove all extra vertex attributes that were allocated with
490e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul * draw_alloc_extra_vertex_attrib().
491e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul */
492e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paulvoid
493e22e3927b056806e9bbb089734132ad0bcb98df1Brian Pauldraw_remove_extra_vertex_attribs(struct draw_context *draw)
494e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul{
495e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul   draw->extra_shader_outputs.num = 0;
496e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul}
497e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul
498e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul
4995a09ad8248ce452136ed96a3d46532b03c877618Brian/**
500102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca * If a geometry shader is present, return its info, else the vertex shader's
501102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca * info.
502102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca */
503102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonsecastruct tgsi_shader_info *
504102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonsecadraw_get_shader_info(const struct draw_context *draw)
505102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca{
506102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca
507102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca   if (draw->gs.geometry_shader) {
508102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca      return &draw->gs.geometry_shader->info;
509102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca   } else {
510102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca      return &draw->vs.vertex_shader->info;
511102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca   }
512102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca}
513102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca
514102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca
515102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca/**
516d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian * Ask the draw module for the location/slot of the given vertex attribute in
517d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian * a post-transformed vertex.
518d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian *
519d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian * With this function, drivers that use the draw module should have no reason
52089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin * to track the current vertex/geometry shader.
521d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian *
522d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian * Note that the draw module may sometimes generate vertices with extra
523d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian * attributes (such as texcoords for AA lines).  The driver can call this
524d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian * function to find those attributes.
525d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian *
526d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian * Zero is returned if the attribute is not found since this is
527d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian * a don't care / undefined situtation.  Returning -1 would be a bit more
528d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian * work for the drivers.
529aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian */
530aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brianint
53189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusindraw_find_shader_output(const struct draw_context *draw,
53289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin                        uint semantic_name, uint semantic_index)
533aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian{
534102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca   const struct tgsi_shader_info *info = draw_get_shader_info(draw);
535d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian   uint i;
53689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin
53789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin   for (i = 0; i < info->num_outputs; i++) {
53889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin      if (info->output_semantic_name[i] == semantic_name &&
53989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin          info->output_semantic_index[i] == semantic_index)
540d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian         return i;
541d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian   }
542d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian
543e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul   /* Search the extra vertex attributes */
544e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul   for (i = 0; i < draw->extra_shader_outputs.num; i++) {
545e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul      if (draw->extra_shader_outputs.semantic_name[i] == semantic_name &&
546e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul          draw->extra_shader_outputs.semantic_index[i] == semantic_index) {
547e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul         return draw->extra_shader_outputs.slot[i];
548e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul      }
549aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian   }
55089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin
551aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian   return 0;
552aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian}
553aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian
554aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian
555aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian/**
556c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul * Return total number of the shader outputs.  This function is similar to
557c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul * draw_current_shader_outputs() but this function also counts any extra
558c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul * vertex/geometry output attributes that may be filled in by some draw
559c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul * stages (such as AA point, AA line).
56089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin *
56189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin * If geometry shader is present, its output will be returned,
56289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin * if not vertex shader is used.
5631774b177b858f9f87d00e54b0bf00e9634e375e9Brian */
5641774b177b858f9f87d00e54b0bf00e9634e375e9Brianuint
56589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusindraw_num_shader_outputs(const struct draw_context *draw)
5661774b177b858f9f87d00e54b0bf00e9634e375e9Brian{
567102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca   const struct tgsi_shader_info *info = draw_get_shader_info(draw);
568e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul   uint count;
56989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin
570102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca   count = info->num_outputs;
571e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul   count += draw->extra_shader_outputs.num;
57289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin
5731774b177b858f9f87d00e54b0bf00e9634e375e9Brian   return count;
5741774b177b858f9f87d00e54b0bf00e9634e375e9Brian}
5751774b177b858f9f87d00e54b0bf00e9634e375e9Brian
5761774b177b858f9f87d00e54b0bf00e9634e375e9Brian
577f2bccfd3c806a879abf0c40858806ec3825d0628Brian/**
578c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul * Provide TGSI sampler objects for vertex/geometry shaders that use
579bef196c7929606bb8c7e9c06fe83a90fc0d95f09Brian Paul * texture fetches.  This state only needs to be set once per context.
580f2bccfd3c806a879abf0c40858806ec3825d0628Brian * This might only be used by software drivers for the time being.
581f2bccfd3c806a879abf0c40858806ec3825d0628Brian */
582f2bccfd3c806a879abf0c40858806ec3825d0628Brianvoid
583f2bccfd3c806a879abf0c40858806ec3825d0628Briandraw_texture_samplers(struct draw_context *draw,
58453bd9796a1395e4acde884ff55cb7ee18586595aZack Rusin                      uint shader,
585f2bccfd3c806a879abf0c40858806ec3825d0628Brian                      uint num_samplers,
586f2bccfd3c806a879abf0c40858806ec3825d0628Brian                      struct tgsi_sampler **samplers)
587f2bccfd3c806a879abf0c40858806ec3825d0628Brian{
58853bd9796a1395e4acde884ff55cb7ee18586595aZack Rusin   if (shader == PIPE_SHADER_VERTEX) {
589bef196c7929606bb8c7e9c06fe83a90fc0d95f09Brian Paul      draw->vs.tgsi.num_samplers = num_samplers;
590bef196c7929606bb8c7e9c06fe83a90fc0d95f09Brian Paul      draw->vs.tgsi.samplers = samplers;
59153bd9796a1395e4acde884ff55cb7ee18586595aZack Rusin   } else {
59253bd9796a1395e4acde884ff55cb7ee18586595aZack Rusin      debug_assert(shader == PIPE_SHADER_GEOMETRY);
593bef196c7929606bb8c7e9c06fe83a90fc0d95f09Brian Paul      draw->gs.tgsi.num_samplers = num_samplers;
594bef196c7929606bb8c7e9c06fe83a90fc0d95f09Brian Paul      draw->gs.tgsi.samplers = samplers;
59553bd9796a1395e4acde884ff55cb7ee18586595aZack Rusin   }
596f2bccfd3c806a879abf0c40858806ec3825d0628Brian}
597f2bccfd3c806a879abf0c40858806ec3825d0628Brian
598f2bccfd3c806a879abf0c40858806ec3825d0628Brian
599f2bccfd3c806a879abf0c40858806ec3825d0628Brian
6003e22180fc893bb09bf6b990bc4e858fd85f522abJosé Fonseca
601297b3be25a7f097fb9b1a79e332acddc12dcc3feKeith Whitwellvoid draw_set_render( struct draw_context *draw,
602297b3be25a7f097fb9b1a79e332acddc12dcc3feKeith Whitwell		      struct vbuf_render *render )
603297b3be25a7f097fb9b1a79e332acddc12dcc3feKeith Whitwell{
604297b3be25a7f097fb9b1a79e332acddc12dcc3feKeith Whitwell   draw->render = render;
605297b3be25a7f097fb9b1a79e332acddc12dcc3feKeith Whitwell}
60684501e68f6294370d6f2f6aec4e7eab57bcc0e72Keith Whitwell
607280bcff1fa200b790d8712946a4ffbaa47a67433Keith Whitwell
6084f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu/**
609185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Paul * Tell the draw module where vertex indexes/elements are located, and
610185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Paul * their size (in bytes).
611185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Paul *
612185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Paul * Note: the caller must apply the pipe_index_buffer::offset value to
613185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Paul * the address.  The draw module doesn't do that.
6144f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu */
6154f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wuvoid
616185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Pauldraw_set_indexes(struct draw_context *draw,
617185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Paul                 const void *elements, unsigned elem_size)
618185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Paul{
619185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Paul   assert(elem_size == 0 ||
620185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Paul          elem_size == 1 ||
621185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Paul          elem_size == 2 ||
622185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Paul          elem_size == 4);
623185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Paul   draw->pt.user.elts = elements;
62438d1191f4133dc427fccdbaec61bef33201c2dccMarek Olšák   draw->pt.user.eltSizeIB = elem_size;
6254f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu}
6264f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu
62766891826421d5b774e081f7a2a85580cd0523fabKeith Whitwell
628507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell/* Revamp me please:
629507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell */
630507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwellvoid draw_do_flush( struct draw_context *draw, unsigned flags )
631507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell{
63214d1ca8d867d6e44c756cb759f92421107118b2eBrian Paul   if (!draw->suspend_flushing)
633507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   {
63414d1ca8d867d6e44c756cb759f92421107118b2eBrian Paul      assert(!draw->flushing); /* catch inadvertant recursion */
63514d1ca8d867d6e44c756cb759f92421107118b2eBrian Paul
636507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell      draw->flushing = TRUE;
637507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
638e7bac4276634ea1ee81ac71f6f6869f87e689872Keith Whitwell      draw_pipeline_flush( draw, flags );
639e7bac4276634ea1ee81ac71f6f6869f87e689872Keith Whitwell
640b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz      draw_pt_flush( draw, flags );
641b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz
642507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell      draw->flushing = FALSE;
643507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   }
644507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell}
64589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin
64689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin
647c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul/**
648c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul * Return the number of output attributes produced by the geometry
649c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul * shader, if present.  If no geometry shader, return the number of
650c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul * outputs from the vertex shader.
651c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul * \sa draw_num_shader_outputs
652c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul */
653256f7f5ab2123bae9549e4f572276e200dc1ae76Brian Pauluint
654256f7f5ab2123bae9549e4f572276e200dc1ae76Brian Pauldraw_current_shader_outputs(const struct draw_context *draw)
65589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin{
65689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin   if (draw->gs.geometry_shader)
65789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin      return draw->gs.num_gs_outputs;
65889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin   return draw->vs.num_vs_outputs;
65989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin}
66089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin
661c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul
662c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul/**
663c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul * Return the index of the shader output which will contain the
664c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul * vertex position.
665c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul */
666256f7f5ab2123bae9549e4f572276e200dc1ae76Brian Pauluint
667256f7f5ab2123bae9549e4f572276e200dc1ae76Brian Pauldraw_current_shader_position_output(const struct draw_context *draw)
66889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin{
66989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin   if (draw->gs.geometry_shader)
67089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin      return draw->gs.position_output;
67189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin   return draw->vs.position_output;
67289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin}
673e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul
674e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul
675e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul/**
67640c5987ed84f9f0b8bb1f707bb13c1aafc39330aDave Airlie * Return the index of the shader output which will contain the
67740c5987ed84f9f0b8bb1f707bb13c1aafc39330aDave Airlie * vertex position.
67840c5987ed84f9f0b8bb1f707bb13c1aafc39330aDave Airlie */
67940c5987ed84f9f0b8bb1f707bb13c1aafc39330aDave Airlieuint
68040c5987ed84f9f0b8bb1f707bb13c1aafc39330aDave Airliedraw_current_shader_clipvertex_output(const struct draw_context *draw)
68140c5987ed84f9f0b8bb1f707bb13c1aafc39330aDave Airlie{
68240c5987ed84f9f0b8bb1f707bb13c1aafc39330aDave Airlie   return draw->vs.clipvertex_output;
68340c5987ed84f9f0b8bb1f707bb13c1aafc39330aDave Airlie}
68440c5987ed84f9f0b8bb1f707bb13c1aafc39330aDave Airlie
6851865f341d8f45b389061fc08d2da90b7aa8a6099Dave Airlieuint
6861865f341d8f45b389061fc08d2da90b7aa8a6099Dave Airliedraw_current_shader_clipdistance_output(const struct draw_context *draw, int index)
6871865f341d8f45b389061fc08d2da90b7aa8a6099Dave Airlie{
6881865f341d8f45b389061fc08d2da90b7aa8a6099Dave Airlie   return draw->vs.clipdistance_output[index];
6891865f341d8f45b389061fc08d2da90b7aa8a6099Dave Airlie}
6901865f341d8f45b389061fc08d2da90b7aa8a6099Dave Airlie
69140c5987ed84f9f0b8bb1f707bb13c1aafc39330aDave Airlie/**
692e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul * Return a pointer/handle for a driver/CSO rasterizer object which
693e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul * disabled culling, stippling, unfilled tris, etc.
694e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul * This is used by some pipeline stages (such as wide_point, aa_line
695e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul * and aa_point) which convert points/lines into triangles.  In those
696e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul * cases we don't want to accidentally cull the triangles.
697e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul *
698e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul * \param scissor  should the rasterizer state enable scissoring?
699e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul * \param flatshade  should the rasterizer state use flat shading?
700e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul * \return  rasterizer CSO handle
701e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul */
702e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paulvoid *
703e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Pauldraw_get_rasterizer_no_cull( struct draw_context *draw,
704e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul                             boolean scissor,
705e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul                             boolean flatshade )
706e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul{
707e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul   if (!draw->rasterizer_no_cull[scissor][flatshade]) {
708e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul      /* create now */
709e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul      struct pipe_context *pipe = draw->pipe;
710e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul      struct pipe_rasterizer_state rast;
711e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul
712e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul      memset(&rast, 0, sizeof(rast));
713e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul      rast.scissor = scissor;
714e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul      rast.flatshade = flatshade;
7150bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell      rast.front_ccw = 1;
716e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul      rast.gl_rasterization_rules = draw->rasterizer->gl_rasterization_rules;
717e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul
718e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul      draw->rasterizer_no_cull[scissor][flatshade] =
719e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul         pipe->create_rasterizer_state(pipe, &rast);
720e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul   }
721e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul   return draw->rasterizer_no_cull[scissor][flatshade];
722e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul}
723a45b7f47ee0e38b288cc8fc4f6a1c013e8c227bcZack Rusin
724a45b7f47ee0e38b288cc8fc4f6a1c013e8c227bcZack Rusinvoid
725ec8cbd79ac4065111365a6720c9564de56855cc8Dave Airliedraw_set_mapped_so_targets(struct draw_context *draw,
726ec8cbd79ac4065111365a6720c9564de56855cc8Dave Airlie                           int num_targets,
727ec8cbd79ac4065111365a6720c9564de56855cc8Dave Airlie                           struct draw_so_target *targets[PIPE_MAX_SO_BUFFERS])
728ec8cbd79ac4065111365a6720c9564de56855cc8Dave Airlie{
729ec8cbd79ac4065111365a6720c9564de56855cc8Dave Airlie   int i;
730ec8cbd79ac4065111365a6720c9564de56855cc8Dave Airlie
731ec8cbd79ac4065111365a6720c9564de56855cc8Dave Airlie   for (i = 0; i < num_targets; i++)
732ec8cbd79ac4065111365a6720c9564de56855cc8Dave Airlie      draw->so.targets[i] = targets[i];
733ec8cbd79ac4065111365a6720c9564de56855cc8Dave Airlie   for (i = num_targets; i < PIPE_MAX_SO_BUFFERS; i++)
734ec8cbd79ac4065111365a6720c9564de56855cc8Dave Airlie      draw->so.targets[i] = NULL;
735ec8cbd79ac4065111365a6720c9564de56855cc8Dave Airlie
736ec8cbd79ac4065111365a6720c9564de56855cc8Dave Airlie   draw->so.num_targets = num_targets;
737ec8cbd79ac4065111365a6720c9564de56855cc8Dave Airlie}
738ec8cbd79ac4065111365a6720c9564de56855cc8Dave Airlie
739ec8cbd79ac4065111365a6720c9564de56855cc8Dave Airlievoid
740a45b7f47ee0e38b288cc8fc4f6a1c013e8c227bcZack Rusindraw_set_mapped_so_buffers(struct draw_context *draw,
741a45b7f47ee0e38b288cc8fc4f6a1c013e8c227bcZack Rusin                           void *buffers[PIPE_MAX_SO_BUFFERS],
742a45b7f47ee0e38b288cc8fc4f6a1c013e8c227bcZack Rusin                           unsigned num_buffers)
743a45b7f47ee0e38b288cc8fc4f6a1c013e8c227bcZack Rusin{
744a45b7f47ee0e38b288cc8fc4f6a1c013e8c227bcZack Rusin}
745a45b7f47ee0e38b288cc8fc4f6a1c013e8c227bcZack Rusin
746a45b7f47ee0e38b288cc8fc4f6a1c013e8c227bcZack Rusinvoid
747a45b7f47ee0e38b288cc8fc4f6a1c013e8c227bcZack Rusindraw_set_so_state(struct draw_context *draw,
748861a029ddb31e91bb4d8e18ab708d0d172f63aadMarek Olšák                  struct pipe_stream_output_info *state)
749a45b7f47ee0e38b288cc8fc4f6a1c013e8c227bcZack Rusin{
750a45b7f47ee0e38b288cc8fc4f6a1c013e8c227bcZack Rusin   memcpy(&draw->so.state,
751a45b7f47ee0e38b288cc8fc4f6a1c013e8c227bcZack Rusin          state,
752861a029ddb31e91bb4d8e18ab708d0d172f63aadMarek Olšák          sizeof(struct pipe_stream_output_info));
753a45b7f47ee0e38b288cc8fc4f6a1c013e8c227bcZack Rusin}
75401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
75501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusinvoid
75601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusindraw_set_sampler_views(struct draw_context *draw,
757df87fb59136eb302d72eac4b58fd8ffb25989ed5Brian Paul                       unsigned shader_stage,
75801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin                       struct pipe_sampler_view **views,
75901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin                       unsigned num)
76001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin{
76101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   unsigned i;
76201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
7633e3f99277df947a96029580dc4e66ae38a93f004José Fonseca   debug_assert(shader_stage < PIPE_SHADER_TYPES);
7643e3f99277df947a96029580dc4e66ae38a93f004José Fonseca   debug_assert(num <= PIPE_MAX_SAMPLERS);
76501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
766a2c1df4c9a7375bc5306e8cfd07a9f7087759a96Brian Paul   for (i = 0; i < num; ++i)
767a2c1df4c9a7375bc5306e8cfd07a9f7087759a96Brian Paul      draw->sampler_views[shader_stage][i] = views[i];
7683e3f99277df947a96029580dc4e66ae38a93f004José Fonseca   for (i = num; i < PIPE_MAX_SAMPLERS; ++i)
769a2c1df4c9a7375bc5306e8cfd07a9f7087759a96Brian Paul      draw->sampler_views[shader_stage][i] = NULL;
77001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
771a2c1df4c9a7375bc5306e8cfd07a9f7087759a96Brian Paul   draw->num_sampler_views[shader_stage] = num;
77201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin}
77301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
77401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusinvoid
77501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusindraw_set_samplers(struct draw_context *draw,
776df87fb59136eb302d72eac4b58fd8ffb25989ed5Brian Paul                  unsigned shader_stage,
77701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin                  struct pipe_sampler_state **samplers,
77801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin                  unsigned num)
77901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin{
78001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   unsigned i;
78101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
7823e3f99277df947a96029580dc4e66ae38a93f004José Fonseca   debug_assert(shader_stage < PIPE_SHADER_TYPES);
7833e3f99277df947a96029580dc4e66ae38a93f004José Fonseca   debug_assert(num <= PIPE_MAX_SAMPLERS);
78401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
785a2c1df4c9a7375bc5306e8cfd07a9f7087759a96Brian Paul   for (i = 0; i < num; ++i)
786a2c1df4c9a7375bc5306e8cfd07a9f7087759a96Brian Paul      draw->samplers[shader_stage][i] = samplers[i];
7873e3f99277df947a96029580dc4e66ae38a93f004José Fonseca   for (i = num; i < PIPE_MAX_SAMPLERS; ++i)
788a2c1df4c9a7375bc5306e8cfd07a9f7087759a96Brian Paul      draw->samplers[shader_stage][i] = NULL;
78901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
790a2c1df4c9a7375bc5306e8cfd07a9f7087759a96Brian Paul   draw->num_samplers[shader_stage] = num;
7910cb545a7f2e823c85309013c4c41e9461f297d06Brian Paul
7920cb545a7f2e823c85309013c4c41e9461f297d06Brian Paul#ifdef HAVE_LLVM
793a2c1df4c9a7375bc5306e8cfd07a9f7087759a96Brian Paul   if (draw->llvm && shader_stage == PIPE_SHADER_VERTEX)
794a2c1df4c9a7375bc5306e8cfd07a9f7087759a96Brian Paul      draw_llvm_set_sampler_state(draw);
7950cb545a7f2e823c85309013c4c41e9461f297d06Brian Paul#endif
79601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin}
79701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
79801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusinvoid
79901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusindraw_set_mapped_texture(struct draw_context *draw,
800df87fb59136eb302d72eac4b58fd8ffb25989ed5Brian Paul                        unsigned shader_stage,
80101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin                        unsigned sampler_idx,
80201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin                        uint32_t width, uint32_t height, uint32_t depth,
80308070cead0bb79d4441d8c5b900d1571bb63c670Fabian Bieler                        uint32_t first_level, uint32_t last_level,
804048a90c1cb926fdeae47392582cb91b0a689905fBrian Paul                        uint32_t row_stride[PIPE_MAX_TEXTURE_LEVELS],
805048a90c1cb926fdeae47392582cb91b0a689905fBrian Paul                        uint32_t img_stride[PIPE_MAX_TEXTURE_LEVELS],
806048a90c1cb926fdeae47392582cb91b0a689905fBrian Paul                        const void *data[PIPE_MAX_TEXTURE_LEVELS])
80701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin{
808df87fb59136eb302d72eac4b58fd8ffb25989ed5Brian Paul   if (shader_stage == PIPE_SHADER_VERTEX) {
80901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin#ifdef HAVE_LLVM
810df87fb59136eb302d72eac4b58fd8ffb25989ed5Brian Paul      if (draw->llvm)
811df87fb59136eb302d72eac4b58fd8ffb25989ed5Brian Paul         draw_llvm_set_mapped_texture(draw,
812df87fb59136eb302d72eac4b58fd8ffb25989ed5Brian Paul                                      sampler_idx,
813df87fb59136eb302d72eac4b58fd8ffb25989ed5Brian Paul                                      width, height, depth, first_level, last_level,
814df87fb59136eb302d72eac4b58fd8ffb25989ed5Brian Paul                                      row_stride, img_stride, data);
81501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin#endif
8160d308ef8feb081bedd12e01b270278e5f0de8e5aBrian Paul   }
81701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin}
8186dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca
8196dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca/**
8206dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca * XXX: Results for PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS because there are two
8216dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca * different ways of setting textures, and drivers typically only support one.
8226dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca */
8236dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonsecaint
8246dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonsecadraw_get_shader_param_no_llvm(unsigned shader, enum pipe_shader_cap param)
8256dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca{
8266dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca   switch(shader) {
8276dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca   case PIPE_SHADER_VERTEX:
8286dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca   case PIPE_SHADER_GEOMETRY:
8296dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca      return tgsi_exec_get_shader_param(param);
8306dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca   default:
8316dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca      return 0;
8326dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca   }
8336dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca}
8346dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca
8356dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca/**
8366dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca * XXX: Results for PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS because there are two
8376dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca * different ways of setting textures, and drivers typically only support one.
8386dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca */
8396dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonsecaint
8406dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonsecadraw_get_shader_param(unsigned shader, enum pipe_shader_cap param)
8416dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca{
8426dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca
8436dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca#ifdef HAVE_LLVM
8446dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca   if (draw_get_option_use_llvm()) {
8456dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca      switch(shader) {
8466dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca      case PIPE_SHADER_VERTEX:
8476dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca      case PIPE_SHADER_GEOMETRY:
8486dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca         return gallivm_get_shader_param(param);
8496dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca      default:
8506dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca         return 0;
8516dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca      }
8526dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca   }
8536dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca#endif
8546dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca
8556dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca   return draw_get_shader_param_no_llvm(shader, param);
8566dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca}
8576dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca
858