Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
5564 serge 1
/**************************************************************************
2
 *
3
 * Copyright 2007-2008 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
  * @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 
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