• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Mesa 3-D graphics library
3  *
4  * Copyright (C) 2012-2013 LunarG, Inc.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a
7  * copy of this software and associated documentation files (the "Software"),
8  * to deal in the Software without restriction, including without limitation
9  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10  * and/or sell copies of the Software, and to permit persons to whom the
11  * Software is furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included
14  * in all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22  * DEALINGS IN THE SOFTWARE.
23  *
24  * Authors:
25  *    Chia-I Wu <olv@lunarg.com>
26  */
27 
28 #ifndef ILO_SHADER_INTERNAL_H
29 #define ILO_SHADER_INTERNAL_H
30 
31 #include "core/ilo_state_sbe.h"
32 #include "core/ilo_state_sol.h"
33 
34 #include "ilo_common.h"
35 #include "ilo_state.h"
36 #include "ilo_shader.h"
37 
38 /* XXX The interface needs to be reworked */
39 
40 /**
41  * A shader variant.  It consists of non-orthogonal states of the pipe context
42  * affecting the compilation of a shader.
43  */
44 struct ilo_shader_variant {
45    union {
46       struct {
47          bool rasterizer_discard;
48          int num_ucps;
49       } vs;
50 
51       struct {
52          bool rasterizer_discard;
53          int num_inputs;
54          int semantic_names[PIPE_MAX_SHADER_INPUTS];
55          int semantic_indices[PIPE_MAX_SHADER_INPUTS];
56       } gs;
57 
58       struct {
59          bool flatshade;
60          int fb_height;
61          int num_cbufs;
62       } fs;
63    } u;
64 
65    bool use_pcb;
66 
67    int num_sampler_views;
68    struct {
69       unsigned r:3;
70       unsigned g:3;
71       unsigned b:3;
72       unsigned a:3;
73    } sampler_view_swizzles[ILO_MAX_SAMPLER_VIEWS];
74 
75    uint32_t saturate_tex_coords[3];
76 };
77 
78 struct ilo_kernel_routing {
79    bool initialized;
80 
81    bool is_point;
82    bool light_twoside;
83    uint32_t sprite_coord_enable;
84    int sprite_coord_mode;
85    int src_len;
86    int src_semantics[PIPE_MAX_SHADER_OUTPUTS];
87    int src_indices[PIPE_MAX_SHADER_OUTPUTS];
88 
89    struct ilo_state_sbe sbe;
90 };
91 
92 /**
93  * A compiled shader.
94  */
95 struct ilo_shader {
96    struct ilo_shader_variant variant;
97 
98    union ilo_shader_cso cso;
99 
100    struct {
101       int semantic_names[PIPE_MAX_SHADER_INPUTS];
102       int semantic_indices[PIPE_MAX_SHADER_INPUTS];
103       int interp[PIPE_MAX_SHADER_INPUTS];
104       bool centroid[PIPE_MAX_SHADER_INPUTS];
105       int count;
106 
107       int start_grf;
108       bool has_pos;
109       bool has_linear_interp;
110       int barycentric_interpolation_mode;
111       uint32_t const_interp_enable;
112       bool discard_adj;
113    } in;
114 
115    struct {
116       int register_indices[PIPE_MAX_SHADER_OUTPUTS];
117       int semantic_names[PIPE_MAX_SHADER_OUTPUTS];
118       int semantic_indices[PIPE_MAX_SHADER_OUTPUTS];
119       int count;
120 
121       bool has_pos;
122    } out;
123 
124    bool skip_cbuf0_upload;
125 
126    bool has_kill;
127    bool dispatch_16;
128 
129    bool stream_output;
130    int svbi_post_inc;
131 
132    uint32_t sol_data[PIPE_MAX_SO_OUTPUTS][2];
133    struct ilo_state_sol sol;
134 
135    /* for VS stream output / rasterizer discard */
136    int gs_offsets[3];
137    int gs_start_grf;
138    int gs_bt_so_count;
139 
140    void *kernel;
141    int kernel_size;
142    int per_thread_scratch_size;
143 
144    struct ilo_kernel_routing routing;
145    struct ilo_state_ps_params_info ps_params;
146 
147    /* what does the push constant buffer consist of? */
148    struct {
149       int cbuf0_size;
150       int clip_state_size;
151    } pcb;
152 
153    /* binding table */
154    struct {
155       int rt_base, rt_count;
156       int tex_base, tex_count;
157       int const_base, const_count;
158       int res_base, res_count;
159 
160       int gen6_so_base, gen6_so_count;
161 
162       int global_base, global_count;
163 
164       int total_count;
165    } bt;
166 
167    struct list_head list;
168 
169    /* managed by shader cache */
170    bool uploaded;
171    uint32_t cache_offset;
172 };
173 
174 /**
175  * Information about a shader state.
176  */
177 struct ilo_shader_info {
178    const struct ilo_dev *dev;
179    int type;
180 
181    const struct tgsi_token *tokens;
182 
183    struct pipe_stream_output_info stream_output;
184    struct {
185       unsigned req_local_mem;
186       unsigned req_private_mem;
187       unsigned req_input_mem;
188    } compute;
189 
190    uint32_t non_orthogonal_states;
191 
192    bool has_color_interp;
193    bool has_pos;
194    bool has_vertexid;
195    bool has_instanceid;
196    bool fs_color0_writes_all_cbufs;
197 
198    int edgeflag_in;
199    int edgeflag_out;
200 
201    uint32_t shadow_samplers;
202    int num_samplers;
203 
204    int constant_buffer_count;
205 };
206 
207 /**
208  * A shader state.
209  */
210 struct ilo_shader_state {
211    struct ilo_shader_info info;
212 
213    struct list_head variants;
214    int num_variants, total_size;
215 
216    struct ilo_shader *shader;
217 
218    /* managed by shader cache */
219    struct ilo_shader_cache *cache;
220    struct list_head list;
221 };
222 
223 void
224 ilo_shader_variant_init(struct ilo_shader_variant *variant,
225                         const struct ilo_shader_info *info,
226                         const struct ilo_state_vector *vec);
227 
228 bool
229 ilo_shader_state_use_variant(struct ilo_shader_state *state,
230                              const struct ilo_shader_variant *variant);
231 
232 struct ilo_shader *
233 ilo_shader_compile_vs(const struct ilo_shader_state *state,
234                       const struct ilo_shader_variant *variant);
235 
236 struct ilo_shader *
237 ilo_shader_compile_gs(const struct ilo_shader_state *state,
238                       const struct ilo_shader_variant *variant);
239 
240 bool
241 ilo_shader_compile_gs_passthrough(const struct ilo_shader_state *vs_state,
242                                   const struct ilo_shader_variant *vs_variant,
243                                   const int *so_mapping,
244                                   struct ilo_shader *vs);
245 
246 struct ilo_shader *
247 ilo_shader_compile_fs(const struct ilo_shader_state *state,
248                       const struct ilo_shader_variant *variant);
249 
250 struct ilo_shader *
251 ilo_shader_compile_cs(const struct ilo_shader_state *state,
252                       const struct ilo_shader_variant *variant);
253 
254 static inline void
ilo_shader_destroy_kernel(struct ilo_shader * sh)255 ilo_shader_destroy_kernel(struct ilo_shader *sh)
256 {
257    FREE(sh->kernel);
258    FREE(sh);
259 }
260 
261 #endif /* ILO_SHADER_INTERNAL_H */
262