19fbdf500788e78d63247a17226a75f7a079ae315Brian Paul/************************************************************************** 29fbdf500788e78d63247a17226a75f7a079ae315Brian Paul * 3877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * Copyright 2007 VMware, Inc. 49fbdf500788e78d63247a17226a75f7a079ae315Brian Paul * All Rights Reserved. 59fbdf500788e78d63247a17226a75f7a079ae315Brian Paul * 69fbdf500788e78d63247a17226a75f7a079ae315Brian Paul * Permission is hereby granted, free of charge, to any person obtaining a 79fbdf500788e78d63247a17226a75f7a079ae315Brian Paul * copy of this software and associated documentation files (the 89fbdf500788e78d63247a17226a75f7a079ae315Brian Paul * "Software"), to deal in the Software without restriction, including 99fbdf500788e78d63247a17226a75f7a079ae315Brian Paul * without limitation the rights to use, copy, modify, merge, publish, 109fbdf500788e78d63247a17226a75f7a079ae315Brian Paul * distribute, sub license, and/or sell copies of the Software, and to 119fbdf500788e78d63247a17226a75f7a079ae315Brian Paul * permit persons to whom the Software is furnished to do so, subject to 129fbdf500788e78d63247a17226a75f7a079ae315Brian Paul * the following conditions: 139fbdf500788e78d63247a17226a75f7a079ae315Brian Paul * 149fbdf500788e78d63247a17226a75f7a079ae315Brian Paul * The above copyright notice and this permission notice (including the 159fbdf500788e78d63247a17226a75f7a079ae315Brian Paul * next paragraph) shall be included in all copies or substantial portions 169fbdf500788e78d63247a17226a75f7a079ae315Brian Paul * of the Software. 179fbdf500788e78d63247a17226a75f7a079ae315Brian Paul * 189fbdf500788e78d63247a17226a75f7a079ae315Brian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 199fbdf500788e78d63247a17226a75f7a079ae315Brian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 209fbdf500788e78d63247a17226a75f7a079ae315Brian Paul * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 229fbdf500788e78d63247a17226a75f7a079ae315Brian Paul * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 239fbdf500788e78d63247a17226a75f7a079ae315Brian Paul * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 249fbdf500788e78d63247a17226a75f7a079ae315Brian Paul * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 259fbdf500788e78d63247a17226a75f7a079ae315Brian Paul * 269fbdf500788e78d63247a17226a75f7a079ae315Brian Paul **************************************************************************/ 279fbdf500788e78d63247a17226a75f7a079ae315Brian Paul 289fbdf500788e78d63247a17226a75f7a079ae315Brian Paul /* 299fbdf500788e78d63247a17226a75f7a079ae315Brian Paul * Authors: 30877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * Keith Whitwell <keithw@vmware.com> 319fbdf500788e78d63247a17226a75f7a079ae315Brian Paul */ 329fbdf500788e78d63247a17226a75f7a079ae315Brian Paul 339fbdf500788e78d63247a17226a75f7a079ae315Brian Paul 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" 39e73bf3b805de78299f1a652668ba4e6eab9bac94Marek Olšák#include "util/u_helpers.h" 400a3779d95537343505200ad096acf135dcd81b80Zack Rusin#include "util/u_prim.h" 41f9e2c24326869542c9b43220f63dd9841c6de38fMatthew McClure#include "util/u_format.h" 429fbdf500788e78d63247a17226a75f7a079ae315Brian Paul#include "draw_context.h" 43d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin#include "draw_pipe.h" 44662a4d4a120cb0a07023f00e3c5e4a0809428a53Zack Rusin#include "draw_prim_assembler.h" 45280bcff1fa200b790d8712946a4ffbaa47a67433Keith Whitwell#include "draw_vs.h" 4689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin#include "draw_gs.h" 479fbdf500788e78d63247a17226a75f7a079ae315Brian Paul 4834041968f883253de639f137a761340e84f82bb9José Fonseca#if HAVE_LLVM 497c4208c3a0f48955720f41b3cb320a120c505ba6Zack Rusin#include "gallivm/lp_bld_init.h" 506dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca#include "gallivm/lp_bld_limits.h" 5101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin#include "draw_llvm.h" 52f201217c1d87919572a3b1cf7de94f580f20e5f0Luca Barbieri 53e96f4e3b853ff5fe4d927c69695c0b5f1966d448Zack Rusinboolean 54f201217c1d87919572a3b1cf7de94f580f20e5f0Luca Barbieridraw_get_option_use_llvm(void) 55f201217c1d87919572a3b1cf7de94f580f20e5f0Luca Barbieri{ 5625b00f4617973243707f14ea72bb7f501a3190c9David Heidelberger return debug_get_bool_option("DRAW_USE_LLVM", TRUE); 57f201217c1d87919572a3b1cf7de94f580f20e5f0Luca Barbieri} 581c73e919a4b4dd79166d0633075990056f27fd28Zack Rusin#else 591c73e919a4b4dd79166d0633075990056f27fd28Zack Rusinboolean 601c73e919a4b4dd79166d0633075990056f27fd28Zack Rusindraw_get_option_use_llvm(void) 611c73e919a4b4dd79166d0633075990056f27fd28Zack Rusin{ 621c73e919a4b4dd79166d0633075990056f27fd28Zack Rusin return FALSE; 631c73e919a4b4dd79166d0633075990056f27fd28Zack Rusin} 647c4208c3a0f48955720f41b3cb320a120c505ba6Zack Rusin#endif 659d9e838974d1b9ab35235387bdfda5d99cb19d38Brian Paul 66efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul 67efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul/** 68efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul * Create new draw module context with gallivm state for LLVM JIT. 69efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul */ 703e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantzstatic struct draw_context * 7143e2109326d0b3bcf9b2241b054dadeceae33ca5Mathias Fröhlichdraw_create_context(struct pipe_context *pipe, void *context, 7243e2109326d0b3bcf9b2241b054dadeceae33ca5Mathias Fröhlich boolean try_llvm) 739fbdf500788e78d63247a17226a75f7a079ae315Brian Paul{ 749fbdf500788e78d63247a17226a75f7a079ae315Brian Paul struct draw_context *draw = CALLOC_STRUCT( draw_context ); 75150c289f6067cb1ba4572f9124948a94ef94c839Edward O'Callaghan if (!draw) 76f4863f3923152448e27ea68d0cd04411bbe3f4c7Jakob Bornecrantz goto err_out; 779fbdf500788e78d63247a17226a75f7a079ae315Brian Paul 781e003b44e83dde3912ec48eb3df0e25802b5101eRoland Scheidegger /* we need correct cpu caps for disabling denorms in draw_vbo() */ 791e003b44e83dde3912ec48eb3df0e25802b5101eRoland Scheidegger util_cpu_detect(); 801e003b44e83dde3912ec48eb3df0e25802b5101eRoland Scheidegger 8134041968f883253de639f137a761340e84f82bb9José Fonseca#if HAVE_LLVM 823e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantz if (try_llvm && draw_get_option_use_llvm()) { 8343e2109326d0b3bcf9b2241b054dadeceae33ca5Mathias Fröhlich draw->llvm = draw_llvm_create(draw, (LLVMContextRef)context); 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 92662a4d4a120cb0a07023f00e3c5e4a0809428a53Zack Rusin draw->ia = draw_prim_assembler_create(draw); 93662a4d4a120cb0a07023f00e3c5e4a0809428a53Zack Rusin if (!draw->ia) 94662a4d4a120cb0a07023f00e3c5e4a0809428a53Zack Rusin goto err_destroy; 95662a4d4a120cb0a07023f00e3c5e4a0809428a53Zack Rusin 96c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin return draw; 97c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin 98f4863f3923152448e27ea68d0cd04411bbe3f4c7Jakob Bornecrantzerr_destroy: 99c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin draw_destroy( draw ); 100f4863f3923152448e27ea68d0cd04411bbe3f4c7Jakob Bornecrantzerr_out: 101c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin return NULL; 102c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin} 103c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin 104efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul 1053e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantz/** 1063e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantz * Create new draw module context, with LLVM JIT. 1073e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantz */ 1083e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantzstruct draw_context * 1093e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantzdraw_create(struct pipe_context *pipe) 1103e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantz{ 11143e2109326d0b3bcf9b2241b054dadeceae33ca5Mathias Fröhlich return draw_create_context(pipe, NULL, TRUE); 1123e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantz} 1133e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantz 1143e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantz 11534041968f883253de639f137a761340e84f82bb9José Fonseca#if HAVE_LLVM 11643e2109326d0b3bcf9b2241b054dadeceae33ca5Mathias Fröhlichstruct draw_context * 11743e2109326d0b3bcf9b2241b054dadeceae33ca5Mathias Fröhlichdraw_create_with_llvm_context(struct pipe_context *pipe, 11843e2109326d0b3bcf9b2241b054dadeceae33ca5Mathias Fröhlich void *context) 11943e2109326d0b3bcf9b2241b054dadeceae33ca5Mathias Fröhlich{ 12043e2109326d0b3bcf9b2241b054dadeceae33ca5Mathias Fröhlich return draw_create_context(pipe, context, TRUE); 12143e2109326d0b3bcf9b2241b054dadeceae33ca5Mathias Fröhlich} 12243e2109326d0b3bcf9b2241b054dadeceae33ca5Mathias Fröhlich#endif 12343e2109326d0b3bcf9b2241b054dadeceae33ca5Mathias Fröhlich 1243e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantz/** 1253e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantz * Create a new draw context, without LLVM JIT. 1263e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantz */ 1273e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantzstruct draw_context * 1283e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantzdraw_create_no_llvm(struct pipe_context *pipe) 1293e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantz{ 13043e2109326d0b3bcf9b2241b054dadeceae33ca5Mathias Fröhlich return draw_create_context(pipe, NULL, FALSE); 1313e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantz} 1323e22c7a25321554a32fa6254485912fd53deff3aJakob Bornecrantz 133efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul 134c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusinboolean draw_init(struct draw_context *draw) 135c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin{ 136b609cfc7c9c38f26e7e6d6f7dd5dd6d38f4ed209José Fonseca /* 137b609cfc7c9c38f26e7e6d6f7dd5dd6d38f4ed209José Fonseca * Note that several functions compute the clipmask of the predefined 138b609cfc7c9c38f26e7e6d6f7dd5dd6d38f4ed209José Fonseca * formats with hardcoded formulas instead of using these. So modifications 139b609cfc7c9c38f26e7e6d6f7dd5dd6d38f4ed209José Fonseca * here must be reflected there too. 140b609cfc7c9c38f26e7e6d6f7dd5dd6d38f4ed209José Fonseca */ 141b609cfc7c9c38f26e7e6d6f7dd5dd6d38f4ed209José Fonseca 1429fbdf500788e78d63247a17226a75f7a079ae315Brian Paul ASSIGN_4V( draw->plane[0], -1, 0, 0, 1 ); 1439fbdf500788e78d63247a17226a75f7a079ae315Brian Paul ASSIGN_4V( draw->plane[1], 1, 0, 0, 1 ); 1449fbdf500788e78d63247a17226a75f7a079ae315Brian Paul ASSIGN_4V( draw->plane[2], 0, -1, 0, 1 ); 1459fbdf500788e78d63247a17226a75f7a079ae315Brian Paul ASSIGN_4V( draw->plane[3], 0, 1, 0, 1 ); 1469fbdf500788e78d63247a17226a75f7a079ae315Brian Paul ASSIGN_4V( draw->plane[4], 0, 0, 1, 1 ); /* yes these are correct */ 1479fbdf500788e78d63247a17226a75f7a079ae315Brian Paul ASSIGN_4V( draw->plane[5], 0, 0, -1, 1 ); /* mesa's a bit wonky */ 14857f2f84f0e2a06313d30b3d9341229f6643683a1Brian Paul draw->clip_xy = TRUE; 14957f2f84f0e2a06313d30b3d9341229f6643683a1Brian Paul draw->clip_z = TRUE; 1509fbdf500788e78d63247a17226a75f7a079ae315Brian Paul 151dc4c821f0817a3db716f965692fb701079f66340Marek Olšák draw->pt.user.planes = (float (*) [DRAW_TOTAL_CLIP_PLANES][4]) &(draw->plane[0]); 1527807763dd84ae381e208f74a0f4b7476b70ffbe8Zack Rusin draw->pt.user.eltMax = ~0; 153a773f06e969a3992451dd7fe6fd55ea96b2774faKeith Whitwell 154507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell if (!draw_pipeline_init( draw )) 155c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin return FALSE; 156a773f06e969a3992451dd7fe6fd55ea96b2774faKeith Whitwell 157f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell if (!draw_pt_init( draw )) 158c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin return FALSE; 159f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell 1602f0d1396e4c1626b3b1ac799bd29e86a9530369eKeith Whitwell if (!draw_vs_init( draw )) 161c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin return FALSE; 1622f0d1396e4c1626b3b1ac799bd29e86a9530369eKeith Whitwell 16389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin if (!draw_gs_init( draw )) 164c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin return FALSE; 16589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 1668b4f7b0672d663273310fffa9490ad996f5b914aChristoph Bumiller draw->quads_always_flatshade_last = !draw->pipe->screen->get_param( 1678b4f7b0672d663273310fffa9490ad996f5b914aChristoph Bumiller draw->pipe->screen, PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION); 1688b4f7b0672d663273310fffa9490ad996f5b914aChristoph Bumiller 169f9e2c24326869542c9b43220f63dd9841c6de38fMatthew McClure draw->floating_point_depth = false; 170f9e2c24326869542c9b43220f63dd9841c6de38fMatthew McClure 171c5c5cd7132e18f4aad8e73d8ee879f8823c4c1e7Zack Rusin return TRUE; 1729fbdf500788e78d63247a17226a75f7a079ae315Brian Paul} 1739fbdf500788e78d63247a17226a75f7a079ae315Brian Paul 174913ed25f18aa9e24fc34fcf0b637d73ce355025dZack Rusin/* 175913ed25f18aa9e24fc34fcf0b637d73ce355025dZack Rusin * Called whenever we're starting to draw a new instance. 176913ed25f18aa9e24fc34fcf0b637d73ce355025dZack Rusin * Some internal structures don't want to have to reset internal 177913ed25f18aa9e24fc34fcf0b637d73ce355025dZack Rusin * members on each invocation (because their state might have to persist 178913ed25f18aa9e24fc34fcf0b637d73ce355025dZack Rusin * between multiple primitive restart rendering call) but might have to 179913ed25f18aa9e24fc34fcf0b637d73ce355025dZack Rusin * for each new instance. 180913ed25f18aa9e24fc34fcf0b637d73ce355025dZack Rusin * This is particularly the case for primitive id's in geometry shader. 181913ed25f18aa9e24fc34fcf0b637d73ce355025dZack Rusin */ 182913ed25f18aa9e24fc34fcf0b637d73ce355025dZack Rusinvoid draw_new_instance(struct draw_context *draw) 183913ed25f18aa9e24fc34fcf0b637d73ce355025dZack Rusin{ 184913ed25f18aa9e24fc34fcf0b637d73ce355025dZack Rusin draw_geometry_shader_new_instance(draw->gs.geometry_shader); 185f2a7fd9943fcb7d3de3bc2b21907e0a157b88e96Roland Scheidegger draw_prim_assembler_new_instance(draw->ia); 186913ed25f18aa9e24fc34fcf0b637d73ce355025dZack Rusin} 187913ed25f18aa9e24fc34fcf0b637d73ce355025dZack Rusin 1889fbdf500788e78d63247a17226a75f7a079ae315Brian Paul 1899fbdf500788e78d63247a17226a75f7a079ae315Brian Paulvoid draw_destroy( struct draw_context *draw ) 1909fbdf500788e78d63247a17226a75f7a079ae315Brian Paul{ 19149ba607abab17cc07e9f163f5415636474fd7940Vinson Lee struct pipe_context *pipe; 192f03191048668ebcda56053f4c908e1ac0d98edd0Brian Paul unsigned i, j; 193e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul 194f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell if (!draw) 195f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell return; 196f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell 19749ba607abab17cc07e9f163f5415636474fd7940Vinson Lee pipe = draw->pipe; 19849ba607abab17cc07e9f163f5415636474fd7940Vinson Lee 199e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul /* free any rasterizer CSOs that we may have created. 200e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul */ 201e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul for (i = 0; i < 2; i++) { 202e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul for (j = 0; j < 2; j++) { 203e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul if (draw->rasterizer_no_cull[i][j]) { 204e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul pipe->delete_rasterizer_state(pipe, draw->rasterizer_no_cull[i][j]); 205e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul } 206e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul } 207e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul } 208a773f06e969a3992451dd7fe6fd55ea96b2774faKeith Whitwell 2093c9aa3a7b12cfe178c14fea93cfb64a32db0b8adMarek Olšák for (i = 0; i < draw->pt.nr_vertex_buffers; i++) { 2103c9aa3a7b12cfe178c14fea93cfb64a32db0b8adMarek Olšák pipe_resource_reference(&draw->pt.vertex_buffer[i].buffer, NULL); 2113c9aa3a7b12cfe178c14fea93cfb64a32db0b8adMarek Olšák } 2123c9aa3a7b12cfe178c14fea93cfb64a32db0b8adMarek Olšák 2135038c20795cb2e49d72c1f43a8b705056592356cKeith Whitwell /* Not so fast -- we're just borrowing this at the moment. 2145038c20795cb2e49d72c1f43a8b705056592356cKeith Whitwell * 215297b3be25a7f097fb9b1a79e332acddc12dcc3feKeith Whitwell if (draw->render) 216297b3be25a7f097fb9b1a79e332acddc12dcc3feKeith Whitwell draw->render->destroy( draw->render ); 2175038c20795cb2e49d72c1f43a8b705056592356cKeith Whitwell */ 218297b3be25a7f097fb9b1a79e332acddc12dcc3feKeith Whitwell 219662a4d4a120cb0a07023f00e3c5e4a0809428a53Zack Rusin draw_prim_assembler_destroy(draw->ia); 220507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell draw_pipeline_destroy( draw ); 221f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell draw_pt_destroy( draw ); 2222f0d1396e4c1626b3b1ac799bd29e86a9530369eKeith Whitwell draw_vs_destroy( draw ); 223a5c03bd6f16517bf35c273741080492d70d64c29Jakob Bornecrantz draw_gs_destroy( draw ); 22434041968f883253de639f137a761340e84f82bb9José Fonseca#ifdef HAVE_LLVM 2254c73030d47f39441d718157f7d9a59c136bbfac0Jakob Bornecrantz if (draw->llvm) 226f201217c1d87919572a3b1cf7de94f580f20e5f0Luca Barbieri draw_llvm_destroy( draw->llvm ); 22701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin#endif 228f40357e25c0520ef1d64ffab03501da4c8b93529Keith Whitwell 229ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol FREE( draw ); 2309fbdf500788e78d63247a17226a75f7a079ae315Brian Paul} 2319fbdf500788e78d63247a17226a75f7a079ae315Brian Paul 2329fbdf500788e78d63247a17226a75f7a079ae315Brian Paul 23363a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian Paul 23408589f71051e588b0bb7d0c8b529976c85398dd1Keith Whitwellvoid draw_flush( struct draw_context *draw ) 23508589f71051e588b0bb7d0c8b529976c85398dd1Keith Whitwell{ 2361603a33fb276d7e78a2e872dfa05aa0093d1329aBrian Paul draw_do_flush( draw, DRAW_FLUSH_BACKEND ); 2379fbdf500788e78d63247a17226a75f7a079ae315Brian Paul} 2389fbdf500788e78d63247a17226a75f7a079ae315Brian Paul 2399fbdf500788e78d63247a17226a75f7a079ae315Brian Paul 240d0bc5293d6e1e9c34fa822b7c2928932ed22462cBrian Paul/** 241f9e2c24326869542c9b43220f63dd9841c6de38fMatthew McClure * Specify the depth stencil format for the draw pipeline. This function 242f9e2c24326869542c9b43220f63dd9841c6de38fMatthew McClure * determines the Minimum Resolvable Depth factor for polygon offset. 243d0bc5293d6e1e9c34fa822b7c2928932ed22462cBrian Paul * This factor potentially depends on the number of Z buffer bits, 244d0bc5293d6e1e9c34fa822b7c2928932ed22462cBrian Paul * the rasterization algorithm and the arithmetic performed on Z 245f9e2c24326869542c9b43220f63dd9841c6de38fMatthew McClure * values between vertex shading and rasterization. 246d0bc5293d6e1e9c34fa822b7c2928932ed22462cBrian Paul */ 247f9e2c24326869542c9b43220f63dd9841c6de38fMatthew McClurevoid draw_set_zs_format(struct draw_context *draw, enum pipe_format format) 248d0bc5293d6e1e9c34fa822b7c2928932ed22462cBrian Paul{ 249f9e2c24326869542c9b43220f63dd9841c6de38fMatthew McClure const struct util_format_description *desc = util_format_description(format); 250f9e2c24326869542c9b43220f63dd9841c6de38fMatthew McClure 251f9e2c24326869542c9b43220f63dd9841c6de38fMatthew McClure draw->floating_point_depth = 252f9e2c24326869542c9b43220f63dd9841c6de38fMatthew McClure (util_get_depth_format_type(desc) == UTIL_FORMAT_TYPE_FLOAT); 253f9e2c24326869542c9b43220f63dd9841c6de38fMatthew McClure 254f9e2c24326869542c9b43220f63dd9841c6de38fMatthew McClure draw->mrd = util_get_depth_format_mrd(desc); 255d0bc5293d6e1e9c34fa822b7c2928932ed22462cBrian Paul} 256d0bc5293d6e1e9c34fa822b7c2928932ed22462cBrian Paul 257d56a3adc30c19c8f00cb7dc585e86babfd3a79a7Brian Paul 25865ef78e8611556780fce0bee1feba805347ec627Marek Olšákstatic bool 25965ef78e8611556780fce0bee1feba805347ec627Marek Olšákdraw_is_vs_window_space(struct draw_context *draw) 2606c0dc4bafbdbdc0cb4b6e5934fe064226dbd47ecKeith Whitwell{ 26165ef78e8611556780fce0bee1feba805347ec627Marek Olšák if (draw->vs.vertex_shader) { 26265ef78e8611556780fce0bee1feba805347ec627Marek Olšák struct tgsi_shader_info *info = &draw->vs.vertex_shader->info; 26365ef78e8611556780fce0bee1feba805347ec627Marek Olšák 26465ef78e8611556780fce0bee1feba805347ec627Marek Olšák return info->properties[TGSI_PROPERTY_VS_WINDOW_SPACE_POSITION] != 0; 26565ef78e8611556780fce0bee1feba805347ec627Marek Olšák } 26665ef78e8611556780fce0bee1feba805347ec627Marek Olšák return false; 26765ef78e8611556780fce0bee1feba805347ec627Marek Olšák} 26865ef78e8611556780fce0bee1feba805347ec627Marek Olšák 26965ef78e8611556780fce0bee1feba805347ec627Marek Olšák 27065ef78e8611556780fce0bee1feba805347ec627Marek Olšákvoid 27165ef78e8611556780fce0bee1feba805347ec627Marek Olšákdraw_update_clip_flags(struct draw_context *draw) 27265ef78e8611556780fce0bee1feba805347ec627Marek Olšák{ 27365ef78e8611556780fce0bee1feba805347ec627Marek Olšák bool window_space = draw_is_vs_window_space(draw); 27465ef78e8611556780fce0bee1feba805347ec627Marek Olšák 27565ef78e8611556780fce0bee1feba805347ec627Marek Olšák draw->clip_xy = !draw->driver.bypass_clip_xy && !window_space; 2764465efc3bf8d755a9afb7a4bb5382e2f5bf113e1Brian Paul draw->guard_band_xy = (!draw->driver.bypass_clip_xy && 2774465efc3bf8d755a9afb7a4bb5382e2f5bf113e1Brian Paul draw->driver.guard_band_xy); 2786c0dc4bafbdbdc0cb4b6e5934fe064226dbd47ecKeith Whitwell draw->clip_z = (!draw->driver.bypass_clip_z && 27965ef78e8611556780fce0bee1feba805347ec627Marek Olšák draw->rasterizer && draw->rasterizer->depth_clip) && 28065ef78e8611556780fce0bee1feba805347ec627Marek Olšák !window_space; 281dc4c821f0817a3db716f965692fb701079f66340Marek Olšák draw->clip_user = draw->rasterizer && 28265ef78e8611556780fce0bee1feba805347ec627Marek Olšák draw->rasterizer->clip_plane_enable != 0 && 28365ef78e8611556780fce0bee1feba805347ec627Marek Olšák !window_space; 2848c0368abb9474d092e33f79773bfbb457d4d9eddRoland Scheidegger draw->guard_band_points_xy = draw->guard_band_xy || 2858c0368abb9474d092e33f79773bfbb457d4d9eddRoland Scheidegger (draw->driver.bypass_clip_points && 2868c0368abb9474d092e33f79773bfbb457d4d9eddRoland Scheidegger (draw->rasterizer && 2878c0368abb9474d092e33f79773bfbb457d4d9eddRoland Scheidegger draw->rasterizer->point_tri_clip)); 2886c0dc4bafbdbdc0cb4b6e5934fe064226dbd47ecKeith Whitwell} 2896c0dc4bafbdbdc0cb4b6e5934fe064226dbd47ecKeith Whitwell 29065ef78e8611556780fce0bee1feba805347ec627Marek Olšák 29165ef78e8611556780fce0bee1feba805347ec627Marek Olšákvoid 29265ef78e8611556780fce0bee1feba805347ec627Marek Olšákdraw_update_viewport_flags(struct draw_context *draw) 29365ef78e8611556780fce0bee1feba805347ec627Marek Olšák{ 29465ef78e8611556780fce0bee1feba805347ec627Marek Olšák bool window_space = draw_is_vs_window_space(draw); 29565ef78e8611556780fce0bee1feba805347ec627Marek Olšák 29665ef78e8611556780fce0bee1feba805347ec627Marek Olšák draw->bypass_viewport = window_space || draw->identity_viewport; 29765ef78e8611556780fce0bee1feba805347ec627Marek Olšák} 29865ef78e8611556780fce0bee1feba805347ec627Marek Olšák 29965ef78e8611556780fce0bee1feba805347ec627Marek Olšák 3009fbdf500788e78d63247a17226a75f7a079ae315Brian Paul/** 301de69fc1703f79e5c97e66b654de7a93b7abce8f0Zack Rusin * Register new primitive rasterization/rendering state. 3029fbdf500788e78d63247a17226a75f7a079ae315Brian Paul * This causes the drawing pipeline to be rebuilt. 3039fbdf500788e78d63247a17226a75f7a079ae315Brian Paul */ 304de69fc1703f79e5c97e66b654de7a93b7abce8f0Zack Rusinvoid draw_set_rasterizer_state( struct draw_context *draw, 305e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul const struct pipe_rasterizer_state *raster, 306e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul void *rast_handle ) 3079fbdf500788e78d63247a17226a75f7a079ae315Brian Paul{ 308e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul if (!draw->suspend_flushing) { 309e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE ); 3101603a33fb276d7e78a2e872dfa05aa0093d1329aBrian Paul 311e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul draw->rasterizer = raster; 312e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul draw->rast_handle = rast_handle; 31365ef78e8611556780fce0bee1feba805347ec627Marek Olšák draw_update_clip_flags(draw); 314dc4c821f0817a3db716f965692fb701079f66340Marek Olšák } 3150588858702d1a5c9c08573ea6817e2e149473cf6Keith Whitwell} 3160588858702d1a5c9c08573ea6817e2e149473cf6Keith Whitwell 3176c0dc4bafbdbdc0cb4b6e5934fe064226dbd47ecKeith Whitwell/* With a little more work, llvmpipe will be able to turn this off and 3186c0dc4bafbdbdc0cb4b6e5934fe064226dbd47ecKeith Whitwell * do its own x/y clipping. 3196c0dc4bafbdbdc0cb4b6e5934fe064226dbd47ecKeith Whitwell * 3206c0dc4bafbdbdc0cb4b6e5934fe064226dbd47ecKeith Whitwell * Some hardware can turn off clipping altogether - in particular any 3216c0dc4bafbdbdc0cb4b6e5934fe064226dbd47ecKeith Whitwell * hardware with a TNL unit can do its own clipping, even if it is 3226c0dc4bafbdbdc0cb4b6e5934fe064226dbd47ecKeith Whitwell * relying on the draw module for some other reason. 3234b9bcf31f47c4530f22cbbaca73491d01e44a9d4Roland Scheidegger * Setting bypass_clip_points to achieve d3d-style point clipping (the driver 3244b9bcf31f47c4530f22cbbaca73491d01e44a9d4Roland Scheidegger * will need to do the "vp scissoring") _requires_ the driver to implement 3254b9bcf31f47c4530f22cbbaca73491d01e44a9d4Roland Scheidegger * wide points / point sprites itself (points will still be clipped if rasterizer 3264b9bcf31f47c4530f22cbbaca73491d01e44a9d4Roland Scheidegger * point_tri_clip isn't set). Only relevant if bypass_clip_xy isn't set. 3276c0dc4bafbdbdc0cb4b6e5934fe064226dbd47ecKeith Whitwell */ 3280588858702d1a5c9c08573ea6817e2e149473cf6Keith Whitwellvoid draw_set_driver_clipping( struct draw_context *draw, 3296c0dc4bafbdbdc0cb4b6e5934fe064226dbd47ecKeith Whitwell boolean bypass_clip_xy, 3304465efc3bf8d755a9afb7a4bb5382e2f5bf113e1Brian Paul boolean bypass_clip_z, 3314b9bcf31f47c4530f22cbbaca73491d01e44a9d4Roland Scheidegger boolean guard_band_xy, 3324b9bcf31f47c4530f22cbbaca73491d01e44a9d4Roland Scheidegger boolean bypass_clip_points) 3330588858702d1a5c9c08573ea6817e2e149473cf6Keith Whitwell{ 3340588858702d1a5c9c08573ea6817e2e149473cf6Keith Whitwell draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE ); 3350588858702d1a5c9c08573ea6817e2e149473cf6Keith Whitwell 3366c0dc4bafbdbdc0cb4b6e5934fe064226dbd47ecKeith Whitwell draw->driver.bypass_clip_xy = bypass_clip_xy; 3376c0dc4bafbdbdc0cb4b6e5934fe064226dbd47ecKeith Whitwell draw->driver.bypass_clip_z = bypass_clip_z; 3384465efc3bf8d755a9afb7a4bb5382e2f5bf113e1Brian Paul draw->driver.guard_band_xy = guard_band_xy; 3394b9bcf31f47c4530f22cbbaca73491d01e44a9d4Roland Scheidegger draw->driver.bypass_clip_points = bypass_clip_points; 34065ef78e8611556780fce0bee1feba805347ec627Marek Olšák draw_update_clip_flags(draw); 3419fbdf500788e78d63247a17226a75f7a079ae315Brian Paul} 3429fbdf500788e78d63247a17226a75f7a079ae315Brian Paul 3439fbdf500788e78d63247a17226a75f7a079ae315Brian Paul 3449fbdf500788e78d63247a17226a75f7a079ae315Brian Paul/** 345193c85ec7a1aec44eebc67c6224fb6ecbb4607a5Brian Paul * Plug in the primitive rendering/rasterization stage (which is the last 346193c85ec7a1aec44eebc67c6224fb6ecbb4607a5Brian Paul * stage in the drawing pipeline). 3479fbdf500788e78d63247a17226a75f7a079ae315Brian Paul * This is provided by the device driver. 3489fbdf500788e78d63247a17226a75f7a079ae315Brian Paul */ 349de69fc1703f79e5c97e66b654de7a93b7abce8f0Zack Rusinvoid draw_set_rasterize_stage( struct draw_context *draw, 350de69fc1703f79e5c97e66b654de7a93b7abce8f0Zack Rusin struct draw_stage *stage ) 3519fbdf500788e78d63247a17226a75f7a079ae315Brian Paul{ 3521603a33fb276d7e78a2e872dfa05aa0093d1329aBrian Paul draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE ); 3531603a33fb276d7e78a2e872dfa05aa0093d1329aBrian Paul 354de69fc1703f79e5c97e66b654de7a93b7abce8f0Zack Rusin draw->pipeline.rasterize = stage; 3559fbdf500788e78d63247a17226a75f7a079ae315Brian Paul} 3569fbdf500788e78d63247a17226a75f7a079ae315Brian Paul 3579fbdf500788e78d63247a17226a75f7a079ae315Brian Paul 3589fbdf500788e78d63247a17226a75f7a079ae315Brian Paul/** 3599fbdf500788e78d63247a17226a75f7a079ae315Brian Paul * Set the draw module's clipping state. 3609fbdf500788e78d63247a17226a75f7a079ae315Brian Paul */ 3619fbdf500788e78d63247a17226a75f7a079ae315Brian Paulvoid draw_set_clip_state( struct draw_context *draw, 3629fbdf500788e78d63247a17226a75f7a079ae315Brian Paul const struct pipe_clip_state *clip ) 3639fbdf500788e78d63247a17226a75f7a079ae315Brian Paul{ 3644b73cdb864aef6d64c35a7ab9a59e4ee4e3f9d0fBrian Paul draw_do_flush(draw, DRAW_FLUSH_PARAMETER_CHANGE); 36508589f71051e588b0bb7d0c8b529976c85398dd1Keith Whitwell 366dc4c821f0817a3db716f965692fb701079f66340Marek Olšák memcpy(&draw->plane[6], clip->ucp, sizeof(clip->ucp)); 3679fbdf500788e78d63247a17226a75f7a079ae315Brian Paul} 3689fbdf500788e78d63247a17226a75f7a079ae315Brian Paul 3699fbdf500788e78d63247a17226a75f7a079ae315Brian Paul 3709fbdf500788e78d63247a17226a75f7a079ae315Brian Paul/** 3719fbdf500788e78d63247a17226a75f7a079ae315Brian Paul * Set the draw module's viewport state. 3729fbdf500788e78d63247a17226a75f7a079ae315Brian Paul */ 373eaabb4ead07ae043ecc789024028e225ebd0f318Zack Rusinvoid draw_set_viewport_states( struct draw_context *draw, 374eaabb4ead07ae043ecc789024028e225ebd0f318Zack Rusin unsigned start_slot, 375eaabb4ead07ae043ecc789024028e225ebd0f318Zack Rusin unsigned num_viewports, 376eaabb4ead07ae043ecc789024028e225ebd0f318Zack Rusin const struct pipe_viewport_state *vps ) 3779fbdf500788e78d63247a17226a75f7a079ae315Brian Paul{ 378eaabb4ead07ae043ecc789024028e225ebd0f318Zack Rusin const struct pipe_viewport_state *viewport = vps; 3794b73cdb864aef6d64c35a7ab9a59e4ee4e3f9d0fBrian Paul draw_do_flush(draw, DRAW_FLUSH_PARAMETER_CHANGE); 38062628c4d3d497cbca73fde869c9069fa90e6453eKeith Whitwell 381d7d676252d2ae1fd6d3dd76d4e205251ad7c6152Zack Rusin debug_assert(start_slot < PIPE_MAX_VIEWPORTS); 382d7d676252d2ae1fd6d3dd76d4e205251ad7c6152Zack Rusin debug_assert((start_slot + num_viewports) <= PIPE_MAX_VIEWPORTS); 3837756aae815a26c533948081c2c319c20bcf5962cZack Rusin 3847756aae815a26c533948081c2c319c20bcf5962cZack Rusin memcpy(draw->viewports + start_slot, vps, 3857756aae815a26c533948081c2c319c20bcf5962cZack Rusin sizeof(struct pipe_viewport_state) * num_viewports); 386d7d676252d2ae1fd6d3dd76d4e205251ad7c6152Zack Rusin 3877756aae815a26c533948081c2c319c20bcf5962cZack Rusin draw->identity_viewport = (num_viewports == 1) && 3887756aae815a26c533948081c2c319c20bcf5962cZack Rusin (viewport->scale[0] == 1.0f && 3897756aae815a26c533948081c2c319c20bcf5962cZack Rusin viewport->scale[1] == 1.0f && 3907756aae815a26c533948081c2c319c20bcf5962cZack Rusin viewport->scale[2] == 1.0f && 3917756aae815a26c533948081c2c319c20bcf5962cZack Rusin viewport->translate[0] == 0.0f && 3927756aae815a26c533948081c2c319c20bcf5962cZack Rusin viewport->translate[1] == 0.0f && 3932efabd9f5a711a7f6cd1846630244b7814bf25b3Marek Olšák viewport->translate[2] == 0.0f); 39465ef78e8611556780fce0bee1feba805347ec627Marek Olšák draw_update_viewport_flags(draw); 3959fbdf500788e78d63247a17226a75f7a079ae315Brian Paul} 3960a262998ef2813d19e9fee01d3e5808416e9cb04Brian Paul 3970a262998ef2813d19e9fee01d3e5808416e9cb04Brian Paul 39863a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian Paul 39963a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian Paulvoid 400a52c0416d1f2105960b4646e2e268aed26814689Brian Pauldraw_set_vertex_buffers(struct draw_context *draw, 401e73bf3b805de78299f1a652668ba4e6eab9bac94Marek Olšák unsigned start_slot, unsigned count, 402a52c0416d1f2105960b4646e2e268aed26814689Brian Paul const struct pipe_vertex_buffer *buffers) 4030a262998ef2813d19e9fee01d3e5808416e9cb04Brian Paul{ 404e73bf3b805de78299f1a652668ba4e6eab9bac94Marek Olšák assert(start_slot + count <= PIPE_MAX_ATTRIBS); 405a52c0416d1f2105960b4646e2e268aed26814689Brian Paul 406e73bf3b805de78299f1a652668ba4e6eab9bac94Marek Olšák util_set_vertex_buffers_count(draw->pt.vertex_buffer, 407e73bf3b805de78299f1a652668ba4e6eab9bac94Marek Olšák &draw->pt.nr_vertex_buffers, 408e73bf3b805de78299f1a652668ba4e6eab9bac94Marek Olšák buffers, start_slot, count); 4090a262998ef2813d19e9fee01d3e5808416e9cb04Brian Paul} 4100a262998ef2813d19e9fee01d3e5808416e9cb04Brian Paul 4110a262998ef2813d19e9fee01d3e5808416e9cb04Brian Paul 4120a262998ef2813d19e9fee01d3e5808416e9cb04Brian Paulvoid 413a52c0416d1f2105960b4646e2e268aed26814689Brian Pauldraw_set_vertex_elements(struct draw_context *draw, 414a52c0416d1f2105960b4646e2e268aed26814689Brian Paul unsigned count, 415a52c0416d1f2105960b4646e2e268aed26814689Brian Paul const struct pipe_vertex_element *elements) 4160a262998ef2813d19e9fee01d3e5808416e9cb04Brian Paul{ 417a52c0416d1f2105960b4646e2e268aed26814689Brian Paul assert(count <= PIPE_MAX_ATTRIBS); 418a52c0416d1f2105960b4646e2e268aed26814689Brian Paul 419b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz /* We could improve this by only flushing the frontend and the fetch part 420b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz * of the middle. This would avoid recalculating the emit keys.*/ 421b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE ); 422b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz 4237d72607e142c0412b88183b849fd701e698b8f79Keith Whitwell memcpy(draw->pt.vertex_element, elements, count * sizeof(elements[0])); 4247d72607e142c0412b88183b849fd701e698b8f79Keith Whitwell draw->pt.nr_vertex_elements = count; 4250a262998ef2813d19e9fee01d3e5808416e9cb04Brian Paul} 4260a262998ef2813d19e9fee01d3e5808416e9cb04Brian Paul 4270a262998ef2813d19e9fee01d3e5808416e9cb04Brian Paul 42863a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian Paul/** 42963a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian Paul * Tell drawing context where to find mapped vertex buffers. 43063a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian Paul */ 4310a262998ef2813d19e9fee01d3e5808416e9cb04Brian Paulvoid 43263a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian Pauldraw_set_mapped_vertex_buffer(struct draw_context *draw, 43329853ab7b8656cee9b92a53bec43f6e9f1e49691Zack Rusin unsigned attr, const void *buffer, 43429853ab7b8656cee9b92a53bec43f6e9f1e49691Zack Rusin size_t size) 4350a262998ef2813d19e9fee01d3e5808416e9cb04Brian Paul{ 43629853ab7b8656cee9b92a53bec43f6e9f1e49691Zack Rusin draw->pt.user.vbuffer[attr].map = buffer; 43729853ab7b8656cee9b92a53bec43f6e9f1e49691Zack Rusin draw->pt.user.vbuffer[attr].size = size; 43863a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian Paul} 43963a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian Paul 44063a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian Paul 44163a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian Paulvoid 44263a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian Pauldraw_set_mapped_constant_buffer(struct draw_context *draw, 44389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin unsigned shader_type, 4449851644435f991a1a1bbb145333a97601627b37dMichal Krol unsigned slot, 44589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin const void *buffer, 446bb2e13b9e82b68ec3b9fc56a4c35e7ead8fd138fKeith Whitwell unsigned size ) 44763a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian Paul{ 44889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin debug_assert(shader_type == PIPE_SHADER_VERTEX || 44989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin shader_type == PIPE_SHADER_GEOMETRY); 4507c5f255201f42303188137f56ea8acc030444f0eMichal Krol debug_assert(slot < PIPE_MAX_CONSTANT_BUFFERS); 4519851644435f991a1a1bbb145333a97601627b37dMichal Krol 4524b73cdb864aef6d64c35a7ab9a59e4ee4e3f9d0fBrian Paul draw_do_flush(draw, DRAW_FLUSH_PARAMETER_CHANGE); 4534b73cdb864aef6d64c35a7ab9a59e4ee4e3f9d0fBrian Paul 454ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul switch (shader_type) { 455ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul case PIPE_SHADER_VERTEX: 4569851644435f991a1a1bbb145333a97601627b37dMichal Krol draw->pt.user.vs_constants[slot] = buffer; 457ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul draw->pt.user.vs_constants_size[slot] = size; 458ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul break; 459ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul case PIPE_SHADER_GEOMETRY: 4609851644435f991a1a1bbb145333a97601627b37dMichal Krol draw->pt.user.gs_constants[slot] = buffer; 461ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul draw->pt.user.gs_constants_size[slot] = size; 462ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul break; 463ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul default: 464ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul assert(0 && "invalid shader type in draw_set_mapped_constant_buffer"); 46589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin } 4660a262998ef2813d19e9fee01d3e5808416e9cb04Brian Paul} 46763a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian Paul 46863a51aee86f76ae54fb1ce572d584fb0f01aaec5Brian Paul 469f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian Paul/** 4705e29aab1752c3e07ae2ebde4cb00e6550dab0eb2Brian Paul * Tells the draw module to draw points with triangles if their size 4715e29aab1752c3e07ae2ebde4cb00e6550dab0eb2Brian Paul * is greater than this threshold. 472f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian Paul */ 473f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian Paulvoid 4745e29aab1752c3e07ae2ebde4cb00e6550dab0eb2Brian Pauldraw_wide_point_threshold(struct draw_context *draw, float threshold) 475f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian Paul{ 4761603a33fb276d7e78a2e872dfa05aa0093d1329aBrian Paul draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE ); 477507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell draw->pipeline.wide_point_threshold = threshold; 478f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian Paul} 479f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian Paul 480f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian Paul 481f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian Paul/** 4828cb223eb020560d59c8f73e09b832cef477933b7Brian Paul * Should the draw module handle point->quad conversion for drawing sprites? 4838cb223eb020560d59c8f73e09b832cef477933b7Brian Paul */ 4848cb223eb020560d59c8f73e09b832cef477933b7Brian Paulvoid 4858cb223eb020560d59c8f73e09b832cef477933b7Brian Pauldraw_wide_point_sprites(struct draw_context *draw, boolean draw_sprite) 4868cb223eb020560d59c8f73e09b832cef477933b7Brian Paul{ 4878cb223eb020560d59c8f73e09b832cef477933b7Brian Paul draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE ); 4888cb223eb020560d59c8f73e09b832cef477933b7Brian Paul draw->pipeline.wide_point_sprites = draw_sprite; 4898cb223eb020560d59c8f73e09b832cef477933b7Brian Paul} 4908cb223eb020560d59c8f73e09b832cef477933b7Brian Paul 4918cb223eb020560d59c8f73e09b832cef477933b7Brian Paul 4928cb223eb020560d59c8f73e09b832cef477933b7Brian Paul/** 493a1a13954885cd469faab49633b5386e5c889e3dfBrian Paul * Tells the draw module to draw lines with triangles if their width 494a1a13954885cd469faab49633b5386e5c889e3dfBrian Paul * is greater than this threshold. 495f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian Paul */ 496f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian Paulvoid 497a1a13954885cd469faab49633b5386e5c889e3dfBrian Pauldraw_wide_line_threshold(struct draw_context *draw, float threshold) 498f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian Paul{ 4991603a33fb276d7e78a2e872dfa05aa0093d1329aBrian Paul draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE ); 5004586e6c8cb5b391536a370faa0c419c3fd541693José Fonseca draw->pipeline.wide_line_threshold = roundf(threshold); 501f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian Paul} 50208589f71051e588b0bb7d0c8b529976c85398dd1Keith Whitwell 50308589f71051e588b0bb7d0c8b529976c85398dd1Keith Whitwell 50408589f71051e588b0bb7d0c8b529976c85398dd1Keith Whitwell/** 5058b8c9acdb747499149e633179a8ad10b0e4206b1Brian Paul * Tells the draw module whether or not to implement line stipple. 5068b8c9acdb747499149e633179a8ad10b0e4206b1Brian Paul */ 5078b8c9acdb747499149e633179a8ad10b0e4206b1Brian Paulvoid 5088b8c9acdb747499149e633179a8ad10b0e4206b1Brian Pauldraw_enable_line_stipple(struct draw_context *draw, boolean enable) 5098b8c9acdb747499149e633179a8ad10b0e4206b1Brian Paul{ 5108b8c9acdb747499149e633179a8ad10b0e4206b1Brian Paul draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE ); 511507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell draw->pipeline.line_stipple = enable; 5128b8c9acdb747499149e633179a8ad10b0e4206b1Brian Paul} 5138b8c9acdb747499149e633179a8ad10b0e4206b1Brian Paul 5148b8c9acdb747499149e633179a8ad10b0e4206b1Brian Paul 5158b8c9acdb747499149e633179a8ad10b0e4206b1Brian Paul/** 5165a09ad8248ce452136ed96a3d46532b03c877618Brian Paul * Tells draw module whether to convert points to quads for sprite mode. 5175a09ad8248ce452136ed96a3d46532b03c877618Brian Paul */ 5185a09ad8248ce452136ed96a3d46532b03c877618Brian Paulvoid 5195a09ad8248ce452136ed96a3d46532b03c877618Brian Pauldraw_enable_point_sprites(struct draw_context *draw, boolean enable) 5205a09ad8248ce452136ed96a3d46532b03c877618Brian Paul{ 5215a09ad8248ce452136ed96a3d46532b03c877618Brian Paul draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE ); 522507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell draw->pipeline.point_sprite = enable; 5235a09ad8248ce452136ed96a3d46532b03c877618Brian Paul} 5245a09ad8248ce452136ed96a3d46532b03c877618Brian Paul 5255a09ad8248ce452136ed96a3d46532b03c877618Brian Paul 526c48da7d78b4e7bdbe056b3c9668756d49019be06Keith Whitwellvoid 527c48da7d78b4e7bdbe056b3c9668756d49019be06Keith Whitwelldraw_set_force_passthrough( struct draw_context *draw, boolean enable ) 528c48da7d78b4e7bdbe056b3c9668756d49019be06Keith Whitwell{ 529c48da7d78b4e7bdbe056b3c9668756d49019be06Keith Whitwell draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE ); 530c48da7d78b4e7bdbe056b3c9668756d49019be06Keith Whitwell draw->force_passthrough = enable; 531c48da7d78b4e7bdbe056b3c9668756d49019be06Keith Whitwell} 532c48da7d78b4e7bdbe056b3c9668756d49019be06Keith Whitwell 533c48da7d78b4e7bdbe056b3c9668756d49019be06Keith Whitwell 534e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul 535e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul/** 536102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca * Allocate an extra vertex/geometry shader vertex attribute, if it doesn't 537102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca * exist already. 538102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca * 539e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul * This is used by some of the optional draw module stages such 540e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul * as wide_point which may need to allocate additional generic/texcoord 541e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul * attributes. 542e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul */ 543e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paulint 544e22e3927b056806e9bbb089734132ad0bcb98df1Brian Pauldraw_alloc_extra_vertex_attrib(struct draw_context *draw, 545e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul uint semantic_name, uint semantic_index) 546e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul{ 547102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca int slot; 548102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca uint num_outputs; 549102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca uint n; 550102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca 551102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca slot = draw_find_shader_output(draw, semantic_name, semantic_index); 5524b5595b38b3884531624fab6def7c604e92d0914Zack Rusin if (slot >= 0) { 553102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca return slot; 554102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca } 555102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca 556102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca num_outputs = draw_current_shader_outputs(draw); 557102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca n = draw->extra_shader_outputs.num; 558e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul 559489df4a71aca99b2eebc62c02215a5860def944dBrian Paul assert(n < ARRAY_SIZE(draw->extra_shader_outputs.semantic_name)); 560e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul 561e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul draw->extra_shader_outputs.semantic_name[n] = semantic_name; 562e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul draw->extra_shader_outputs.semantic_index[n] = semantic_index; 563e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul draw->extra_shader_outputs.slot[n] = num_outputs + n; 564e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul draw->extra_shader_outputs.num++; 565e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul 566e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul return draw->extra_shader_outputs.slot[n]; 567e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul} 568e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul 569e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul 570e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul/** 571e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul * Remove all extra vertex attributes that were allocated with 572e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul * draw_alloc_extra_vertex_attrib(). 573e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul */ 574e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paulvoid 575e22e3927b056806e9bbb089734132ad0bcb98df1Brian Pauldraw_remove_extra_vertex_attribs(struct draw_context *draw) 576e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul{ 577e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul draw->extra_shader_outputs.num = 0; 578e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul} 579e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul 580e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul 5815a09ad8248ce452136ed96a3d46532b03c877618Brian Paul/** 582102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca * If a geometry shader is present, return its info, else the vertex shader's 583102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca * info. 584102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca */ 585102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonsecastruct tgsi_shader_info * 586102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonsecadraw_get_shader_info(const struct draw_context *draw) 587102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca{ 588102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca 589102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca if (draw->gs.geometry_shader) { 590102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca return &draw->gs.geometry_shader->info; 591102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca } else { 592102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca return &draw->vs.vertex_shader->info; 593102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca } 594102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca} 595102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca 596d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin/** 597d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin * Prepare outputs slots from the draw module 598d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin * 599d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin * Certain parts of the draw module can emit additional 600d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin * outputs that can be quite useful to the backends, a good 601d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin * example of it is the process of decomposing primitives 602d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin * into wireframes (aka. lines) which normally would lose 603d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin * the face-side information, but using this method we can 604d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin * inject another shader output which passes the original 605d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin * face side information to the backend. 606d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin */ 607d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusinvoid 608d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusindraw_prepare_shader_outputs(struct draw_context *draw) 609d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin{ 61057cd3267782fcf92d1e7d772760956516d4367dfZack Rusin draw_remove_extra_vertex_attribs(draw); 611662a4d4a120cb0a07023f00e3c5e4a0809428a53Zack Rusin draw_prim_assembler_prepare_outputs(draw->ia); 612d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin draw_unfilled_prepare_outputs(draw, draw->pipeline.unfilled); 61389a665eb5fa176f68223bf54a472d6a0567c3546Marek Olšák if (draw->pipeline.aapoint) 61489a665eb5fa176f68223bf54a472d6a0567c3546Marek Olšák draw_aapoint_prepare_outputs(draw, draw->pipeline.aapoint); 61589a665eb5fa176f68223bf54a472d6a0567c3546Marek Olšák if (draw->pipeline.aaline) 61689a665eb5fa176f68223bf54a472d6a0567c3546Marek Olšák draw_aaline_prepare_outputs(draw, draw->pipeline.aaline); 617d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin} 618102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca 619102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca/** 620d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian Paul * Ask the draw module for the location/slot of the given vertex attribute in 621d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian Paul * a post-transformed vertex. 622d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian Paul * 623d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian Paul * With this function, drivers that use the draw module should have no reason 62489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin * to track the current vertex/geometry shader. 625d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian Paul * 626d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian Paul * Note that the draw module may sometimes generate vertices with extra 627d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian Paul * attributes (such as texcoords for AA lines). The driver can call this 628d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian Paul * function to find those attributes. 629d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian Paul * 6304b5595b38b3884531624fab6def7c604e92d0914Zack Rusin * -1 is returned if the attribute is not found since this is 631644b8346fda0283842888010365410f24e790725Roland Scheidegger * an undefined situation. Note, that zero is valid and can 6324b5595b38b3884531624fab6def7c604e92d0914Zack Rusin * be used by any of the attributes, because position is not 6334b5595b38b3884531624fab6def7c604e92d0914Zack Rusin * required to be attribute 0 or even at all present. 634aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian Paul */ 635aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian Paulint 63689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusindraw_find_shader_output(const struct draw_context *draw, 63789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin uint semantic_name, uint semantic_index) 638aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian Paul{ 639102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca const struct tgsi_shader_info *info = draw_get_shader_info(draw); 640d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian Paul uint i; 64189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 64289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin for (i = 0; i < info->num_outputs; i++) { 64389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin if (info->output_semantic_name[i] == semantic_name && 64489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin info->output_semantic_index[i] == semantic_index) 645d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian Paul return i; 646d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian Paul } 647d6c7f7e314ee9f034402c919d142bf6ba9844ec9Brian Paul 648e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul /* Search the extra vertex attributes */ 649e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul for (i = 0; i < draw->extra_shader_outputs.num; i++) { 650e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul if (draw->extra_shader_outputs.semantic_name[i] == semantic_name && 651e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul draw->extra_shader_outputs.semantic_index[i] == semantic_index) { 652e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul return draw->extra_shader_outputs.slot[i]; 653e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul } 654aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian Paul } 65589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 6564b5595b38b3884531624fab6def7c604e92d0914Zack Rusin return -1; 657aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian Paul} 658aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian Paul 659aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian Paul 660aceeb80d4f706980aaf71b8e098d4c6718d8ac90Brian Paul/** 661c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul * Return total number of the shader outputs. This function is similar to 662c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul * draw_current_shader_outputs() but this function also counts any extra 663c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul * vertex/geometry output attributes that may be filled in by some draw 664c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul * stages (such as AA point, AA line). 66589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin * 66689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin * If geometry shader is present, its output will be returned, 66789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin * if not vertex shader is used. 6681774b177b858f9f87d00e54b0bf00e9634e375e9Brian Paul */ 6691774b177b858f9f87d00e54b0bf00e9634e375e9Brian Pauluint 67089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusindraw_num_shader_outputs(const struct draw_context *draw) 6711774b177b858f9f87d00e54b0bf00e9634e375e9Brian Paul{ 672102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca const struct tgsi_shader_info *info = draw_get_shader_info(draw); 673e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul uint count; 67489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 675102bf6e2a70f565f03d5e9c4995b29d61c0aa165José Fonseca count = info->num_outputs; 676e22e3927b056806e9bbb089734132ad0bcb98df1Brian Paul count += draw->extra_shader_outputs.num; 67789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 6781774b177b858f9f87d00e54b0bf00e9634e375e9Brian Paul return count; 6791774b177b858f9f87d00e54b0bf00e9634e375e9Brian Paul} 6801774b177b858f9f87d00e54b0bf00e9634e375e9Brian Paul 6811774b177b858f9f87d00e54b0bf00e9634e375e9Brian Paul 682f2bccfd3c806a879abf0c40858806ec3825d0628Brian Paul/** 68305487ef88ded5fea0b1de7bc08d44846648d1ce2Zack Rusin * Return total number of the vertex shader outputs. This function 68405487ef88ded5fea0b1de7bc08d44846648d1ce2Zack Rusin * also counts any extra vertex output attributes that may 68505487ef88ded5fea0b1de7bc08d44846648d1ce2Zack Rusin * be filled in by some draw stages (such as AA point, AA line, 68605487ef88ded5fea0b1de7bc08d44846648d1ce2Zack Rusin * front face). 68705487ef88ded5fea0b1de7bc08d44846648d1ce2Zack Rusin */ 68805487ef88ded5fea0b1de7bc08d44846648d1ce2Zack Rusinuint 68905487ef88ded5fea0b1de7bc08d44846648d1ce2Zack Rusindraw_total_vs_outputs(const struct draw_context *draw) 69005487ef88ded5fea0b1de7bc08d44846648d1ce2Zack Rusin{ 69105487ef88ded5fea0b1de7bc08d44846648d1ce2Zack Rusin const struct tgsi_shader_info *info = &draw->vs.vertex_shader->info; 69205487ef88ded5fea0b1de7bc08d44846648d1ce2Zack Rusin 693fea5c2640b564daf47608215b2156e5b18f7d262Roland Scheidegger return info->num_outputs + draw->extra_shader_outputs.num; 69405487ef88ded5fea0b1de7bc08d44846648d1ce2Zack Rusin} 69505487ef88ded5fea0b1de7bc08d44846648d1ce2Zack Rusin 69605487ef88ded5fea0b1de7bc08d44846648d1ce2Zack Rusin/** 69705487ef88ded5fea0b1de7bc08d44846648d1ce2Zack Rusin * Return total number of the geometry shader outputs. This function 69805487ef88ded5fea0b1de7bc08d44846648d1ce2Zack Rusin * also counts any extra geometry output attributes that may 69905487ef88ded5fea0b1de7bc08d44846648d1ce2Zack Rusin * be filled in by some draw stages (such as AA point, AA line, front 70005487ef88ded5fea0b1de7bc08d44846648d1ce2Zack Rusin * face). 70105487ef88ded5fea0b1de7bc08d44846648d1ce2Zack Rusin */ 70205487ef88ded5fea0b1de7bc08d44846648d1ce2Zack Rusinuint 70305487ef88ded5fea0b1de7bc08d44846648d1ce2Zack Rusindraw_total_gs_outputs(const struct draw_context *draw) 70405487ef88ded5fea0b1de7bc08d44846648d1ce2Zack Rusin{ 70505487ef88ded5fea0b1de7bc08d44846648d1ce2Zack Rusin const struct tgsi_shader_info *info; 70605487ef88ded5fea0b1de7bc08d44846648d1ce2Zack Rusin 70705487ef88ded5fea0b1de7bc08d44846648d1ce2Zack Rusin if (!draw->gs.geometry_shader) 70805487ef88ded5fea0b1de7bc08d44846648d1ce2Zack Rusin return 0; 70905487ef88ded5fea0b1de7bc08d44846648d1ce2Zack Rusin 71005487ef88ded5fea0b1de7bc08d44846648d1ce2Zack Rusin info = &draw->gs.geometry_shader->info; 71105487ef88ded5fea0b1de7bc08d44846648d1ce2Zack Rusin 71205487ef88ded5fea0b1de7bc08d44846648d1ce2Zack Rusin return info->num_outputs + draw->extra_shader_outputs.num; 71305487ef88ded5fea0b1de7bc08d44846648d1ce2Zack Rusin} 71405487ef88ded5fea0b1de7bc08d44846648d1ce2Zack Rusin 71505487ef88ded5fea0b1de7bc08d44846648d1ce2Zack Rusin 71605487ef88ded5fea0b1de7bc08d44846648d1ce2Zack Rusin/** 717c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul * Provide TGSI sampler objects for vertex/geometry shaders that use 718bef196c7929606bb8c7e9c06fe83a90fc0d95f09Brian Paul * texture fetches. This state only needs to be set once per context. 719f2bccfd3c806a879abf0c40858806ec3825d0628Brian Paul * This might only be used by software drivers for the time being. 720f2bccfd3c806a879abf0c40858806ec3825d0628Brian Paul */ 721f2bccfd3c806a879abf0c40858806ec3825d0628Brian Paulvoid 7226b35c2b110be0d9ae6a292250fdcbab11a9190a5Roland Scheideggerdraw_texture_sampler(struct draw_context *draw, 7236b35c2b110be0d9ae6a292250fdcbab11a9190a5Roland Scheidegger uint shader, 7246b35c2b110be0d9ae6a292250fdcbab11a9190a5Roland Scheidegger struct tgsi_sampler *sampler) 725f2bccfd3c806a879abf0c40858806ec3825d0628Brian Paul{ 72653bd9796a1395e4acde884ff55cb7ee18586595aZack Rusin if (shader == PIPE_SHADER_VERTEX) { 7276b35c2b110be0d9ae6a292250fdcbab11a9190a5Roland Scheidegger draw->vs.tgsi.sampler = sampler; 72853bd9796a1395e4acde884ff55cb7ee18586595aZack Rusin } else { 72953bd9796a1395e4acde884ff55cb7ee18586595aZack Rusin debug_assert(shader == PIPE_SHADER_GEOMETRY); 7306b35c2b110be0d9ae6a292250fdcbab11a9190a5Roland Scheidegger draw->gs.tgsi.sampler = sampler; 73153bd9796a1395e4acde884ff55cb7ee18586595aZack Rusin } 732f2bccfd3c806a879abf0c40858806ec3825d0628Brian Paul} 733f2bccfd3c806a879abf0c40858806ec3825d0628Brian Paul 7340d1f679dedfb47944259e846d7f2eadbcf0907caDave Airlie/** 7350d1f679dedfb47944259e846d7f2eadbcf0907caDave Airlie * Provide TGSI image objects for vertex/geometry shaders that use 7360d1f679dedfb47944259e846d7f2eadbcf0907caDave Airlie * texture fetches. This state only needs to be set once per context. 7370d1f679dedfb47944259e846d7f2eadbcf0907caDave Airlie * This might only be used by software drivers for the time being. 7380d1f679dedfb47944259e846d7f2eadbcf0907caDave Airlie */ 7390d1f679dedfb47944259e846d7f2eadbcf0907caDave Airlievoid 7400d1f679dedfb47944259e846d7f2eadbcf0907caDave Airliedraw_image(struct draw_context *draw, 7410d1f679dedfb47944259e846d7f2eadbcf0907caDave Airlie uint shader, 7420d1f679dedfb47944259e846d7f2eadbcf0907caDave Airlie struct tgsi_image *image) 7430d1f679dedfb47944259e846d7f2eadbcf0907caDave Airlie{ 7440d1f679dedfb47944259e846d7f2eadbcf0907caDave Airlie if (shader == PIPE_SHADER_VERTEX) { 7450d1f679dedfb47944259e846d7f2eadbcf0907caDave Airlie draw->vs.tgsi.image = image; 7460d1f679dedfb47944259e846d7f2eadbcf0907caDave Airlie } else { 7470d1f679dedfb47944259e846d7f2eadbcf0907caDave Airlie debug_assert(shader == PIPE_SHADER_GEOMETRY); 7480d1f679dedfb47944259e846d7f2eadbcf0907caDave Airlie draw->gs.tgsi.image = image; 7490d1f679dedfb47944259e846d7f2eadbcf0907caDave Airlie } 7500d1f679dedfb47944259e846d7f2eadbcf0907caDave Airlie} 7510d1f679dedfb47944259e846d7f2eadbcf0907caDave Airlie 752c2aeeca4554d744b6293ad87d9a183e51b0138ffDave Airlie/** 753c2aeeca4554d744b6293ad87d9a183e51b0138ffDave Airlie * Provide TGSI buffer objects for vertex/geometry shaders that use 754c2aeeca4554d744b6293ad87d9a183e51b0138ffDave Airlie * load/store/atomic ops. This state only needs to be set once per context. 755c2aeeca4554d744b6293ad87d9a183e51b0138ffDave Airlie * This might only be used by software drivers for the time being. 756c2aeeca4554d744b6293ad87d9a183e51b0138ffDave Airlie */ 757c2aeeca4554d744b6293ad87d9a183e51b0138ffDave Airlievoid 758c2aeeca4554d744b6293ad87d9a183e51b0138ffDave Airliedraw_buffer(struct draw_context *draw, 759c2aeeca4554d744b6293ad87d9a183e51b0138ffDave Airlie uint shader, 760c2aeeca4554d744b6293ad87d9a183e51b0138ffDave Airlie struct tgsi_buffer *buffer) 761c2aeeca4554d744b6293ad87d9a183e51b0138ffDave Airlie{ 762c2aeeca4554d744b6293ad87d9a183e51b0138ffDave Airlie if (shader == PIPE_SHADER_VERTEX) { 763c2aeeca4554d744b6293ad87d9a183e51b0138ffDave Airlie draw->vs.tgsi.buffer = buffer; 764c2aeeca4554d744b6293ad87d9a183e51b0138ffDave Airlie } else { 765c2aeeca4554d744b6293ad87d9a183e51b0138ffDave Airlie debug_assert(shader == PIPE_SHADER_GEOMETRY); 766c2aeeca4554d744b6293ad87d9a183e51b0138ffDave Airlie draw->gs.tgsi.buffer = buffer; 767c2aeeca4554d744b6293ad87d9a183e51b0138ffDave Airlie } 768c2aeeca4554d744b6293ad87d9a183e51b0138ffDave Airlie} 769f2bccfd3c806a879abf0c40858806ec3825d0628Brian Paul 7703e22180fc893bb09bf6b990bc4e858fd85f522abJosé Fonseca 771297b3be25a7f097fb9b1a79e332acddc12dcc3feKeith Whitwellvoid draw_set_render( struct draw_context *draw, 772297b3be25a7f097fb9b1a79e332acddc12dcc3feKeith Whitwell struct vbuf_render *render ) 773297b3be25a7f097fb9b1a79e332acddc12dcc3feKeith Whitwell{ 774297b3be25a7f097fb9b1a79e332acddc12dcc3feKeith Whitwell draw->render = render; 775297b3be25a7f097fb9b1a79e332acddc12dcc3feKeith Whitwell} 77684501e68f6294370d6f2f6aec4e7eab57bcc0e72Keith Whitwell 777280bcff1fa200b790d8712946a4ffbaa47a67433Keith Whitwell 7784f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu/** 779185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Paul * Tell the draw module where vertex indexes/elements are located, and 780185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Paul * their size (in bytes). 781185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Paul * 782185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Paul * Note: the caller must apply the pipe_index_buffer::offset value to 783185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Paul * the address. The draw module doesn't do that. 7844f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu */ 7854f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wuvoid 786185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Pauldraw_set_indexes(struct draw_context *draw, 7875104ed3dbf18d47736fc67a8e3e317ea18360fa8Zack Rusin const void *elements, unsigned elem_size, 7885104ed3dbf18d47736fc67a8e3e317ea18360fa8Zack Rusin unsigned elem_buffer_space) 789185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Paul{ 790185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Paul assert(elem_size == 0 || 791185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Paul elem_size == 1 || 792185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Paul elem_size == 2 || 793185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Paul elem_size == 4); 794185ed2105829d6f5eb19edb9abbf0d7977e157c3Brian Paul draw->pt.user.elts = elements; 7952988fa940e1d8a4531fddff4d554eec1e6e04474Marek Olšák draw->pt.user.eltSizeIB = elem_size; 7965104ed3dbf18d47736fc67a8e3e317ea18360fa8Zack Rusin if (elem_size) 7975104ed3dbf18d47736fc67a8e3e317ea18360fa8Zack Rusin draw->pt.user.eltMax = elem_buffer_space / elem_size; 7985104ed3dbf18d47736fc67a8e3e317ea18360fa8Zack Rusin else 7995104ed3dbf18d47736fc67a8e3e317ea18360fa8Zack Rusin draw->pt.user.eltMax = 0; 8004f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu} 8014f024e0f642f4f743e4d051ec71c00e45bfd361fChia-I Wu 80266891826421d5b774e081f7a2a85580cd0523fabKeith Whitwell 803507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell/* Revamp me please: 804507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell */ 805507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwellvoid draw_do_flush( struct draw_context *draw, unsigned flags ) 806507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell{ 80714d1ca8d867d6e44c756cb759f92421107118b2eBrian Paul if (!draw->suspend_flushing) 808507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell { 80914d1ca8d867d6e44c756cb759f92421107118b2eBrian Paul assert(!draw->flushing); /* catch inadvertant recursion */ 81014d1ca8d867d6e44c756cb759f92421107118b2eBrian Paul 811507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell draw->flushing = TRUE; 812507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell 813e7bac4276634ea1ee81ac71f6f6869f87e689872Keith Whitwell draw_pipeline_flush( draw, flags ); 814e7bac4276634ea1ee81ac71f6f6869f87e689872Keith Whitwell 815b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz draw_pt_flush( draw, flags ); 816b6d3a435a0e0e53a9e8cc4c4249dc7c2f897a83dJakob Bornecrantz 817507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell draw->flushing = FALSE; 818507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell } 819507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell} 82089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 82189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 822c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul/** 823c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul * Return the number of output attributes produced by the geometry 824c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul * shader, if present. If no geometry shader, return the number of 825c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul * outputs from the vertex shader. 826c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul * \sa draw_num_shader_outputs 827c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul */ 828256f7f5ab2123bae9549e4f572276e200dc1ae76Brian Pauluint 829256f7f5ab2123bae9549e4f572276e200dc1ae76Brian Pauldraw_current_shader_outputs(const struct draw_context *draw) 83089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin{ 83189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin if (draw->gs.geometry_shader) 83289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin return draw->gs.num_gs_outputs; 83389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin return draw->vs.num_vs_outputs; 83489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin} 83589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 836c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul 837c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul/** 838c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul * Return the index of the shader output which will contain the 839c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul * vertex position. 840c740a7da6142a9d7c4affddba519b75d47de24fdBrian Paul */ 841256f7f5ab2123bae9549e4f572276e200dc1ae76Brian Pauluint 842256f7f5ab2123bae9549e4f572276e200dc1ae76Brian Pauldraw_current_shader_position_output(const struct draw_context *draw) 84389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin{ 84489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin if (draw->gs.geometry_shader) 84589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin return draw->gs.position_output; 84689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin return draw->vs.position_output; 84789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin} 848e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul 849e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul 850e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul/** 85140c5987ed84f9f0b8bb1f707bb13c1aafc39330aDave Airlie * Return the index of the shader output which will contain the 8527756aae815a26c533948081c2c319c20bcf5962cZack Rusin * viewport index. 8537756aae815a26c533948081c2c319c20bcf5962cZack Rusin */ 8547756aae815a26c533948081c2c319c20bcf5962cZack Rusinuint 8557756aae815a26c533948081c2c319c20bcf5962cZack Rusindraw_current_shader_viewport_index_output(const struct draw_context *draw) 8567756aae815a26c533948081c2c319c20bcf5962cZack Rusin{ 8577756aae815a26c533948081c2c319c20bcf5962cZack Rusin if (draw->gs.geometry_shader) 8587756aae815a26c533948081c2c319c20bcf5962cZack Rusin return draw->gs.geometry_shader->viewport_index_output; 8594b6d6642d2c64ce67d65ead480fb99104a7e2d3aRoland Scheidegger return draw->vs.vertex_shader->viewport_index_output; 8607756aae815a26c533948081c2c319c20bcf5962cZack Rusin} 8617756aae815a26c533948081c2c319c20bcf5962cZack Rusin 8627756aae815a26c533948081c2c319c20bcf5962cZack Rusin/** 8637756aae815a26c533948081c2c319c20bcf5962cZack Rusin * Returns true if there's a geometry shader bound and the geometry 8647756aae815a26c533948081c2c319c20bcf5962cZack Rusin * shader writes out a viewport index. 8657756aae815a26c533948081c2c319c20bcf5962cZack Rusin */ 8667756aae815a26c533948081c2c319c20bcf5962cZack Rusinboolean 8677756aae815a26c533948081c2c319c20bcf5962cZack Rusindraw_current_shader_uses_viewport_index(const struct draw_context *draw) 8687756aae815a26c533948081c2c319c20bcf5962cZack Rusin{ 8697756aae815a26c533948081c2c319c20bcf5962cZack Rusin if (draw->gs.geometry_shader) 8707756aae815a26c533948081c2c319c20bcf5962cZack Rusin return draw->gs.geometry_shader->info.writes_viewport_index; 8714b6d6642d2c64ce67d65ead480fb99104a7e2d3aRoland Scheidegger return draw->vs.vertex_shader->info.writes_viewport_index; 8727756aae815a26c533948081c2c319c20bcf5962cZack Rusin} 8737756aae815a26c533948081c2c319c20bcf5962cZack Rusin 8747756aae815a26c533948081c2c319c20bcf5962cZack Rusin 8757756aae815a26c533948081c2c319c20bcf5962cZack Rusin/** 8767756aae815a26c533948081c2c319c20bcf5962cZack Rusin * Return the index of the shader output which will contain the 8776e9005e8b0e72e7a29cd9700d3bcb2459922c01eRoland Scheidegger * clip vertex position. 8786e9005e8b0e72e7a29cd9700d3bcb2459922c01eRoland Scheidegger * Note we don't support clipvertex output in the gs. For clipping 8796e9005e8b0e72e7a29cd9700d3bcb2459922c01eRoland Scheidegger * to work correctly hence we return ordinary position output instead. 88040c5987ed84f9f0b8bb1f707bb13c1aafc39330aDave Airlie */ 88140c5987ed84f9f0b8bb1f707bb13c1aafc39330aDave Airlieuint 88240c5987ed84f9f0b8bb1f707bb13c1aafc39330aDave Airliedraw_current_shader_clipvertex_output(const struct draw_context *draw) 88340c5987ed84f9f0b8bb1f707bb13c1aafc39330aDave Airlie{ 8846e9005e8b0e72e7a29cd9700d3bcb2459922c01eRoland Scheidegger if (draw->gs.geometry_shader) 8856e9005e8b0e72e7a29cd9700d3bcb2459922c01eRoland Scheidegger return draw->gs.position_output; 88640c5987ed84f9f0b8bb1f707bb13c1aafc39330aDave Airlie return draw->vs.clipvertex_output; 88740c5987ed84f9f0b8bb1f707bb13c1aafc39330aDave Airlie} 88840c5987ed84f9f0b8bb1f707bb13c1aafc39330aDave Airlie 8891865f341d8f45b389061fc08d2da90b7aa8a6099Dave Airlieuint 890d17062a40e16454a15aa037a4d1d9e9562cedd46Dave Airliedraw_current_shader_ccdistance_output(const struct draw_context *draw, int index) 8911865f341d8f45b389061fc08d2da90b7aa8a6099Dave Airlie{ 8925507c11f85dda4fbcdc9b36494551c933471a070Zack Rusin debug_assert(index < PIPE_MAX_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT); 893c1a50f5ed7beb2f6aecfbacdc3339c8cb0107257Zack Rusin if (draw->gs.geometry_shader) 894d17062a40e16454a15aa037a4d1d9e9562cedd46Dave Airlie return draw->gs.geometry_shader->ccdistance_output[index]; 895d17062a40e16454a15aa037a4d1d9e9562cedd46Dave Airlie return draw->vs.ccdistance_output[index]; 8961865f341d8f45b389061fc08d2da90b7aa8a6099Dave Airlie} 8971865f341d8f45b389061fc08d2da90b7aa8a6099Dave Airlie 898c1a50f5ed7beb2f6aecfbacdc3339c8cb0107257Zack Rusin 899c1a50f5ed7beb2f6aecfbacdc3339c8cb0107257Zack Rusinuint 900c1a50f5ed7beb2f6aecfbacdc3339c8cb0107257Zack Rusindraw_current_shader_num_written_clipdistances(const struct draw_context *draw) 901c1a50f5ed7beb2f6aecfbacdc3339c8cb0107257Zack Rusin{ 902c1a50f5ed7beb2f6aecfbacdc3339c8cb0107257Zack Rusin if (draw->gs.geometry_shader) 903c1a50f5ed7beb2f6aecfbacdc3339c8cb0107257Zack Rusin return draw->gs.geometry_shader->info.num_written_clipdistance; 904c1a50f5ed7beb2f6aecfbacdc3339c8cb0107257Zack Rusin return draw->vs.vertex_shader->info.num_written_clipdistance; 905c1a50f5ed7beb2f6aecfbacdc3339c8cb0107257Zack Rusin} 906c1a50f5ed7beb2f6aecfbacdc3339c8cb0107257Zack Rusin 907babe35a067d1610d9032cc28eec8e16b18685621Zack Rusinuint 908babe35a067d1610d9032cc28eec8e16b18685621Zack Rusindraw_current_shader_num_written_culldistances(const struct draw_context *draw) 909babe35a067d1610d9032cc28eec8e16b18685621Zack Rusin{ 910babe35a067d1610d9032cc28eec8e16b18685621Zack Rusin if (draw->gs.geometry_shader) 911babe35a067d1610d9032cc28eec8e16b18685621Zack Rusin return draw->gs.geometry_shader->info.num_written_culldistance; 912babe35a067d1610d9032cc28eec8e16b18685621Zack Rusin return draw->vs.vertex_shader->info.num_written_culldistance; 913babe35a067d1610d9032cc28eec8e16b18685621Zack Rusin} 914babe35a067d1610d9032cc28eec8e16b18685621Zack Rusin 91540c5987ed84f9f0b8bb1f707bb13c1aafc39330aDave Airlie/** 916e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul * Return a pointer/handle for a driver/CSO rasterizer object which 917e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul * disabled culling, stippling, unfilled tris, etc. 918e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul * This is used by some pipeline stages (such as wide_point, aa_line 919e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul * and aa_point) which convert points/lines into triangles. In those 920e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul * cases we don't want to accidentally cull the triangles. 921e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul * 922e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul * \param scissor should the rasterizer state enable scissoring? 923e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul * \param flatshade should the rasterizer state use flat shading? 924e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul * \return rasterizer CSO handle 925e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul */ 926e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paulvoid * 927e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Pauldraw_get_rasterizer_no_cull( struct draw_context *draw, 928e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul boolean scissor, 929e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul boolean flatshade ) 930e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul{ 931e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul if (!draw->rasterizer_no_cull[scissor][flatshade]) { 932e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul /* create now */ 933e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul struct pipe_context *pipe = draw->pipe; 934e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul struct pipe_rasterizer_state rast; 935e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul 936e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul memset(&rast, 0, sizeof(rast)); 937e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul rast.scissor = scissor; 938e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul rast.flatshade = flatshade; 9390bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell rast.front_ccw = 1; 9402737abb44efebfa10ac84b183c20fc5818d1514eJosé Fonseca rast.half_pixel_center = draw->rasterizer->half_pixel_center; 9412737abb44efebfa10ac84b183c20fc5818d1514eJosé Fonseca rast.bottom_edge_rule = draw->rasterizer->bottom_edge_rule; 9427c1bf8e381b914f88335686cc6561f89dcca9ae5José Fonseca rast.clip_halfz = draw->rasterizer->clip_halfz; 943e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul 944e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul draw->rasterizer_no_cull[scissor][flatshade] = 945e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul pipe->create_rasterizer_state(pipe, &rast); 946e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul } 947e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul return draw->rasterizer_no_cull[scissor][flatshade]; 948e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul} 949a45b7f47ee0e38b288cc8fc4f6a1c013e8c227bcZack Rusin 950a45b7f47ee0e38b288cc8fc4f6a1c013e8c227bcZack Rusinvoid 951ec8cbd79ac4065111365a6720c9564de56855cc8Dave Airliedraw_set_mapped_so_targets(struct draw_context *draw, 952ec8cbd79ac4065111365a6720c9564de56855cc8Dave Airlie int num_targets, 9539542131b273d01d2c3403e6791172347cb792e34Zack Rusin struct draw_so_target *targets[PIPE_MAX_SO_BUFFERS]) 954ec8cbd79ac4065111365a6720c9564de56855cc8Dave Airlie{ 955ec8cbd79ac4065111365a6720c9564de56855cc8Dave Airlie int i; 956ec8cbd79ac4065111365a6720c9564de56855cc8Dave Airlie 9579542131b273d01d2c3403e6791172347cb792e34Zack Rusin for (i = 0; i < num_targets; i++) 958ec8cbd79ac4065111365a6720c9564de56855cc8Dave Airlie draw->so.targets[i] = targets[i]; 959ec8cbd79ac4065111365a6720c9564de56855cc8Dave Airlie for (i = num_targets; i < PIPE_MAX_SO_BUFFERS; i++) 960ec8cbd79ac4065111365a6720c9564de56855cc8Dave Airlie draw->so.targets[i] = NULL; 961ec8cbd79ac4065111365a6720c9564de56855cc8Dave Airlie 962ec8cbd79ac4065111365a6720c9564de56855cc8Dave Airlie draw->so.num_targets = num_targets; 963ec8cbd79ac4065111365a6720c9564de56855cc8Dave Airlie} 964ec8cbd79ac4065111365a6720c9564de56855cc8Dave Airlie 965ec8cbd79ac4065111365a6720c9564de56855cc8Dave Airlievoid 96601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusindraw_set_sampler_views(struct draw_context *draw, 967532db3b7881f3dfcd299320cbf44443d06b88373Kai Wasserbäch enum pipe_shader_type shader_stage, 96801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin struct pipe_sampler_view **views, 96901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin unsigned num) 97001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin{ 97101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin unsigned i; 97201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 9733e3f99277df947a96029580dc4e66ae38a93f004José Fonseca debug_assert(shader_stage < PIPE_SHADER_TYPES); 974c789b981b244333cfc903bcd1e2fefc010500013Roland Scheidegger debug_assert(num <= PIPE_MAX_SHADER_SAMPLER_VIEWS); 97501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 976c0ba1080df4fa75ba23f254f2f998c97af70764bRoland Scheidegger draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE ); 977c0ba1080df4fa75ba23f254f2f998c97af70764bRoland Scheidegger 978a2c1df4c9a7375bc5306e8cfd07a9f7087759a96Brian Paul for (i = 0; i < num; ++i) 979a2c1df4c9a7375bc5306e8cfd07a9f7087759a96Brian Paul draw->sampler_views[shader_stage][i] = views[i]; 980c789b981b244333cfc903bcd1e2fefc010500013Roland Scheidegger for (i = num; i < PIPE_MAX_SHADER_SAMPLER_VIEWS; ++i) 981a2c1df4c9a7375bc5306e8cfd07a9f7087759a96Brian Paul draw->sampler_views[shader_stage][i] = NULL; 98201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 983a2c1df4c9a7375bc5306e8cfd07a9f7087759a96Brian Paul draw->num_sampler_views[shader_stage] = num; 98401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin} 98501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 98601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusinvoid 98701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusindraw_set_samplers(struct draw_context *draw, 988532db3b7881f3dfcd299320cbf44443d06b88373Kai Wasserbäch enum pipe_shader_type shader_stage, 98901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin struct pipe_sampler_state **samplers, 99001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin unsigned num) 99101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin{ 99201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin unsigned i; 99301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 9943e3f99277df947a96029580dc4e66ae38a93f004José Fonseca debug_assert(shader_stage < PIPE_SHADER_TYPES); 9953e3f99277df947a96029580dc4e66ae38a93f004José Fonseca debug_assert(num <= PIPE_MAX_SAMPLERS); 99601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 997c0ba1080df4fa75ba23f254f2f998c97af70764bRoland Scheidegger draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE ); 998c0ba1080df4fa75ba23f254f2f998c97af70764bRoland Scheidegger 999a2c1df4c9a7375bc5306e8cfd07a9f7087759a96Brian Paul for (i = 0; i < num; ++i) 1000a2c1df4c9a7375bc5306e8cfd07a9f7087759a96Brian Paul draw->samplers[shader_stage][i] = samplers[i]; 10013e3f99277df947a96029580dc4e66ae38a93f004José Fonseca for (i = num; i < PIPE_MAX_SAMPLERS; ++i) 1002a2c1df4c9a7375bc5306e8cfd07a9f7087759a96Brian Paul draw->samplers[shader_stage][i] = NULL; 100301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 1004a2c1df4c9a7375bc5306e8cfd07a9f7087759a96Brian Paul draw->num_samplers[shader_stage] = num; 10050cb545a7f2e823c85309013c4c41e9461f297d06Brian Paul 100634041968f883253de639f137a761340e84f82bb9José Fonseca#ifdef HAVE_LLVM 1007d066133a7637864bde46b8118778c526826583a6Zack Rusin if (draw->llvm) 1008d066133a7637864bde46b8118778c526826583a6Zack Rusin draw_llvm_set_sampler_state(draw, shader_stage); 10090cb545a7f2e823c85309013c4c41e9461f297d06Brian Paul#endif 101001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin} 101101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 101201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusinvoid 101301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusindraw_set_mapped_texture(struct draw_context *draw, 1014df87fb59136eb302d72eac4b58fd8ffb25989ed5Brian Paul unsigned shader_stage, 101520183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger unsigned sview_idx, 101601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin uint32_t width, uint32_t height, uint32_t depth, 101708070cead0bb79d4441d8c5b900d1571bb63c670Fabian Bieler uint32_t first_level, uint32_t last_level, 101826097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger const void *base_ptr, 1019048a90c1cb926fdeae47392582cb91b0a689905fBrian Paul uint32_t row_stride[PIPE_MAX_TEXTURE_LEVELS], 1020048a90c1cb926fdeae47392582cb91b0a689905fBrian Paul uint32_t img_stride[PIPE_MAX_TEXTURE_LEVELS], 102126097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger uint32_t mip_offsets[PIPE_MAX_TEXTURE_LEVELS]) 102201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin{ 102334041968f883253de639f137a761340e84f82bb9José Fonseca#ifdef HAVE_LLVM 1024e96f4e3b853ff5fe4d927c69695c0b5f1966d448Zack Rusin if (draw->llvm) 1025e96f4e3b853ff5fe4d927c69695c0b5f1966d448Zack Rusin draw_llvm_set_mapped_texture(draw, 1026e96f4e3b853ff5fe4d927c69695c0b5f1966d448Zack Rusin shader_stage, 1027e96f4e3b853ff5fe4d927c69695c0b5f1966d448Zack Rusin sview_idx, 1028e96f4e3b853ff5fe4d927c69695c0b5f1966d448Zack Rusin width, height, depth, first_level, 1029e96f4e3b853ff5fe4d927c69695c0b5f1966d448Zack Rusin last_level, base_ptr, 1030e96f4e3b853ff5fe4d927c69695c0b5f1966d448Zack Rusin row_stride, img_stride, mip_offsets); 103101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin#endif 103201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin} 10336dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca 10346dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca/** 10356dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca * XXX: Results for PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS because there are two 10366dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca * different ways of setting textures, and drivers typically only support one. 10376dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca */ 10386dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonsecaint 10396dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonsecadraw_get_shader_param_no_llvm(unsigned shader, enum pipe_shader_cap param) 10406dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca{ 10416dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca switch(shader) { 10426dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca case PIPE_SHADER_VERTEX: 10436dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca case PIPE_SHADER_GEOMETRY: 10446dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca return tgsi_exec_get_shader_param(param); 10456dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca default: 10466dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca return 0; 10476dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca } 10486dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca} 10496dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca 10506dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca/** 10516dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca * XXX: Results for PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS because there are two 10526dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca * different ways of setting textures, and drivers typically only support one. 10539af68e9b1d116cdc8eb6a22bac091fe4716679e6Roland Scheidegger * Drivers requesting a draw context explicitly without llvm must call 10549af68e9b1d116cdc8eb6a22bac091fe4716679e6Roland Scheidegger * draw_get_shader_param_no_llvm instead. 10556dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca */ 10566dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonsecaint 10576dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonsecadraw_get_shader_param(unsigned shader, enum pipe_shader_cap param) 10586dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca{ 10596dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca 106034041968f883253de639f137a761340e84f82bb9José Fonseca#ifdef HAVE_LLVM 10616dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca if (draw_get_option_use_llvm()) { 10626dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca switch(shader) { 10636dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca case PIPE_SHADER_VERTEX: 10646dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca case PIPE_SHADER_GEOMETRY: 10656dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca return gallivm_get_shader_param(param); 10666dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca default: 10676dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca return 0; 10686dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca } 10696dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca } 10706dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca#endif 10716dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca 10726dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca return draw_get_shader_param_no_llvm(shader, param); 10736dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca} 10746dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca 107580ee4a407a2668f6a6a410c3e56ae9910510f773Zack Rusin/** 107680ee4a407a2668f6a6a410c3e56ae9910510f773Zack Rusin * Enables or disables collection of statistics. 107780ee4a407a2668f6a6a410c3e56ae9910510f773Zack Rusin * 107880ee4a407a2668f6a6a410c3e56ae9910510f773Zack Rusin * Draw module is capable of generating statistics for the vertex 107980ee4a407a2668f6a6a410c3e56ae9910510f773Zack Rusin * processing pipeline. Collection of that data isn't free and so 108080ee4a407a2668f6a6a410c3e56ae9910510f773Zack Rusin * it's disabled by default. The users of the module can enable 108180ee4a407a2668f6a6a410c3e56ae9910510f773Zack Rusin * (or disable) this functionality through this function. 108280ee4a407a2668f6a6a410c3e56ae9910510f773Zack Rusin * The actual data will be emitted through the VBUF interface, 108380ee4a407a2668f6a6a410c3e56ae9910510f773Zack Rusin * the 'pipeline_statistics' callback to be exact. 108480ee4a407a2668f6a6a410c3e56ae9910510f773Zack Rusin */ 108580ee4a407a2668f6a6a410c3e56ae9910510f773Zack Rusinvoid 108680ee4a407a2668f6a6a410c3e56ae9910510f773Zack Rusindraw_collect_pipeline_statistics(struct draw_context *draw, 108780ee4a407a2668f6a6a410c3e56ae9910510f773Zack Rusin boolean enable) 108880ee4a407a2668f6a6a410c3e56ae9910510f773Zack Rusin{ 108980ee4a407a2668f6a6a410c3e56ae9910510f773Zack Rusin draw->collect_statistics = enable; 109080ee4a407a2668f6a6a410c3e56ae9910510f773Zack Rusin} 10910a3779d95537343505200ad096acf135dcd81b80Zack Rusin 10920a3779d95537343505200ad096acf135dcd81b80Zack Rusin/** 10930a3779d95537343505200ad096acf135dcd81b80Zack Rusin * Computes clipper invocation statistics. 10940a3779d95537343505200ad096acf135dcd81b80Zack Rusin * 10950a3779d95537343505200ad096acf135dcd81b80Zack Rusin * Figures out how many primitives would have been 10960a3779d95537343505200ad096acf135dcd81b80Zack Rusin * sent to the clipper given the specified 10970a3779d95537343505200ad096acf135dcd81b80Zack Rusin * prim info data. 10980a3779d95537343505200ad096acf135dcd81b80Zack Rusin */ 10990a3779d95537343505200ad096acf135dcd81b80Zack Rusinvoid 11000a3779d95537343505200ad096acf135dcd81b80Zack Rusindraw_stats_clipper_primitives(struct draw_context *draw, 11010a3779d95537343505200ad096acf135dcd81b80Zack Rusin const struct draw_prim_info *prim_info) 11020a3779d95537343505200ad096acf135dcd81b80Zack Rusin{ 11030a3779d95537343505200ad096acf135dcd81b80Zack Rusin if (draw->collect_statistics) { 1104e5f306e3ffe99ab497fe48dfb3fda333303147e7Brian Paul unsigned i; 1105e5f306e3ffe99ab497fe48dfb3fda333303147e7Brian Paul for (i = 0; i < prim_info->primitive_count; i++) { 11060a3779d95537343505200ad096acf135dcd81b80Zack Rusin draw->statistics.c_invocations += 11070a3779d95537343505200ad096acf135dcd81b80Zack Rusin u_decomposed_prims_for_vertices(prim_info->prim, 11080a3779d95537343505200ad096acf135dcd81b80Zack Rusin prim_info->primitive_lengths[i]); 11090a3779d95537343505200ad096acf135dcd81b80Zack Rusin } 11100a3779d95537343505200ad096acf135dcd81b80Zack Rusin } 11110a3779d95537343505200ad096acf135dcd81b80Zack Rusin} 1112d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin 1113d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin 1114d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin/** 1115d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin * Returns true if the draw module will inject the frontface 1116d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin * info into the outputs. 1117d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin * 1118d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin * Given the specified primitive and rasterizer state 1119d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin * the function will figure out if the draw module 1120d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin * will inject the front-face information into shader 1121d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin * outputs. This is done to preserve the front-facing 1122d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin * info when decomposing primitives into wireframes. 1123d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin */ 1124d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusinboolean 1125d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusindraw_will_inject_frontface(const struct draw_context *draw) 1126d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin{ 1127d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin unsigned reduced_prim = u_reduced_prim(draw->pt.prim); 1128d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin const struct pipe_rasterizer_state *rast = draw->rasterizer; 1129d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin 1130d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin if (reduced_prim != PIPE_PRIM_TRIANGLES) { 1131d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin return FALSE; 1132d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin } 1133d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin 1134d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin return (rast && 1135d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin (rast->fill_front != PIPE_POLYGON_MODE_FILL || 1136d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin rast->fill_back != PIPE_POLYGON_MODE_FILL)); 1137d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin} 1138