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