"Fossies" - the Fresh Open Source Software Archive

Member "mesa-20.1.8/src/gallium/drivers/i915/i915_context.h" (16 Sep 2020, 12369 Bytes) of package /linux/misc/mesa-20.1.8.tar.xz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "i915_context.h" see the Fossies "Dox" file reference documentation and the last Fossies "Diffs" side-by-side code changes report: 20.1.5_vs_20.2.0-rc1.

    1  /**************************************************************************
    2  * 
    3  * Copyright 2003 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 #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/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][3];
  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 
  199    unsigned LIS4;
  200    unsigned LIS7;
  201    unsigned sc[1];
  202 
  203    union { float f; unsigned u; } ds[2];
  204 };
  205 
  206 struct i915_sampler_state {
  207    struct pipe_sampler_state templ;
  208    unsigned state[3];
  209    unsigned minlod;
  210    unsigned maxlod;
  211 };
  212 
  213 struct i915_velems_state {
  214    unsigned count;
  215    struct pipe_vertex_element velem[PIPE_MAX_ATTRIBS];
  216 };
  217 
  218 
  219 struct i915_context {
  220    struct pipe_context base;
  221 
  222    struct i915_winsys *iws;
  223 
  224    struct draw_context *draw;
  225 
  226    /* The most recent drawing state as set by the driver:
  227     */
  228    const struct i915_blend_state           *blend;
  229    const struct i915_sampler_state         *fragment_sampler[PIPE_MAX_SAMPLERS];
  230    struct pipe_sampler_state               *vertex_samplers[PIPE_MAX_SAMPLERS];
  231    const struct i915_depth_stencil_state   *depth_stencil;
  232    const struct i915_rasterizer_state      *rasterizer;
  233 
  234    struct i915_fragment_shader *fs;
  235 
  236    void *vs;
  237 
  238    struct i915_velems_state *velems;
  239    unsigned nr_vertex_buffers;
  240    struct pipe_vertex_buffer vertex_buffers[PIPE_MAX_ATTRIBS];
  241 
  242    struct pipe_blend_color blend_color;
  243    struct pipe_stencil_ref stencil_ref;
  244    struct pipe_clip_state clip;
  245    struct pipe_resource *constants[PIPE_SHADER_TYPES];
  246    struct pipe_framebuffer_state framebuffer;
  247    struct pipe_poly_stipple poly_stipple;
  248    struct pipe_scissor_state scissor;
  249    struct pipe_sampler_view *fragment_sampler_views[PIPE_MAX_SAMPLERS];
  250    struct pipe_sampler_view *vertex_sampler_views[PIPE_MAX_SAMPLERS];
  251    struct pipe_viewport_state viewport;
  252 
  253    unsigned dirty;
  254 
  255    struct pipe_resource *mapped_vs_tex[PIPE_MAX_SAMPLERS];
  256    struct i915_winsys_buffer* mapped_vs_tex_buffer[PIPE_MAX_SAMPLERS];
  257 
  258    unsigned num_samplers;
  259    unsigned num_fragment_sampler_views;
  260    unsigned num_vertex_samplers;
  261    unsigned num_vertex_sampler_views;
  262 
  263    struct i915_winsys_batchbuffer *batch;
  264 
  265    /** Vertex buffer */
  266    struct i915_winsys_buffer *vbo;
  267    size_t vbo_offset;
  268    unsigned vbo_flushed;
  269 
  270    struct i915_state current;
  271    unsigned hardware_dirty;
  272    unsigned immediate_dirty : I915_MAX_IMMEDIATE;
  273    unsigned dynamic_dirty : I915_MAX_DYNAMIC;
  274    unsigned static_dirty : 4;
  275    unsigned flush_dirty : 2;
  276 
  277    struct i915_winsys_buffer *validation_buffers[2 + 1 + I915_TEX_UNITS];
  278    int num_validation_buffers;
  279 
  280    struct slab_mempool transfer_pool;
  281    struct slab_mempool texture_transfer_pool;
  282 
  283    /* state for tracking flushes */
  284    int last_fired_vertices;
  285    int fired_vertices;
  286    int queued_vertices;
  287 
  288    /** blitter/hw-clear */
  289    struct blitter_context* blitter;
  290 };
  291 
  292 /* A flag for each state_tracker state object:
  293  */
  294 #define I915_NEW_VIEWPORT      0x1
  295 #define I915_NEW_RASTERIZER    0x2
  296 #define I915_NEW_FS            0x4
  297 #define I915_NEW_BLEND         0x8
  298 #define I915_NEW_CLIP          0x10
  299 #define I915_NEW_SCISSOR       0x20
  300 #define I915_NEW_STIPPLE       0x40
  301 #define I915_NEW_FRAMEBUFFER   0x80
  302 #define I915_NEW_ALPHA_TEST    0x100
  303 #define I915_NEW_DEPTH_STENCIL 0x200
  304 #define I915_NEW_SAMPLER       0x400
  305 #define I915_NEW_SAMPLER_VIEW  0x800
  306 #define I915_NEW_VS_CONSTANTS  0x1000
  307 #define I915_NEW_FS_CONSTANTS  0x2000
  308 #define I915_NEW_GS_CONSTANTS  0x4000
  309 #define I915_NEW_VBO           0x8000
  310 #define I915_NEW_VS            0x10000
  311 
  312 
  313 /* Driver's internally generated state flags:
  314  */
  315 #define I915_NEW_VERTEX_FORMAT    0x10000
  316 
  317 
  318 /* Dirty flags for hardware emit
  319  */
  320 #define I915_HW_STATIC            (1<<I915_CACHE_STATIC)
  321 #define I915_HW_DYNAMIC           (1<<I915_CACHE_DYNAMIC)
  322 #define I915_HW_SAMPLER           (1<<I915_CACHE_SAMPLER)
  323 #define I915_HW_MAP               (1<<I915_CACHE_MAP)
  324 #define I915_HW_PROGRAM           (1<<I915_CACHE_PROGRAM)
  325 #define I915_HW_CONSTANTS         (1<<I915_CACHE_CONSTANTS)
  326 #define I915_HW_IMMEDIATE         (1<<(I915_MAX_CACHE+0))
  327 #define I915_HW_INVARIANT         (1<<(I915_MAX_CACHE+1))
  328 #define I915_HW_FLUSH             (1<<(I915_MAX_CACHE+1))
  329 
  330 /* hw flush handling */
  331 #define I915_FLUSH_CACHE        1
  332 #define I915_PIPELINE_FLUSH     2
  333 
  334 /* split up static state */
  335 #define I915_DST_BUF_COLOR              1
  336 #define I915_DST_BUF_DEPTH              2
  337 #define I915_DST_VARS                   4
  338 #define I915_DST_RECT                   8
  339 
  340 static inline
  341 void i915_set_flush_dirty(struct i915_context *i915, unsigned flush)
  342 {
  343    i915->hardware_dirty |= I915_HW_FLUSH;
  344    i915->flush_dirty |= flush;
  345 }
  346 
  347 
  348 /***********************************************************************
  349  * i915_prim_emit.c: 
  350  */
  351 struct draw_stage *i915_draw_render_stage( struct i915_context *i915 );
  352 
  353 
  354 /***********************************************************************
  355  * i915_prim_vbuf.c: 
  356  */
  357 struct draw_stage *i915_draw_vbuf_stage( struct i915_context *i915 );
  358 
  359 
  360 /***********************************************************************
  361  * i915_state.c:
  362  */
  363 void i915_prepare_vertex_sampling(struct i915_context *i915);
  364 void i915_cleanup_vertex_sampling(struct i915_context *i915);
  365 
  366 
  367 
  368 /***********************************************************************
  369  * i915_state_emit.c: 
  370  */
  371 void i915_emit_hardware_state(struct i915_context *i915 );
  372 
  373 
  374 
  375 /***********************************************************************
  376  * i915_clear.c: 
  377  */
  378 void i915_clear_blitter(struct pipe_context *pipe, unsigned buffers,
  379                         const struct pipe_scissor_state *scissor_state,
  380                         const union pipe_color_union *color,
  381                         double depth, unsigned stencil);
  382 void i915_clear_render(struct pipe_context *pipe, unsigned buffers,
  383                        const struct pipe_scissor_state *scissor_state,
  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, unsigned flags);
  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