Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /**************************************************************************
  2.  *
  3.  * Copyright 2007 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. /* Authors:  Keith Whitwell <keithw@vmware.com>
  29.  */
  30.  
  31. #ifndef SP_CONTEXT_H
  32. #define SP_CONTEXT_H
  33.  
  34. #include "pipe/p_context.h"
  35. #include "util/u_blitter.h"
  36.  
  37. #include "draw/draw_vertex.h"
  38.  
  39. #include "sp_quad_pipe.h"
  40.  
  41.  
  42. /** Do polygon stipple in the draw module? */
  43. #define DO_PSTIPPLE_IN_DRAW_MODULE 0
  44.  
  45. /** Do polygon stipple with the util module? */
  46. #define DO_PSTIPPLE_IN_HELPER_MODULE 1
  47.  
  48.  
  49. struct softpipe_vbuf_render;
  50. struct draw_context;
  51. struct draw_stage;
  52. struct softpipe_tile_cache;
  53. struct softpipe_tex_tile_cache;
  54. struct sp_fragment_shader;
  55. struct sp_vertex_shader;
  56. struct sp_velems_state;
  57. struct sp_so_state;
  58.  
  59. struct softpipe_context {
  60.    struct pipe_context pipe;  /**< base class */
  61.  
  62.    /** Constant state objects */
  63.    struct pipe_blend_state *blend;
  64.    struct pipe_sampler_state *samplers[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS];
  65.    struct pipe_depth_stencil_alpha_state *depth_stencil;
  66.    struct pipe_rasterizer_state *rasterizer;
  67.    struct sp_fragment_shader *fs;
  68.    struct sp_fragment_shader_variant *fs_variant;
  69.    struct sp_vertex_shader *vs;
  70.    struct sp_geometry_shader *gs;
  71.    struct sp_velems_state *velems;
  72.    struct sp_so_state *so;
  73.  
  74.    /** Other rendering state */
  75.    struct pipe_blend_color blend_color;
  76.    struct pipe_blend_color blend_color_clamped;
  77.    struct pipe_stencil_ref stencil_ref;
  78.    struct pipe_clip_state clip;
  79.    struct pipe_resource *constants[PIPE_SHADER_TYPES][PIPE_MAX_CONSTANT_BUFFERS];
  80.    struct pipe_framebuffer_state framebuffer;
  81.    struct pipe_poly_stipple poly_stipple;
  82.    struct pipe_scissor_state scissor;
  83.    struct pipe_sampler_view *sampler_views[PIPE_SHADER_TYPES][PIPE_MAX_SHADER_SAMPLER_VIEWS];
  84.  
  85.    struct pipe_viewport_state viewport;
  86.    struct pipe_vertex_buffer vertex_buffer[PIPE_MAX_ATTRIBS];
  87.    struct pipe_index_buffer index_buffer;
  88.    struct pipe_resource *mapped_vs_tex[PIPE_MAX_SHADER_SAMPLER_VIEWS];
  89.    struct pipe_resource *mapped_gs_tex[PIPE_MAX_SHADER_SAMPLER_VIEWS];
  90.  
  91.    struct draw_so_target *so_targets[PIPE_MAX_SO_BUFFERS];
  92.    unsigned num_so_targets;
  93.    
  94.    struct pipe_query_data_so_statistics so_stats;
  95.  
  96.    struct pipe_query_data_pipeline_statistics pipeline_statistics;
  97.    unsigned active_statistics_queries;
  98.  
  99.    unsigned num_samplers[PIPE_SHADER_TYPES];
  100.    unsigned num_sampler_views[PIPE_SHADER_TYPES];
  101.  
  102.    unsigned num_vertex_buffers;
  103.  
  104.    unsigned dirty; /**< Mask of SP_NEW_x flags */
  105.  
  106.    /* Counter for occlusion queries.  Note this supports overlapping
  107.     * queries.
  108.     */
  109.    uint64_t occlusion_count;
  110.    unsigned active_query_count;
  111.  
  112.    /** Mapped vertex buffers */
  113.    ubyte *mapped_vbuffer[PIPE_MAX_ATTRIBS];
  114.  
  115.    /** Mapped constant buffers */
  116.    const void *mapped_constants[PIPE_SHADER_TYPES][PIPE_MAX_CONSTANT_BUFFERS];
  117.    unsigned const_buffer_size[PIPE_SHADER_TYPES][PIPE_MAX_CONSTANT_BUFFERS];
  118.  
  119.    /** Vertex format */
  120.    struct vertex_info vertex_info;
  121.    struct vertex_info vertex_info_vbuf;
  122.  
  123.    /** Which vertex shader output slot contains point size */
  124.    int psize_slot;
  125.  
  126.    /** Which vertex shader output slot contains layer */
  127.    int layer_slot;
  128.  
  129.    /** The reduced version of the primitive supplied by the state tracker */
  130.    unsigned reduced_api_prim;
  131.  
  132.    /** Derived information about which winding orders to cull */
  133.    unsigned cull_mode;
  134.  
  135.    /**
  136.     * The reduced primitive after unfilled triangles, wide-line decomposition,
  137.     * etc, are taken into account.  This is the primitive type that's actually
  138.     * rasterized.
  139.     */
  140.    unsigned reduced_prim;
  141.  
  142.    /** Derived from scissor and surface bounds: */
  143.    struct pipe_scissor_state cliprect;
  144.  
  145.    unsigned line_stipple_counter;
  146.  
  147.    /** Conditional query object and mode */
  148.    struct pipe_query *render_cond_query;
  149.    uint render_cond_mode;
  150.    boolean render_cond_cond;
  151.  
  152.    /** Polygon stipple items */
  153.    struct {
  154.       struct pipe_resource *texture;
  155.       struct pipe_sampler_state *sampler;
  156.       struct pipe_sampler_view *sampler_view;
  157.    } pstipple;
  158.  
  159.    /** Software quad rendering pipeline */
  160.    struct {
  161.       struct quad_stage *shade;
  162.       struct quad_stage *depth_test;
  163.       struct quad_stage *blend;
  164.       struct quad_stage *pstipple;
  165.       struct quad_stage *first; /**< points to one of the above stages */
  166.    } quad;
  167.  
  168.    /** TGSI exec things */
  169.    struct {
  170.       struct sp_tgsi_sampler *sampler[PIPE_SHADER_TYPES];
  171.    } tgsi;
  172.  
  173.    struct tgsi_exec_machine *fs_machine;
  174.  
  175.    /** The primitive drawing context */
  176.    struct draw_context *draw;
  177.  
  178.    /** Draw module backend */
  179.    struct vbuf_render *vbuf_backend;
  180.    struct draw_stage *vbuf;
  181.  
  182.    struct blitter_context *blitter;
  183.  
  184.    boolean dirty_render_cache;
  185.  
  186.    struct softpipe_tile_cache *cbuf_cache[PIPE_MAX_COLOR_BUFS];
  187.    struct softpipe_tile_cache *zsbuf_cache;
  188.  
  189.    unsigned tex_timestamp;
  190.  
  191.    /*
  192.     * Texture caches for vertex, fragment, geometry stages.
  193.     * Don't use PIPE_SHADER_TYPES here to avoid allocating unused memory
  194.     * for compute shaders.
  195.     * XXX wouldn't it make more sense for the tile cache to just be part
  196.     * of sp_sampler_view?
  197.     */
  198.    struct softpipe_tex_tile_cache *tex_cache[PIPE_SHADER_GEOMETRY+1][PIPE_MAX_SHADER_SAMPLER_VIEWS];
  199.  
  200.    unsigned dump_fs : 1;
  201.    unsigned dump_gs : 1;
  202.    unsigned no_rast : 1;
  203. };
  204.  
  205.  
  206. static INLINE struct softpipe_context *
  207. softpipe_context( struct pipe_context *pipe )
  208. {
  209.    return (struct softpipe_context *)pipe;
  210. }
  211.  
  212.  
  213. struct pipe_context *
  214. softpipe_create_context( struct pipe_screen *, void *priv );
  215.  
  216. struct pipe_resource *
  217. softpipe_user_buffer_create(struct pipe_screen *screen,
  218.                             void *ptr,
  219.                             unsigned bytes,
  220.                             unsigned bind_flags);
  221.  
  222. #define SP_UNREFERENCED         0
  223. #define SP_REFERENCED_FOR_READ  (1 << 0)
  224. #define SP_REFERENCED_FOR_WRITE (1 << 1)
  225.  
  226. unsigned int
  227. softpipe_is_resource_referenced( struct pipe_context *pipe,
  228.                                  struct pipe_resource *texture,
  229.                                  unsigned level, int layer);
  230.  
  231. #endif /* SP_CONTEXT_H */
  232.