draw_context.c revision 7ec681f3
1/**************************************************************************
2 *
3 * Copyright 2007 VMware, Inc.
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
16 * of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 **************************************************************************/
27
28 /*
29  * Authors:
30  *   Keith Whitwell <keithw@vmware.com>
31  */
32
33
34#include "pipe/p_context.h"
35#include "util/u_memory.h"
36#include "util/u_math.h"
37#include "util/u_cpu_detect.h"
38#include "util/u_inlines.h"
39#include "util/u_helpers.h"
40#include "util/u_prim.h"
41#include "util/format/u_format.h"
42#include "draw_context.h"
43#include "draw_pipe.h"
44#include "draw_prim_assembler.h"
45#include "draw_vs.h"
46#include "draw_gs.h"
47#include "draw_tess.h"
48
49#ifdef DRAW_LLVM_AVAILABLE
50#include "gallivm/lp_bld_init.h"
51#include "gallivm/lp_bld_limits.h"
52#include "draw_llvm.h"
53
54boolean
55draw_get_option_use_llvm(void)
56{
57   return debug_get_bool_option("DRAW_USE_LLVM", TRUE);
58}
59#else
60boolean
61draw_get_option_use_llvm(void)
62{
63   return FALSE;
64}
65#endif
66
67bool
68draw_has_llvm(void)
69{
70#ifdef DRAW_LLVM_AVAILABLE
71   return draw_get_option_use_llvm();
72#else
73   return false;
74#endif
75}
76
77/**
78 * Create new draw module context with gallivm state for LLVM JIT.
79 */
80static struct draw_context *
81draw_create_context(struct pipe_context *pipe, void *context,
82                    boolean try_llvm)
83{
84   struct draw_context *draw = CALLOC_STRUCT( draw_context );
85   if (!draw)
86      goto err_out;
87
88   /* we need correct cpu caps for disabling denorms in draw_vbo() */
89   util_cpu_detect();
90
91#ifdef DRAW_LLVM_AVAILABLE
92   if (try_llvm && draw_get_option_use_llvm()) {
93      draw->llvm = draw_llvm_create(draw, (LLVMContextRef)context);
94   }
95#endif
96
97   draw->pipe = pipe;
98   draw->constant_buffer_stride = (sizeof(float) * 4);
99
100   if (!draw_init(draw))
101      goto err_destroy;
102
103   draw->ia = draw_prim_assembler_create(draw);
104   if (!draw->ia)
105      goto err_destroy;
106
107   return draw;
108
109err_destroy:
110   draw_destroy( draw );
111err_out:
112   return NULL;
113}
114
115
116/**
117 * Create new draw module context, with LLVM JIT.
118 */
119struct draw_context *
120draw_create(struct pipe_context *pipe)
121{
122   return draw_create_context(pipe, NULL, TRUE);
123}
124
125
126#ifdef DRAW_LLVM_AVAILABLE
127struct draw_context *
128draw_create_with_llvm_context(struct pipe_context *pipe,
129                              void *context)
130{
131   return draw_create_context(pipe, context, TRUE);
132}
133#endif
134
135/**
136 * Create a new draw context, without LLVM JIT.
137 */
138struct draw_context *
139draw_create_no_llvm(struct pipe_context *pipe)
140{
141   return draw_create_context(pipe, NULL, FALSE);
142}
143
144
145boolean draw_init(struct draw_context *draw)
146{
147   /*
148    * Note that several functions compute the clipmask of the predefined
149    * formats with hardcoded formulas instead of using these. So modifications
150    * here must be reflected there too.
151    */
152
153   ASSIGN_4V( draw->plane[0], -1,  0,  0, 1 );
154   ASSIGN_4V( draw->plane[1],  1,  0,  0, 1 );
155   ASSIGN_4V( draw->plane[2],  0, -1,  0, 1 );
156   ASSIGN_4V( draw->plane[3],  0,  1,  0, 1 );
157   ASSIGN_4V( draw->plane[4],  0,  0,  1, 1 ); /* yes these are correct */
158   ASSIGN_4V( draw->plane[5],  0,  0, -1, 1 ); /* mesa's a bit wonky */
159   draw->clip_xy = TRUE;
160   draw->clip_z = TRUE;
161
162   draw->pt.user.planes = (float (*) [DRAW_TOTAL_CLIP_PLANES][4]) &(draw->plane[0]);
163   draw->pt.user.eltMax = ~0;
164
165   if (!draw_pipeline_init( draw ))
166      return FALSE;
167
168   if (!draw_pt_init( draw ))
169      return FALSE;
170
171   if (!draw_vs_init( draw ))
172      return FALSE;
173
174   if (!draw_gs_init( draw ))
175      return FALSE;
176
177   draw->quads_always_flatshade_last = !draw->pipe->screen->get_param(
178      draw->pipe->screen, PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION);
179
180   draw->floating_point_depth = false;
181
182   return TRUE;
183}
184
185/*
186 * Called whenever we're starting to draw a new instance.
187 * Some internal structures don't want to have to reset internal
188 * members on each invocation (because their state might have to persist
189 * between multiple primitive restart rendering call) but might have to
190 * for each new instance.
191 * This is particularly the case for primitive id's in geometry shader.
192 */
193void draw_new_instance(struct draw_context *draw)
194{
195   draw_geometry_shader_new_instance(draw->gs.geometry_shader);
196   draw_prim_assembler_new_instance(draw->ia);
197}
198
199
200void draw_destroy( struct draw_context *draw )
201{
202   struct pipe_context *pipe;
203   unsigned i, j, k;
204
205   if (!draw)
206      return;
207
208   pipe = draw->pipe;
209
210   /* free any rasterizer CSOs that we may have created.
211    */
212   for (i = 0; i < 2; i++) {
213      for (j = 0; j < 2; j++) {
214         for (k = 0; k < 2; k++) {
215            if (draw->rasterizer_no_cull[i][j][k]) {
216               pipe->delete_rasterizer_state(pipe, draw->rasterizer_no_cull[i][j][k]);
217            }
218         }
219      }
220   }
221
222   for (i = 0; i < draw->pt.nr_vertex_buffers; i++)
223      pipe_vertex_buffer_unreference(&draw->pt.vertex_buffer[i]);
224
225   /* Not so fast -- we're just borrowing this at the moment.
226    *
227   if (draw->render)
228      draw->render->destroy( draw->render );
229   */
230
231   draw_prim_assembler_destroy(draw->ia);
232   draw_pipeline_destroy( draw );
233   draw_pt_destroy( draw );
234   draw_vs_destroy( draw );
235   draw_gs_destroy( draw );
236#ifdef DRAW_LLVM_AVAILABLE
237   if (draw->llvm)
238      draw_llvm_destroy( draw->llvm );
239#endif
240
241   FREE( draw );
242}
243
244
245
246void draw_flush( struct draw_context *draw )
247{
248   draw_do_flush( draw, DRAW_FLUSH_BACKEND );
249}
250
251
252/**
253 * Specify the depth stencil format for the draw pipeline. This function
254 * determines the Minimum Resolvable Depth factor for polygon offset.
255 * This factor potentially depends on the number of Z buffer bits,
256 * the rasterization algorithm and the arithmetic performed on Z
257 * values between vertex shading and rasterization.
258 */
259void draw_set_zs_format(struct draw_context *draw, enum pipe_format format)
260{
261   const struct util_format_description *desc = util_format_description(format);
262
263   draw->floating_point_depth =
264      (util_get_depth_format_type(desc) == UTIL_FORMAT_TYPE_FLOAT);
265
266   draw->mrd = util_get_depth_format_mrd(desc);
267}
268
269
270static bool
271draw_is_vs_window_space(struct draw_context *draw)
272{
273   if (draw->vs.vertex_shader) {
274      struct tgsi_shader_info *info = &draw->vs.vertex_shader->info;
275
276      return info->properties[TGSI_PROPERTY_VS_WINDOW_SPACE_POSITION] != 0;
277   }
278   return false;
279}
280
281
282void
283draw_update_clip_flags(struct draw_context *draw)
284{
285   bool window_space = draw_is_vs_window_space(draw);
286
287   draw->clip_xy = !draw->driver.bypass_clip_xy && !window_space;
288   draw->guard_band_xy = (!draw->driver.bypass_clip_xy &&
289                          draw->driver.guard_band_xy);
290   draw->clip_z = (!draw->driver.bypass_clip_z &&
291                   draw->rasterizer && draw->rasterizer->depth_clip_near) &&
292                  !window_space;
293   draw->clip_user = draw->rasterizer &&
294                     draw->rasterizer->clip_plane_enable != 0 &&
295                     !window_space;
296   draw->guard_band_points_xy = draw->guard_band_xy ||
297                                (draw->driver.bypass_clip_points &&
298                                (draw->rasterizer &&
299                                 draw->rasterizer->point_tri_clip));
300}
301
302
303void
304draw_update_viewport_flags(struct draw_context *draw)
305{
306   bool window_space = draw_is_vs_window_space(draw);
307
308   draw->bypass_viewport = window_space || draw->identity_viewport;
309}
310
311
312/**
313 * Register new primitive rasterization/rendering state.
314 * This causes the drawing pipeline to be rebuilt.
315 */
316void draw_set_rasterizer_state( struct draw_context *draw,
317                                const struct pipe_rasterizer_state *raster,
318                                void *rast_handle )
319{
320   if (!draw->suspend_flushing) {
321      draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
322
323      draw->rasterizer = raster;
324      draw->rast_handle = rast_handle;
325      draw_update_clip_flags(draw);
326   }
327}
328
329/* With a little more work, llvmpipe will be able to turn this off and
330 * do its own x/y clipping.
331 *
332 * Some hardware can turn off clipping altogether - in particular any
333 * hardware with a TNL unit can do its own clipping, even if it is
334 * relying on the draw module for some other reason.
335 * Setting bypass_clip_points to achieve d3d-style point clipping (the driver
336 * will need to do the "vp scissoring") _requires_ the driver to implement
337 * wide points / point sprites itself (points will still be clipped if rasterizer
338 * point_tri_clip isn't set). Only relevant if bypass_clip_xy isn't set.
339 */
340void draw_set_driver_clipping( struct draw_context *draw,
341                               boolean bypass_clip_xy,
342                               boolean bypass_clip_z,
343                               boolean guard_band_xy,
344                               boolean bypass_clip_points)
345{
346   draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
347
348   draw->driver.bypass_clip_xy = bypass_clip_xy;
349   draw->driver.bypass_clip_z = bypass_clip_z;
350   draw->driver.guard_band_xy = guard_band_xy;
351   draw->driver.bypass_clip_points = bypass_clip_points;
352   draw_update_clip_flags(draw);
353}
354
355
356/**
357 * Plug in the primitive rendering/rasterization stage (which is the last
358 * stage in the drawing pipeline).
359 * This is provided by the device driver.
360 */
361void draw_set_rasterize_stage( struct draw_context *draw,
362                               struct draw_stage *stage )
363{
364   draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
365
366   draw->pipeline.rasterize = stage;
367}
368
369
370/**
371 * Set the draw module's clipping state.
372 */
373void draw_set_clip_state( struct draw_context *draw,
374                          const struct pipe_clip_state *clip )
375{
376   draw_do_flush(draw, DRAW_FLUSH_PARAMETER_CHANGE);
377
378   memcpy(&draw->plane[6], clip->ucp, sizeof(clip->ucp));
379}
380
381
382/**
383 * Set the draw module's viewport state.
384 */
385void draw_set_viewport_states( struct draw_context *draw,
386                               unsigned start_slot,
387                               unsigned num_viewports,
388                               const struct pipe_viewport_state *vps )
389{
390   const struct pipe_viewport_state *viewport = vps;
391   draw_do_flush(draw, DRAW_FLUSH_PARAMETER_CHANGE);
392
393   debug_assert(start_slot < PIPE_MAX_VIEWPORTS);
394   debug_assert((start_slot + num_viewports) <= PIPE_MAX_VIEWPORTS);
395
396   memcpy(draw->viewports + start_slot, vps,
397          sizeof(struct pipe_viewport_state) * num_viewports);
398
399   draw->identity_viewport = (num_viewports == 1) &&
400      (viewport->scale[0] == 1.0f &&
401       viewport->scale[1] == 1.0f &&
402       viewport->scale[2] == 1.0f &&
403       viewport->translate[0] == 0.0f &&
404       viewport->translate[1] == 0.0f &&
405       viewport->translate[2] == 0.0f);
406   draw_update_viewport_flags(draw);
407}
408
409
410
411void
412draw_set_vertex_buffers(struct draw_context *draw,
413                        unsigned start_slot, unsigned count,
414                        unsigned unbind_num_trailing_slots,
415                        const struct pipe_vertex_buffer *buffers)
416{
417   assert(start_slot + count <= PIPE_MAX_ATTRIBS);
418
419   util_set_vertex_buffers_count(draw->pt.vertex_buffer,
420                                 &draw->pt.nr_vertex_buffers,
421                                 buffers, start_slot, count,
422                                 unbind_num_trailing_slots, false);
423}
424
425
426void
427draw_set_vertex_elements(struct draw_context *draw,
428                         unsigned count,
429                         const struct pipe_vertex_element *elements)
430{
431   assert(count <= PIPE_MAX_ATTRIBS);
432
433   /* We could improve this by only flushing the frontend and the fetch part
434    * of the middle. This would avoid recalculating the emit keys.*/
435   draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
436
437   memcpy(draw->pt.vertex_element, elements, count * sizeof(elements[0]));
438   draw->pt.nr_vertex_elements = count;
439}
440
441
442/**
443 * Tell drawing context where to find mapped vertex buffers.
444 */
445void
446draw_set_mapped_vertex_buffer(struct draw_context *draw,
447                              unsigned attr, const void *buffer,
448                              size_t size)
449{
450   draw->pt.user.vbuffer[attr].map  = buffer;
451   draw->pt.user.vbuffer[attr].size = size;
452}
453
454
455void
456draw_set_mapped_constant_buffer(struct draw_context *draw,
457                                enum pipe_shader_type shader_type,
458                                unsigned slot,
459                                const void *buffer,
460                                unsigned size )
461{
462   debug_assert(shader_type == PIPE_SHADER_VERTEX ||
463                shader_type == PIPE_SHADER_GEOMETRY ||
464                shader_type == PIPE_SHADER_TESS_CTRL ||
465                shader_type == PIPE_SHADER_TESS_EVAL);
466   debug_assert(slot < PIPE_MAX_CONSTANT_BUFFERS);
467
468   draw_do_flush(draw, DRAW_FLUSH_PARAMETER_CHANGE);
469
470   switch (shader_type) {
471   case PIPE_SHADER_VERTEX:
472      draw->pt.user.vs_constants[slot] = buffer;
473      draw->pt.user.vs_constants_size[slot] = size;
474      break;
475   case PIPE_SHADER_GEOMETRY:
476      draw->pt.user.gs_constants[slot] = buffer;
477      draw->pt.user.gs_constants_size[slot] = size;
478      break;
479   case PIPE_SHADER_TESS_CTRL:
480      draw->pt.user.tcs_constants[slot] = buffer;
481      draw->pt.user.tcs_constants_size[slot] = size;
482      break;
483   case PIPE_SHADER_TESS_EVAL:
484      draw->pt.user.tes_constants[slot] = buffer;
485      draw->pt.user.tes_constants_size[slot] = size;
486      break;
487   default:
488      assert(0 && "invalid shader type in draw_set_mapped_constant_buffer");
489   }
490}
491
492void
493draw_set_mapped_shader_buffer(struct draw_context *draw,
494                              enum pipe_shader_type shader_type,
495                              unsigned slot,
496                              const void *buffer,
497                              unsigned size )
498{
499   debug_assert(shader_type == PIPE_SHADER_VERTEX ||
500                shader_type == PIPE_SHADER_GEOMETRY ||
501                shader_type == PIPE_SHADER_TESS_CTRL ||
502                shader_type == PIPE_SHADER_TESS_EVAL);
503   debug_assert(slot < PIPE_MAX_SHADER_BUFFERS);
504
505   draw_do_flush(draw, DRAW_FLUSH_PARAMETER_CHANGE);
506
507   switch (shader_type) {
508   case PIPE_SHADER_VERTEX:
509      draw->pt.user.vs_ssbos[slot] = buffer;
510      draw->pt.user.vs_ssbos_size[slot] = size;
511      break;
512   case PIPE_SHADER_GEOMETRY:
513      draw->pt.user.gs_ssbos[slot] = buffer;
514      draw->pt.user.gs_ssbos_size[slot] = size;
515      break;
516   case PIPE_SHADER_TESS_CTRL:
517      draw->pt.user.tcs_ssbos[slot] = buffer;
518      draw->pt.user.tcs_ssbos_size[slot] = size;
519      break;
520   case PIPE_SHADER_TESS_EVAL:
521      draw->pt.user.tes_ssbos[slot] = buffer;
522      draw->pt.user.tes_ssbos_size[slot] = size;
523      break;
524   default:
525      assert(0 && "invalid shader type in draw_set_mapped_shader_buffer");
526   }
527}
528
529/**
530 * Tells the draw module to draw points with triangles if their size
531 * is greater than this threshold.
532 */
533void
534draw_wide_point_threshold(struct draw_context *draw, float threshold)
535{
536   draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
537   draw->pipeline.wide_point_threshold = threshold;
538}
539
540
541/**
542 * Should the draw module handle point->quad conversion for drawing sprites?
543 */
544void
545draw_wide_point_sprites(struct draw_context *draw, boolean draw_sprite)
546{
547   draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
548   draw->pipeline.wide_point_sprites = draw_sprite;
549}
550
551
552/**
553 * Tells the draw module to draw lines with triangles if their width
554 * is greater than this threshold.
555 */
556void
557draw_wide_line_threshold(struct draw_context *draw, float threshold)
558{
559   draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
560   draw->pipeline.wide_line_threshold = roundf(threshold);
561}
562
563
564/**
565 * Tells the draw module whether or not to implement line stipple.
566 */
567void
568draw_enable_line_stipple(struct draw_context *draw, boolean enable)
569{
570   draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
571   draw->pipeline.line_stipple = enable;
572}
573
574
575/**
576 * Tells draw module whether to convert points to quads for sprite mode.
577 */
578void
579draw_enable_point_sprites(struct draw_context *draw, boolean enable)
580{
581   draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
582   draw->pipeline.point_sprite = enable;
583}
584
585
586
587/**
588 * Allocate an extra vertex/geometry shader vertex attribute, if it doesn't
589 * exist already.
590 *
591 * This is used by some of the optional draw module stages such
592 * as wide_point which may need to allocate additional generic/texcoord
593 * attributes.
594 */
595int
596draw_alloc_extra_vertex_attrib(struct draw_context *draw,
597                               uint semantic_name, uint semantic_index)
598{
599   int slot;
600   uint num_outputs;
601   uint n;
602
603   slot = draw_find_shader_output(draw, semantic_name, semantic_index);
604   if (slot >= 0) {
605      return slot;
606   }
607
608   num_outputs = draw_current_shader_outputs(draw);
609   n = draw->extra_shader_outputs.num;
610
611   assert(n < ARRAY_SIZE(draw->extra_shader_outputs.semantic_name));
612
613   draw->extra_shader_outputs.semantic_name[n] = semantic_name;
614   draw->extra_shader_outputs.semantic_index[n] = semantic_index;
615   draw->extra_shader_outputs.slot[n] = num_outputs + n;
616   draw->extra_shader_outputs.num++;
617
618   return draw->extra_shader_outputs.slot[n];
619}
620
621
622/**
623 * Remove all extra vertex attributes that were allocated with
624 * draw_alloc_extra_vertex_attrib().
625 */
626void
627draw_remove_extra_vertex_attribs(struct draw_context *draw)
628{
629   draw->extra_shader_outputs.num = 0;
630}
631
632
633/**
634 * If a geometry shader is present, return its info, else the vertex shader's
635 * info.
636 */
637struct tgsi_shader_info *
638draw_get_shader_info(const struct draw_context *draw)
639{
640
641   if (draw->gs.geometry_shader) {
642      return &draw->gs.geometry_shader->info;
643   } else if (draw->tes.tess_eval_shader) {
644      return &draw->tes.tess_eval_shader->info;
645   } else {
646      return &draw->vs.vertex_shader->info;
647   }
648}
649
650/**
651 * Prepare outputs slots from the draw module
652 *
653 * Certain parts of the draw module can emit additional
654 * outputs that can be quite useful to the backends, a good
655 * example of it is the process of decomposing primitives
656 * into wireframes (aka. lines) which normally would lose
657 * the face-side information, but using this method we can
658 * inject another shader output which passes the original
659 * face side information to the backend.
660 */
661void
662draw_prepare_shader_outputs(struct draw_context *draw)
663{
664   draw_remove_extra_vertex_attribs(draw);
665   draw_prim_assembler_prepare_outputs(draw->ia);
666   draw_unfilled_prepare_outputs(draw, draw->pipeline.unfilled);
667   if (draw->pipeline.aapoint)
668      draw_aapoint_prepare_outputs(draw, draw->pipeline.aapoint);
669   if (draw->pipeline.aaline)
670      draw_aaline_prepare_outputs(draw, draw->pipeline.aaline);
671}
672
673/**
674 * Ask the draw module for the location/slot of the given vertex attribute in
675 * a post-transformed vertex.
676 *
677 * With this function, drivers that use the draw module should have no reason
678 * to track the current vertex/geometry shader.
679 *
680 * Note that the draw module may sometimes generate vertices with extra
681 * attributes (such as texcoords for AA lines).  The driver can call this
682 * function to find those attributes.
683 *
684 * -1 is returned if the attribute is not found since this is
685 * an undefined situation. Note, that zero is valid and can
686 * be used by any of the attributes, because position is not
687 * required to be attribute 0 or even at all present.
688 */
689int
690draw_find_shader_output(const struct draw_context *draw,
691                        uint semantic_name, uint semantic_index)
692{
693   const struct tgsi_shader_info *info = draw_get_shader_info(draw);
694   uint i;
695
696   for (i = 0; i < info->num_outputs; i++) {
697      if (info->output_semantic_name[i] == semantic_name &&
698          info->output_semantic_index[i] == semantic_index)
699         return i;
700   }
701
702   /* Search the extra vertex attributes */
703   for (i = 0; i < draw->extra_shader_outputs.num; i++) {
704      if (draw->extra_shader_outputs.semantic_name[i] == semantic_name &&
705          draw->extra_shader_outputs.semantic_index[i] == semantic_index) {
706         return draw->extra_shader_outputs.slot[i];
707      }
708   }
709
710   return -1;
711}
712
713
714/**
715 * Return total number of the shader outputs.  This function is similar to
716 * draw_current_shader_outputs() but this function also counts any extra
717 * vertex/geometry output attributes that may be filled in by some draw
718 * stages (such as AA point, AA line).
719 *
720 * If geometry shader is present, its output will be returned,
721 * if not vertex shader is used.
722 */
723uint
724draw_num_shader_outputs(const struct draw_context *draw)
725{
726   const struct tgsi_shader_info *info = draw_get_shader_info(draw);
727   uint count;
728
729   count = info->num_outputs;
730   count += draw->extra_shader_outputs.num;
731
732   return count;
733}
734
735
736/**
737 * Return total number of the vertex shader outputs.  This function
738 * also counts any extra vertex output attributes that may
739 * be filled in by some draw stages (such as AA point, AA line,
740 * front face).
741 */
742uint
743draw_total_vs_outputs(const struct draw_context *draw)
744{
745   const struct tgsi_shader_info *info = &draw->vs.vertex_shader->info;
746
747   return info->num_outputs + draw->extra_shader_outputs.num;
748}
749
750/**
751 * Return total number of the geometry shader outputs. This function
752 * also counts any extra geometry output attributes that may
753 * be filled in by some draw stages (such as AA point, AA line, front
754 * face).
755 */
756uint
757draw_total_gs_outputs(const struct draw_context *draw)
758{
759   const struct tgsi_shader_info *info;
760
761   if (!draw->gs.geometry_shader)
762      return 0;
763
764   info = &draw->gs.geometry_shader->info;
765
766   return info->num_outputs + draw->extra_shader_outputs.num;
767}
768
769/**
770 * Return total number of the tess ctrl shader outputs.
771 */
772uint
773draw_total_tcs_outputs(const struct draw_context *draw)
774{
775   const struct tgsi_shader_info *info;
776
777   if (!draw->tcs.tess_ctrl_shader)
778      return 0;
779
780   info = &draw->tcs.tess_ctrl_shader->info;
781
782   return info->num_outputs;
783}
784
785/**
786 * Return total number of the tess eval shader outputs.
787 */
788uint
789draw_total_tes_outputs(const struct draw_context *draw)
790{
791   const struct tgsi_shader_info *info;
792
793   if (!draw->tes.tess_eval_shader)
794      return 0;
795
796   info = &draw->tes.tess_eval_shader->info;
797
798   return info->num_outputs + draw->extra_shader_outputs.num;
799}
800
801/**
802 * Provide TGSI sampler objects for vertex/geometry shaders that use
803 * texture fetches.  This state only needs to be set once per context.
804 * This might only be used by software drivers for the time being.
805 */
806void
807draw_texture_sampler(struct draw_context *draw,
808                     enum pipe_shader_type shader,
809                     struct tgsi_sampler *sampler)
810{
811   switch (shader) {
812   case PIPE_SHADER_VERTEX:
813      draw->vs.tgsi.sampler = sampler;
814      break;
815   case PIPE_SHADER_GEOMETRY:
816      draw->gs.tgsi.sampler = sampler;
817      break;
818   case PIPE_SHADER_TESS_CTRL:
819      draw->tcs.tgsi.sampler = sampler;
820      break;
821   case PIPE_SHADER_TESS_EVAL:
822      draw->tes.tgsi.sampler = sampler;
823      break;
824   default:
825      assert(0);
826      break;
827   }
828}
829
830/**
831 * Provide TGSI image objects for vertex/geometry shaders that use
832 * texture fetches.  This state only needs to be set once per context.
833 * This might only be used by software drivers for the time being.
834 */
835void
836draw_image(struct draw_context *draw,
837           enum pipe_shader_type shader,
838           struct tgsi_image *image)
839{
840   switch (shader) {
841   case PIPE_SHADER_VERTEX:
842      draw->vs.tgsi.image = image;
843      break;
844   case PIPE_SHADER_GEOMETRY:
845      draw->gs.tgsi.image = image;
846      break;
847   case PIPE_SHADER_TESS_CTRL:
848      draw->tcs.tgsi.image = image;
849      break;
850   case PIPE_SHADER_TESS_EVAL:
851      draw->tes.tgsi.image = image;
852      break;
853   default:
854      assert(0);
855      break;
856   }
857}
858
859/**
860 * Provide TGSI buffer objects for vertex/geometry shaders that use
861 * load/store/atomic ops.  This state only needs to be set once per context.
862 * This might only be used by software drivers for the time being.
863 */
864void
865draw_buffer(struct draw_context *draw,
866            enum pipe_shader_type shader,
867            struct tgsi_buffer *buffer)
868{
869   switch (shader) {
870   case PIPE_SHADER_VERTEX:
871      draw->vs.tgsi.buffer = buffer;
872      break;
873   case PIPE_SHADER_GEOMETRY:
874      draw->gs.tgsi.buffer = buffer;
875      break;
876   case PIPE_SHADER_TESS_CTRL:
877      draw->tcs.tgsi.buffer = buffer;
878      break;
879   case PIPE_SHADER_TESS_EVAL:
880      draw->tes.tgsi.buffer = buffer;
881      break;
882   default:
883      assert(0);
884      break;
885   }
886}
887
888
889void draw_set_render( struct draw_context *draw,
890		      struct vbuf_render *render )
891{
892   draw->render = render;
893}
894
895
896/**
897 * Tell the draw module where vertex indexes/elements are located, and
898 * their size (in bytes).
899 */
900void
901draw_set_indexes(struct draw_context *draw,
902                 const void *elements, unsigned elem_size,
903                 unsigned elem_buffer_space)
904{
905   assert(elem_size == 0 ||
906          elem_size == 1 ||
907          elem_size == 2 ||
908          elem_size == 4);
909   draw->pt.user.elts = elements;
910   draw->pt.user.eltSizeIB = elem_size;
911   if (elem_size)
912      draw->pt.user.eltMax = elem_buffer_space / elem_size;
913   else
914      draw->pt.user.eltMax = 0;
915}
916
917
918/* Revamp me please:
919 */
920void draw_do_flush( struct draw_context *draw, unsigned flags )
921{
922   if (!draw->suspend_flushing)
923   {
924      assert(!draw->flushing); /* catch inadvertant recursion */
925
926      draw->flushing = TRUE;
927
928      draw_pipeline_flush( draw, flags );
929
930      draw_pt_flush( draw, flags );
931
932      draw->flushing = FALSE;
933   }
934}
935
936
937/**
938 * Return the number of output attributes produced by the geometry
939 * shader, if present.  If no geometry shader, return the number of
940 * outputs from the vertex shader.
941 * \sa draw_num_shader_outputs
942 */
943uint
944draw_current_shader_outputs(const struct draw_context *draw)
945{
946   if (draw->gs.geometry_shader)
947      return draw->gs.num_gs_outputs;
948   return draw->vs.num_vs_outputs;
949}
950
951
952/**
953 * Return the index of the shader output which will contain the
954 * vertex position.
955 */
956uint
957draw_current_shader_position_output(const struct draw_context *draw)
958{
959   if (draw->gs.geometry_shader)
960      return draw->gs.position_output;
961   if (draw->tes.tess_eval_shader)
962      return draw->tes.position_output;
963   return draw->vs.position_output;
964}
965
966
967/**
968 * Return the index of the shader output which will contain the
969 * viewport index.
970 */
971uint
972draw_current_shader_viewport_index_output(const struct draw_context *draw)
973{
974   if (draw->gs.geometry_shader)
975      return draw->gs.geometry_shader->viewport_index_output;
976   else if (draw->tes.tess_eval_shader)
977      return draw->tes.tess_eval_shader->viewport_index_output;
978   return draw->vs.vertex_shader->viewport_index_output;
979}
980
981/**
982 * Returns true if there's a geometry shader bound and the geometry
983 * shader writes out a viewport index.
984 */
985boolean
986draw_current_shader_uses_viewport_index(const struct draw_context *draw)
987{
988   if (draw->gs.geometry_shader)
989      return draw->gs.geometry_shader->info.writes_viewport_index;
990   else if (draw->tes.tess_eval_shader)
991      return draw->tes.tess_eval_shader->info.writes_viewport_index;
992   return draw->vs.vertex_shader->info.writes_viewport_index;
993}
994
995
996/**
997 * Return the index of the shader output which will contain the
998 * clip vertex position.
999 * Note we don't support clipvertex output in the gs. For clipping
1000 * to work correctly hence we return ordinary position output instead.
1001 */
1002uint
1003draw_current_shader_clipvertex_output(const struct draw_context *draw)
1004{
1005   if (draw->gs.geometry_shader)
1006      return draw->gs.clipvertex_output;
1007   if (draw->tes.tess_eval_shader)
1008      return draw->tes.clipvertex_output;
1009   return draw->vs.clipvertex_output;
1010}
1011
1012uint
1013draw_current_shader_ccdistance_output(const struct draw_context *draw, int index)
1014{
1015   debug_assert(index < PIPE_MAX_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT);
1016   if (draw->gs.geometry_shader)
1017      return draw->gs.geometry_shader->ccdistance_output[index];
1018   if (draw->tes.tess_eval_shader)
1019      return draw->tes.tess_eval_shader->ccdistance_output[index];
1020   return draw->vs.ccdistance_output[index];
1021}
1022
1023
1024uint
1025draw_current_shader_num_written_clipdistances(const struct draw_context *draw)
1026{
1027   if (draw->gs.geometry_shader)
1028      return draw->gs.geometry_shader->info.num_written_clipdistance;
1029   if (draw->tes.tess_eval_shader)
1030      return draw->tes.tess_eval_shader->info.num_written_clipdistance;
1031   return draw->vs.vertex_shader->info.num_written_clipdistance;
1032}
1033
1034uint
1035draw_current_shader_num_written_culldistances(const struct draw_context *draw)
1036{
1037   if (draw->gs.geometry_shader)
1038      return draw->gs.geometry_shader->info.num_written_culldistance;
1039   if (draw->tes.tess_eval_shader)
1040      return draw->tes.tess_eval_shader->info.num_written_culldistance;
1041   return draw->vs.vertex_shader->info.num_written_culldistance;
1042}
1043
1044/**
1045 * Return a pointer/handle for a driver/CSO rasterizer object which
1046 * disabled culling, stippling, unfilled tris, etc.
1047 * This is used by some pipeline stages (such as wide_point, aa_line
1048 * and aa_point) which convert points/lines into triangles.  In those
1049 * cases we don't want to accidentally cull the triangles.
1050 *
1051 * \param scissor  should the rasterizer state enable scissoring?
1052 * \param flatshade  should the rasterizer state use flat shading?
1053 * \return  rasterizer CSO handle
1054 */
1055void *
1056draw_get_rasterizer_no_cull( struct draw_context *draw,
1057                             const struct pipe_rasterizer_state *base_rast )
1058{
1059   if (!draw->rasterizer_no_cull[base_rast->scissor][base_rast->flatshade][base_rast->rasterizer_discard]) {
1060      /* create now */
1061      struct pipe_context *pipe = draw->pipe;
1062      struct pipe_rasterizer_state rast;
1063
1064      memset(&rast, 0, sizeof(rast));
1065      rast.scissor = base_rast->scissor;
1066      rast.flatshade = base_rast->flatshade;
1067      rast.rasterizer_discard = base_rast->rasterizer_discard;
1068      rast.front_ccw = 1;
1069      rast.half_pixel_center = draw->rasterizer->half_pixel_center;
1070      rast.bottom_edge_rule = draw->rasterizer->bottom_edge_rule;
1071      rast.clip_halfz = draw->rasterizer->clip_halfz;
1072
1073      draw->rasterizer_no_cull[base_rast->scissor][base_rast->flatshade][base_rast->rasterizer_discard] =
1074         pipe->create_rasterizer_state(pipe, &rast);
1075   }
1076   return draw->rasterizer_no_cull[base_rast->scissor][base_rast->flatshade][base_rast->rasterizer_discard];
1077}
1078
1079void
1080draw_set_mapped_so_targets(struct draw_context *draw,
1081                           int num_targets,
1082                           struct draw_so_target *targets[PIPE_MAX_SO_BUFFERS])
1083{
1084   int i;
1085
1086   draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
1087
1088   for (i = 0; i < num_targets; i++)
1089      draw->so.targets[i] = targets[i];
1090   for (i = num_targets; i < PIPE_MAX_SO_BUFFERS; i++)
1091      draw->so.targets[i] = NULL;
1092
1093   draw->so.num_targets = num_targets;
1094}
1095
1096void
1097draw_set_sampler_views(struct draw_context *draw,
1098                       enum pipe_shader_type shader_stage,
1099                       struct pipe_sampler_view **views,
1100                       unsigned num)
1101{
1102   unsigned i;
1103
1104   debug_assert(shader_stage < PIPE_SHADER_TYPES);
1105   debug_assert(num <= PIPE_MAX_SHADER_SAMPLER_VIEWS);
1106
1107   draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
1108
1109   for (i = 0; i < num; ++i)
1110      draw->sampler_views[shader_stage][i] = views[i];
1111   for (i = num; i < draw->num_sampler_views[shader_stage]; ++i)
1112      draw->sampler_views[shader_stage][i] = NULL;
1113
1114   draw->num_sampler_views[shader_stage] = num;
1115}
1116
1117void
1118draw_set_samplers(struct draw_context *draw,
1119                  enum pipe_shader_type shader_stage,
1120                  struct pipe_sampler_state **samplers,
1121                  unsigned num)
1122{
1123   unsigned i;
1124
1125   debug_assert(shader_stage < PIPE_SHADER_TYPES);
1126   debug_assert(num <= PIPE_MAX_SAMPLERS);
1127
1128   draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
1129
1130   for (i = 0; i < num; ++i)
1131      draw->samplers[shader_stage][i] = samplers[i];
1132   for (i = num; i < PIPE_MAX_SAMPLERS; ++i)
1133      draw->samplers[shader_stage][i] = NULL;
1134
1135   draw->num_samplers[shader_stage] = num;
1136
1137#ifdef DRAW_LLVM_AVAILABLE
1138   if (draw->llvm)
1139      draw_llvm_set_sampler_state(draw, shader_stage);
1140#endif
1141}
1142
1143void
1144draw_set_images(struct draw_context *draw,
1145                enum pipe_shader_type shader_stage,
1146                struct pipe_image_view *views,
1147                unsigned num)
1148{
1149   unsigned i;
1150
1151   debug_assert(shader_stage < PIPE_SHADER_TYPES);
1152   debug_assert(num <= PIPE_MAX_SHADER_IMAGES);
1153
1154   draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
1155
1156   for (i = 0; i < num; ++i)
1157      draw->images[shader_stage][i] = &views[i];
1158   for (i = num; i < draw->num_sampler_views[shader_stage]; ++i)
1159      draw->images[shader_stage][i] = NULL;
1160
1161   draw->num_images[shader_stage] = num;
1162}
1163
1164void
1165draw_set_mapped_texture(struct draw_context *draw,
1166                        enum pipe_shader_type shader_stage,
1167                        unsigned sview_idx,
1168                        uint32_t width, uint32_t height, uint32_t depth,
1169                        uint32_t first_level, uint32_t last_level,
1170                        uint32_t num_samples,
1171                        uint32_t sample_stride,
1172                        const void *base_ptr,
1173                        uint32_t row_stride[PIPE_MAX_TEXTURE_LEVELS],
1174                        uint32_t img_stride[PIPE_MAX_TEXTURE_LEVELS],
1175                        uint32_t mip_offsets[PIPE_MAX_TEXTURE_LEVELS])
1176{
1177#ifdef DRAW_LLVM_AVAILABLE
1178   if (draw->llvm)
1179      draw_llvm_set_mapped_texture(draw,
1180                                   shader_stage,
1181                                   sview_idx,
1182                                   width, height, depth, first_level,
1183                                   last_level, num_samples, sample_stride, base_ptr,
1184                                   row_stride, img_stride, mip_offsets);
1185#endif
1186}
1187
1188void
1189draw_set_mapped_image(struct draw_context *draw,
1190                      enum pipe_shader_type shader_stage,
1191                      unsigned idx,
1192                      uint32_t width, uint32_t height, uint32_t depth,
1193                      const void *base_ptr,
1194                      uint32_t row_stride,
1195                      uint32_t img_stride,
1196                      uint32_t num_samples,
1197                      uint32_t sample_stride)
1198{
1199#ifdef DRAW_LLVM_AVAILABLE
1200   if (draw->llvm)
1201      draw_llvm_set_mapped_image(draw,
1202                                 shader_stage,
1203                                 idx,
1204                                 width, height, depth,
1205                                 base_ptr,
1206                                 row_stride, img_stride,
1207                                 num_samples, sample_stride);
1208#endif
1209}
1210
1211/**
1212 * XXX: Results for PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS because there are two
1213 * different ways of setting textures, and drivers typically only support one.
1214 */
1215int
1216draw_get_shader_param_no_llvm(enum pipe_shader_type shader,
1217                              enum pipe_shader_cap param)
1218{
1219   switch(shader) {
1220   case PIPE_SHADER_VERTEX:
1221   case PIPE_SHADER_GEOMETRY:
1222      return tgsi_exec_get_shader_param(param);
1223   default:
1224      return 0;
1225   }
1226}
1227
1228/**
1229 * XXX: Results for PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS because there are two
1230 * different ways of setting textures, and drivers typically only support one.
1231 * Drivers requesting a draw context explicitly without llvm must call
1232 * draw_get_shader_param_no_llvm instead.
1233 */
1234int
1235draw_get_shader_param(enum pipe_shader_type shader, enum pipe_shader_cap param)
1236{
1237
1238#ifdef DRAW_LLVM_AVAILABLE
1239   if (draw_get_option_use_llvm()) {
1240      switch(shader) {
1241      case PIPE_SHADER_VERTEX:
1242      case PIPE_SHADER_GEOMETRY:
1243      case PIPE_SHADER_TESS_CTRL:
1244      case PIPE_SHADER_TESS_EVAL:
1245         return gallivm_get_shader_param(param);
1246      default:
1247         return 0;
1248      }
1249   }
1250#endif
1251
1252   return draw_get_shader_param_no_llvm(shader, param);
1253}
1254
1255/**
1256 * Enables or disables collection of statistics.
1257 *
1258 * Draw module is capable of generating statistics for the vertex
1259 * processing pipeline. Collection of that data isn't free and so
1260 * it's disabled by default. The users of the module can enable
1261 * (or disable) this functionality through this function.
1262 * The actual data will be emitted through the VBUF interface,
1263 * the 'pipeline_statistics' callback to be exact.
1264 */
1265void
1266draw_collect_pipeline_statistics(struct draw_context *draw,
1267                                 boolean enable)
1268{
1269   draw->collect_statistics = enable;
1270}
1271
1272/**
1273 * Enable/disable primitives generated gathering.
1274 */
1275void draw_collect_primitives_generated(struct draw_context *draw,
1276                                       bool enable)
1277{
1278   draw->collect_primgen = enable;
1279}
1280
1281/**
1282 * Computes clipper invocation statistics.
1283 *
1284 * Figures out how many primitives would have been
1285 * sent to the clipper given the specified
1286 * prim info data.
1287 */
1288void
1289draw_stats_clipper_primitives(struct draw_context *draw,
1290                              const struct draw_prim_info *prim_info)
1291{
1292   if (draw->collect_statistics) {
1293      unsigned i;
1294      for (i = 0; i < prim_info->primitive_count; i++) {
1295         draw->statistics.c_invocations +=
1296            u_decomposed_prims_for_vertices(prim_info->prim,
1297                                            prim_info->primitive_lengths[i]);
1298      }
1299   }
1300}
1301
1302
1303/**
1304 * Returns true if the draw module will inject the frontface
1305 * info into the outputs.
1306 *
1307 * Given the specified primitive and rasterizer state
1308 * the function will figure out if the draw module
1309 * will inject the front-face information into shader
1310 * outputs. This is done to preserve the front-facing
1311 * info when decomposing primitives into wireframes.
1312 */
1313boolean
1314draw_will_inject_frontface(const struct draw_context *draw)
1315{
1316   unsigned reduced_prim = u_reduced_prim(draw->pt.prim);
1317   const struct pipe_rasterizer_state *rast = draw->rasterizer;
1318
1319   if (reduced_prim != PIPE_PRIM_TRIANGLES) {
1320      return FALSE;
1321   }
1322
1323   return (rast &&
1324           (rast->fill_front != PIPE_POLYGON_MODE_FILL ||
1325            rast->fill_back != PIPE_POLYGON_MODE_FILL));
1326}
1327
1328void
1329draw_set_tess_state(struct draw_context *draw,
1330		    const float default_outer_level[4],
1331		    const float default_inner_level[2])
1332{
1333   for (unsigned i = 0; i < 4; i++)
1334      draw->default_outer_tess_level[i] = default_outer_level[i];
1335   for (unsigned i = 0; i < 2; i++)
1336      draw->default_inner_tess_level[i] = default_inner_level[i];
1337}
1338
1339void
1340draw_set_disk_cache_callbacks(struct draw_context *draw,
1341                              void *data_cookie,
1342                              void (*find_shader)(void *cookie,
1343                                                  struct lp_cached_code *cache,
1344                                                  unsigned char ir_sha1_cache_key[20]),
1345                              void (*insert_shader)(void *cookie,
1346                                                    struct lp_cached_code *cache,
1347                                                    unsigned char ir_sha1_cache_key[20]))
1348{
1349   draw->disk_cache_find_shader = find_shader;
1350   draw->disk_cache_insert_shader = insert_shader;
1351   draw->disk_cache_cookie = data_cookie;
1352}
1353
1354void draw_set_constant_buffer_stride(struct draw_context *draw, unsigned num_bytes)
1355{
1356   draw->constant_buffer_stride = num_bytes;
1357}
1358