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