Subversion Repositories Kolibri OS

Rev

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

  1. /**************************************************************************
  2.  *
  3.  * Copyright 2007-2008 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.  /**
  29.   * @file
  30.   * Constant State Object (CSO) cache.
  31.   *
  32.   * The basic idea is that the states are created via the
  33.   * create_state/bind_state/delete_state semantics. The driver is expected to
  34.   * perform as much of the Gallium state translation to whatever its internal
  35.   * representation is during the create call. Gallium then has a caching
  36.   * mechanism where it stores the created states. When the pipeline needs an
  37.   * actual state change, a bind call is issued. In the bind call the driver
  38.   * gets its already translated representation.
  39.   *
  40.   * Those semantics mean that the driver doesn't do the repeated translations
  41.   * of states on every frame, but only once, when a new state is actually
  42.   * created.
  43.   *
  44.   * Even on hardware that doesn't do any kind of state cache, it makes the
  45.   * driver look a lot neater, plus it avoids all the redundant state
  46.   * translations on every frame.
  47.   *
  48.   * Currently our constant state objects are:
  49.   * - alpha test
  50.   * - blend
  51.   * - depth stencil
  52.   * - fragment shader
  53.   * - rasterizer (old setup)
  54.   * - sampler
  55.   * - vertex shader
  56.   * - vertex elements
  57.   *
  58.   * Things that are not constant state objects include:
  59.   * - blend_color
  60.   * - clip_state
  61.   * - clear_color_state
  62.   * - constant_buffer
  63.   * - feedback_state
  64.   * - framebuffer_state
  65.   * - polygon_stipple
  66.   * - scissor_state
  67.   * - texture_state
  68.   * - viewport_state
  69.   *
  70.   * @author Zack Rusin <zack@tungstengraphics.com>
  71.   */
  72.  
  73. #ifndef CSO_CACHE_H
  74. #define CSO_CACHE_H
  75.  
  76. #include "pipe/p_context.h"
  77. #include "pipe/p_state.h"
  78.  
  79. /* cso_hash.h is necessary for cso_hash_iter, as MSVC requires structures
  80.  * returned by value to be fully defined */
  81. #include "cso_hash.h"
  82.  
  83.  
  84. #ifdef  __cplusplus
  85. extern "C" {
  86. #endif
  87.  
  88. enum cso_cache_type {
  89.    CSO_RASTERIZER,
  90.    CSO_BLEND,
  91.    CSO_DEPTH_STENCIL_ALPHA,
  92.    CSO_SAMPLER,
  93.    CSO_VELEMENTS,
  94.    CSO_CACHE_MAX,
  95. };
  96.  
  97. typedef void (*cso_state_callback)(void *ctx, void *obj);
  98.  
  99. typedef void (*cso_sanitize_callback)(struct cso_hash *hash,
  100.                                       enum cso_cache_type type,
  101.                                       int max_size,
  102.                                       void *user_data);
  103.  
  104. struct cso_cache;
  105.  
  106. struct cso_blend {
  107.    struct pipe_blend_state state;
  108.    void *data;
  109.    cso_state_callback delete_state;
  110.    struct pipe_context *context;
  111. };
  112.  
  113. struct cso_depth_stencil_alpha {
  114.    struct pipe_depth_stencil_alpha_state state;
  115.    void *data;
  116.    cso_state_callback delete_state;
  117.    struct pipe_context *context;
  118. };
  119.  
  120. struct cso_rasterizer {
  121.    struct pipe_rasterizer_state state;
  122.    void *data;
  123.    cso_state_callback delete_state;
  124.    struct pipe_context *context;
  125. };
  126.  
  127. struct cso_sampler {
  128.    struct pipe_sampler_state state;
  129.    void *data;
  130.    cso_state_callback delete_state;
  131.    struct pipe_context *context;
  132. };
  133.  
  134. struct cso_velems_state {
  135.    unsigned count;
  136.    struct pipe_vertex_element velems[PIPE_MAX_ATTRIBS];
  137. };
  138.  
  139. struct cso_velements {
  140.    struct cso_velems_state state;
  141.    void *data;
  142.    cso_state_callback delete_state;
  143.    struct pipe_context *context;
  144. };
  145.  
  146. unsigned cso_construct_key(void *item, int item_size);
  147.  
  148. struct cso_cache *cso_cache_create(void);
  149. void cso_cache_delete(struct cso_cache *sc);
  150.  
  151. void cso_cache_set_sanitize_callback(struct cso_cache *sc,
  152.                                      cso_sanitize_callback cb,
  153.                                      void *user_data);
  154.  
  155. struct cso_hash_iter cso_insert_state(struct cso_cache *sc,
  156.                                       unsigned hash_key, enum cso_cache_type type,
  157.                                       void *state);
  158. struct cso_hash_iter cso_find_state(struct cso_cache *sc,
  159.                                     unsigned hash_key, enum cso_cache_type type);
  160. struct cso_hash_iter cso_find_state_template(struct cso_cache *sc,
  161.                                              unsigned hash_key, enum cso_cache_type type,
  162.                                              void *templ, unsigned size);
  163. void cso_for_each_state(struct cso_cache *sc, enum cso_cache_type type,
  164.                         cso_state_callback func, void *user_data);
  165. void * cso_take_state(struct cso_cache *sc, unsigned hash_key,
  166.                       enum cso_cache_type type);
  167.  
  168. void cso_set_maximum_cache_size(struct cso_cache *sc, int number);
  169. int cso_maximum_cache_size(const struct cso_cache *sc);
  170.  
  171. #ifdef  __cplusplus
  172. }
  173. #endif
  174.  
  175. #endif
  176.