Subversion Repositories Kolibri OS

Rev

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

  1.  /**************************************************************************
  2.  *
  3.  * Copyright 2003 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. #ifndef I915_CONTEXT_H
  29. #define I915_CONTEXT_H
  30.  
  31.  
  32. #include "pipe/p_context.h"
  33. #include "pipe/p_defines.h"
  34. #include "pipe/p_state.h"
  35.  
  36. #include "draw/draw_vertex.h"
  37.  
  38. #include "tgsi/tgsi_scan.h"
  39.  
  40. #include "util/u_slab.h"
  41. #include "util/u_blitter.h"
  42.  
  43.  
  44. struct i915_winsys;
  45. struct i915_winsys_buffer;
  46. struct i915_winsys_batchbuffer;
  47.  
  48.  
  49. #define I915_TEX_UNITS 8
  50.  
  51. #define I915_DYNAMIC_MODES4       0
  52. #define I915_DYNAMIC_DEPTHSCALE_0 1 /* just the header */
  53. #define I915_DYNAMIC_DEPTHSCALE_1 2
  54. #define I915_DYNAMIC_IAB          3
  55. #define I915_DYNAMIC_BC_0         4 /* just the header */
  56. #define I915_DYNAMIC_BC_1         5
  57. #define I915_DYNAMIC_BFO_0        6
  58. #define I915_DYNAMIC_BFO_1        7
  59. #define I915_DYNAMIC_STP_0        8
  60. #define I915_DYNAMIC_STP_1        9
  61. #define I915_DYNAMIC_SC_ENA_0     10
  62. #define I915_DYNAMIC_SC_RECT_0    11
  63. #define I915_DYNAMIC_SC_RECT_1    12
  64. #define I915_DYNAMIC_SC_RECT_2    13
  65. #define I915_MAX_DYNAMIC          14
  66.  
  67.  
  68. #define I915_IMMEDIATE_S0         0
  69. #define I915_IMMEDIATE_S1         1
  70. #define I915_IMMEDIATE_S2         2
  71. #define I915_IMMEDIATE_S3         3
  72. #define I915_IMMEDIATE_S4         4
  73. #define I915_IMMEDIATE_S5         5
  74. #define I915_IMMEDIATE_S6         6
  75. #define I915_IMMEDIATE_S7         7
  76. #define I915_MAX_IMMEDIATE        8
  77.  
  78. /* These must mach the order of LI0_STATE_* bits, as they will be used
  79.  * to generate hardware packets:
  80.  */
  81. #define I915_CACHE_STATIC         0
  82. #define I915_CACHE_DYNAMIC        1 /* handled specially */
  83. #define I915_CACHE_SAMPLER        2
  84. #define I915_CACHE_MAP            3
  85. #define I915_CACHE_PROGRAM        4
  86. #define I915_CACHE_CONSTANTS      5
  87. #define I915_MAX_CACHE            6
  88.  
  89. #define I915_MAX_CONSTANT  32
  90.  
  91.  
  92. /** See constant_flags[] below */
  93. #define I915_CONSTFLAG_USER 0x1f
  94.  
  95.  
  96. /**
  97.  * Subclass of pipe_shader_state
  98.  */
  99. struct i915_fragment_shader
  100. {
  101.    struct pipe_shader_state state;
  102.  
  103.    struct tgsi_shader_info info;
  104.  
  105.    struct draw_fragment_shader *draw_data;
  106.  
  107.    uint *decl;
  108.    uint decl_len;
  109.  
  110.    uint *program;
  111.    uint program_len;
  112.  
  113.    /**
  114.     * constants introduced during translation.
  115.     * These are placed at the end of the constant buffer and grow toward
  116.     * the beginning (eg: slot 31, 30 29, ...)
  117.     * User-provided constants start at 0.
  118.     * This allows both types of constants to co-exist (until there's too many)
  119.     * and doesn't require regenerating/changing the fragment program to
  120.     * shuffle constants around.
  121.     */
  122.    uint num_constants;
  123.    float constants[I915_MAX_CONSTANT][4];
  124.  
  125.    /**
  126.     * Status of each constant
  127.     * if I915_CONSTFLAG_PARAM, the value must be taken from the corresponding
  128.     * slot of the user's constant buffer. (set by pipe->set_constant_buffer())
  129.     * Else, the bitmask indicates which components are occupied by immediates.
  130.     */
  131.    ubyte constant_flags[I915_MAX_CONSTANT];
  132.  
  133.    /**
  134.     * The mapping between generics and hw texture coords.
  135.     * We need to share this between the vertex and fragment stages.
  136.     **/
  137.    int generic_mapping[I915_TEX_UNITS];
  138. };
  139.  
  140.  
  141. struct i915_cache_context;
  142.  
  143. /* Use to calculate differences between state emitted to hardware and
  144.  * current driver-calculated state.  
  145.  */
  146. struct i915_state
  147. {
  148.    unsigned immediate[I915_MAX_IMMEDIATE];
  149.    unsigned dynamic[I915_MAX_DYNAMIC];
  150.  
  151.    /** number of constants passed in through a constant buffer */
  152.    uint num_user_constants[PIPE_SHADER_TYPES];
  153.  
  154.    /* texture sampler state */
  155.    unsigned sampler[I915_TEX_UNITS][3];
  156.    unsigned sampler_enable_flags;
  157.    unsigned sampler_enable_nr;
  158.  
  159.    /* texture image buffers */
  160.    unsigned texbuffer[I915_TEX_UNITS][2];
  161.  
  162.    /** Describes the current hardware vertex layout */
  163.    struct vertex_info vertex_info;
  164.  
  165.    /* static state (dst/depth buffer state) */
  166.    struct i915_winsys_buffer *cbuf_bo;
  167.    unsigned cbuf_flags;
  168.    struct i915_winsys_buffer *depth_bo;
  169.    unsigned depth_flags;
  170.    unsigned dst_buf_vars;
  171.    uint32_t draw_offset;
  172.    uint32_t draw_size;
  173.    uint32_t target_fixup_format;
  174.    uint32_t fixup_swizzle;
  175.  
  176.    unsigned id;                 /* track lost context events */
  177. };
  178.  
  179. struct i915_blend_state {
  180.    unsigned iab;
  181.    unsigned modes4;
  182.    unsigned LIS5;
  183.    unsigned LIS6;
  184. };
  185.  
  186. struct i915_depth_stencil_state {
  187.    unsigned stencil_modes4;
  188.    unsigned bfo[2];
  189.    unsigned stencil_LIS5;
  190.    unsigned depth_LIS6;
  191. };
  192.  
  193. struct i915_rasterizer_state {
  194.    struct pipe_rasterizer_state templ;
  195.  
  196.    unsigned light_twoside : 1;
  197.    unsigned st;
  198.    enum interp_mode color_interp;
  199.  
  200.    unsigned LIS4;
  201.    unsigned LIS7;
  202.    unsigned sc[1];
  203.  
  204.    union { float f; unsigned u; } ds[2];
  205. };
  206.  
  207. struct i915_sampler_state {
  208.    struct pipe_sampler_state templ;
  209.    unsigned state[3];
  210.    unsigned minlod;
  211.    unsigned maxlod;
  212. };
  213.  
  214. struct i915_velems_state {
  215.    unsigned count;
  216.    struct pipe_vertex_element velem[PIPE_MAX_ATTRIBS];
  217. };
  218.  
  219.  
  220. struct i915_context {
  221.    struct pipe_context base;
  222.  
  223.    struct i915_winsys *iws;
  224.  
  225.    struct draw_context *draw;
  226.  
  227.    /* The most recent drawing state as set by the driver:
  228.     */
  229.    const struct i915_blend_state           *blend;
  230.    const struct i915_sampler_state         *sampler[PIPE_MAX_SAMPLERS];
  231.    struct pipe_sampler_state *vertex_samplers[PIPE_MAX_SAMPLERS];
  232.    const struct i915_depth_stencil_state   *depth_stencil;
  233.    const struct i915_rasterizer_state      *rasterizer;
  234.  
  235.    struct i915_fragment_shader *fs;
  236.  
  237.    void *vs;
  238.  
  239.    struct i915_velems_state *velems;
  240.    unsigned nr_vertex_buffers;
  241.    struct pipe_vertex_buffer vertex_buffers[PIPE_MAX_ATTRIBS];
  242.  
  243.    struct pipe_blend_color blend_color;
  244.    struct pipe_stencil_ref stencil_ref;
  245.    struct pipe_clip_state clip;
  246.    struct pipe_resource *constants[PIPE_SHADER_TYPES];
  247.    struct pipe_framebuffer_state framebuffer;
  248.    struct pipe_poly_stipple poly_stipple;
  249.    struct pipe_scissor_state scissor;
  250.    struct pipe_sampler_view *fragment_sampler_views[PIPE_MAX_SAMPLERS];
  251.    struct pipe_sampler_view *vertex_sampler_views[PIPE_MAX_SAMPLERS];
  252.    struct pipe_viewport_state viewport;
  253.    struct pipe_index_buffer index_buffer;
  254.  
  255.    unsigned dirty;
  256.  
  257.    struct pipe_resource *mapped_vs_tex[PIPE_MAX_SAMPLERS];
  258.    struct i915_winsys_buffer* mapped_vs_tex_buffer[PIPE_MAX_SAMPLERS];
  259.  
  260.    unsigned num_samplers;
  261.    unsigned num_fragment_sampler_views;
  262.    unsigned num_vertex_samplers;
  263.    unsigned num_vertex_sampler_views;
  264.  
  265.    struct i915_winsys_batchbuffer *batch;
  266.  
  267.    /** Vertex buffer */
  268.    struct i915_winsys_buffer *vbo;
  269.    size_t vbo_offset;
  270.    unsigned vbo_flushed;
  271.  
  272.    struct i915_state current;
  273.    unsigned hardware_dirty;
  274.    unsigned immediate_dirty : I915_MAX_IMMEDIATE;
  275.    unsigned dynamic_dirty : I915_MAX_DYNAMIC;
  276.    unsigned static_dirty : 4;
  277.    unsigned flush_dirty : 2;
  278.  
  279.    struct i915_winsys_buffer *validation_buffers[2 + 1 + I915_TEX_UNITS];
  280.    int num_validation_buffers;
  281.  
  282.    struct util_slab_mempool transfer_pool;
  283.    struct util_slab_mempool texture_transfer_pool;
  284.  
  285.    /* state for tracking flushes */
  286.    int last_fired_vertices;
  287.    int fired_vertices;
  288.    int queued_vertices;
  289.  
  290.    /** blitter/hw-clear */
  291.    struct blitter_context* blitter;
  292. };
  293.  
  294. /* A flag for each state_tracker state object:
  295.  */
  296. #define I915_NEW_VIEWPORT      0x1
  297. #define I915_NEW_RASTERIZER    0x2
  298. #define I915_NEW_FS            0x4
  299. #define I915_NEW_BLEND         0x8
  300. #define I915_NEW_CLIP          0x10
  301. #define I915_NEW_SCISSOR       0x20
  302. #define I915_NEW_STIPPLE       0x40
  303. #define I915_NEW_FRAMEBUFFER   0x80
  304. #define I915_NEW_ALPHA_TEST    0x100
  305. #define I915_NEW_DEPTH_STENCIL 0x200
  306. #define I915_NEW_SAMPLER       0x400
  307. #define I915_NEW_SAMPLER_VIEW  0x800
  308. #define I915_NEW_VS_CONSTANTS  0x1000
  309. #define I915_NEW_FS_CONSTANTS  0x2000
  310. #define I915_NEW_GS_CONSTANTS  0x4000
  311. #define I915_NEW_VBO           0x8000
  312. #define I915_NEW_VS            0x10000
  313.  
  314.  
  315. /* Driver's internally generated state flags:
  316.  */
  317. #define I915_NEW_VERTEX_FORMAT    0x10000
  318.  
  319.  
  320. /* Dirty flags for hardware emit
  321.  */
  322. #define I915_HW_STATIC            (1<<I915_CACHE_STATIC)
  323. #define I915_HW_DYNAMIC           (1<<I915_CACHE_DYNAMIC)
  324. #define I915_HW_SAMPLER           (1<<I915_CACHE_SAMPLER)
  325. #define I915_HW_MAP               (1<<I915_CACHE_MAP)
  326. #define I915_HW_PROGRAM           (1<<I915_CACHE_PROGRAM)
  327. #define I915_HW_CONSTANTS         (1<<I915_CACHE_CONSTANTS)
  328. #define I915_HW_IMMEDIATE         (1<<(I915_MAX_CACHE+0))
  329. #define I915_HW_INVARIANT         (1<<(I915_MAX_CACHE+1))
  330. #define I915_HW_FLUSH             (1<<(I915_MAX_CACHE+1))
  331.  
  332. /* hw flush handling */
  333. #define I915_FLUSH_CACHE                1
  334. #define I915_PIPELINE_FLUSH             2
  335.  
  336. /* split up static state */
  337. #define I915_DST_BUF_COLOR              1
  338. #define I915_DST_BUF_DEPTH              2
  339. #define I915_DST_VARS                   4
  340. #define I915_DST_RECT                   8
  341.  
  342. static INLINE
  343. void i915_set_flush_dirty(struct i915_context *i915, unsigned flush)
  344. {
  345.    i915->hardware_dirty |= I915_HW_FLUSH;
  346.    i915->flush_dirty |= flush;
  347. }
  348.  
  349.  
  350. /***********************************************************************
  351.  * i915_prim_emit.c:
  352.  */
  353. struct draw_stage *i915_draw_render_stage( struct i915_context *i915 );
  354.  
  355.  
  356. /***********************************************************************
  357.  * i915_prim_vbuf.c:
  358.  */
  359. struct draw_stage *i915_draw_vbuf_stage( struct i915_context *i915 );
  360.  
  361.  
  362. /***********************************************************************
  363.  * i915_state.c:
  364.  */
  365. void i915_prepare_vertex_sampling(struct i915_context *i915);
  366. void i915_cleanup_vertex_sampling(struct i915_context *i915);
  367.  
  368.  
  369.  
  370. /***********************************************************************
  371.  * i915_state_emit.c:
  372.  */
  373. void i915_emit_hardware_state(struct i915_context *i915 );
  374.  
  375.  
  376.  
  377. /***********************************************************************
  378.  * i915_clear.c:
  379.  */
  380. void i915_clear_blitter(struct pipe_context *pipe, unsigned buffers,
  381.                         const union pipe_color_union *color,
  382.                         double depth, unsigned stencil);
  383. void i915_clear_render(struct pipe_context *pipe, unsigned buffers,
  384.                        const union pipe_color_union *color,
  385.                        double depth, unsigned stencil);
  386. void i915_clear_emit(struct pipe_context *pipe, unsigned buffers,
  387.                      const union pipe_color_union *color,
  388.                      double depth, unsigned stencil,
  389.                      unsigned destx, unsigned desty, unsigned width, unsigned height);
  390.  
  391.  
  392. /***********************************************************************
  393.  *
  394.  */
  395. void i915_init_state_functions( struct i915_context *i915 );
  396. void i915_init_flush_functions( struct i915_context *i915 );
  397. void i915_init_string_functions( struct i915_context *i915 );
  398.  
  399.  
  400. /************************************************************************
  401.  * i915_context.c
  402.  */
  403. struct pipe_context *i915_create_context(struct pipe_screen *screen,
  404.                                          void *priv);
  405.  
  406.  
  407. /***********************************************************************
  408.  * Inline conversion functions.  These are better-typed than the
  409.  * macros used previously:
  410.  */
  411. static INLINE struct i915_context *
  412. i915_context( struct pipe_context *pipe )
  413. {
  414.    return (struct i915_context *)pipe;
  415. }
  416.  
  417.  
  418. #endif
  419.