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