Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /**************************************************************************
  2.  *
  3.  * Copyright 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.  * The rast code is concerned with rasterization of command bins.
  30.  * Each screen tile has a bin associated with it.  To render the
  31.  * scene we iterate over the tile bins and execute the commands
  32.  * in each bin.
  33.  * We'll do that with multiple threads...
  34.  */
  35.  
  36.  
  37. #ifndef LP_RAST_H
  38. #define LP_RAST_H
  39.  
  40. #include "pipe/p_compiler.h"
  41. #include "lp_jit.h"
  42.  
  43.  
  44. struct lp_rasterizer;
  45. struct lp_scene;
  46. struct lp_fence;
  47. struct cmd_bin;
  48.  
  49. /** For sub-pixel positioning */
  50. #define FIXED_ORDER 4
  51. #define FIXED_ONE (1<<FIXED_ORDER)
  52.  
  53. /* Rasterizer output size going to jit fs, width/height */
  54. #define LP_RASTER_BLOCK_SIZE 4
  55.  
  56. #define LP_MAX_ACTIVE_BINNED_QUERIES 16
  57.  
  58.  
  59. struct lp_rasterizer_task;
  60.  
  61.  
  62. /**
  63.  * Rasterization state.
  64.  * Objects of this type are put into the shared data bin and pointed
  65.  * to by commands in the per-tile bins.
  66.  */
  67. struct lp_rast_state {
  68.    /* State for the shader.  This also contains state which feeds into
  69.     * the fragment shader, such as blend color and alpha ref value.
  70.     */
  71.    struct lp_jit_context jit_context;
  72.    
  73.    /* The shader itself.  Probably we also need to pass a pointer to
  74.     * the tile color/z/stencil data somehow
  75.      */
  76.    struct lp_fragment_shader_variant *variant;
  77. };
  78.  
  79.  
  80. /**
  81.  * Coefficients necessary to run the shader at a given location.
  82.  * First coefficient is position.
  83.  * These pointers point into the bin data buffer.
  84.  */
  85. struct lp_rast_shader_inputs {
  86.    unsigned frontfacing:1;      /** True for front-facing */
  87.    unsigned disable:1;          /** Partially binned, disable this command */
  88.    unsigned opaque:1;           /** Is opaque */
  89.    unsigned pad0:29;            /* wasted space */
  90.    unsigned stride;             /* how much to advance data between a0, dadx, dady */
  91.    unsigned layer;              /* the layer to render to (from gs, already clamped) */
  92.    unsigned pad2;               /* wasted space */
  93.    /* followed by a0, dadx, dady and planes[] */
  94. };
  95.  
  96. /* Note: the order of these values is important as they are loaded by
  97.  * sse code in rasterization:
  98.  */
  99. struct lp_rast_plane {
  100.    /* edge function values at minx,miny ?? */
  101.    int c;
  102.  
  103.    int dcdx;
  104.    int dcdy;
  105.  
  106.    /* one-pixel sized trivial reject offsets for each plane */
  107.    int eo;
  108. };
  109.  
  110. /**
  111.  * Rasterization information for a triangle known to be in this bin,
  112.  * plus inputs to run the shader:
  113.  * These fields are tile- and bin-independent.
  114.  * Objects of this type are put into the lp_setup_context::data buffer.
  115.  */
  116. struct lp_rast_triangle {
  117. #ifdef DEBUG
  118.    float v[3][2];
  119.    float pad0;
  120.    float pad1;
  121. #endif
  122.  
  123.    /* inputs for the shader */
  124.    struct lp_rast_shader_inputs inputs;
  125.    /* planes are also allocated here */
  126. };
  127.  
  128.  
  129. #define GET_A0(inputs) ((float (*)[4])((inputs)+1))
  130. #define GET_DADX(inputs) ((float (*)[4])((char *)((inputs) + 1) + (inputs)->stride))
  131. #define GET_DADY(inputs) ((float (*)[4])((char *)((inputs) + 1) + 2 * (inputs)->stride))
  132. #define GET_PLANES(tri) ((struct lp_rast_plane *)((char *)(&(tri)->inputs + 1) + 3 * (tri)->inputs.stride))
  133.  
  134.  
  135.  
  136. struct lp_rasterizer *
  137. lp_rast_create( unsigned num_threads );
  138.  
  139. void
  140. lp_rast_destroy( struct lp_rasterizer * );
  141.  
  142. unsigned
  143. lp_rast_get_num_threads( struct lp_rasterizer * );
  144.  
  145. void
  146. lp_rast_queue_scene( struct lp_rasterizer *rast,
  147.                      struct lp_scene *scene );
  148.  
  149. void
  150. lp_rast_finish( struct lp_rasterizer *rast );
  151.  
  152.  
  153. union lp_rast_cmd_arg {
  154.    const struct lp_rast_shader_inputs *shade_tile;
  155.    struct {
  156.       const struct lp_rast_triangle *tri;
  157.       unsigned plane_mask;
  158.    } triangle;
  159.    const struct lp_rast_state *set_state;
  160.    union pipe_color_union clear_color;
  161.    struct {
  162.       uint64_t value;
  163.       uint64_t mask;
  164.    } clear_zstencil;
  165.    const struct lp_rast_state *state;
  166.    struct lp_fence *fence;
  167.    struct llvmpipe_query *query_obj;
  168. };
  169.  
  170.  
  171. /* Cast wrappers.  Hopefully these compile to noops!
  172.  */
  173. static INLINE union lp_rast_cmd_arg
  174. lp_rast_arg_inputs( const struct lp_rast_shader_inputs *shade_tile )
  175. {
  176.    union lp_rast_cmd_arg arg;
  177.    arg.shade_tile = shade_tile;
  178.    return arg;
  179. }
  180.  
  181. static INLINE union lp_rast_cmd_arg
  182. lp_rast_arg_triangle( const struct lp_rast_triangle *triangle,
  183.                       unsigned plane_mask)
  184. {
  185.    union lp_rast_cmd_arg arg;
  186.    arg.triangle.tri = triangle;
  187.    arg.triangle.plane_mask = plane_mask;
  188.    return arg;
  189. }
  190.  
  191. /**
  192.  * Build argument for a contained triangle.
  193.  *
  194.  * All planes are enabled, so instead of the plane mask we pass the upper
  195.  * left coordinates of the a block that fully encloses the triangle.
  196.  */
  197. static INLINE union lp_rast_cmd_arg
  198. lp_rast_arg_triangle_contained( const struct lp_rast_triangle *triangle,
  199.                                 unsigned x, unsigned y)
  200. {
  201.    union lp_rast_cmd_arg arg;
  202.    arg.triangle.tri = triangle;
  203.    arg.triangle.plane_mask = x | (y << 8);
  204.    return arg;
  205. }
  206.  
  207. static INLINE union lp_rast_cmd_arg
  208. lp_rast_arg_state( const struct lp_rast_state *state )
  209. {
  210.    union lp_rast_cmd_arg arg;
  211.    arg.set_state = state;
  212.    return arg;
  213. }
  214.  
  215. static INLINE union lp_rast_cmd_arg
  216. lp_rast_arg_fence( struct lp_fence *fence )
  217. {
  218.    union lp_rast_cmd_arg arg;
  219.    arg.fence = fence;
  220.    return arg;
  221. }
  222.  
  223.  
  224. static INLINE union lp_rast_cmd_arg
  225. lp_rast_arg_clearzs( uint64_t value, uint64_t mask )
  226. {
  227.    union lp_rast_cmd_arg arg;
  228.    arg.clear_zstencil.value = value;
  229.    arg.clear_zstencil.mask = mask;
  230.    return arg;
  231. }
  232.  
  233.  
  234. static INLINE union lp_rast_cmd_arg
  235. lp_rast_arg_query( struct llvmpipe_query *pq )
  236. {
  237.    union lp_rast_cmd_arg arg;
  238.    arg.query_obj = pq;
  239.    return arg;
  240. }
  241.  
  242. static INLINE union lp_rast_cmd_arg
  243. lp_rast_arg_null( void )
  244. {
  245.    union lp_rast_cmd_arg arg;
  246.    arg.set_state = NULL;
  247.    return arg;
  248. }
  249.  
  250.  
  251. /**
  252.  * Binnable Commands.
  253.  * These get put into bins by the setup code and are called when
  254.  * the bins are executed.
  255.  */
  256. #define LP_RAST_OP_CLEAR_COLOR       0x0
  257. #define LP_RAST_OP_CLEAR_ZSTENCIL    0x1
  258. #define LP_RAST_OP_TRIANGLE_1        0x2
  259. #define LP_RAST_OP_TRIANGLE_2        0x3
  260. #define LP_RAST_OP_TRIANGLE_3        0x4
  261. #define LP_RAST_OP_TRIANGLE_4        0x5
  262. #define LP_RAST_OP_TRIANGLE_5        0x6
  263. #define LP_RAST_OP_TRIANGLE_6        0x7
  264. #define LP_RAST_OP_TRIANGLE_7        0x8
  265. #define LP_RAST_OP_TRIANGLE_8        0x9
  266. #define LP_RAST_OP_TRIANGLE_3_4      0xa
  267. #define LP_RAST_OP_TRIANGLE_3_16     0xb
  268. #define LP_RAST_OP_TRIANGLE_4_16     0xc
  269. #define LP_RAST_OP_SHADE_TILE        0xd
  270. #define LP_RAST_OP_SHADE_TILE_OPAQUE 0xe
  271. #define LP_RAST_OP_BEGIN_QUERY       0xf
  272. #define LP_RAST_OP_END_QUERY         0x10
  273. #define LP_RAST_OP_SET_STATE         0x11
  274.  
  275. #define LP_RAST_OP_MAX               0x12
  276. #define LP_RAST_OP_MASK              0xff
  277.  
  278. void
  279. lp_debug_bins( struct lp_scene *scene );
  280. void
  281. lp_debug_draw_bins_by_cmd_length( struct lp_scene *scene );
  282. void
  283. lp_debug_draw_bins_by_coverage( struct lp_scene *scene );
  284.  
  285.  
  286. #endif
  287.