Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /**************************************************************************
  2.  *
  3.  * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
  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 TUNGSTEN GRAPHICS 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 <keith@tungstengraphics.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 "draw_context.h"
  42. #include "draw_vs.h"
  43. #include "draw_gs.h"
  44.  
  45. #if HAVE_LLVM
  46. #include "gallivm/lp_bld_init.h"
  47. #include "gallivm/lp_bld_limits.h"
  48. #include "draw_llvm.h"
  49.  
  50. boolean
  51. draw_get_option_use_llvm(void)
  52. {
  53.    static boolean first = TRUE;
  54.    static boolean value;
  55.    if (first) {
  56.       first = FALSE;
  57.       value = debug_get_bool_option("DRAW_USE_LLVM", TRUE);
  58.  
  59. #ifdef PIPE_ARCH_X86
  60.       util_cpu_detect();
  61.       /* require SSE2 due to LLVM PR6960. */
  62.       if (!util_cpu_caps.has_sse2)
  63.          value = FALSE;
  64. #endif
  65.    }
  66.    return value;
  67. }
  68. #endif
  69.  
  70.  
  71. /**
  72.  * Create new draw module context with gallivm state for LLVM JIT.
  73.  */
  74. static struct draw_context *
  75. draw_create_context(struct pipe_context *pipe, boolean try_llvm)
  76. {
  77.    struct draw_context *draw = CALLOC_STRUCT( draw_context );
  78.    if (draw == NULL)
  79.       goto err_out;
  80.  
  81. #if HAVE_LLVM
  82.    if (try_llvm && draw_get_option_use_llvm()) {
  83.       draw->llvm = draw_llvm_create(draw);
  84.       if (!draw->llvm)
  85.          goto err_destroy;
  86.    }
  87. #endif
  88.  
  89.    draw->pipe = pipe;
  90.  
  91.    if (!draw_init(draw))
  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 *
  107. draw_create(struct pipe_context *pipe)
  108. {
  109.    return draw_create_context(pipe, TRUE);
  110. }
  111.  
  112.  
  113. /**
  114.  * Create a new draw context, without LLVM JIT.
  115.  */
  116. struct draw_context *
  117. draw_create_no_llvm(struct pipe_context *pipe)
  118. {
  119.    return draw_create_context(pipe, FALSE);
  120. }
  121.  
  122.  
  123. boolean draw_init(struct draw_context *draw)
  124. {
  125.    /*
  126.     * Note that several functions compute the clipmask of the predefined
  127.     * formats with hardcoded formulas instead of using these. So modifications
  128.     * here must be reflected there too.
  129.     */
  130.  
  131.    ASSIGN_4V( draw->plane[0], -1,  0,  0, 1 );
  132.    ASSIGN_4V( draw->plane[1],  1,  0,  0, 1 );
  133.    ASSIGN_4V( draw->plane[2],  0, -1,  0, 1 );
  134.    ASSIGN_4V( draw->plane[3],  0,  1,  0, 1 );
  135.    ASSIGN_4V( draw->plane[4],  0,  0,  1, 1 ); /* yes these are correct */
  136.    ASSIGN_4V( draw->plane[5],  0,  0, -1, 1 ); /* mesa's a bit wonky */
  137.    draw->clip_xy = TRUE;
  138.    draw->clip_z = TRUE;
  139.  
  140.    draw->pt.user.planes = (float (*) [DRAW_TOTAL_CLIP_PLANES][4]) &(draw->plane[0]);
  141.    draw->pt.user.eltMax = ~0;
  142.  
  143.    if (!draw_pipeline_init( draw ))
  144.       return FALSE;
  145.  
  146.    if (!draw_pt_init( draw ))
  147.       return FALSE;
  148.  
  149.    if (!draw_vs_init( draw ))
  150.       return FALSE;
  151.  
  152.    if (!draw_gs_init( draw ))
  153.       return FALSE;
  154.  
  155.    draw->quads_always_flatshade_last = !draw->pipe->screen->get_param(
  156.       draw->pipe->screen, PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION);
  157.  
  158.    return TRUE;
  159. }
  160.  
  161. /*
  162.  * Called whenever we're starting to draw a new instance.
  163.  * Some internal structures don't want to have to reset internal
  164.  * members on each invocation (because their state might have to persist
  165.  * between multiple primitive restart rendering call) but might have to
  166.  * for each new instance.
  167.  * This is particularly the case for primitive id's in geometry shader.
  168.  */
  169. void draw_new_instance(struct draw_context *draw)
  170. {
  171.    draw_geometry_shader_new_instance(draw->gs.geometry_shader);
  172. }
  173.  
  174.  
  175. void draw_destroy( struct draw_context *draw )
  176. {
  177.    struct pipe_context *pipe;
  178.    unsigned i, j;
  179.  
  180.    if (!draw)
  181.       return;
  182.  
  183.    pipe = draw->pipe;
  184.  
  185.    /* free any rasterizer CSOs that we may have created.
  186.     */
  187.    for (i = 0; i < 2; i++) {
  188.       for (j = 0; j < 2; j++) {
  189.          if (draw->rasterizer_no_cull[i][j]) {
  190.             pipe->delete_rasterizer_state(pipe, draw->rasterizer_no_cull[i][j]);
  191.          }
  192.       }
  193.    }
  194.  
  195.    for (i = 0; i < draw->pt.nr_vertex_buffers; i++) {
  196.       pipe_resource_reference(&draw->pt.vertex_buffer[i].buffer, NULL);
  197.    }
  198.  
  199.    /* Not so fast -- we're just borrowing this at the moment.
  200.     *
  201.    if (draw->render)
  202.       draw->render->destroy( draw->render );
  203.    */
  204.  
  205.    draw_pipeline_destroy( draw );
  206.    draw_pt_destroy( draw );
  207.    draw_vs_destroy( draw );
  208.    draw_gs_destroy( draw );
  209. #ifdef HAVE_LLVM
  210.    if (draw->llvm)
  211.       draw_llvm_destroy( draw->llvm );
  212. #endif
  213.  
  214.    FREE( draw );
  215. }
  216.  
  217.  
  218.  
  219. void draw_flush( struct draw_context *draw )
  220. {
  221.    draw_do_flush( draw, DRAW_FLUSH_BACKEND );
  222. }
  223.  
  224.  
  225. /**
  226.  * Specify the Minimum Resolvable Depth factor for polygon offset.
  227.  * This factor potentially depends on the number of Z buffer bits,
  228.  * the rasterization algorithm and the arithmetic performed on Z
  229.  * values between vertex shading and rasterization.  It will vary
  230.  * from one driver to another.
  231.  */
  232. void draw_set_mrd(struct draw_context *draw, double mrd)
  233. {
  234.    draw->mrd = mrd;
  235. }
  236.  
  237.  
  238. static void update_clip_flags( struct draw_context *draw )
  239. {
  240.    draw->clip_xy = !draw->driver.bypass_clip_xy;
  241.    draw->guard_band_xy = (!draw->driver.bypass_clip_xy &&
  242.                           draw->driver.guard_band_xy);
  243.    draw->clip_z = (!draw->driver.bypass_clip_z &&
  244.                    draw->rasterizer && draw->rasterizer->depth_clip);
  245.    draw->clip_user = draw->rasterizer &&
  246.                      draw->rasterizer->clip_plane_enable != 0;
  247. }
  248.  
  249. /**
  250.  * Register new primitive rasterization/rendering state.
  251.  * This causes the drawing pipeline to be rebuilt.
  252.  */
  253. void draw_set_rasterizer_state( struct draw_context *draw,
  254.                                 const struct pipe_rasterizer_state *raster,
  255.                                 void *rast_handle )
  256. {
  257.    if (!draw->suspend_flushing) {
  258.       draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
  259.  
  260.       draw->rasterizer = raster;
  261.       draw->rast_handle = rast_handle;
  262.       update_clip_flags(draw);
  263.    }
  264. }
  265.  
  266. /* With a little more work, llvmpipe will be able to turn this off and
  267.  * do its own x/y clipping.  
  268.  *
  269.  * Some hardware can turn off clipping altogether - in particular any
  270.  * hardware with a TNL unit can do its own clipping, even if it is
  271.  * relying on the draw module for some other reason.
  272.  */
  273. void draw_set_driver_clipping( struct draw_context *draw,
  274.                                boolean bypass_clip_xy,
  275.                                boolean bypass_clip_z,
  276.                                boolean guard_band_xy)
  277. {
  278.    draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
  279.  
  280.    draw->driver.bypass_clip_xy = bypass_clip_xy;
  281.    draw->driver.bypass_clip_z = bypass_clip_z;
  282.    draw->driver.guard_band_xy = guard_band_xy;
  283.    update_clip_flags(draw);
  284. }
  285.  
  286.  
  287. /**
  288.  * Plug in the primitive rendering/rasterization stage (which is the last
  289.  * stage in the drawing pipeline).
  290.  * This is provided by the device driver.
  291.  */
  292. void draw_set_rasterize_stage( struct draw_context *draw,
  293.                                struct draw_stage *stage )
  294. {
  295.    draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
  296.  
  297.    draw->pipeline.rasterize = stage;
  298. }
  299.  
  300.  
  301. /**
  302.  * Set the draw module's clipping state.
  303.  */
  304. void draw_set_clip_state( struct draw_context *draw,
  305.                           const struct pipe_clip_state *clip )
  306. {
  307.    draw_do_flush(draw, DRAW_FLUSH_PARAMETER_CHANGE);
  308.  
  309.    memcpy(&draw->plane[6], clip->ucp, sizeof(clip->ucp));
  310. }
  311.  
  312.  
  313. /**
  314.  * Set the draw module's viewport state.
  315.  */
  316. void draw_set_viewport_states( struct draw_context *draw,
  317.                                unsigned start_slot,
  318.                                unsigned num_viewports,
  319.                                const struct pipe_viewport_state *vps )
  320. {
  321.    const struct pipe_viewport_state *viewport = vps;
  322.    draw_do_flush(draw, DRAW_FLUSH_PARAMETER_CHANGE);
  323.  
  324.    debug_assert(start_slot < PIPE_MAX_VIEWPORTS);
  325.    debug_assert((start_slot + num_viewports) <= PIPE_MAX_VIEWPORTS);
  326.  
  327.    memcpy(draw->viewports + start_slot, vps,
  328.           sizeof(struct pipe_viewport_state) * num_viewports);
  329.  
  330.    draw->identity_viewport = (num_viewports == 1) &&
  331.       (viewport->scale[0] == 1.0f &&
  332.        viewport->scale[1] == 1.0f &&
  333.        viewport->scale[2] == 1.0f &&
  334.        viewport->scale[3] == 1.0f &&
  335.        viewport->translate[0] == 0.0f &&
  336.        viewport->translate[1] == 0.0f &&
  337.        viewport->translate[2] == 0.0f &&
  338.        viewport->translate[3] == 0.0f);
  339. }
  340.  
  341.  
  342.  
  343. void
  344. draw_set_vertex_buffers(struct draw_context *draw,
  345.                         unsigned start_slot, unsigned count,
  346.                         const struct pipe_vertex_buffer *buffers)
  347. {
  348.    assert(start_slot + count <= PIPE_MAX_ATTRIBS);
  349.  
  350.    util_set_vertex_buffers_count(draw->pt.vertex_buffer,
  351.                                  &draw->pt.nr_vertex_buffers,
  352.                                  buffers, start_slot, count);
  353. }
  354.  
  355.  
  356. void
  357. draw_set_vertex_elements(struct draw_context *draw,
  358.                          unsigned count,
  359.                          const struct pipe_vertex_element *elements)
  360. {
  361.    assert(count <= PIPE_MAX_ATTRIBS);
  362.  
  363.    /* We could improve this by only flushing the frontend and the fetch part
  364.     * of the middle. This would avoid recalculating the emit keys.*/
  365.    draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
  366.  
  367.    memcpy(draw->pt.vertex_element, elements, count * sizeof(elements[0]));
  368.    draw->pt.nr_vertex_elements = count;
  369. }
  370.  
  371.  
  372. /**
  373.  * Tell drawing context where to find mapped vertex buffers.
  374.  */
  375. void
  376. draw_set_mapped_vertex_buffer(struct draw_context *draw,
  377.                               unsigned attr, const void *buffer,
  378.                               size_t size)
  379. {
  380.    draw->pt.user.vbuffer[attr].map  = buffer;
  381.    draw->pt.user.vbuffer[attr].size = size;
  382. }
  383.  
  384.  
  385. void
  386. draw_set_mapped_constant_buffer(struct draw_context *draw,
  387.                                 unsigned shader_type,
  388.                                 unsigned slot,
  389.                                 const void *buffer,
  390.                                 unsigned size )
  391. {
  392.    debug_assert(shader_type == PIPE_SHADER_VERTEX ||
  393.                 shader_type == PIPE_SHADER_GEOMETRY);
  394.    debug_assert(slot < PIPE_MAX_CONSTANT_BUFFERS);
  395.  
  396.    draw_do_flush(draw, DRAW_FLUSH_PARAMETER_CHANGE);
  397.  
  398.    switch (shader_type) {
  399.    case PIPE_SHADER_VERTEX:
  400.       draw->pt.user.vs_constants[slot] = buffer;
  401.       draw->pt.user.vs_constants_size[slot] = size;
  402.       break;
  403.    case PIPE_SHADER_GEOMETRY:
  404.       draw->pt.user.gs_constants[slot] = buffer;
  405.       draw->pt.user.gs_constants_size[slot] = size;
  406.       break;
  407.    default:
  408.       assert(0 && "invalid shader type in draw_set_mapped_constant_buffer");
  409.    }
  410. }
  411.  
  412.  
  413. /**
  414.  * Tells the draw module to draw points with triangles if their size
  415.  * is greater than this threshold.
  416.  */
  417. void
  418. draw_wide_point_threshold(struct draw_context *draw, float threshold)
  419. {
  420.    draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
  421.    draw->pipeline.wide_point_threshold = threshold;
  422. }
  423.  
  424.  
  425. /**
  426.  * Should the draw module handle point->quad conversion for drawing sprites?
  427.  */
  428. void
  429. draw_wide_point_sprites(struct draw_context *draw, boolean draw_sprite)
  430. {
  431.    draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
  432.    draw->pipeline.wide_point_sprites = draw_sprite;
  433. }
  434.  
  435.  
  436. /**
  437.  * Tells the draw module to draw lines with triangles if their width
  438.  * is greater than this threshold.
  439.  */
  440. void
  441. draw_wide_line_threshold(struct draw_context *draw, float threshold)
  442. {
  443.    draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
  444.    draw->pipeline.wide_line_threshold = roundf(threshold);
  445. }
  446.  
  447.  
  448. /**
  449.  * Tells the draw module whether or not to implement line stipple.
  450.  */
  451. void
  452. draw_enable_line_stipple(struct draw_context *draw, boolean enable)
  453. {
  454.    draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
  455.    draw->pipeline.line_stipple = enable;
  456. }
  457.  
  458.  
  459. /**
  460.  * Tells draw module whether to convert points to quads for sprite mode.
  461.  */
  462. void
  463. draw_enable_point_sprites(struct draw_context *draw, boolean enable)
  464. {
  465.    draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
  466.    draw->pipeline.point_sprite = enable;
  467. }
  468.  
  469.  
  470. void
  471. draw_set_force_passthrough( struct draw_context *draw, boolean enable )
  472. {
  473.    draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
  474.    draw->force_passthrough = enable;
  475. }
  476.  
  477.  
  478.  
  479. /**
  480.  * Allocate an extra vertex/geometry shader vertex attribute, if it doesn't
  481.  * exist already.
  482.  *
  483.  * This is used by some of the optional draw module stages such
  484.  * as wide_point which may need to allocate additional generic/texcoord
  485.  * attributes.
  486.  */
  487. int
  488. draw_alloc_extra_vertex_attrib(struct draw_context *draw,
  489.                                uint semantic_name, uint semantic_index)
  490. {
  491.    int slot;
  492.    uint num_outputs;
  493.    uint n;
  494.  
  495.    slot = draw_find_shader_output(draw, semantic_name, semantic_index);
  496.    if (slot >= 0) {
  497.       return slot;
  498.    }
  499.  
  500.    num_outputs = draw_current_shader_outputs(draw);
  501.    n = draw->extra_shader_outputs.num;
  502.  
  503.    assert(n < Elements(draw->extra_shader_outputs.semantic_name));
  504.  
  505.    draw->extra_shader_outputs.semantic_name[n] = semantic_name;
  506.    draw->extra_shader_outputs.semantic_index[n] = semantic_index;
  507.    draw->extra_shader_outputs.slot[n] = num_outputs + n;
  508.    draw->extra_shader_outputs.num++;
  509.  
  510.    return draw->extra_shader_outputs.slot[n];
  511. }
  512.  
  513.  
  514. /**
  515.  * Remove all extra vertex attributes that were allocated with
  516.  * draw_alloc_extra_vertex_attrib().
  517.  */
  518. void
  519. draw_remove_extra_vertex_attribs(struct draw_context *draw)
  520. {
  521.    draw->extra_shader_outputs.num = 0;
  522. }
  523.  
  524.  
  525. /**
  526.  * If a geometry shader is present, return its info, else the vertex shader's
  527.  * info.
  528.  */
  529. struct tgsi_shader_info *
  530. draw_get_shader_info(const struct draw_context *draw)
  531. {
  532.  
  533.    if (draw->gs.geometry_shader) {
  534.       return &draw->gs.geometry_shader->info;
  535.    } else {
  536.       return &draw->vs.vertex_shader->info;
  537.    }
  538. }
  539.  
  540.  
  541. /**
  542.  * Ask the draw module for the location/slot of the given vertex attribute in
  543.  * a post-transformed vertex.
  544.  *
  545.  * With this function, drivers that use the draw module should have no reason
  546.  * to track the current vertex/geometry shader.
  547.  *
  548.  * Note that the draw module may sometimes generate vertices with extra
  549.  * attributes (such as texcoords for AA lines).  The driver can call this
  550.  * function to find those attributes.
  551.  *
  552.  * -1 is returned if the attribute is not found since this is
  553.  * an undefined situation. Note, that zero is valid and can
  554.  * be used by any of the attributes, because position is not
  555.  * required to be attribute 0 or even at all present.
  556.  */
  557. int
  558. draw_find_shader_output(const struct draw_context *draw,
  559.                         uint semantic_name, uint semantic_index)
  560. {
  561.    const struct tgsi_shader_info *info = draw_get_shader_info(draw);
  562.    uint i;
  563.  
  564.    for (i = 0; i < info->num_outputs; i++) {
  565.       if (info->output_semantic_name[i] == semantic_name &&
  566.           info->output_semantic_index[i] == semantic_index)
  567.          return i;
  568.    }
  569.  
  570.    /* Search the extra vertex attributes */
  571.    for (i = 0; i < draw->extra_shader_outputs.num; i++) {
  572.       if (draw->extra_shader_outputs.semantic_name[i] == semantic_name &&
  573.           draw->extra_shader_outputs.semantic_index[i] == semantic_index) {
  574.          return draw->extra_shader_outputs.slot[i];
  575.       }
  576.    }
  577.  
  578.    return -1;
  579. }
  580.  
  581.  
  582. /**
  583.  * Return total number of the shader outputs.  This function is similar to
  584.  * draw_current_shader_outputs() but this function also counts any extra
  585.  * vertex/geometry output attributes that may be filled in by some draw
  586.  * stages (such as AA point, AA line).
  587.  *
  588.  * If geometry shader is present, its output will be returned,
  589.  * if not vertex shader is used.
  590.  */
  591. uint
  592. draw_num_shader_outputs(const struct draw_context *draw)
  593. {
  594.    const struct tgsi_shader_info *info = draw_get_shader_info(draw);
  595.    uint count;
  596.  
  597.    count = info->num_outputs;
  598.    count += draw->extra_shader_outputs.num;
  599.  
  600.    return count;
  601. }
  602.  
  603.  
  604. /**
  605.  * Provide TGSI sampler objects for vertex/geometry shaders that use
  606.  * texture fetches.  This state only needs to be set once per context.
  607.  * This might only be used by software drivers for the time being.
  608.  */
  609. void
  610. draw_texture_sampler(struct draw_context *draw,
  611.                      uint shader,
  612.                      struct tgsi_sampler *sampler)
  613. {
  614.    if (shader == PIPE_SHADER_VERTEX) {
  615.       draw->vs.tgsi.sampler = sampler;
  616.    } else {
  617.       debug_assert(shader == PIPE_SHADER_GEOMETRY);
  618.       draw->gs.tgsi.sampler = sampler;
  619.    }
  620. }
  621.  
  622.  
  623.  
  624.  
  625. void draw_set_render( struct draw_context *draw,
  626.                       struct vbuf_render *render )
  627. {
  628.    draw->render = render;
  629. }
  630.  
  631.  
  632. /**
  633.  * Tell the draw module where vertex indexes/elements are located, and
  634.  * their size (in bytes).
  635.  *
  636.  * Note: the caller must apply the pipe_index_buffer::offset value to
  637.  * the address.  The draw module doesn't do that.
  638.  */
  639. void
  640. draw_set_indexes(struct draw_context *draw,
  641.                  const void *elements, unsigned elem_size,
  642.                  unsigned elem_buffer_space)
  643. {
  644.    assert(elem_size == 0 ||
  645.           elem_size == 1 ||
  646.           elem_size == 2 ||
  647.           elem_size == 4);
  648.    draw->pt.user.elts = elements;
  649.    draw->pt.user.eltSizeIB = elem_size;
  650.    if (elem_size)
  651.       draw->pt.user.eltMax = elem_buffer_space / elem_size;
  652.    else
  653.       draw->pt.user.eltMax = 0;
  654. }
  655.  
  656.  
  657. /* Revamp me please:
  658.  */
  659. void draw_do_flush( struct draw_context *draw, unsigned flags )
  660. {
  661.    if (!draw->suspend_flushing)
  662.    {
  663.       assert(!draw->flushing); /* catch inadvertant recursion */
  664.  
  665.       draw->flushing = TRUE;
  666.  
  667.       draw_pipeline_flush( draw, flags );
  668.  
  669.       draw_pt_flush( draw, flags );
  670.  
  671.       draw->flushing = FALSE;
  672.    }
  673. }
  674.  
  675.  
  676. /**
  677.  * Return the number of output attributes produced by the geometry
  678.  * shader, if present.  If no geometry shader, return the number of
  679.  * outputs from the vertex shader.
  680.  * \sa draw_num_shader_outputs
  681.  */
  682. uint
  683. draw_current_shader_outputs(const struct draw_context *draw)
  684. {
  685.    if (draw->gs.geometry_shader)
  686.       return draw->gs.num_gs_outputs;
  687.    return draw->vs.num_vs_outputs;
  688. }
  689.  
  690.  
  691. /**
  692.  * Return the index of the shader output which will contain the
  693.  * vertex position.
  694.  */
  695. uint
  696. draw_current_shader_position_output(const struct draw_context *draw)
  697. {
  698.    if (draw->gs.geometry_shader)
  699.       return draw->gs.position_output;
  700.    return draw->vs.position_output;
  701. }
  702.  
  703.  
  704. /**
  705.  * Return the index of the shader output which will contain the
  706.  * viewport index.
  707.  */
  708. uint
  709. draw_current_shader_viewport_index_output(const struct draw_context *draw)
  710. {
  711.    if (draw->gs.geometry_shader)
  712.       return draw->gs.geometry_shader->viewport_index_output;
  713.    return 0;
  714. }
  715.  
  716. /**
  717.  * Returns true if there's a geometry shader bound and the geometry
  718.  * shader writes out a viewport index.
  719.  */
  720. boolean
  721. draw_current_shader_uses_viewport_index(const struct draw_context *draw)
  722. {
  723.    if (draw->gs.geometry_shader)
  724.       return draw->gs.geometry_shader->info.writes_viewport_index;
  725.    return FALSE;
  726. }
  727.  
  728.  
  729. /**
  730.  * Return the index of the shader output which will contain the
  731.  * vertex position.
  732.  */
  733. uint
  734. draw_current_shader_clipvertex_output(const struct draw_context *draw)
  735. {
  736.    return draw->vs.clipvertex_output;
  737. }
  738.  
  739. uint
  740. draw_current_shader_clipdistance_output(const struct draw_context *draw, int index)
  741. {
  742.    debug_assert(index < PIPE_MAX_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT);
  743.    if (draw->gs.geometry_shader)
  744.       return draw->gs.geometry_shader->clipdistance_output[index];
  745.    return draw->vs.clipdistance_output[index];
  746. }
  747.  
  748.  
  749. uint
  750. draw_current_shader_num_written_clipdistances(const struct draw_context *draw)
  751. {
  752.    if (draw->gs.geometry_shader)
  753.       return draw->gs.geometry_shader->info.num_written_clipdistance;
  754.    return draw->vs.vertex_shader->info.num_written_clipdistance;
  755. }
  756.  
  757.  
  758. uint
  759. draw_current_shader_culldistance_output(const struct draw_context *draw, int index)
  760. {
  761.    debug_assert(index < PIPE_MAX_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT);
  762.    if (draw->gs.geometry_shader)
  763.       return draw->gs.geometry_shader->culldistance_output[index];
  764.    return draw->vs.vertex_shader->culldistance_output[index];
  765. }
  766.  
  767. uint
  768. draw_current_shader_num_written_culldistances(const struct draw_context *draw)
  769. {
  770.    if (draw->gs.geometry_shader)
  771.       return draw->gs.geometry_shader->info.num_written_culldistance;
  772.    return draw->vs.vertex_shader->info.num_written_culldistance;
  773. }
  774.  
  775. /**
  776.  * Return a pointer/handle for a driver/CSO rasterizer object which
  777.  * disabled culling, stippling, unfilled tris, etc.
  778.  * This is used by some pipeline stages (such as wide_point, aa_line
  779.  * and aa_point) which convert points/lines into triangles.  In those
  780.  * cases we don't want to accidentally cull the triangles.
  781.  *
  782.  * \param scissor  should the rasterizer state enable scissoring?
  783.  * \param flatshade  should the rasterizer state use flat shading?
  784.  * \return  rasterizer CSO handle
  785.  */
  786. void *
  787. draw_get_rasterizer_no_cull( struct draw_context *draw,
  788.                              boolean scissor,
  789.                              boolean flatshade )
  790. {
  791.    if (!draw->rasterizer_no_cull[scissor][flatshade]) {
  792.       /* create now */
  793.       struct pipe_context *pipe = draw->pipe;
  794.       struct pipe_rasterizer_state rast;
  795.  
  796.       memset(&rast, 0, sizeof(rast));
  797.       rast.scissor = scissor;
  798.       rast.flatshade = flatshade;
  799.       rast.front_ccw = 1;
  800.       rast.half_pixel_center = draw->rasterizer->half_pixel_center;
  801.       rast.bottom_edge_rule = draw->rasterizer->bottom_edge_rule;
  802.       rast.clip_halfz = draw->rasterizer->clip_halfz;
  803.  
  804.       draw->rasterizer_no_cull[scissor][flatshade] =
  805.          pipe->create_rasterizer_state(pipe, &rast);
  806.    }
  807.    return draw->rasterizer_no_cull[scissor][flatshade];
  808. }
  809.  
  810. void
  811. draw_set_mapped_so_targets(struct draw_context *draw,
  812.                            int num_targets,
  813.                            struct draw_so_target *targets[PIPE_MAX_SO_BUFFERS])
  814. {
  815.    int i;
  816.  
  817.    for (i = 0; i < num_targets; i++)
  818.       draw->so.targets[i] = targets[i];
  819.    for (i = num_targets; i < PIPE_MAX_SO_BUFFERS; i++)
  820.       draw->so.targets[i] = NULL;
  821.  
  822.    draw->so.num_targets = num_targets;
  823. }
  824.  
  825. void
  826. draw_set_sampler_views(struct draw_context *draw,
  827.                        unsigned shader_stage,
  828.                        struct pipe_sampler_view **views,
  829.                        unsigned num)
  830. {
  831.    unsigned i;
  832.  
  833.    debug_assert(shader_stage < PIPE_SHADER_TYPES);
  834.    debug_assert(num <= PIPE_MAX_SHADER_SAMPLER_VIEWS);
  835.  
  836.    draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
  837.  
  838.    for (i = 0; i < num; ++i)
  839.       draw->sampler_views[shader_stage][i] = views[i];
  840.    for (i = num; i < PIPE_MAX_SHADER_SAMPLER_VIEWS; ++i)
  841.       draw->sampler_views[shader_stage][i] = NULL;
  842.  
  843.    draw->num_sampler_views[shader_stage] = num;
  844. }
  845.  
  846. void
  847. draw_set_samplers(struct draw_context *draw,
  848.                   unsigned shader_stage,
  849.                   struct pipe_sampler_state **samplers,
  850.                   unsigned num)
  851. {
  852.    unsigned i;
  853.  
  854.    debug_assert(shader_stage < PIPE_SHADER_TYPES);
  855.    debug_assert(num <= PIPE_MAX_SAMPLERS);
  856.  
  857.    draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
  858.  
  859.    for (i = 0; i < num; ++i)
  860.       draw->samplers[shader_stage][i] = samplers[i];
  861.    for (i = num; i < PIPE_MAX_SAMPLERS; ++i)
  862.       draw->samplers[shader_stage][i] = NULL;
  863.  
  864.    draw->num_samplers[shader_stage] = num;
  865.  
  866. #ifdef HAVE_LLVM
  867.    if (draw->llvm)
  868.       draw_llvm_set_sampler_state(draw, shader_stage);
  869. #endif
  870. }
  871.  
  872. void
  873. draw_set_mapped_texture(struct draw_context *draw,
  874.                         unsigned shader_stage,
  875.                         unsigned sview_idx,
  876.                         uint32_t width, uint32_t height, uint32_t depth,
  877.                         uint32_t first_level, uint32_t last_level,
  878.                         const void *base_ptr,
  879.                         uint32_t row_stride[PIPE_MAX_TEXTURE_LEVELS],
  880.                         uint32_t img_stride[PIPE_MAX_TEXTURE_LEVELS],
  881.                         uint32_t mip_offsets[PIPE_MAX_TEXTURE_LEVELS])
  882. {
  883. #ifdef HAVE_LLVM
  884.    if (draw->llvm)
  885.       draw_llvm_set_mapped_texture(draw,
  886.                                    shader_stage,
  887.                                    sview_idx,
  888.                                    width, height, depth, first_level,
  889.                                    last_level, base_ptr,
  890.                                    row_stride, img_stride, mip_offsets);
  891. #endif
  892. }
  893.  
  894. /**
  895.  * XXX: Results for PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS because there are two
  896.  * different ways of setting textures, and drivers typically only support one.
  897.  */
  898. int
  899. draw_get_shader_param_no_llvm(unsigned shader, enum pipe_shader_cap param)
  900. {
  901.    switch(shader) {
  902.    case PIPE_SHADER_VERTEX:
  903.    case PIPE_SHADER_GEOMETRY:
  904.       return tgsi_exec_get_shader_param(param);
  905.    default:
  906.       return 0;
  907.    }
  908. }
  909.  
  910. /**
  911.  * XXX: Results for PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS because there are two
  912.  * different ways of setting textures, and drivers typically only support one.
  913.  */
  914. int
  915. draw_get_shader_param(unsigned shader, enum pipe_shader_cap param)
  916. {
  917.  
  918. #ifdef HAVE_LLVM
  919.    if (draw_get_option_use_llvm()) {
  920.       switch(shader) {
  921.       case PIPE_SHADER_VERTEX:
  922.       case PIPE_SHADER_GEOMETRY:
  923.          return gallivm_get_shader_param(param);
  924.       default:
  925.          return 0;
  926.       }
  927.    }
  928. #endif
  929.  
  930.    return draw_get_shader_param_no_llvm(shader, param);
  931. }
  932.  
  933. /**
  934.  * Enables or disables collection of statistics.
  935.  *
  936.  * Draw module is capable of generating statistics for the vertex
  937.  * processing pipeline. Collection of that data isn't free and so
  938.  * it's disabled by default. The users of the module can enable
  939.  * (or disable) this functionality through this function.
  940.  * The actual data will be emitted through the VBUF interface,
  941.  * the 'pipeline_statistics' callback to be exact.
  942.  */
  943. void
  944. draw_collect_pipeline_statistics(struct draw_context *draw,
  945.                                  boolean enable)
  946. {
  947.    draw->collect_statistics = enable;
  948. }
  949.  
  950. /**
  951.  * Computes clipper invocation statistics.
  952.  *
  953.  * Figures out how many primitives would have been
  954.  * sent to the clipper given the specified
  955.  * prim info data.
  956.  */
  957. void
  958. draw_stats_clipper_primitives(struct draw_context *draw,
  959.                               const struct draw_prim_info *prim_info)
  960. {
  961.    if (draw->collect_statistics) {
  962.       unsigned start, i;
  963.       for (start = i = 0;
  964.            i < prim_info->primitive_count;
  965.            start += prim_info->primitive_lengths[i], i++)
  966.       {
  967.          draw->statistics.c_invocations +=
  968.             u_decomposed_prims_for_vertices(prim_info->prim,
  969.                                             prim_info->primitive_lengths[i]);
  970.       }
  971.    }
  972. }
  973.