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