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