Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /**************************************************************************
  2.  *
  3.  * Copyright 2007-2009 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. /**
  30.  * The setup code is concerned with point/line/triangle setup and
  31.  * putting commands/data into the bins.
  32.  */
  33.  
  34.  
  35. #ifndef LP_SETUP_CONTEXT_H
  36. #define LP_SETUP_CONTEXT_H
  37.  
  38. #include "lp_setup.h"
  39. #include "lp_rast.h"
  40. #include "lp_scene.h"
  41. #include "lp_bld_interp.h"      /* for struct lp_shader_input */
  42.  
  43. #include "draw/draw_vbuf.h"
  44. #include "util/u_rect.h"
  45. #include "util/u_pack_color.h"
  46.  
  47. #define LP_SETUP_NEW_FS          0x01
  48. #define LP_SETUP_NEW_CONSTANTS   0x02
  49. #define LP_SETUP_NEW_BLEND_COLOR 0x04
  50. #define LP_SETUP_NEW_SCISSOR     0x08
  51. #define LP_SETUP_NEW_VIEWPORTS   0x10
  52.  
  53.  
  54. struct lp_setup_variant;
  55.  
  56.  
  57. /** Max number of scenes */
  58. /* XXX: make multiple scenes per context work, see lp_setup_rasterize_scene */
  59. #define MAX_SCENES 1
  60.  
  61.  
  62.  
  63. /**
  64.  * Point/line/triangle setup context.
  65.  * Note: "stored" below indicates data which is stored in the bins,
  66.  * not arbitrary malloc'd memory.
  67.  *
  68.  *
  69.  * Subclass of vbuf_render, plugged directly into the draw module as
  70.  * the rendering backend.
  71.  */
  72. struct lp_setup_context
  73. {
  74.    struct vbuf_render base;
  75.  
  76.    struct pipe_context *pipe;
  77.    struct vertex_info *vertex_info;
  78.    uint prim;
  79.    uint vertex_size;
  80.    uint nr_vertices;
  81.    uint sprite_coord_enable, sprite_coord_origin;
  82.    uint vertex_buffer_size;
  83.    void *vertex_buffer;
  84.  
  85.    /* Final pipeline stage for draw module.  Draw module should
  86.     * create/install this itself now.
  87.     */
  88.    struct draw_stage *vbuf;
  89.    unsigned num_threads;
  90.    unsigned scene_idx;
  91.    struct lp_scene *scenes[MAX_SCENES];  /**< all the scenes */
  92.    struct lp_scene *scene;               /**< current scene being built */
  93.  
  94.    struct lp_fence *last_fence;
  95.    struct llvmpipe_query *active_queries[LP_MAX_ACTIVE_BINNED_QUERIES];
  96.    unsigned active_binned_queries;
  97.  
  98.    boolean flatshade_first;
  99.    boolean ccw_is_frontface;
  100.    boolean scissor_test;
  101.    boolean point_size_per_vertex;
  102.    boolean rasterizer_discard;
  103.    unsigned cullmode;
  104.    unsigned bottom_edge_rule;
  105.    float pixel_offset;
  106.    float line_width;
  107.    float point_size;
  108.    float psize;
  109.    unsigned viewport_index_slot;
  110.    unsigned layer_slot;
  111.    int face_slot;
  112.  
  113.    struct pipe_framebuffer_state fb;
  114.    struct u_rect framebuffer;
  115.    struct u_rect scissors[PIPE_MAX_VIEWPORTS];
  116.    struct u_rect draw_regions[PIPE_MAX_VIEWPORTS];   /* intersection of fb & scissor */
  117.    struct lp_jit_viewport viewports[PIPE_MAX_VIEWPORTS];
  118.  
  119.    struct {
  120.       unsigned flags;
  121.       union util_color color_val[PIPE_MAX_COLOR_BUFS];
  122.       uint64_t zsmask;
  123.       uint64_t zsvalue;               /**< lp_rast_clear_zstencil() cmd */
  124.    } clear;
  125.  
  126.    enum setup_state {
  127.       SETUP_FLUSHED,    /**< scene is null */
  128.       SETUP_CLEARED,    /**< scene exists but has only clears */
  129.       SETUP_ACTIVE      /**< scene exists and has at least one draw/query */
  130.    } state;
  131.    
  132.    struct {
  133.       const struct lp_rast_state *stored; /**< what's in the scene */
  134.       struct lp_rast_state current;  /**< currently set state */
  135.       struct pipe_resource *current_tex[PIPE_MAX_SHADER_SAMPLER_VIEWS];
  136.    } fs;
  137.  
  138.    /** fragment shader constants */
  139.    struct {
  140.       struct pipe_constant_buffer current;
  141.       unsigned stored_size;
  142.       const void *stored_data;
  143.    } constants[LP_MAX_TGSI_CONST_BUFFERS];
  144.  
  145.    struct {
  146.       struct pipe_blend_color current;
  147.       uint8_t *stored;
  148.    } blend_color;
  149.  
  150.  
  151.    struct {
  152.       const struct lp_setup_variant *variant;
  153.    } setup;
  154.  
  155.    unsigned dirty;   /**< bitmask of LP_SETUP_NEW_x bits */
  156.  
  157.    void (*point)( struct lp_setup_context *,
  158.                   const float (*v0)[4]);
  159.  
  160.    void (*line)( struct lp_setup_context *,
  161.                  const float (*v0)[4],
  162.                  const float (*v1)[4]);
  163.  
  164.    void (*triangle)( struct lp_setup_context *,
  165.                      const float (*v0)[4],
  166.                      const float (*v1)[4],
  167.                      const float (*v2)[4]);
  168. };
  169.  
  170. void lp_setup_choose_triangle( struct lp_setup_context *setup );
  171. void lp_setup_choose_line( struct lp_setup_context *setup );
  172. void lp_setup_choose_point( struct lp_setup_context *setup );
  173.  
  174. void lp_setup_init_vbuf(struct lp_setup_context *setup);
  175.  
  176. boolean lp_setup_update_state( struct lp_setup_context *setup,
  177.                             boolean update_scene);
  178.  
  179. void lp_setup_destroy( struct lp_setup_context *setup );
  180.  
  181. boolean lp_setup_flush_and_restart(struct lp_setup_context *setup);
  182.  
  183. void
  184. lp_setup_print_triangle(struct lp_setup_context *setup,
  185.                         const float (*v0)[4],
  186.                         const float (*v1)[4],
  187.                         const float (*v2)[4]);
  188.  
  189. void
  190. lp_setup_print_vertex(struct lp_setup_context *setup,
  191.                       const char *name,
  192.                       const float (*v)[4]);
  193.  
  194.  
  195. struct lp_rast_triangle *
  196. lp_setup_alloc_triangle(struct lp_scene *scene,
  197.                         unsigned num_inputs,
  198.                         unsigned nr_planes,
  199.                         unsigned *tri_size);
  200.  
  201. boolean
  202. lp_setup_bin_triangle( struct lp_setup_context *setup,
  203.                        struct lp_rast_triangle *tri,
  204.                        const struct u_rect *bbox,
  205.                        int nr_planes,
  206.                        unsigned scissor_index );
  207.  
  208. #endif
  209.